使用PAGE_GUARD的VirtualProtect不使用局部变量

时间:2016-05-10 20:30:53

标签: c++ c windows winapi memory

这可以按预期工作。提出new HtmlPolicyBuilder() .allowCommonBlockElements() .allowCommonInlineFormattingElements() .allowStyling() .allowStandardUrlProtocols() .toFactory()

STATUS_GUARD_PAGE_VIOLATION

然而,当运行这个几乎完全相同的代码时,程序会毫无例外地退出。

int main()
{
    DWORD oldp;
    DWORD *pdp = new DWORD;
    *pdp = 0;
    if (!VirtualProtect(pdp, sizeof(DWORD), PAGE_READWRITE | PAGE_GUARD, &oldp))
        return 1;
    *pdp = 1000;
    return 0;
}

两个程序int main() { DWORD oldp; DWORD pd = 0; DWORD *pdp = &pd; if (!VirtualProtect(pdp, sizeof(DWORD), PAGE_READWRITE | PAGE_GUARD, &oldp)) return 1; *pdp = 1000; return 0; } ,所以exited with code 0正在成功完成。那么,为什么在第二个例子中,当我尝试访问受保护的内存时,没有引发异常?

修改

运行此操作会导致访问冲突;从而证明了Ton的假设。

VirtualProtect

1 个答案:

答案 0 :(得分:7)

在第二个示例中,在应用程序堆栈使用的内存页面上设置PAGE_GUARD。在VirtuaProtect成功之后,对该页面的第一次访问将引发异常。第一次访问不是由'* pdp = 1000'代码完成的。可能这是VirtualProtect函数中已经完成的访问。如果它优雅地处理这个(特定的)异常,它将解释你看到的行为。