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

Ale*_*lex 2 c c++ memory windows winapi

这按预期工作.A 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,当运行这个几乎相同的代码时,程序会毫无例外地退出.

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;
}
Run Code Online (Sandbox Code Playgroud)

这两个方案exited with code 0,因此VirtualProtect成功完成.那么,为什么在第二个例子中,当我尝试访问受保护的内存时,没有异常?

编辑:

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

int main()
{
    DWORD oldp;
    DWORD pd = 0;
    DWORD *pdp = &pd;
    if (!VirtualProtect(pdp, sizeof(DWORD), PAGE_NOACCESS, &oldp))
        return 1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ton*_*oij 7

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