【问题标题】:Does VirtualProtect require the address of the beginning of the page?VirtualProtect 是否需要页面开头的地址?
【发布时间】:2012-05-31 18:07:41
【问题描述】:

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

【问题讨论】:

    标签: c++ winapi virtualquery


    【解决方案1】:

    您不需要传入页面的基地址。 VirtualProtect 将接受页面内的任何地址。 description of the dwSize parameter 说明了这一点:

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

    如果您能够有一个跨越页面边界的两字节范围,那么lpAddress 必须有可能在页面末尾之前只有一个字节。页面不能只有一个字节长,所以它不在页面的开头。

    【讨论】:

      【解决方案2】:

      在任何一种情况下,您都不需要VirtualQuery——页面总是PAGE_SIZE 的倍数,通常为4 KiB。因此,您只需要将您的号码四舍五入到最接近的PAGE_SIZE

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

      【讨论】:

        猜你喜欢
        • 2015-04-26
        • 1970-01-01
        • 2023-04-05
        • 2021-05-10
        • 1970-01-01
        • 2016-09-06
        • 1970-01-01
        • 1970-01-01
        • 2012-03-02
        相关资源
        最近更新 更多