TraceMessage が呼び出される前の最後のエラー コードを保持できますか?
デフォルトでは、TraceMessage は WPP_TRACE マクロを使用して呼び出されます。 Windows Vista より前のバージョンの Windows では、最後のエラー コードは TraceMessage によって上書きされていました。
Windows Vista 以降では、カスタム WPP_TRACE マクロを定義することで、最後のエラー コードを保存できます。 カーネル モード ドライバーやユーザー モード アプリケーションなどのトレース プロバイダーのソース ファイルにトレース メッセージ ヘッダー (.tmh) ファイルを含める前に、このマクロのバージョンを定義する必要があり。
次の例は、TraceMessage を呼び出す前に最後のエラー コードを保存する方法を示しています。
WPP_TRACE マクロから呼び出される TraceMessage へのラッパーを作成します。 その後、ラッパー関数から 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 関数ごとに同じコードが生成されるため、バイナリ ファイルのコード サイズが増加します。