Can I preserve the last-error code before TraceMessage is called?

By default, TraceMessage is called by using the WPP_TRACE macro. In versions of Windows earlier than Windows Vista, the last-error code was overwritten by TraceMessage.

Starting with Windows Vista, you can preserve the last-error code by defining a custom WPP_TRACE macro. You must define your version of this macro before you include the trace message header (.tmh) file in the source file of your trace provider, such as a kernel-mode driver or user-mode application..

The following examples show how you can preserve the last-error code before you call TraceMessage:

  • Make a wrapper to TraceMessage that is called from the WPP_TRACE macro. You can then call TraceMessageVa, from the wrapper function.

    The following example shows how to write a wrapper to TraceMessage:

    #define WPP_TRACE 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);
     return TraceError;
  • Modify the WPP_TRACE macro, as shown in the following example:

    #define WPP_TRACE(...)                              \
     do                                              \
        {                                               \
            DWORD LastError = GetLastError();           \
            TraceMessage(__VA_ARGS__);                  \
            SetLastError(LastError);                    \
        }                                               \
     while (FALSE, FALSE)

    Note This method increases the code size of your binary files because the same code will be generated for each WPP_SF function.

Send comments about this topic to Microsoft