Требуется ли VirtualProtect адрес начала страницы?
Мне нужно использовать VirtualProtect, и мой вопрос касается адреса региона, переданного функции. Там написано (в MSDN) "адрес, который описывает начальную страницу", должен ли он быть адресом начала страницы или это может быть любой адрес на этой странице? Другими словами, я должен сначала использовать VirtualQuery, чтобы определить начальный адрес страницы?
2 ответа
Вам не нужно указывать базовый адрес страницы. VirtualProtect
примет любой адрес на странице. Описание dwSize
Параметр проясняет это:
Область затронутых страниц включает все страницы, содержащие один или несколько байтов в диапазоне от параметра lpAddress до (lpAddress+dwSize). Это означает, что 2-байтовый диапазон, охватывающий границу страницы, вызывает изменение атрибутов защиты обеих страниц.
Если у вас есть двухбайтовый диапазон, который пересекает границу страницы, то это должно быть возможно для lpAddress
быть только один байт до конца страницы. Страницы не могут быть длиной всего один байт, поэтому они не находятся в начале страницы.
В любом случае вам не понадобится VirtualQuery
- страницы всегда кратны PAGE_SIZE
, что обычно составляет 4 КиБ. Так что вам просто нужно округлить свой номер до ближайшего PAGE_SIZE
,
Но я не верю, что вам нужно округляться; Я думаю, что любой адрес будет работать. Это может стоить двойной проверки, хотя.