【发布时间】:2015-12-01 08:03:51
【问题描述】:
使用我们 API 的客户收到保护页面异常。 他使用 VirtualAlloc 和 VirtualProtect。
当我运行他的示例时,一切正常。
我尝试了来自 Microsoft 的 this 示例,但 VisualStudio 不会引发 0x80000001 异常,即使我已经在“调试”下的异常菜单中打开了它。 但是这个例子清楚地表明:
第一次尝试锁定内存块失败,引发 STATUS_GUARD_PAGE_VIOLATION 异常。
我需要做什么才能获得该异常?
编辑:
客户做了这样的事情:
SYSTEM_INFO systemInfo;
GetSystemInfo(&systemInfo);
DWORD dwPageSize = systemInfo.dwPageSize;
size_t size = width * height * sizeof(MyStruct);
while(size % dwPageSize)
{
height--;
size = width * height * sizeof(MyStruct);
}
size_t dataSize = size + dwPageSize;
MyStruct * my_struct = (MyStruct*)VirtualAlloc(NULL, dataSize, MEM_COMMIT | MEM_RESERVE , PAGE_READWRITE);
if (!my_struct) return;
LPVOID beginGuard = (char*)my_struct + size;
DWORD oldProtection;
BOOL b = VirtualProtect(beginGuard, dwPageSize, PAGE_READWRITE | PAGE_GUARD, &oldProtection);
if(!b) MessageBox(NULL, "Can't set guard page", "", 0);
doSomething(); // some API function
在 'doSomething()' 中的某个地方抛出了提到的异常。但我无法帮助那个客户,因为我没有得到那个例外。
【问题讨论】:
-
您能否详细介绍一下客户是如何获得保护页异常的。向我们展示他的榜样。就 MSDN 中的示例而言,您可以在 cmets 中看到其解释不正确,因为
VirtualLock不会引发异常。实际上是很明显的。我的意思是,在整个 sn-p 中没有处理异常的代码。 -
我编辑了我的帖子以便澄清。
-
那么您在说什么,
doSomething代表客户为引发此异常而执行的一些操作,而您不知道它们是什么?您是否尝试过访问my_struct?将doSomething替换为MyStruct foo = my_struct[0];,应该会得到0x80000001 异常。 -
当他使用 PAGE_GUARD 时,获得 STATUS_GUARD_PAGE_VIOLATION 永远不会让人感到意外。这完全是意图。带有
height变量的 hanky-panky 不太可能是正确的,它几乎注定会变成 0。在这种情况下,对 my_struct 的任何访问都会触发异常。无论它打算做什么(动态扩展分配或生成缓冲区溢出诊断)都不太可能成功。 sizeof(my_struct) 必须是 4096 的倍数。 -
@HansPassant 我的问题是,运行此代码时没有任何异常。我真的不明白为什么不。
标签: c++ visual-studio-2010 exception