c - 如何将 Win32 异常代码转换为字符串?

标签 c winapi seh

我不情愿地不得不再次处理 Win32 结构化异常。我正在尝试生成一个描述异常的字符串。其中大部分都很简单,但我坚持一些基本的东西:我如何转换异常代码(GetExceptionCode() 的结果,或 ExceptionCode 的成员EXCEPTION_RECORD) 转换成描述异常的字符串?

我正在寻找可以将例如 0xC0000005 转换为“访问冲突”的东西。它只是调用 FormatMessage() 吗?

最佳答案

结构化异常代码是通过 NTSTATUS 编号定义的。虽然有人来自 MS suggests使用 FormatMessage()将 NTSTATUS 数字转换为字符串,我不会这样做。标记 FORMAT_MESSAGE_FROM_SYSTEM 用于转换 GetLastError() 的结果成一个字符串,所以这里没有意义。将标志 FORMAT_MESSAGE_FROM_HMODULEntdll.dll 一起使用将导致某些代码的结果不正确。例如,对于 EXCEPTION_ACCESS_VIOLATION,您将得到 The instruction at 0x,这不是很有用:)。

当您查看存储在 ntdll.dll 中的字符串时,很明显其中许多应该与 printf() 一起使用。功能,不与FormatMessage() .例如,EXCEPTION_ACCESS_VIOLATION 的字符串是:

0x%08lx 处的指令引用了 0x%08lx 处的内存。内存不能是 %s。

%0FormatMessage() 处理作为转义序列意味着消息终止符,而不是插入。插入是 %1 到 %99。这就是为什么标记 FORMAT_MESSAGE_IGNORE_INSERTS 没有任何区别。

您可能希望从 ntdll.dll 加载字符串并将其传递给 vprintf()但您需要完全按照字符串指定的方式准备参数(例如,对于 EXCEPTION_ACCESS_VIOLATION,它是 unsigned longunsigned longchar*)。这种方法有一个主要缺点:ntdll.dll 中参数的数量、顺序或大小的任何更改都可能破坏您的代码。

因此,将字符串硬编码到您自己的代码中会更安全、更容易。我发现在没有与我协调的情况下使用其他人准备的字符串是危险的 :) 而且还有其他功能。这只是故障的另一种可能性。

关于c - 如何将 Win32 异常代码转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7915215/

相关文章:

自定义全局热键

c - C程序中的非法初始化

c++ - 从某些 TreeView 项目中删除图像?

c++ - WindowProc 中的异常

c++ - C2712 : Cannot use __try in functions that require object unwinding

c - 根据输入没有得到想要的输出

c - 在 C 中按字母顺序排序名称

c++ - 如何处理 Win32 多行编辑控件中的 Enter 键?

delphi - COM Elevation Moniker 在 Vista/Windows 7 下无法提升服务器

c++ - 使用 SEH(结构化异常处理)时观察到的不同行为