アンロード ルーチンの環境

オペレーティング システムは、ドライバーが置き換えられた場合、またはドライバー サービスのすべてのデバイスが削除された場合にドライバーをアンロードします。 PnP マネージャーは、ドライバーが IRP_MN_REMOVE_DEVICE 要求を処理した後、それ以上のデバイス オブジェクトがない場合は、PnP ドライバーの Unload ルーチンを呼び出します。

アンロード シーケンスの開始時に、I/O マネージャーまたは PnP マネージャーは、ドライバー オブジェクトとそのデバイス オブジェクトを "保留中のアンロード" としてマークします。 ドライバーが "保留中のアンロード" としてマークされた後、そのドライバーに追加のドライバーをアタッチすることも、ドライバーのデバイス オブジェクトに対して追加の参照を実行することもできません。 ドライバーは未処理の IRP を完了できますが、システムはドライバーに新しい IRP を送信しません。

次のすべてが当てはまる場合、I/O マネージャーはドライバーの Unload ルーチンを呼び出します。

  • ドライバーが作成したデバイス オブジェクトへの参照は保持されません。 言い換えると、基になるデバイスに関連付けられているファイルを開くことはなく、ドライバーのデバイス オブジェクトに対してどの IRP も未処理にすることはできません。

  • 他のドライバーをこのドライバーに接続されたままにすることはできません。

  • ドライバーは、以前に登録したすべての PnP 通知の登録を解除するために IoUnregisterPlugPlayNotification を呼び出しています。

ドライバーの DriverEntry ルーチンがエラー状態を返す場合、Unload ルーチンは呼び出されないことに注意してください。 この場合、I/O マネージャーは、単にドライバーが占有するメモリ領域を解放します。

PnP マネージャーも I/O マネージャーも、システムのシャットダウン時に Unload ルーチンを呼び出しません。 シャットダウン処理を実行する必要があるドライバーは、DispatchShutdown ルーチンを登録する必要があります。