Bagikan melalui


Membongkar Driver Callout

Untuk membongkar driver callout, sistem operasi memanggil fungsi pembongkaran driver callout. Untuk informasi selengkapnya tentang cara menentukan fungsi bongkar driver callout, lihat Menentukan Fungsi Bongkar.

Fungsi pembongkaran driver callout menjamin bahwa callout driver callout tidak terdaftar dari mesin filter sebelum driver callout dibongkar dari memori sistem. Driver callout memanggil fungsi FwpsCalloutUnregisterById0 atau fungsi FwpsCalloutUnregisterByKey0 untuk membatalkan pendaftaran callout dari mesin filter. Driver callout tidak boleh kembali dari fungsi unload-nya sampai setelah berhasil membatalkan pendaftaran semua callout-nya dari mesin filter.

Setelah driver callout membatalkan pendaftaran semua callout-nya dari mesin filter, driver tersebut harus menghapus objek perangkat yang dibuatnya sebelum awalnya mendaftarkan callout-nya. Driver callout yang didasarkan pada Windows Driver Model (WDM) memanggil fungsi IoDeleteDevice untuk menghapus objek perangkat. Driver callout yang didasarkan pada Windows Driver Frameworks (WDF) memanggil fungsi WdfObjectDelete untuk menghapus objek perangkat kerangka kerja.

Driver callout juga harus menghancurkan handel injeksi paket apa pun yang sebelumnya dibuat dengan memanggil fungsi FwpsInjectionHandleDestroy0 sebelum kembali dari fungsi bongkar.

Contohnya:

// Device object
PDEVICE_OBJECT deviceObject;

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

// Injection handle
HANDLE injectionHandle;

// Unload function
VOID
 Unload(
    IN PDRIVER_OBJECT DriverObject
    )
{
  NTSTATUS status;

  // Unregister the callout
 status =
 FwpsCalloutUnregisterById0(
 CalloutId
      );

  // Check result
 if (status == STATUS_DEVICE_BUSY)
  {
    // For each data flow that is being processed by the
    // callout that has an associated context, clean up
    // the context and then call FwpsFlowRemoveContext0
    // to remove the context from the data flow.
    ...

    // Finish unregistering the callout
 status =
 FwpsCalloutUnregisterById0(
 CalloutId
        );
  }

  // Check status
 if (status != STATUS_SUCCESS)
  {
    // Handle error
    ...
  }

  // Delete the device object
 IoDeleteDevice(
 deviceObject
    );

  // Destroy the injection handle
 status =
 FwpsInjectionHandleDestroy0(
 injectionHandle
      );

  // Check status
 if (status != STATUS_SUCCESS)
  {
    // Handle error
    ...
  }
}

Contoh sebelumnya mengasumsikan driver callout berbasis WDM. Untuk driver callout berbasis WDF, satu-satunya perbedaan adalah parameter yang diteruskan ke fungsi pembongkaran driver callout dan cara driver callout menghapus objek perangkat kerangka kerja.

WDFDEVICE wdfDevice;

VOID
 Unload(
    IN WDFDRIVER Driver;
    )
{

  ...

  // Delete the framework device object
 WdfObjectDelete(
 wdfDevice
    );

  ...
}