WDI TLV パーサー インターフェイスの概要
呼び出し先の割り当てモデル
ドライバー内のエントリ ポイントは、TLV が格納されたメッセージまたは表示を受け取ります。 コードは、メッセージ ID を抽出し、それが処理目的の ID であるかどうかを判断した後、汎用解析ルーチンを呼び出し、(WDI_MESSAGE_HEADER を超えて進んだ後に) TLV BLOB を渡して TLV を 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 を必要とせず、パラメーターは厳密に型指定され、間接参照のレベルが 1 つ少なくなります。
WDI_GET_ADAPTER_CAPABILITIES_PARAMETERS adapterCapabilitiesParsed;
ndisStatus = ParseWdiGetAdapterCapabilities(
cbBufferLength,
pvBuffer,
&Context
&adapterCapabilitiesParsed);
呼び出し元が構造体の使用を完了したら、呼び出し元はパーサーに対して、解析中に行われた割り当てをクリーンし、再利用の準備が整った状態で構造体をワイプする機会を与える必要があります。 パラメーターは厳密に型指定されているため、呼び出し先には追加のパラメーターは必要ありません。
CleanupParsedWdiGetAdapterCapabilities(&adapterCapabilitiesParsed);
CleanupParse API を呼び出すと、構造体内のすべてのデータが無効になります。
一部のメッセージには、関連付けられたデータがありません。 API を完成させるために、適切な名前の Parse メソッドが提供されます。 これらのメソッドは、バイト ストリームが空であることを検証します。 Typedef はパラメーター型に対して提供されますが、呼び出し元は呼び出し元割り当てモデルを使用する場合、out パラメーターに NULL を渡すこともできます。 いずれの場合も、パーサーは空の定数解析構造体を返すことによって、割り当てを回避します。 呼び出し元は、この返された空の構造体に絶対に書き込んではなりません (したがって、唯一のフィールドは _Reserved という名前になります)。 これらのメッセージは、"追加データはありません。 ヘッダー内のデータで十分です。”とドキュメントに記載されています。
メッセージの方向
ほとんどのメッセージは、M1 と M0、M3、または M4 の形式が異なります。 これに対応するために、このようなメッセージには、異なる解析 API と生成 API があります。 M1 の場合、API は Parse<MessageName>ToIhv または Generate<MessageName>ToIhv という命名規則に従います。 M0、M3、または M4 メッセージの場合、API は Parse<MessageName>FromIhv または Generate<MessageName>FromIhv という命名規則に従います。 ただし、IHV ミニポートのコードを簡素化するために、Parse<MessageName> を Parse<MessageName>ToIhv に、Generate<MessageName> を Generate<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 バイトの Length フィールドがオーバーフローしていることを示します。 この場合、要素の数を減らす必要があります。 このエラーはまた、外部 TLV に含まれている内部 TLV が多すぎる (または大きすぎる) ときにも発生し、この場合もヘッダーの 2 バイトの Length フィールドがオーバーフローします。 解析時には、TLV ヘッダーの Length フィールドが外部 TLV またはバイト ストリームより大きいことを示します。 |
NDIS_STATUS_FILE_NOT_FOUND |
解析時に、必要な TLV がバイト ストリームに存在しないことを示します。 これは通常、バイト ストリームのジェネレーターのバグです。 |
NDIS_STATUS_RESOURCES |
生成時に、アロケーターが失敗したことを示します。 |
NDIS_STATUS_UNSUPPORTED_REVISION |
解析または生成時に、Context パラメーターが NULL であるか、、PeerVersion パラメーターが WDI_VERSION_MIN_SUPPORTED 未満であることを示します。 |