次の方法で共有


WDI TLV ダンパー

パーサー ジェネレーター ライブラリには、TLV バイト配列をトレース ステートメントにデコードするルーチンがあります。

    typedef _Function_class_( TlvDumperCallback ) void( __stdcall *TlvDumperCallback )(_In_ UINT_PTR Context, _In_z_ _Printf_format_string_ PCSTR Format, ...);

    void __stdcall TraceUnknownTlvByteStream(
        _In_ ULONG PeerVersion,
        _In_ ULONG BufferLength,
        _In_reads_bytes_( BufferLength ) UINT8 const * pBuffer );

    void __stdcall TraceMessageTlvByteStream(
        _In_ ULONG MessageId,
        _In_ BOOLEAN fToIhv,
        _In_ ULONG PeerVersion,
        _In_ ULONG BufferLength,
        _In_reads_bytes_( BufferLength ) UINT8 const * pBuffer );

    void __stdcall DumpUnknownTlvByteStream(
        _In_ ULONG PeerVersion,
        _In_ ULONG BufferLength,
        _In_reads_bytes_( BufferLength ) UINT8 const * pBuffer,
        _In_opt_ ULONG_PTR Context,
        _In_opt_ TlvDumperCallback pCallback );

    void __stdcall DumpMessageTlvByteStream(
        _In_ ULONG MessageId,
        _In_ BOOLEAN fToIhv,
        _In_ ULONG PeerVersion,
        _In_ ULONG BufferLength,
        _In_reads_bytes_( BufferLength ) UINT8 const * pBuffer,
        _In_opt_ ULONG_PTR Context,
        _In_opt_ TlvDumperCallback pCallback );

WPP トレースのみが必要な場合は、コード サイズとログ サイズ (ETL ファイル内の文字列の数が少ない) への影響が最小に最適化されているため、トレース API を使用します。 より汎用的なダンプが必要な場合は、WPP トレースを含み、コールバック ルーチンも含めるダンプ API を使用します。 スタブ ドライバーには、このコールバック ルーチンを使用して DebugPrint API を介してカーネル デバッガーに出力をリダイレクトする例があります。

Parse API と Generate API とは異なり、ダンパーは多く許容されます。 特定のメッセージや TLV に対する Canonical 形式に関係なく、可能な限り、TLV バイトを理解しようと試みます。 つまり、パーサーが拒否するものを正しくデコードしてダンプする可能性があります。

警告: ダンパーがバイトを人間が判読できる形式に正常にデコードした場合、バイトが整形式の TLV であることを意味するものではありません。

Parse API と同様に、pBuffer ポインターと BufferLength パラメーターはヘッダーを除外し、最初の TLV を直接指す必要があります。

API の Message バリアントには、TLV をより明確に区別するためのメッセージ ID とメッセージの方向が含まれます。 これは、コンテキストに応じて同じ TLV ID をさまざまな方法でデコードできるため便利です。 たとえば、WDI_TLV_BSSID は、OID_WDI_TASK_SCAN の一部である場合は WDI_MAC_ADDRESS を直接含めることができます。また、WDI_TLV_P2P_ATTRIBUTES の一部である場合は WDI_MAC_ADDRESS の一覧を含めることができます。