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 跟踪,请使用跟踪 API,因为它们经过优化,对代码大小和日志大小的影响最小(ETL 文件中的字符串更少)。 如果需要更常规的用途转储器,请使用转储 API,因为它们包括 WPP 跟踪,还包括回调例程。 存根驱动程序具有使用此回调例程通过 DebugPrint API 将输出重定向到内核调试器的示例。
与解析 API 和生成 API 不同,转储器非常宽松。 无论给定消息或 TLV 的规范形式如何,它都会尽力使 TLV 字节有意义。 这意味着转储器可能会正确解码并转储分析器拒绝的内容。
警告 如果转储器成功地将字节解码为人工可读格式,并不意味着字节就是格式正确的 TLV。
与分析 API 一样, pBuffer 指针和 BufferLength 参数应排除任何标头并直接指向第一个 TLV。
API 的消息变体包括消息 ID 和消息方向,以便更好地消除 TLV 的歧义。 这很有用,因为可以根据上下文以不同的方式解码相同的 TLV ID。 例如,当作为 OID_WDI_TASK_SCAN 的一部分时,WDI_TLV_BSSID 可以直接包含一个 WDI_MAC_ADDRESS,当作为 WDI_TLV_P2P_ATTRIBUTES的一部分时,它也可以包含一个 WDI_MAC_ADDRESS 列表。