Работа с 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 }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д