Bagikan melalui


Mendaftarkan Callout dengan Mesin Filter

Setelah driver callout membuat objek perangkat, kemudian dapat mendaftarkan callout-nya dengan mesin filter. Driver callout dapat mendaftarkan callout-nya dengan mesin filter kapan saja, bahkan jika mesin filter saat ini tidak berjalan. Untuk mendaftarkan callout dengan mesin filter, driver callout memanggil fungsi FwpsCalloutRegister0 . Contohnya:

// 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;
}

Jika panggilan ke fungsi FwpsCalloutRegister0 berhasil, variabel yang diarahkan oleh parameter terakhir berisi pengidentifikasi run-time untuk callout. Pengidentifikasi run-time ini sesuai dengan GUID yang ditentukan untuk kunci callout.

Satu driver callout dapat menerapkan lebih dari satu callout. Jika driver callout mengimplementasikan lebih dari satu callout, ia memanggil fungsi FwpsCalloutRegister0 satu kali untuk setiap callout yang didukungnya untuk mendaftarkan setiap callout dengan mesin filter.

classifyFn