フィルター エンジンへのコールアウトの登録
コールアウト ドライバーは、デバイス オブジェクトを作成した後、そのコールアウトをフィルター エンジンに登録できます。 コールアウト ドライバーは、フィルター エンジンが現在実行されていない場合でも、いつでもフィルター エンジンにそのコールアウトを登録できます。 コールアウトをフィルター エンジンに登録するため、コールアウト ドライバーは 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 回ずつ呼び出し、各コールアウトをフィルター エンジンに登録します。