Volcados de TLV de WDI
La biblioteca del generador de analizadores tiene rutinas para descodificar matrices de bytes de TLV en instrucciones de seguimiento.
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 );
Si solo necesita el seguimiento de WPP, use las API de seguimiento, ya que están optimizadas para tener el menor impacto en el tamaño del código, así como el tamaño del registro (menos cadenas en el archivo ETL). Si necesita un volcado de memoria de uso más general, use las API de volcado de memoria, ya que incluyen el seguimiento de WPP y también incluyen una rutina de devolución de llamada. El controlador de código auxiliar tiene un ejemplo de uso de esta rutina de devolución de llamada para redirigir la salida al depurador de kernel a través de las API de DebugPrint.
A diferencia de las API de análisis y generación, el volcado de memoria es muy permisivo. Intenta dar sentido a los bytes de TLV lo mejor posible, independientemente de la forma canónica de un mensaje o TLV determinado. Esto significa que el volcado de memoria podría descodificar y volcar algo que el analizador rechaza.
Advertencia Si el volcado de memoria descodifica correctamente los bytes en un formato legible, no significa que los bytes sean un TLV con formato correcto.
Al igual que las API de análisis, el puntero pBuffer y los parámetros de BufferLength deben excluir los encabezados y apuntar directamente al primer TLV.
Las variantes de mensaje de las API incluyen el identificador de mensaje y la dirección del mensaje para desambiguar mejor el TLV. Esto resulta útil porque el mismo identificador de TLV se puede descodificar de maneras diferentes en función del contexto. Por ejemplo, WDI_TLV_BSSID puede contener directamente una WDI_MAC_ADDRESS cuando forma parte de OID_WDI_TASK_SCAN o puede contener una lista de WDI_MAC_ADDRESS cuando forma parte de WDI_TLV_P2P_ATTRIBUTES.