Можно ли сохранить код последней ошибки перед вызовом 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.