2012-01-17 3 views
0

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

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

 +-------------------------------------------------------+ 
    | 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

ответ

1

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

+0

Так что 'VirtualProtect()' не возражал бы, если бы я менял защиту определенной страницы, а не весь диапазон «VirtualAlloc()», выделенный? –

+0

Нет, все в порядке. Я делаю это [здесь] (http://stackoverflow.com/a/7859813/968261). –

+0

Хорошо, тогда :) –

0

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

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

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

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

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