フィルター エンジンへのコールアウトの登録

コールアウト ドライバーは、デバイス オブジェクトを作成した後、そのコールアウトをフィルター エンジンに登録できます。 コールアウト ドライバーは、フィルター エンジンが現在実行されていない場合でも、いつでもフィルター エンジンにそのコールアウトを登録できます。 コールアウトをフィルター エンジンに登録するため、コールアウト ドライバーは FwpsCalloutRegister0 関数を呼び出します。 次に例を示します。

// Prototypes for the callout's callout functions
VOID NTAPI
 ClassifyFn(
    IN const FWPS_INCOMING_VALUES0  *inFixedValues,
    IN const FWPS_INCOMING_METADATA_VALUES0  *inMetaValues,
    IN OUT VOID  *layerData,
    IN const FWPS_FILTER0  *filter,
    IN UINT64  flowContext,
    IN OUT FWPS_CLASSIFY_OUT0  *classifyOut
    );

NTSTATUS NTAPI
 NotifyFn(
 IN FWPS_CALLOUT_NOTIFY_TYPE notifyType,
    IN const GUID  *filterKey,
    IN const FWPS_FILTER0  *filter
    );

VOID NTAPI
 FlowDeleteFn(
    IN UINT16  layerId,
    IN UINT32  calloutId,
    IN UINT64  flowContext
    );

// Callout registration structure
const FWPS_CALLOUT0 Callout =
{
 { ... }, // GUID key identifying the callout
  0,       // Callout-specific flags (none set here)
 ClassifyFn,
 NotifyFn,
 FlowDeleteFn
};

// Variable for the run-time callout identifier
UINT32 CalloutId;

NTSTATUS
 DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{
  PDEVICE_OBJECT deviceObject;
  NTSTATUS status;

  ...

 status =
 FwpsCalloutRegister0(
 deviceObject,
      &Callout,
      &CalloutId
      );

  ...

 return status;
}

FwpsCalloutRegister0 関数の呼び出しに成功した場合、最後のパラメーターによってポイントされる変数には、コールアウトのランタイム識別子が含まれます。 このランタイム識別子は、コールアウト キーに指定された GUID に対応しています。

1 つのコールアウト ドライバーが複数のコールアウトを実装できます。 コールアウト ドライバーは、複数のコールアウトを実装した場合、サポートされる各コールアウトに対して FwpsCalloutRegister0 関数を 1 回ずつ呼び出し、各コールアウトをフィルター エンジンに登録します。

classifyFn