다음을 통해 공유


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 파일의 문자열 수 감소)에 가장 작은 영향을 미치도록 최적화되므로 사용합니다. 보다 범용 덤퍼가 필요한 경우 WPP 추적을 포함하고 콜백 루틴을 포함하기 때문에 덤프 API를 사용합니다. 스텁 드라이버에는 이 콜백 루틴을 사용하여 DebugPrint API를 통해 출력을 커널 디버거로 리디렉션하는 예제가 있습니다.

구문 분석 및 생성 API와 달리 덤퍼는 매우 허용됩니다. 지정된 메시지 또는 TLV의 정식 형식에 관계없이 TLV 바이트를 최대한 이해하려고 합니다. 즉, 덤퍼는 파서가 거부하는 항목을 올바르게 디코딩하고 덤프할 수 있습니다.

경고 덤퍼가 바이트를 사람이 읽을 수 있는 형식으로 디코딩하는 경우 바이트가 올바른 형식의 TLV인 것은 아닙니다.

구문 분석 API 와 마찬가지로 pBuffer 포인터 및 BufferLength 매개 변수는 헤더를 제외하고 첫 번째 TLV를 직접 가리킵니다.

API의 메시지 변형에는 TLV를 보다 명확하게 구분하기 위한 메시지 ID와 메시지 방향이 포함됩니다. 이는 컨텍스트에 따라 동일한 TLV ID를 다른 방식으로 디코딩할 수 있기 때문에 유용합니다. 예를 들어 WDI_TLV_BSSID OID_WDI_TASK_SCAN 일부일 때 WDI_MAC_ADDRESS 직접 포함하거나 WDI_TLV_P2P_ATTRIBUTES 일부일 때 WDI_MAC_ADDRESS 목록을 포함할 수 있습니다.