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