【问题标题】:Guard Page Exception - how to raiseGuard Page Exception - 如何引发
【发布时间】: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


【解决方案1】:

要引发代码为 0x80000001 的异常,您需要尝试访问使用 PAGE_GUARD 标志分配和保护的内存。写类似

MyStruct foo = my_struct[0];

并且会引发异常。

就来自 MSDN 的示例而言,您可以在该帖子的 cmets 中看到其解释不正确,因为 VirtualLock 没有引发异常。

【讨论】:

  • 当我按照你说的做时,仍然不会引发异常。
  • @thats_me 您在哪个 Windows 版本上进行测试?我使用 Windows 7 x64。当我运行这段代码时,它会抛出该异常。我正在使用 VS2015,但仍然......当您构建该示例并从命令提示符执行它时会发生什么?
  • 我还在使用带有 VS 2010 的 Windows 7 x64。您是否有机会使用 Sophos AntiVirus?我目前的猜测是,某些防病毒程序负责引发该异常。 (只是猜测。)从 cmd 运行程序没有任何区别。
  • @thats_me 我不使用 Sophos,这与 AV 也没有任何关系。抛出该异常是预期的行为,如PAGE_GUARD 标志的描述中所述:msdn.microsoft.com/en-us/library/windows/desktop/… 您是否尝试仅使用此代码创建示例应用程序,或者您是否在项目中调用它?也许你在处理这个异常的函数调用层次结构中的某个地方有一个 try-catch 块?
  • 我确实创建了一个示例程序,仍然没有异常。
猜你喜欢
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 1970-01-01
  • 2017-06-13
  • 2019-05-10
  • 2023-03-22
相关资源
最近更新 更多