是否可以在调用 TraceMessage 之前保留最后一个错误代码?
默认情况下,使用 WPP_TRACE 宏调用 TraceMessage 。 在早于 Windows Vista 的 Windows 版本中,TraceMessage 覆盖了最后一个错误代码。
从 Windows Vista 开始,可以通过定义自定义WPP_TRACE宏来保留最后一个错误代码。 必须先定义此宏的版本,然后才能在跟踪提供程序的源文件(例如内核模式驱动程序或用户模式应用程序)中包含跟踪消息头 (.tmh) 文件。
以下示例演示如何在调用 TraceMessage 之前保留最后一个错误代码:
使 TraceMessage 成为从 WPP_TRACE 宏调用的包装器。 然后,可以从包装函数调用 TraceMessageVa。
以下示例演示如何将包装写入 TraceMessage:
#define WPP_TRACE WppTraceMessageWrapper DWORD WppTraceMessageWrapper( __in TRACEHANDLE LoggerHandle, __in ULONG MessageFlags, __in LPCGUID MessageGuid, __in USHORT Message Number, ...) { DWORD TraceError = ERROR_SUCCESS; DWORD LastError = ERROR_SUCCESS; va_list Args = NULL; LastError = GetLastError(); va_start(Args, Message Number); TraceError = TraceMessageVa(LoggerHandle, MessageFlags, MessageGuid, Message Number, Args); va_end(Args); SetLastError(LastError); return TraceError; }
修改WPP_TRACE宏,如以下示例所示:
#define WPP_TRACE(...) \ do \ { \ DWORD LastError = GetLastError(); \ TraceMessage(__VA_ARGS__); \ SetLastError(LastError); \ } \ while (FALSE, FALSE)
注意 此方法会增加二进制文件的代码大小,因为将为每个WPP_SF函数生成相同的代码。