【发布时间】:2012-05-31 18:07:41
【问题描述】:
我需要使用 VirtualProtect,我的问题是关于传递给函数的区域地址。 它说(在 MSDN 上)“描述起始页面的地址”,它必须是页面开头的地址还是该页面中的任何地址? 也就是说,我应该先用VirtualQuery来确定页面的起始地址吗?
【问题讨论】:
标签: c++ winapi virtualquery
我需要使用 VirtualProtect,我的问题是关于传递给函数的区域地址。 它说(在 MSDN 上)“描述起始页面的地址”,它必须是页面开头的地址还是该页面中的任何地址? 也就是说,我应该先用VirtualQuery来确定页面的起始地址吗?
【问题讨论】:
标签: c++ winapi virtualquery
您不需要传入页面的基地址。 VirtualProtect 将接受页面内的任何地址。 description of the dwSize parameter 说明了这一点:
受影响页面的区域包括包含从lpAddress 参数到(lpAddress+dwSize) 范围内的一个或多个字节的所有页面。这意味着跨越页面边界的 2 字节范围会导致两个页面的保护属性都发生更改。
如果您能够有一个跨越页面边界的两字节范围,那么lpAddress 必须有可能在页面末尾之前只有一个字节。页面不能只有一个字节长,所以它不在页面的开头。
【讨论】:
在任何一种情况下,您都不需要VirtualQuery——页面总是PAGE_SIZE 的倍数,通常为4 KiB。因此,您只需要将您的号码四舍五入到最接近的PAGE_SIZE。
但我认为你不需要四舍五入;我认为任何地址都可以。不过,这可能值得仔细检查。
【讨论】: