指定卸载函数

标注驱动程序必须提供 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 函数的信息,请参阅 卸载标注驱动程序