Поделиться через


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