这按预期工作。引发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;
}

但是,当运行几乎相同的代码时,程序将毫无异常(exception)地退出。
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,因此VirtualProtect成功完成。为什么在第二个示例中,为什么在我尝试访问 protected 内存时没有引发异常?

编辑:

运行此命令将导致访问冲突;从而证明了吨的假设。
int main()
{
    DWORD oldp;
    DWORD pd = 0;
    DWORD *pdp = &pd;
    if (!VirtualProtect(pdp, sizeof(DWORD), PAGE_NOACCESS, &oldp))
        return 1;
    return 0;
}

最佳答案

在第二个示例中,您在应用程序堆栈使用的内存页面上设置了PAGE_GUARD。 VirtuaProtect成功后,对该页面的首次访问将引发异常。第一次访问不是通过“* pdp = 1000”代码完成的。可能是通过VirtualProtect函数已经完成的访问。如果此方法很好地处理了此(特定)异常,它将说明您看到的行为。

关于c++ - 带有PAGE_GUARD的VirtualProtect无法使用局部变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37148399/

10-10 04:58