Gestionnaires de vidage TLV WDI
La bibliothèque de générateurs d’analyseurs comprend des routines pour décoder des tableaux d’octets de TLV dans des déclarations de trace.
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 vous avez uniquement besoin d’un suivi WPP, utilisez les API de suivi car elles sont optimisées pour avoir le plus faible impact sur la taille du code ainsi que sur la taille du journal (moins de chaînes de caractères dans le fichier ETL). Si vous avez besoin d’un gestionnaire de vidage à usage plus général, utilisez les API de vidage, car elles incluent le suivi WPP et une routine d’appel. Le pilote stub présente un exemple d’utilisation de cette routine de rappel pour rediriger la sortie vers le débogueur du noyau via les API DebugPrint.
Contrairement aux API Parse et Generate, le gestionnaire de vidage est très permissif. Il tente de donner un sens aux octets des TLV du mieux qu’il peut, quelle que soit la forme canonique d’un message ou d’une TLV donnée. Cela signifie qu’il peut décoder et vider correctement ce que l’analyseur rejette.
Avertissement Si le gestionnaire de vidage parvient à décoder les octets dans un format lisible par l’homme, cela ne signifie pas que les octets sont une TLV bien formée.
Comme les API Parse, le pointeur pBuffer et les paramètres BufferLength doivent exclure tous les en-têtes et pointer directement vers la première TLV.
Les variantes de message des API incluent l’ID du message et la direction du message pour mieux lever l’ambiguïté de la TLV. Cela est utile car le même ID de TLV peut être décodé de différentes manières en fonction du contexte. Par exemple, WDI_TLV_BSSID peut contenir directement une WDI_MAC_ADDRESS si c’est une partie de OID_WDI_TASK_SCAN, ou elle peut contenir une liste de WDI_MAC_ADDRESS lorsqu’elle fait partie de WDI_TLV_P2P_ATTRIBUTES.