Можно ли сохранить код последней ошибки перед вызовом TraceMessage?
По умолчанию TraceMessage вызывается с помощью макроса WPP_TRACE. В версиях Windows, предшествующих Windows Vista, код последней ошибки был перезаписан 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 функции будет создаваться один и тот же код.