Partilhar via


Descarregando um driver de callout

Para descarregar um driver de extensão, o sistema operativo chama a função de descarregamento do driver de extensão. Para obter mais informações sobre como especificar a função de desinstalação de um driver callout, consulte Especificando uma função de desinstalação.

A função de descarregamento de um driver de chamada garante que as chamadas do driver de chamada sejam desregistradas do mecanismo de filtro antes que o driver de chamada seja descarregado da memória do sistema. Um callout driver chama a função FwpsCalloutUnregisterById0 ou a função FwpsCalloutUnregisterByKey0 para desregistar um callout do mecanismo de filtro. Um driver de extensão não deve retornar da sua função de descarregamento até que tenha desregistado com êxito todos os seus callouts do mecanismo de filtro.

Depois de um driver de callout ter cancelado o registo de todos os seus callouts do motor de filtragem, deve eliminar o objeto de dispositivo que criou antes de registar originalmente os seus callouts. Um driver de callout baseado no Windows Driver Model (WDM) chama a função IoDeleteDevice para excluir o objeto de dispositivo. Um driver de texto explicativo baseado no WDF (Windows Driver Frameworks) chama o função WdfObjectDelete para excluir o objeto de dispositivo da estrutura.

Um driver de chamada também deve destruir qualquer identificador de injeção de pacote que tenha criado anteriormente ao chamar a função FwpsInjectionHandleDestroy0 antes de retornar da sua função de descarregamento.

Por exemplo:

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

O exemplo anterior pressupõe um driver de chamada baseado em WDM. Para um driver de texto explicativo baseado em WDF, a única diferença é o parâmetro que é passado para a função de descarregamento do driver de texto explicativo e como o driver de texto explicativo exclui o objeto de dispositivo da estrutura.

WDFDEVICE wdfDevice;

VOID
 Unload(
    IN WDFDRIVER Driver;
    )
{

  ...

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

  ...
}