使用PAGE_UARD进行VirtualProtect不使用本地变量

VirtualProtect With PAGE_GUARD Not Working With Local Variables

本文关键字:变量 VirtualProtect PAGE UARD 进行 使用      更新时间:2023-10-16

这可以按预期工作。引发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,所以VirtualProtect成功完成。那么,为什么在第二个例子中,当我试图访问受保护的内存时,没有出现异常?

编辑:

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

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功能中已经完成的访问。如果这能很好地处理这个(特定的)异常,它将解释您看到的行为。