Работа с 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
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5