c++ - 带有 PAGE_GUARD 的 VirtualProtect 不使用局部变量

标签 c++ c windows winapi memory

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

两个程序都以代码 0 退出,因此 VirtualProtect 已成功完成。那么,为什么在第二个示例中,当我尝试访问 protected 内存时没有引发异常?

编辑:

运行它会导致访问冲突;从而证明了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 函数中完成的访问。如果这可以优雅地处理这个(特定的)异常,它将解释您看到的行为。

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

相关文章:

c++ - Microsoft C++ HTTP 服务器 API (httpapi.lib) HttpReceiveClientCertificate 函数返回 ERROR_NOT_FOUND ( 1168 )

c++ - Facing Segmentation fault 使用ffmpeg读取视频时,因为 "pFormatCtx-> streams [i]-> codecpar"的地址是0x00

c - C 中非常基本的指针程序中的警告

c++ -\mingw-w64\...\ld.exe : cannot find -lboost_filesystem

c# - C# 的 LINEST 函数模拟

Windows 8 在 Metro 应用程序上分层 Windows

c++ - 如何使用消息队列分析 GUI 应用程序?

c++ - 为什么 typedef 模板是非法的?

在 C 中从 int 转换为 float 会改变值

c - 指针指向的值没有更新