Condividi tramite


Rimozione di un driver "callout"

Per scaricare un driver callout, il sistema operativo chiama la funzione di disinstallazione del driver callout. Per altre informazioni su come specificare la funzione di scaricamento di un driver callout, vedere Specificare la funzione di scaricamento.

La funzione di disattivazione di un driver callout garantisce che i callout del driver callout siano deregistrati dal motore di filtro prima che il driver callout venga disattivato dalla memoria di sistema. Un driver callout chiama la funzione FwpsCalloutUnregisterById0 o la funzione FwpsCalloutUnregisterByKey0 per deregistrare un callout dal motore di filtro. Un driver callout non deve terminare la funzione di scaricamento fino a quando non avrà annullato con successo la registrazione di tutti i suoi callout dal motore di filtro.

Dopo che un driver di callout ha annullato la registrazione di tutti i suoi callout dal motore di filtro, deve eliminare l'oggetto dispositivo che aveva creato quando ha registrato originariamente i callout. Un driver di callout basato sul modello di driver di Windows (WDM) chiama la funzione IoDeleteDevice per eliminare l'oggetto dispositivo. Un driver callout basato su Windows Driver Frameworks (WDF) chiama la funzione WdfObjectDelete per eliminare l'oggetto dispositivo framework.

Un driver callout deve inoltre distruggere qualsiasi handle di iniezione di pacchetti creato in precedenza chiamando la funzione FwpsInjectionHandleDestroy0 prima di restituire dalla sua funzione di scaricamento.

Per esempio:

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

Nell'esempio precedente si presuppone un driver callout basato su WDM. Per un driver di callout basato su WDF, l'unica differenza è il parametro passato alla funzione di scaricamento del driver callout e il modo in cui il driver callout elimina l'oggetto dispositivo framework.

WDFDEVICE wdfDevice;

VOID
 Unload(
    IN WDFDRIVER Driver;
    )
{

  ...

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

  ...
}