アンロード関数の指定

引き出しドライバーはアンロード関数を提供する必要があります。 オペレーティング システムは、コールアウト ドライバーがシステムからアンロードされるときに、この関数を呼び出します。 コールアウト ドライバーのアンロード関数は、コールアウト ドライバーがシステム メモリからアンロードされる前に、コールアウト ドライバーのコールアウトがフィルター エンジンから登録解除されることを保証します。 吹き出しドライバーは、アンロード関数を提供しない場合、システムからアンロードできません。

吹き出しドライバーがアンロード関数を指定する方法は、引き出しドライバーが Windows ドライバー モデル (WDM) または Windows ドライバー フレームワーク (WDF) に基づいているかどうかによって異なります。

WDM ベースのコールアウト ドライバー

吹き出しドライバーが 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 ベースのコールアウト ドライバー

吹き出しドライバーが WDF に基づいている場合、その EvtDriverUnload 関数で Unload 関数を指定します。 次に例を示します。

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;
}

吹き出しドライバーのアンロード関数を実装する方法については、「コールアウト ドライバーのアンロード」を参照してください。