Bagikan melalui


Memproses Beri Tahu Callout

Mesin filter memanggil fungsi callout callout callout untuk memberi tahu driver callout tentang peristiwa yang terkait dengan callout.

Penambahan Filter

Saat filter yang menentukan callout untuk tindakan filter ditambahkan ke mesin filter, mesin filter memanggil fungsi callout callout calloutFn , meneruskan FWPS_CALLOUT_NOTIFY_ADD_FILTER dalam parameter notifyType .

Driver callout dapat mendaftarkan callout dengan mesin filter setelah filter yang menentukan callout untuk tindakan filter telah ditambahkan ke mesin filter. Dalam situasi ini, mesin filter tidak memanggil fungsi callout callout notifyFn untuk memberi tahu callout tentang salah satu filter yang ada.

Mesin filter hanya memanggil fungsi callout callout callout untuk memberi tahu callout saat filter baru yang menentukan callout untuk tindakan filter ditambahkan ke mesin filter. Dalam situasi ini, fungsi callout notifyFn callout mungkin tidak dipanggil untuk setiap filter di mesin filter yang menentukan callout untuk tindakan filter.

Jika driver callout mendaftarkan callout setelah mesin filter dimulai dan callout harus menerima informasi tentang setiap filter di mesin filter yang menentukan callout untuk tindakan filter, driver callout harus memanggil fungsi manajemen yang sesuai untuk menghitung semua filter di mesin filter. Driver callout harus mengurutkan daftar semua filter yang dihasilkan untuk menemukan filter yang menentukan callout untuk tindakan filter. Lihat Memanggil Fungsi Platform Pemfilteran Windows Lainnya untuk informasi selengkapnya tentang memanggil fungsi-fungsi ini.

Penghapusan Filter

Saat filter yang menentukan callout untuk tindakan filter dihapus dari mesin filter, mesin filter memanggil fungsi callout callout callout dan meneruskan FWPS_CALLOUT_NOTIFY_DELETE_FILTER dalam parameter notifyType dan NULL dalam parameter filterKey . Mesin filter memanggil fungsi callout notifyFn untuk setiap filter yang dihapus di mesin filter yang menentukan callout untuk tindakan filter. Ini termasuk filter apa pun yang ditambahkan ke mesin filter sebelum driver callout mendaftarkan callout dengan mesin filter. Oleh karena itu, callout mungkin menerima pemberitahuan penghapusan filter untuk filter yang tidak menerima pemberitahuan penambahan filter.

Jika fungsi callout callout notifyFn tidak mengenali jenis pemberitahuan yang diteruskan dalam parameter notifyType , itu harus mengabaikan pemberitahuan dan mengembalikan STATUS_SUCCESS.

Driver callout dapat menentukan konteks yang akan dikaitkan dengan filter saat filter ditambahkan ke mesin filter. Konteks seperti itu buram untuk mesin filter. Fungsi callout classifyFn callout dapat menggunakan konteks ini untuk menyimpan informasi status untuk kali berikutnya yang dipanggil oleh mesin filter. Ketika filter dihapus dari mesin filter, driver callout melakukan pembersihan konteks yang diperlukan.

Contohnya:

// Context structure to be associated with the filters
typedef struct FILTER_CONTEXT_ {
  .
  .  // Driver-specific content
  .
} FILTER_CONTEXT, *PFILTER_CONTEXT;

// Memory pool tag for filter context structures
#define FILTER_CONTEXT_POOL_TAG 'fcpt'

// notifyFn callout function
NTSTATUS NTAPI
 NotifyFn(
    IN FWPS_CALLOUT_NOTIFY_TYPE  notifyType,
    IN const GUID  *filterKey,
    IN const FWPS_FILTER0  *filter
    )
{
  PFILTER_CONTEXT context;

 ASSERT(filter != NULL);

  // Switch on the type of notification
 switch(notifyType) {

    // A filter is being added to the filter engine
 case FWPS_CALLOUT_NOTIFY_ADD_FILTER:

      // Allocate the filter context structure
 context =
        (PFILTER_CONTEXT)ExAllocatePoolWithTag(
 NonPagedPool,
 sizeof(FILTER_CONTEXT),
          FILTER_CONTEXT_POOL_TAG
          );

      // Check the result of the memory allocation
 if (context == NULL) {

        // Return error
 return STATUS_INSUFFICIENT_RESOURCES;
      }

      // Initialize the filter context structure
      ...

      // Associate the filter context structure with the filter
 filter->context = (UINT64)context;

 break;

    // A filter is being removed from the filter engine
 case FWPS_CALLOUT_NOTIFY_DELETE_FILTER:

      // Get the filter context structure from the filter
 context = (PFILTER_CONTEXT)filter->context;

 // Check whether the filter has a context
 if (context) {

        // Cleanup the filter context structure
        ...

        // Free the memory for the filter context structure
 ExFreePoolWithTag(
 context,
          FILTER_CONTEXT_POOL_TAG
          );

      }
 break;

    // Unknown notification
 default:

      // Do nothing
 break;
  }

 return STATUS_SUCCESS;
}