パケット タグ付けの使用

コールアウト ドライバーは、対象のパケットにタグを付け、タグ付けされたパケットに発生したイベントの通知を受け取ることができます。 パケットのタグ付けは、Windows 7 以降のバージョンでサポートされています。

パケットのタグ付けを使用するには、コールアウト ドライバーが、FWPS_NET_BUFFER_LIST_NOTIFY_FN0 または FWPS_NET_BUFFER_LIST_NOTIFY_FN1 コールバック関数を実装する必要があります。 この関数は、タグ付けされたパケットのすべての状態通知を受け取ります。 個々のパケットをタグ付けする前に、コールアウト ドライバーは FwpsNetBufferListGetTagForContext0 を呼び出して特別なコンテキスト タグを取得する必要があります。 コールアウト ドライバーは、一部またはすべてのタグ付けされたパケットに同じコンテキスト タグを使用できます。 たとえば、コールアウト ドライバーは、さまざまなコンテキスト タグを使用して、タグ付けされたパケットの種類を識別できます。

パケットをタグ付けするために、コールアウト ドライバーは NET_BUFFER_LIST 構造体を使用します。 コールアウト ドライバーは、FwpsNetBufferListAssociateContext0 を呼び出して、個々の NET_BUFFER_LIST 構造体にタグを付けます。 コールアウト ドライバーがパケットに関連付けるコンテキストは、任意の符号なし 64 ビット値です。 イベントがトリガーされると、FWPS_NET_BUFFER_LIST_NOTIFY_FN0 または FWPS_NET_BUFFER_LIST_NOTIFY_FN1 コールバックは、コールアウト ドライバーが個々のタグ付けされたパケットを識別できるように、入力パラメーターとしてコンテキストを渡します。 コンテキストは、フィルタリング エンジンによって使用または評価されません。 これは、コールアウト ドライバーで使用するためにコールバックにのみ渡されます。

パケットがスタックから出ると、タグ付けされたパケットからコンテキストが自動的に削除されます。 ただし、パケットが TCP/IP スタックに入らない場合 (たとえば、NDIS フィルタードライバーの場合)、netBufferList パラメーターを NULL に設定して FwpsNetBufferListRemoveContext0 を呼び出して、コンテキストを手動で削除する必要があります。

コールアウトがタグ付け操作を早期に中止する必要がある場合は、FwpsNetBufferListRemoveContext0 を呼び出してコンテキストを削除できます。 コンテキストを削除すると、通常、FWPS_NET_BUFFER_LIST_CONTEXT_REMOVED イベントがトリガーされます。 トリガーできるイベントの詳細については、FWPS_NET_BUFFER_LIST_EVENT_TYPE0 リストをご覧ください。 場合によっては、パケットが処理のために TCP/IP スタックに入らない場合など、イベントはトリガーされません。

タグ付けされたパケットが複製されると、コールアウト ドライバーはコンテキストを複製パケットに移動またはコピーできます。 コンテキストを移動するには (複製の場合)、コールアウト ドライバーは、removeContext パラメーターを TRUE に設定して FwpsNetBufferListRetrieveContext0 を呼び出す必要があります。 その後、コンテキストを新しいパケットに関連付けることができます。 コンテキストをコピーするプロセス (重複の場合) は、FwpsNetBufferListRetrieveContext0removeContext パラメーターを FALSE に設定する必要があることを除き同じです。

TCP/IP レイヤーからタグ付けされたパケットは、NDISフィルタードライバー から取得できます。 逆も同じです。 パケットのタグ付けは、データ セグメント以外のパケットが示されないストリーム レイヤーでは利用できません。

コールアウト ドライバーは、FwpsNetBufferListRetrieveContext0 を呼び出して、FWPS_NET_BUFFER_LIST_NOTIFY_FN0 またはFWPS_NET_BUFFER_LIST_NOTIFY_FN1 関数の外部にあるパケットのコンテキストを取得できます。 通常、コールアウト ドライバーは、そのclassifyFnコールバックでコンテキストを取得します。

classifyFn

FWPS_NET_BUFFER_LIST_EVENT_TYPE0

FWPS_NET_BUFFER_LIST_NOTIFY_FN0

FWPS_NET_BUFFER_LIST_NOTIFY_FN1

FwpsNetBufferListAssociateContext0

FwpsNetBufferListGetTagForContext0

FwpsNetBufferListRemoveContext0

FwpsNetBufferListRetrieveContext0

NET_BUFFER_LIST

NDISフィルタードライバー