是否可以在调用 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函数生成相同的代码。