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


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