VirtualProtect是否需要页面开头的地址?

Does VirtualProtect require the address of the beginning of the page?

本文关键字:开头 地址 是否 VirtualProtect      更新时间:2023-10-16

我需要使用VirtualProtect,我的问题是关于传递给函数的区域地址。它说(在 MSDN 上)"描述起始页的地址",它必须是页面开头的地址还是该页面中的任何地址?换句话说,我应该首先使用VirtualQuery来确定页面的起始地址吗?

不需要传入页面的基址。 VirtualProtect将接受页面中的任何地址。dwSize参数的描述清楚地表明了这一点:

受影响页面的区域包括包含从 lpAddress 参数到 (lpAddress+dwSize) 范围内的一个或多个字节的所有页面。这意味着跨越页面边界的 2 字节范围会导致两个页面的保护属性发生更改。

如果您能够有一个跨越页面边界的双字节范围,那么lpAddress必须在页面结束之前只有一个字节。页面不能只有一个字节长,因此它不在页面的开头。

无论哪种情况,您都不需要VirtualQuery - 页面始终是PAGE_SIZE的倍数,通常为 4 KiB。因此,您只需要将数字四舍五入到最接近的PAGE_SIZE

但我不认为你需要四舍五入;我认为任何地址都可以。不过,可能值得仔细检查。