Windows ドライバーへの WPP ソフトウェア トレースの追加

カーネル モード ドライバーやユーザー モード アプリケーションなどのトレース プロバイダーで WPP ソフトウェア トレースを使用するには、コード (または インストルメント) ドライバー ソース ファイルを追加し、ドライバー プロジェクトを変更する必要があります。 このセクションでは、これらの手順について説明します。

ヒント: ドライバーに WPP トレースを追加する最も簡単な方法は、Visual Studio で KMDF または UMDF ドライバー テンプレートのいずれかを使用することです。 テンプレートを使用する場合、追加する必要があるコードの多くは既に行われています。 Visual Studio で、 [新しい >プロジェクト> のファイル] を選択し、Windows ドライバー (ユーザー モードまたはカーネル モード) WDF プロジェクトを選択します。 WPP マクロは、プロジェクトの一部として含まれている Trace.h ヘッダー ファイルで定義されます。 いずれかのテンプレートを使用する場合は、 手順 5に進むことができます。

手順 1: コントロール GUID とトレース フラグを定義する

すべてのトレース プロバイダー (ドライバー、ユーザー モード アプリなど) を一意に定義する必要があります。 これを行うには、コントロール GUID、 識別子、トレース フラグを定義する WPP_CONTROL_GUIDS マクロを追加します。 これは、トレースするタイミングと対象を特定して制御できるように行われます。 通常、各ドライバーは個別のコントロール GUID を持ちますが、ドライバーは複数のコントロール GUID を持つ場合もあれば、複数のドライバーが 1 つのコントロール GUID を共有することもできます。

便宜上、 WPP_CONTROL_GUIDS マクロは通常、共通のヘッダー ファイルで定義されます。 トレース用にインストルメント化するソース ファイルには、ヘッダー ファイルを含める (#include) 必要があります。

ドライバー WPP_CONTROL_GUIDSマクロを追加するには:

  1. WPP トレース マクロの定義に使用できる新しい C++ ヘッダー ファイルを Visual Studio プロジェクトに追加します。 たとえば、ソリューション エクスプローラーでドライバーを長押し (または右クリック) し、 [新しい > 項目の追加]を選択します。 ファイルを保存します (例: Trace.h)。

  2. WPP_CONTROL_GUIDS マクロを追加して、トレース プロバイダーのフレンドリ名を指定し、コントロール GUID を定義し、特定のトレース メッセージを修飾するために使用できるトレース フラグを定義します。

    WPP_CONTROL_GUIDS マクロには、次の構文があります。

    WPP_CONTROL_GUIDSの構文

    #define WPP_CONTROL_GUIDS \
        WPP_DEFINE_CONTROL_GUID(GUIDFriendlyName, (ControlGUID),  \
            WPP_DEFINE_BIT(NameOfTraceFlag1)  \
            WPP_DEFINE_BIT(NameOfTraceFlag2)  \
            .............................   \
            .............................   \
            WPP_DEFINE_BIT(NameOfTraceFlag31) \
            )
    

    たとえば、次のコードでは、 GUIDFriendlyName として myDriverTraceGuid を 使用します。 ControlGUID には、32 桁の 16 進 GUID の標準形式とは少し異なる形式があることに注意してください。 ControlGUID には 5 つのフィールドがありますが、通常のハイフンと中かっこではなく、コンマで区切られ、かっこで囲まれています。 たとえば、(84bdb2e9-829e-41b3-b891-02f454bc2bd7) の代わりに(84bdb2e9,829e,41b3,b891,02f454bc2bd7) を指定します。

    WPP_CONTROL_GUIDS ステートメントの例

    #define WPP_CONTROL_GUIDS                                              \
        WPP_DEFINE_CONTROL_GUID(                                           \
            myDriverTraceGuid, (84bdb2e9,829e,41b3,b891,02f454bc2bd7), \
            WPP_DEFINE_BIT(MYDRIVER_ALL_INFO)        /* bit  0 = 0x00000001 */ \
            WPP_DEFINE_BIT(TRACE_DRIVER)             /* bit  1 = 0x00000002 */ \
            WPP_DEFINE_BIT(TRACE_DEVICE)             /* bit  2 = 0x00000004 */ \
            WPP_DEFINE_BIT(TRACE_QUEUE)              /* bit  3 = 0x00000008 */ \
            )                             
    

    ヒント : このコード スニペットをヘッダー ファイルにコピーできます。 コントロール GUID とフレンドリ名を必ず変更してください。 GUIDgen.exeを使用して、コントロール GUID を生成できます。 Guidgen.exeは Visual Studio に含まれています (ツール > の GUIDの作成)。 Uuidgen.exe ツールを使用することもできます。このツールは、Visual Studio のコマンド プロンプト ウィンドウから入手できます (詳細については、「uuidgen.exe/? 」と入力)。

  3. トレース プロバイダーの トレース フラグ を定義します。

    WPP_CONTROL_GUIDS マクロのWPP_DEFINE_BIT要素は、トレース プロバイダーのトレース フラグを定義します。 通常、フラグはますます詳細なレポート レベルを表しますが、トレース メッセージを生成する条件として任意の方法でフラグを使用できます。 WPP_CONTROL_GUIDSの例では、WPP_DEFINE_BITは 4 つのトレース フラグ (MYDRIVER_ALL_INFO、TRACE_DRIVER、TRACE_DEVICE、およびTRACE_QUEUE) を定義しています。

    最大 31 個のトレース フラグを定義できます。 WPP は、ビット 0 (0x1)、ビット 1 (0x2)、ビット 2 (0x4)、ビット 3 (0x8) などの順序でビット値を要素に割り当てます。 トレース フラグは、ソース コードにトレース メッセージ関数を追加するときに使用します (「手順 5: ドライバー コードをインストルメント化して、適切なポイントでトレース メッセージを生成する」で説明します)。

    注: トレース フラグを使用すると、特定のコンポーネント (たとえば、特定の I/O 要求、デバイスまたはドライバー オブジェクトのアクティビティ) をトレースするタイミングを制御できます。 トレース フラグをトレース メッセージ ステートメントに追加します (例: DoTraceMessage (TRACE_DRIVER, "Hello World!\n"). Tracelog などのトレース コントローラーでトレース セッションを作成する場合は、そのセッションでトレース プロバイダーに使用する -flag オプションを指定します。この場合、フラグはビット 1 (0x1) で、TRACE_DRIVER フラグに対応します。 トレース セッションを開始すると、トレース フラグを指定するすべてのトレース メッセージがログに書き込まれます。

手順 2: 使用するトレース メッセージ関数を選択し、それらの関数の WPP マクロを定義する

デバッグ出力関数と同様に、トレース メッセージ関数は、トレース メッセージを書き込むコードに追加する関数 (またはマクロ) です。

トレース メッセージ関数の選択

  1. 既定のトレース メッセージ関数は DoTraceMessage マクロです。 既定の関数を使用する場合は、プロバイダーの トレース フラグ 値を使用してメッセージを生成するタイミングを制御できます。 トレース フラグの値は、手順 1 でコントロール GUID を作成したときに定義したフラグです。 DoTraceMessageを使用する場合は、既定の WPP マクロが既に定義されているため (WPP_LEVEL_ENABLEDとWPP_LEVEL_LOGGER)、この手順の残りの部分をスキップして 手順 5に進むことができます。

  2. KMDF テンプレートまたは UMDF テンプレートのいずれかを使用している場合は、 TraceEvents 関数と、その関数を有効にするために必要な WPP マクロが既に定義されているため、 手順 5に進むことができます。

  3. 独自のトレース メッセージ関数を作成する場合、または既存のデバッグ出力関数を変換する場合は、この手順の残りの部分に進みます。

トレース メッセージ関数の作成またはカスタマイズ

  1. カスタム トレース メッセージ関数を使用している場合、またはデバッグ出力関数 (KdPrintなど) を変換してトレース メッセージを生成する場合は、トレース プロバイダーでトレース メッセージ関数を識別して有効にする WPP マクロを定義する必要があります。 これらのマクロを、プロジェクトに追加した Trace.h ヘッダー ファイルに配置します。

  2. トレース関数を有効にする WPP マクロを定義します。

    使用する各トレース メッセージ関数には、対応するマクロのペアが必要です。 これらのマクロは、トレース プロバイダーを識別し、メッセージを生成する条件を指定します。 通常は、既定のWPP_LEVEL_ENABLEDとWPP_LEVEL_LOGGERマクロの観点から、マクロ、 WPP_<condition>_LOGGER および WPP_<condition>_ENABLED のペアを定義します。

使用する各トレース メッセージ関数には、対応するマクロのペアが必要です。 これらのマクロは、トレース プロバイダーを識別し、メッセージを生成する条件を指定します。 通常は、既定のWPP_LEVEL_ENABLEDとWPP_LEVEL_LOGGERマクロの観点から、マクロ、 WPP_<condition>_LOGGER および WPP_<condition>_ENABLED のペアを定義します。

用語 説明

WPP_CONDITIONS_LOGGER

プロバイダーに関連付けられているトレース セッションを検索し、セッションにハンドルを返すために使用します。

WPP_CONDITIONS_ENABLED

指定した条件でログ記録が有効になっているかどうかを判断するために使用します。

定義した WPP マクロの場合、 CONDITIONS はトレース メッセージ関数がサポートする条件を、関数のパラメーター リストに表示される順序でアンダースコアで区切って表します。 たとえば、既定のトレース メッセージ関数 DoTraceMessageでは、条件として トレース フラグ のみがサポートされるため、マクロ名 (WPP_LEVEL_ENABLED) にはパラメーターが 1 つだけ存在します。

残念ながら、既定のマクロの名前 (WPP_LEVEL_ENABLEDとWPP_LEVEL_LOGGER) は トレース レベル パラメーターを示しているようですが、実際にはトレース フラグを参照します。

カスタム トレース メッセージ関数を使用する場合は、 トレース レベルなどの追加の修飾子を設定できます。 トレース レベルは Evntrace.h ファイルで定義され、トレース レベルは、トレース メッセージをエラー、警告、および情報メッセージとして分類する便利な方法を提供します。

たとえば、プロジェクトに追加したヘッダー ファイルに次のコード スニペットを追加できます。 次のコードでは、トレース メッセージを生成する条件として トレース レベル パラメーターとトレース フラグ パラメーターの両方をサポートするトレース メッセージ関数のカスタム WPP マクロを定義します。 指定した FLAGS 値に対してログ記録が有効で、有効な LEVEL 値がトレース メッセージ関数呼び出しで使用されるレベル引数以上の場合、 WPP_LEVEL_FLAGS_ENABLED マクロは TRUE を返します。

#define WPP_LEVEL_FLAGS_LOGGER(lvl,flags) \
           WPP_LEVEL_LOGGER(flags)

#define WPP_LEVEL_FLAGS_ENABLED(lvl, flags) \
           (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level >= lvl)

次に、WPP 構成ブロック (begin_wpp構成end_wpp) でカスタム トレース関数を指定する必要があります。たとえば、Visual Studio で UMDF または KMDF ドライバー プロジェクトのテンプレートを使用する場合、テンプレートは TraceEventsという カスタム トレース メッセージ関数の WPP マクロを定義します。 TraceEvents マクロ関数は、メッセージを生成するための条件として トレース レベル とトレース フラグを使用します。 Trace.h ヘッダー ファイルで WPP_LEVEL_FLAGS_ENABLED マクロを定義した場合は、次のマクロ定義を追加できます。

//
// This comment block is scanned by the trace preprocessor to define the 
// TraceEvents function.
//
// begin_wpp config
// FUNC TraceEvents(LEVEL, FLAGS, MSG, ...);
// end_wpp
//

WPP 構成ブロックに同様 の FUNC 宣言を追加することで、既存のデバッグ print ステートメントをトレース メッセージ ステートメントに変換することもできます。 たとえば、次の例では、既存の KdPrint ステートメントを変換するコードを追加します。 また、 FUNC 宣言では、指定したトレース レベルとフラグ {LEVEL=TRACE_LEVEL_INFORMATION, FLAGS=TRACE_DRIVER} を使用するように KdPrint をグローバルに定義します。 デバッガーに出力を送信する代わりに、デバッグ印刷ステートメントがトレース ログに送信されます。

//
// This comment block is scanned by the trace preprocessor to define the
// TraceEvents function and conversion for KdPrint. Note the double parentheses for the KdPrint message, for compatibility with the KdPrint function.
//
// begin_wpp config
// FUNC TraceEvents(LEVEL, FLAGS, MSG, ...);
// FUNC KdPrint{LEVEL=TRACE_LEVEL_INFORMATION, FLAGS=TRACE_DRIVER}((MSG, ...));
// end_wpp
//

KdPrintEx をトレース メッセージ関数に変換する場合は、いくつかの追加の手順を実行する必要があります。 KdPrintと比較して KdPrintEx 関数は 2 つの追加の引数を受け取ります。 KdPrintEx 関数を変換するには、 ComponentIDWPP_DEFINE_BIT を定義し、カスタム WPP_<condition>_LOGGERWPP_<condition>_ENABLED マクロを定義する必要があります。 KdPrintEx の 2 番目のパラメーターは、レベルが トレース レベル の値に似ているを指定するため、必ずしもそれらを再定義する必要はありません。


#define WPP_CONTROL_GUIDS                                              \
    WPP_DEFINE_CONTROL_GUID(\
    myDriverTraceGuid, (11C3AAE4, 0D88, 41b3, 43BD, AC38BF747E19), \    /* change GUID for your provider */
        WPP_DEFINE_BIT(MYDRIVER_ALL_INFO)        /* bit  0 = 0x00000001 */ \
        WPP_DEFINE_BIT(TRACE_DRIVER)             /* bit  1 = 0x00000002 */ \
        WPP_DEFINE_BIT(TRACE_DEVICE)             /* bit  2 = 0x00000004 */ \
        WPP_DEFINE_BIT(TRACE_QUEUE)              /* bit  3 = 0x00000008 */ \
        WPP_DEFINE_BIT(DPFLTR_IHVDRIVER_ID)      /* bit  4 = 0x00000010 */\         /* Added for the ComponentID param of KdPrintEx */
    )

#define WPP_Flags_LEVEL_LOGGER(Flags, level)                                  \
    WPP_LEVEL_LOGGER(Flags)

#define WPP_Flags_LEVEL_ENABLED(Flags, level)                                 \
    (WPP_LEVEL_ENABLED(Flags) && \
    WPP_CONTROL(WPP_BIT_ ## Flags).Level >= level)



//
// This comment block is scanned by the trace preprocessor to convert the KdPrintEx function.
// Note the double parentheses for the KdPrint message, for compatiblility with the KdPrintEx function.
//
// begin_wpp config
// FUNC KdPrintEx((Flags, LEVEL, MSG, ...));   
// end_wpp
//

手順 3: 関連付けられているトレース ヘッダー ファイル (.h および .tmh) を C または C++ のソース ファイルに含める

ヘッダー ファイル (trace.h など) でドライバーのコントロール GUID とトレース フラグを定義した場合は、WPP の初期化とアンロード (手順 4) またはトレース メッセージ関数の呼び出しを行うソース ファイルにヘッダー ファイルを含める必要があります。

さらに、 トレース メッセージ ヘッダー ファイル (.tmh) の #include ステートメントを追加する必要があります。 ドライバーまたはアプリケーションをビルドすると、WPP プリプロセッサは、トレース メッセージ関数を含む各ソース ファイルのトレース メッセージ ヘッダー ファイル (.tmh) を生成します。

/* -- driver.c  - include the *.tmh file that is generated by WPP --*/

#include "trace.h"     /* file that defines WPP_CONFIG_GUIDS and trace flags */
#include "driver.tmh"  /* this file is auto-generated */

手順 4: WPP を初期化してクリーンする適切なコールバック関数にマクロを追加する

ドライバー エントリで WPP を初期化するには

  • WPP_INIT_TRACING マクロをカーネル モード ドライバーまたは UMDF 2.0 ドライバーの DriverEntry ルーチン、またはユーザー モード ドライバー (UMDF 1.x) またはアプリケーションの DLLMain ルーチンに追加します。

ドライバー終了時に WPP リソースをクリーンするには

  • カーネル モード ドライバーまたは UMDF 2.0 ドライバーのドライバーアンロード ルーチン (DriverContextCleanupDriverUnloadなど) に、 WPP_CLEANUP マクロを追加します。

    ユーザー モード ドライバー (UMDF 1.x) またはアプリケーションの場合は、 DLLMain ルーチンに WPP_CLEANUP マクロを追加します。

    また、 DriverEntry が失敗した場合に備えて、 WPP_CLEANUP マクロを DriverEntry ルーチンに追加する必要があります。 たとえば、 DriverEntry が失敗した場合、ドライバーアンロード ルーチンは呼び出されません。 次の例では、 WdfDriverCreate の呼び出しを参照してください。

DriverEntryでWPP_INIT_TRACINGとWPP_CLEANUPを使用するカーネル モード ドライバーの 例


NTSTATUS
DriverEntry(
    _In_ PDRIVER_OBJECT  DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{  

          //  ... 

                //
    // Initialize WPP Tracing in DriverEntry
    //
    WPP_INIT_TRACING( DriverObject, RegistryPath );

                //  ...


 //
    // Create a framework driver object to represent our driver.
    //
    status = WdfDriverCreate(
        DriverObject,
        RegistryPath,
        &attributes, // Driver Object Attributes
        &config,          // Driver Config Info
        WDF_NO_HANDLE // hDriver
        );

    if (!NT_SUCCESS(status)) {

        TraceEvents(TRACE_LEVEL_ERROR, DBG_INIT,
                "WdfDriverCreate failed with status 0x%x\n", status);
        //
        // Cleanup tracing here because DriverContextCleanup will not be called
        // as we have failed to create WDFDRIVER object itself.
        // Please note that if you return failure from DriverEntry after the
        // WDFDRIVER object is created successfully, you don't have to
        // call WPP cleanup because in those cases DriverContextCleanup
        // will be executed when the framework deletes the DriverObject.
        //
        WPP_CLEANUP(DriverObject);

    }

                return status;

}

DriverContextCleanup でWPP_CLEANUPを使用するカーネル モード ドライバーの例



VOID
DriverContextCleanup(
       PDRIVER_OBJECT DriverObject
       )
{
    // ...

    // Clean up WPP resources on unload
    //
    WPP_CLEANUP(DriverObject);

   // ...

}

DriverEntry でWPP_INIT_TRACINGを使用する UMDF 2.0 ドライバーの例


/
// Driver specific #defines in trace header file (trace.h)
//
#define MYDRIVER_TRACING_ID      L"Microsoft\\UMDF2.0\\UMDF2_0Driver1 V1.0"

 // Initialize WPP Tracing in the DriverEntry routine
 //
    WPP_INIT_TRACING( MYDRIVER_TRACING_ID );

DLLMain での UMDF 1.0 ドライバーのWPP_INIT_TRACINGマクロと WPP_CLEANUP マクロの使用例

/
// Driver specific #defines in trace header file (for example, trace.h)
//
#define MYDRIVER_TRACING_ID      L"Microsoft\\UMDF1.X\\UMDF1_XDriver1"


//
// DLL Entry Point - UMDF 1.0 example in the source file where you implement the DLL exports.
// 

extern "C"
BOOL
WINAPI
DllMain(
    HINSTANCE hInstance,
    DWORD dwReason,
    LPVOID lpReserved
    )
{
    if (dwReason == DLL_PROCESS_ATTACH) {
        WPP_INIT_TRACING(MYDRIVER_TRACING_ID);              // Initialize WPP tracing

        g_hInstance = hInstance;
        DisableThreadLibraryCalls(hInstance);

    } else if (dwReason == DLL_PROCESS_DETACH) {
        WPP_CLEANUP();                                                                                                              // Deactivate and cleanup WPP tracing
    }

    return _AtlModule.DllMain(dwReason, lpReserved);
}

手順 5: ドライバー コードをインストルメント化して、適切なポイントでトレース メッセージを生成する

トレース メッセージ関数、トレース フラグ、およびレベルが適切に定義されていれば、任意のトレース メッセージ関数を使用できます。 既定のトレース メッセージ関数は DoTraceMessage マクロです。 このマクロをコードに追加して、ログ ファイルにメッセージを書き込むことができます。 次の表に、定義済みのトレース メッセージ関数と、トレース メッセージの作成に使用できるデバッグ印刷関数の一部を示します。

トレース メッセージ関数の例 いつ使用するか
DoTraceMessage

これが既定のトレース メッセージ関数です。 DoTraceMessage を使用する利点は、関数が既に定義されていることです。 WPP_CONFIG_GUIDS マクロで指定したトレース フラグを使用できます。 DoTraceMessage を使用する場合の欠点は、関数が受け取る条件付きパラメーター 、つまりトレース フラグが 1 つだけであるという点です。 トレース レベルを使用する場合、エラー メッセージまたは警告メッセージのみをログに記録するには、 DoDebugTrace マクロを使用するか、トレース フラグとトレース レベルの両方を使用する TraceEvents を使用します。

TraceEvents

Visual Studio で WDF テンプレートを使用してドライバーを作成する場合、これが既定のトレース メッセージ関数です。 TraceEvents を使用する利点は、トレース メッセージ関数、トレース フラグ、および トレース レベル が既に定義されていることです。 さらに、テンプレートには、関数の入力と終了時にログ ファイルにメッセージを書き込むインストルメンテーションも含まれています。

KdPrint, KdPrintEx, DbgPrint, DbgPrintEx

デバッグ印刷関数を使用する利点は、既存のデバッグ印刷ステートメントを変更する必要がないようにすることです。 デバッガーでのメッセージの表示から、ファイル内のトレース メッセージの記録に簡単に切り替えることができます。 デバッグ出力関数の 1 つを含むようにトレース メッセージ関数をカスタマイズした場合は、それ以上の作業を行う必要はありません。 Logman または Tracelog、または別のトレース コントローラーを使用してトレース セッションを作成する場合は、プロバイダーのフラグとレベルを指定するだけです。 指定した条件を満たすデバッグ印刷ステートメントは、ログに出力されます。

DoTraceMessage ステートメントの使用

  1. デバッグ印刷ルーチンと同様に、 DoTraceMessage マクロをコードに追加します。 DoTraceMessage マクロは、フラグ レベル (TraceFlagName) という 3 つのパラメーターを受け取ります。これは、トレース メッセージの書き込み時の条件、 メッセージ 文字列、およびオプションの変数リストを定義します。

    DoTraceMessage(TraceFlagName, Message, [VariableList... ]
    

    たとえば、次の DoTraceMessage ステートメントは、WPP_CONTROL_GUIDSで定義されているTRACE_DRIVER フラグがトレース セッションに対して有効になっている場合に、 DoTraceMessage ステートメントを含む関数の名前を書き込みます。

         DoTraceMessage( TRACE_DRIVER, "\nEntering %!FUNC!" );
    
    

    この例では、現在実行中の関数 (%FUNC!) に定義済みの文字列を使用します。 WPP で定義された書式指定文字列の詳細については、「WPP 拡張書式指定文字列とは」を参照してください 。

  2. トレース メッセージを生成するには、Logman または Tracelogを使用してトレース プロバイダーのトレース セッションを作成し、TRACE_DRIVER フラグ (ビット 1、0x2) を設定するトレース フラグを指定します。

//
//  DoTraceMessage examples
// 

     ...

// writes the name of the function that contains the trace statement when the flag, TRACE_DRIVER (bit 1, 0x2), 
// as defined in WPP_CONTROL_GUIDS, is enabled for the trace session.

     DoTraceMessage( TRACE_DRIVER, "\nEntering %!FUNC!" );

     ...

// writes the name of the function, the line number, and the error code 

      DoTraceMessage(
            TRACE_DRIVER,
            "[%s] Failed at %d (error code= %d)\n",
            __FUNCTION__,
            __LINE__,
            dwLastError);

Visual Studio で Windows ドライバー テンプレートを使用している場合は、 Trace.h ヘッダー ファイルで TraceEvents マクロが定義されます。

TraceEvents ステートメントの使用

  1. デバッグ印刷ルーチンと同様に、 TraceEvents マクロをコードに追加します。 TraceEvents マクロは、トレース レベル (レベル) とトレース フラグ (フラグ) を受け取ります。トレース フラグは、トレース メッセージの書き込み時の条件、 メッセージ 文字列、およびオプションの変数リストを定義します。

    TraceEvents(Level, Flags, Message, [VariableList... ]
    

    たとえば、次の TraceEvents ステートメントは、 トレース レベル パラメーターとトレース フラグ パラメーターで指定された条件が満たされたときに、 TraceEvents ステートメントを含む関数の名前を書き込みます。 トレース レベルは整数値です。そのトレース セッションに対して指定されたトレース レベル以下の何でもトレースされます。 TRACE_LEVEL_INFORMATIONは Evntrace.h で定義され、値は 4 です。 TRACE_DRIVER フラグ (ビット 1、0x2) は、WPP_CONTROL_GUIDSで定義されます。 トレース セッションに対してこのTRACE_DRIVER ビットが設定されていて、トレース レベルが 4 以上の場合、 TraceEvents はトレース メッセージを書き込みます。

            TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry");
    
    

    この例では、現在実行中の関数 (%FUNC!) に定義済みの文字列を使用します。 WPP で定義された書式指定文字列の詳細については、「WPP 拡張書式指定文字列とは」を参照してください 。

  2. トレース メッセージを生成するには、Logman または Tracelog を使用して、トレース プロバイダーのトレース セッションを作成します。 TRACE_LEVEL_INFORMATION (4) 以上のトレース レベルを指定し、TRACE_DRIVER ビット (ビット 1、0x2) を設定するトレース レベルを指定します。

//
//  TraceEvents examples
// 


    TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry");

//


    TraceEvents(TRACE_LEVEL_INFORMATION, DBG_INIT,
                       "OSRUSBFX2 Driver Sample - Driver Framework Edition.\n");

    TraceEvents(TRACE_LEVEL_INFORMATION, DBG_INIT,
                "Built %s %s\n", __DATE__, __TIME__);

手順 6: Visual Studio プロジェクトを変更して WPP プリプロセッサを実行し、ソリューションをビルドする

WDK では WPP プリプロセッサがサポートされているため、Visual Studio と MSBuild 環境を使用してプリプロセッサを実行できます。

WPP プリプロセッサを実行するには

  1. ソリューション エクスプローラーでドライバー プロジェクトを長押し (または右クリック) し、 [プロパティ]を選びます。
  2. プロジェクトプロパティページで、 構成プロパティ をクリックして WPP トレースを選択します。
  3. [全般] で、 [WPP の実行] オプションを [はい] に設定します。
  4. [コマンド ライン]で、 追加オプションを追加してトレース動作をカスタマイズできます。 追加できる内容については、「WPP プリプロセッサ」を参照してください。
  5. ターゲットの構成とプラットフォームのプロジェクトまたはソリューションをビルドします。 WDK を使ったドライバーのビルドを参照してください。

ビルド プロセスの詳細については、「TraceWPP タスクWDK および Visual Studio のビルド環境」を参照してください。

TraceWPP ツール (TraceWPP.exe) を使用して、ビルド環境とは別にプリプロセッサを実行することもできます。 このツールは、WDK の bin/x86 および bin/x64 サブディレクトリにあります。

手順 7: トレース セッションを開始してトレース メッセージをキャプチャして確認する

WPP トレースが正しく設定されていることを確認するには、ドライバーまたはアプリケーションをテスト コンピューターにインストールし、トレース メッセージをキャプチャするトレース セッションを作成する必要があります。 Logman、 TracelogTraceView などの任意のトレース コントローラーを使用して、トレース プロバイダーのトレース セッションを作成できます。 メッセージをログ ファイルに書き込んだり、カーネル デバッガーに送信したりできます。 使用しているトレース メッセージ関数に応じて、メッセージを生成するトレース フラグとトレース レベルを必ず指定する必要があります。

たとえば、Evntrace.h で定義されているトレース レベルを使用していて、TRACE_LEVEL_INFORMATION (4) 以上をキャプチャする場合は、レベルを 4 に設定する必要があります。 トレース セッションのレベルを 4 に設定すると、すべての情報 (4)、警告 (3)、エラー (2)、および重大 (1) メッセージもキャプチャされます。トレース フラグなどの他の条件も満たされていると仮定します。

すべてのメッセージが生成されることを確認するには、トレース レベルとトレース フラグを最大値に設定するだけで、すべてのメッセージが生成されます。 トレース フラグはビット マスク (ULONG) を使用するため、すべてのビット (たとえば、0xFFFFFFFF) を設定できます。 トレース レベルはバイト値で表されます。 たとえば、Logman を使用している場合は、すべてのレベルに対応する0xFFを指定できます。

(例)Logman を使用したトレース セッションの開始

logman create trace "myWPP_session" -p {11C3AAE4-0D88-41b3-43BD-AC38BF747E19} 0xffffffff 0xff -o c:\DriverTest\TraceFile.etl 

logman start "myWPP_session"

logman stop "myWPP_session"

(例)TraceLog を使用したトレース セッションの開始

tracelog -start MyTrace -guid  MyProvider.guid -f d:\traces\testtrace.etl -flag 2 -level 0xFFFF

Tracelog コマンドには、イベント トレース ログ ファイルの 名前と場所を指定する -f パラメーターが含まれています。 フラグ セットを 指定する -flag パラメーターと、レベル設定を 指定する -level パラメーターが含まれています。 これらのパラメーターは省略できますが、フラグまたはレベルを設定しない限り、一部のトレース プロバイダーはトレース メッセージを生成しません。 トレース レベル は Evntrace.h ファイルで定義され、トレース レベルは、トレース メッセージを重大、エラー、警告、および情報メッセージとして分類する便利な方法を提供します。