Compartilhar via


Dumpers WDI TLV

A biblioteca de geradores de analisador tem rotinas para decodificar matrizes de bytes TLV em instruções de rastreamento.

    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 );

Se você precisar apenas do rastreamento WPP, use as APIs de rastreamento, pois elas são otimizadas para causar o menor impacto no tamanho do código, bem como no tamanho do log (menos cadeias de caracteres no arquivo ETL). Se você precisar de um dumper de uso mais geral, use as APIs de despejo, pois elas incluem o rastreamento WPP e uma rotina de retorno de chamada. O driver de stub tem um exemplo de uso dessa rotina de retorno de chamada para redirecionar a saída para o depurador do kernel via APIs DebugPrint.

Ao contrário das APIs Parse e Generate, o dumper é muito permissivo. Ele tenta entender os bytes TLV da melhor forma possível, independentemente da forma canônica para uma determinada mensagem ou TLV. Isso significa que o dumper pode decodificar e despejar corretamente algo que o analisador rejeita.

Aviso Se o dumper decodificar com êxito os bytes em um formato legível por humanos, isso não significa que os bytes são um TLV bem formado.

Como as APIs Parse, o ponteiro pBuffer e os parâmetros BufferLength devem excluir todos os cabeçalhos e apontar diretamente para o primeiro TLV.

As variantes de mensagem das APIs incluem o ID e a direção da mensagem para desambiguar melhor o TLV. Isso é útil porque a mesma ID do TLV pode ser decodificada de maneiras diferentes, dependendo do contexto. Por exemplo, o WDI_TLV_BSSID pode conter diretamente um WDI_MAC_ADDRESS quando parte de OID_WDI_TASK_SCAN ou pode conter uma lista de WDI_MAC_ADDRESS quando parte de WDI_TLV_P2P_ATTRIBUTES.