Freigeben über


Entladen eines Legendentreibers

Zum Entladen eines Legendentreibers ruft das Betriebssystem die Entladefunktion des Legendentreibers auf. Weitere Informationen zum Angeben der Entladefunktion eines Legendentreibers finden Sie unter Angeben einer Entladefunktion.

Die Entladefunktion eines Legendentreibers garantiert, dass die Legenden des Legendentreibers aus der Filter-Engine nicht registriert werden, bevor der Legendentreiber aus dem Systemspeicher entladen wird. Ein Legendentreiber ruft entweder die Funktion FwpsCalloutUnregisterById0 oder die FwpsCalloutUnregisterByKey0-Funktion auf, um die Registrierung einer Legende aus dem Filtermodul aufzuheben. Ein Legendentreiber darf erst von seiner Entladefunktion zurückkehren, nachdem er die Registrierung aller Legenden aus der Filter-Engine erfolgreich aufgehoben hat.

Nachdem ein Legendentreiber die Registrierung aller Legenden aus der Filter-Engine aufgehoben hat, muss er das Geräteobjekt löschen, das er erstellt hat, bevor er seine Legenden ursprünglich registriert hat. Ein Legendentreiber, der auf dem Windows-Treibermodell (WDM) basiert, ruft die IoDeleteDevice-Funktion auf, um das Geräteobjekt zu löschen. Ein Legendentreiber, der auf den Windows Driver Frameworks (WDF) basiert, ruft die Funktion WdfObjectDelete auf, um das Framework-Geräteobjekt zu löschen.

Ein Legendentreiber muss auch alle Paketeinjektionshandle zerstören, die er zuvor erstellt hat, indem er die Funktion FwpsInjectionHandleDestroy0 aufruft , bevor er von seiner Entladefunktion zurückgibt.

Beispiel:

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

Im vorherigen Beispiel wird von einem WDM-basierten Legendentreiber ausgegangen. Bei einem WDF-basierten Legendentreiber besteht der einzige Unterschied in dem Parameter, der an die Entladefunktion des Legendentreibers übergeben wird, und wie der Legendentreiber das Framework-Geräteobjekt löscht.

WDFDEVICE wdfDevice;

VOID
 Unload(
    IN WDFDRIVER Driver;
    )
{

  ...

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

  ...
}