gpt4 book ai didi

windows - 如何获取异常的名称/描述?

转载 作者:可可西里 更新时间:2023-11-01 12:51:46 28 4
gpt4 key购买 nike

您如何获得 SEH 的名称和/或描述?异常无需必须将字符串硬编码到您的应用程序中?

我尝试使用 FormatMessage(),但它有时会截断消息,即使您指定忽略插入也是如此:

__asm { // raise access violation
xor eax, eax
mov eax, [eax]
}

使用代码 0xC0000005 (EXCEPTION_ACCESS_VIOLATION) 引发异常。

char msg[256];
FormatMessageA(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_IGNORE_INSERTS,
GetModuleHandleA("ntdll.dll"), 0xC0000005,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
msg, sizeof(msg), NULL);

用截断的字符串填充 msg:“The instruction at 0x”。

最佳答案

结构化异常代码是通过 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 中参数的数量、顺序或大小的任何更改都可能破坏您的代码。

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

关于windows - 如何获取异常的名称/描述?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/321898/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com