指定卸载函数
标注驱动程序必须提供 unload 函数。 从系统卸载标注驱动程序时,操作系统会调用此函数。 标注驱动程序的 unload 函数必须保证在从系统内存中卸载标注驱动程序之前,从筛选器引擎中注销标注驱动程序的标注。 如果标注驱动程序未提供 unload 函数,则无法从系统卸载该驱动程序。
标注驱动程序如何指定 unload 函数取决于标注驱动程序是基于 Windows 驱动程序模型 (WDM) 还是 Windows 驱动程序框架 (WDF) 。
WDM-Based标注驱动程序
如果标注驱动程序基于 WDM,它将在其 DriverEntry 函数中指定 Unload 函数。 例如:
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;
...
}
WDF-Based标注驱动程序
如果标注驱动程序基于 WDF,它将在其 DriverEntry 函数中指定 EvtDriverUnload 函数。 例如:
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;
}
有关如何实现标注驱动程序的 unload 函数的信息,请参阅 卸载标注驱动程序。