次の方法で共有


WDI TLV バージョン管理

下位互換性を維持するために、WDI とミニポートはどちらもバージョン管理の境界として TLV ストリームを使用します。 TLV バイト ストリームのプロデューサーは、常に下位互換性のある TLV を生成し、新しく追加されたフィールドを含めないようにする必要があります。 これを実現するには、Context パラメーターに PeerVersion を追加します。 このフィールドは、呼び出し元が、初期化中に受け取った WdiVersion に初期化する必要があります。

すべての解析および生成 API に渡される、Context パラメーターの型定義を次に示します。

typedef struct _TLV_CONTEXT
{
    ULONG_PTR   AllocationContext;
    ULONG       PeerVersion;
} TLV_CONTEXT, *PTLV_CONTEXT;
typedef const TLV_CONTEXT * PCTLV_CONTEXT;

AllocationContext は解析および生成 API によって変更されず、ミニポートによって指定された new 演算子のコールバックに引き続き渡されます。 詳細については、「WDI TLV ジェネレーター/パーサー メモリ インターフェイス」を参照してください。

WDI ベースのシングルバイナリ ドライバーが古いバージョンの WDI に対して実行されると、ミニポートのジェネレーターは PeerVersion を使用して古いバイト ストリームを生成します。 逆に、パーサーは PeerVersion に基づいて古いバイト ストリームを使用し、それを新しいデータ構造に変換します。

ミニポート ドライバーが TLV パーサー ジェネレーター ライブラリを使用せず、代わりに独自の TLV パーサーとジェネレーターを書き込み、古い OS バージョン (および古いバージョンの WDI) のみを実行する単一のバイナリを必要とする場合、そのドライバーはこの機能も含める必要があります。 パーサーは古い WDI によって生成された TLV 文法を受け入れる必要があり、ジェネレーターは古い文法に従って TLV のみを生成する必要があります。

XML は、containerRefs で許可される 2 つの属性 (versionAddedversionRemoved) で、このバージョン管理をサポートするように拡張されています。 これは、パーサーとジェネレーターに、ピアのバージョンに応じてバイト ストリームを調整するよう促すものです。

パーサーとジェネレーターは、常に WDI_VERSION_LATEST にリンクされていることを前提としています。 ミニポートは、WDI_VERSION_1_0 のような特定のバージョンを使用するときではなく、NdisMRegisterWdiMiniportDriver を呼び出すときに、NDIS_MINIPORT_DRIVER_WDI_CHARACTERISTICS::WdiVersion の WDI_VERSION_LATEST を常に渡す必要があります。相手側が予期しないバイト ストリームを送信する可能性があるため、それらが古くなると、TLV パーサー ジェネレーターで問題が発生します。