Especificar una función Unload
Un controlador de llamada debe proporcionar una función de descarga. El sistema operativo llama a esta función cuando el controlador de llamada se descarga del sistema. Una función de descarga del controlador de llamada debe garantizar que las llamadas del controlador de llamada no se registran desde el motor de filtro antes de que el controlador de llamada se descargue de la memoria del sistema. Un controlador de llamada no se puede descargar desde el sistema si no proporciona una función de descarga.
La forma en que un controlador de llamada especifica una función de descarga depende de si el controlador de llamada se basa en el modelo de controlador de Windows (WDM) o en los marcos de windows Driver Framework (WDF).
controladores de llamada de WDM-Based
Si un controlador de llamada se basa en WDM, especifica una función Unload en su función DriverEntry . Por ejemplo:
VOID
Unload(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
...
// Specify the callout driver's Unload function
DriverObject->DriverUnload = Unload;
...
}
controladores de llamada de WDF-Based
Si un controlador de llamada se basa en WDF, especifica una función EvtDriverUnload en su función DriverEntry . Por ejemplo:
VOID
Unload(
IN WDFDRIVER Driver
);
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
NTSTATUS status;
WDF_DRIVER_CONFIG config;
WDFDRIVER driver;
...
// Initialize the driver config structure
WDF_DRIVER_CONFIG_INIT(&config, NULL);
// Indicate that this is a non-PNP driver
config.DriverInitFlags = WdfDriverInitNonPnpDriver;
// Specify the callout driver's Unload function
config.EvtDriverUnload = Unload;
// Create a WDFDRIVER object
status =
WdfDriverCreate(
DriverObject,
RegistryPath,
NULL,
&config,
&driver
);
...
return status;
}
Para obtener información sobre cómo implementar una función de descarga del controlador de llamada, vea Descargar un controlador de llamada.