Работа с VirtualAlloc - C#
Формулировка задачи:
ребята, здравствуйте, очень нужна ваша помощь
мне необходимо в учебных целях зарезервировать участок памяти определенного размера и поиграться с правами доступа. но не удается пока даже первое. я решила воспользоваться VirtualAlloc(), Но компилятор говорит, что функция записана неправильно, а именно: "Наиболее подходящий перегруженный метод для (тут эта функция) имеет несколько недопустимых аргументов"
я вроде кучу документации прочитала, старалась делать все так, но я не знаю, в чем дело. прошу, подскажите!
может, кто-то еще подскажет как правильно менять режимы доступа с помощью VirtualProtect() и как это потом проверить в работе?
спасибо!
вижу, что проблема с размером участка памяти, но какой он должен быть?? я нашла, что в байтах
public partial class Memory : Form
{
public Memory()
{
InitializeComponent();
}
[Flags()]
public enum AllocationType : uint
{
COMMIT = 0x1000,
RESERVE = 0x2000,
RESET = 0x80000,
LARGE_PAGES = 0x20000000,
PHYSICAL = 0x400000,
TOP_DOWN = 0x100000,
WRITE_WATCH = 0x200000
}
[Flags()]
public enum MemoryProtection : uint
{
EXECUTE = 0x10,
EXECUTE_READ = 0x20,
EXECUTE_READWRITE = 0x40,
EXECUTE_WRITECOPY = 0x80,
NOACCESS = 0x01,
READONLY = 0x02,
READWRITE = 0x04,
WRITECOPY = 0x08,
GUARD_Modifierflag = 0x100,
NOCACHE_Modifierflag = 0x200,
WRITECOMBINE_Modifierflag = 0x400
}
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr VirtualAlloc(IntPtr lpAddress, UIntPtr dwSize, AllocationType flAllocationType, MemoryProtection flProtect);
unsafe private void button1_Click(object sender, EventArgs e)
{
var p = VirtualAlloc( IntPtr.Zero, 65, AllocationType.RESERVE, MemoryProtection.READONLY );
}
}
будет плохо, если в сигнатуре поменять тип данных Size c UIntPtr на простой int?
static extern IntPtr VirtualAlloc(IntPtr lpAddress, UIntPtr dwSize, AllocationType flAllocationType, MemoryProtection flProtect);
Решение задачи: «Работа с VirtualAlloc»
textual
Листинг программы
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr VirtualAlloc(IntPtr lpAddress, int dwSize, AllocationType flAllocationType, MemoryProtection flProtect);
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr VirtualProtect(IntPtr lpAddress, int dwSize, MemoryProtection flProtect, out MemoryProtection flOldProtect);
/// <summary>
/// Главная точка входа для приложения.
/// </summary>
[STAThread]
static void Main()
{
unsafe
{
var p = VirtualAlloc(IntPtr.Zero, 600, AllocationType.COMMIT, MemoryProtection.READWRITE);
*(int*)p = 1234;
var val = *(int*)p;
MemoryProtection old;
VirtualProtect(p, 4, MemoryProtection.READONLY, out old); //сменили протект на "только чтение" (фактически, изменился протект у всей страницы, а не 4х байт)
*(int*)p = 1234; //теперь тут бросит AccessViolationException
}