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 の一覧を含めることができます。