Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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 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; }
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.