WDI TLV 파서 인터페이스 개요
호출 수신자 할당 모델
드라이버 내의 진입점은 TLLV가 포함된 메시지 또는 표시를 받습니다. 코드는 메시지 ID를 추출하고 처리하려는 ID인지 확인한 후 제네릭 구문 분석 루틴을 호출하고 TLV Blob( WDI_MESSAGE_HEADER 지나간 후)을 전달하여 TLLV를 C-구조로 구문 분석합니다.
ndisStatus = Parse(
cbBufferLength,
pvBuffer,
messageId,
&Context,
&pParsed);
반환에서 오류를 확인한 후 코드는 출력 버퍼(pParsed)를 아래 예제와 같이 구체적인 형식으로 캐스팅할 수 있습니다.
((WDI_INDICATION_BSS_ENTRY_LIST_PARAMETERS*)pParsed)
호출자가 구문 분석된 데이터로 완료되면 호출자는 메모리를 다시 파서로 반환해야 합니다. 파서는 올바른 데이터를 해제하도록 할당하는 데 사용되는 원본 메시지 ID를 알고 있어야 합니다.
FreeParsed(messageId, pParsed);
pParsed = NULL;
호출자 할당 모델
이 모델에서 호출자는 구문 분석할 올바른 특정 TLV를 이미 결정했으며 힙에 대한 할당을 방지하기 위해 스택 로컬을 사용할 수 있습니다. 호출자는 로컬을 만들고 특정 구문 분석 루틴을 호출합니다. API에는 메시지 ID가 필요하지 않으며 매개 변수는 한 수준 이하의 간접 참조로 강력하게 입력됩니다.
WDI_GET_ADAPTER_CAPABILITIES_PARAMETERS adapterCapabilitiesParsed;
ndisStatus = ParseWdiGetAdapterCapabilities(
cbBufferLength,
pvBuffer,
&Context
&adapterCapabilitiesParsed);
호출자가 구조체 사용을 완료한 후 호출자는 구문 분석 중에 수행한 할당을 클린 다시 사용할 준비가 되도록 구조를 초기화할 수 있는 기회를 파서에 제공해야 합니다. 매개 변수는 강력한 형식이므로 호출 수신자에게 추가 매개 변수가 필요하지 않습니다.
CleanupParsedWdiGetAdapterCapabilities(&adapterCapabilitiesParsed);
CleanupParse API를 호출한 후 구조체의 모든 데이터가 잘못되었습니다.
일부 메시지에는 연결된 데이터가 없습니다. API의 완성도를 위해 적절하게 명명된 Parse 메서드가 제공됩니다. 이러한 메서드는 바이트 스트림이 비어 있는지 확인합니다. 형식 정의는 매개 변수 형식에 대해 제공되지만 호출자는 호출자 할당 모델을 사용하는 경우 out 매개 변수에 대해 NULL을 전달할 수도 있습니다. 모든 경우에 파서는 빈 구문 분석 구조를 상수로 반환하여 할당을 방지합니다. 호출자는 반환된 빈 구조체에 기록해서는 안 됩니다(따라서 유일한 필드 이름은 _Reserved). 이러한 메시지는 "추가 데이터가 없습니다. 헤더의 데이터로 충분합니다."
메시지 방향
대부분의 메시지는 M1과 M0, M3 또는 M4의 형식이 다릅니다. 이를 수용하기 위해 이러한 메시지에는 다른 구문 분석 및 생성 API가 있습니다. M1 메시지의 경우 API는 MessageName ToIhv 구문 분석<또는 MessageName>>ToIhv 생성<의 명명 규칙을 따릅니다. M0, M3 또는 M4 메시지의 경우 API는 MessageName FromIhv 구문 분석<또는 MessageName>>FromIhv 생성<의 명명 규칙을 따릅니다. 그러나 IHV 미니포트에서 코드를 단순화하기 위해 정의는 MessageName 구문 분석<MessageName> ToIhv에 대한 구문 분석<및 MessageName>을 생성하여 MessageName>FromIhv 생성<에 추가됩니다.>< IHV 코드는 자체 M3를 구문 분석하거나 M1을 생성해야 하는 경우에만 이 별칭을 알고 있어야 합니다.
오류 코드
TLV 파서 생성기는 여러 가지 NDIS_STATUS 코드를 반환할 수 있습니다. 자세한 내용은 WPP 추적 로그를 참조하세요. 로그는 항상 근본 원인을 나타내야 합니다. 다음은 가장 일반적인 오류 코드 목록과 그 의미입니다.
NDIS_STATUS_INVALID_DATA |
구문 분석할 때 고정 크기 TLV의 크기가 잘못되었음을 나타냅니다. 목록의 경우 전체 크기가 개별 요소 크기의 짝수 배수가 아니거나 있어야 하는 것보다 더 많은 요소가 있음을 의미합니다. 이는 1개 이상이 필요한 경우 목록에 0개의 요소가 포함되어 있다는 의미일 수도 있습니다. 0 요소가 필요한 경우 Optional_IsPresent false로 설정해야 합니다(TLV 헤더는 바이트 스트림에 있으면 안 됩니다). |
NDIS_STATUS_BUFFER_OVERFLOW |
를 생성할 때 이는 배열(목록)의 요소 수로 인해 TLV 헤더 내의 2바이트 길이 필드가 오버플로됨을 나타냅니다. 요소 수를 줄여야 합니다. 외부 TLV에 내부 TLV가 너무 많거나 너무 커서 헤더의 2바이트 길이 필드가 다시 오버플로되는 경우에도 발생할 수 있습니다. 구문 분석할 때 TLV 헤더의 길이 필드가 외부 TLV 또는 바이트 스트림보다 크다는 것을 나타냅니다. |
NDIS_STATUS_FILE_NOT_FOUND |
구문 분석할 때 필요한 TLV가 바이트 스트림에 없음을 나타냅니다. 일반적으로 바이트 스트림의 생성기가 있는 버그입니다. |
NDIS_STATUS_RESOURCES |
생성 시 할당자가 실패했음을 나타냅니다. |
NDIS_STATUS_UNSUPPORTED_REVISION |
구문 분석하거나 생성할 때 Context 매개 변수가 NULL이거나 PeerVersion 이 WDI_VERSION_MIN_SUPPORTED 미만입니다. |