Защита отдельных страниц в памяти, выделенной VirtualAlloc - PullRequest
0 голосов
/ 17 января 2012

Допустим, я выделил несколько страниц непрерывной памяти, используя VirtualAlloc() от 0x06000000 до 0x06010000 (это 16 страниц по 4 КБ) с защитой PAGE_READWRITE. Но через некоторое время я хочу сделать одну страницу в этой области памяти исполняемой. После прочтения документации msdn для VirtualProtect() я запутался, возможно ли это или нет. В Linux это с mprotect.

Визуальный пример того, что я пытаюсь сделать:

     +-------------------------------------------------------+
     | Commited memory with a single VirtualAlloc call (RW-) |
     +-------------------------------------------------------+
     ↑                                                       ↑
0x06000000                                              0x06010000

И я хочу изменить защиту на это (не в масштабе):

     +------------------+-----------+------------------------+
     |      (RW-)       |   (RWX)   |         (RW-)          |
     +------------------+-----------+------------------------+
     ↑                  ↑           ↑                        ↑
0x06000000         0x06003000  0x06004000               0x06010000

Разрешите ли мне это сделать с помощью VirtualProtect() звонка, подобного этому?

VirtualProtect(0x06003000, 0x1000, PAGE_EXECUTE_READWRITE, &oldProtection);

В настоящее время у меня нет доступа к системе Windows, чтобы проверить это, поэтому я спрашиваю об этом на SO

Ответы [ 2 ]

1 голос
/ 17 января 2012

VirtualProtect(0x06003000, 0x1000, PAGE_EXECUTE_READWRITE, &oldProtection); правильно для уже выделенного / зафиксированного блока памяти размером 0x1000 байтов, начиная с 0x06003000.

0 голосов
/ 17 января 2012

Документы для VirtualProtect довольно ясны:

Область затронутых страниц включает все страницы, содержащие один или несколько байтов в диапазоне от параметра lpAddress до (lpAddress +).dwSize).Это означает, что 2-байтовый диапазон, перекрывающий границу страницы, вызывает изменение атрибутов защиты обеих страниц.

Обратите внимание, что вы можете изменять защиту только на зафиксированных страницах (MEM_RESERVE резервирует место только ввиртуальное адресное пространство процесса)

Следующая цитата не относится к вашему конкретному вопросу, но вы должны помнить об этом, если измените свой дизайн:

Все страницы в указанном регионе должнынаходиться в той же зарезервированной области, выделенной при вызове функции VirtualAlloc или VirtualAllocEx с использованием MEM_RESERVE.Страницы не могут охватывать соседние зарезервированные области, которые были выделены отдельными вызовами VirtualAlloc или VirtualAllocEx с использованием MEM_RESERVE.

...