Descarregando um driver de texto explicativo
Para descarregar um driver de texto explicativo, o sistema operacional chama a função de descarregamento do driver de texto explicativo. Para obter mais informações sobre como especificar a função de descarregamento de um driver de texto explicativo, consulte Especificando uma função de descarregamento.
A função de descarregamento de um driver de texto explicativo garante que os textos explicativos do driver de texto explicativo não sejam registrados no mecanismo de filtro antes que o driver de texto explicativo seja descarregado da memória do sistema. Um driver de texto explicativo chama a função FwpsCalloutUnregisterById0 ou a função FwpsCalloutUnregisterByKey0 para cancelar o registro de um texto explicativo do mecanismo de filtro. Um driver de texto explicativo não deve retornar de sua função de descarregamento até que ele tenha cancelado com êxito todos os seus textos explicativos do mecanismo de filtro.
Depois que um driver de texto explicativo tiver cancelado todos os seus textos explicativos do mecanismo de filtro, ele deverá excluir o objeto de dispositivo que ele criou antes de registrar originalmente seus textos explicativos. Um driver de texto explicativo baseado no WDM (Modelo de Driver do Windows) chama a função IoDeleteDevice para excluir o objeto do dispositivo. Um driver de texto explicativo baseado no WDF (Windows Driver Frameworks) chama a função WdfObjectDelete para excluir o objeto do dispositivo de estrutura.
Um driver de texto explicativo também deve destruir qualquer identificador de injeção de pacote que ele criou anteriormente chamando a função FwpsInjectionHandleDestroy0 antes de retornar de 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 texto explicativo 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 do dispositivo de estrutura.
WDFDEVICE wdfDevice;
VOID
Unload(
IN WDFDRIVER Driver;
)
{
...
// Delete the framework device object
WdfObjectDelete(
wdfDevice
);
...
}