WFP Version-Independent名と Windows の特定のバージョンを対象とする

多くの場合、Windows フィルター プラットフォーム (WFP) API には、複数のバージョンの関数または構造体が用意されています。

WFP API のほとんどのデータ名と関数名は、バージョンが 1 つしかない場合でも、"0" や "1" などのバージョン番号で終わる。

fwpvi.h でのバージョン マッピング

fwpvi.h ヘッダー ファイルは、Windows 7 SDK および WDK 以降に含まれています。 このヘッダー ファイルは、バージョンレス API 名を、特定のオペレーティング システムで使用するのに適したバージョンにマップします。

たとえば、Windows 8 SDK に含まれている fwpvi.h のバージョンからの簡単な抜粋を次に示します。

#define FwpmNetEventCreateEnumHandle FwpmNetEventCreateEnumHandle0
#if (NTDDI_VERSION >= NTDDI_WIN8)
#define FwpmNetEventEnum FwpmNetEventEnum2
#elif (NTDDI_VERSION >= NTDDI_WIN7)
#define FwpmNetEventEnum FwpmNetEventEnum1
#else
#define FwpmNetEventEnum FwpmNetEventEnum0
#endif

上記のように、 FwpmNetEventCreateEnumHandleFwpmNetEventCreateEnumHandle0 のバージョンは 1 つだけであるため、 FwpmNetEventCreateEnumHandle の呼び出しは、対象となるオペレーティング システムに関係なく、常に FwpmNetEventCreateEnumHandle0 を呼び出します。

ただし、FwpmNetEventEnum には、FwpmNetEventEnum0FwpmNetEventEnum1FwpmNetEventEnum2 の 3 つのバージョンがあります。 fwpvi.h ヘッダー ファイルを使用すると、 FwpmNetEventEnum を呼び出すと、対象となるオペレーティング システムに最も適したバージョンが確実に呼び出されます。

Version-Independent関数と構造体の呼び出し

特定のオペレーティング システムまたは WDK バージョンを対象とする WFP 開発者は、バージョンに依存しないマクロに対して常にプログラミングすることをお勧めします。 これにより、対象となるオペレーティング システムでサポートされている最新バージョンが自動的に選択されます。 以前のオペレーティング システムをターゲットにしている場合でも、最新のヘッダー ファイルを使用することをお勧めします。 これを一貫して行うことで、サポートされている最新バージョンが確実に使用され、コードの保守と更新が容易になります。

WFP API リファレンス ドキュメントでは、番号付き API の各バージョンについて説明しています。 複数のバージョンが存在する場合は、対象のオペレーティング システムが示されます。 ただし、開発者は通常、バージョンに依存しない (番号のない) API を呼び出し、対象となるオペレーティング システム (Windows Vista の場合はNTDDI_WIN6、Windows 8場合はNTDDI_WIN8など) を示す必要があります。

異なるバージョンの異なるパラメーターを受け取る関数を適切に処理するには、 などの #if (NTDDI_VERSION >= NTDDI_WIN7)条件付きブロックを含めることができます。