次の方法で共有


記憶域クラス ドライバーの RemoveDevice ルーチン

デバイスが削除されようとしている場合、PnP マネージャーは、まず、PnP クエリ削除要求 (IRP_MN_QUERY_REMOVE_DEVICE) で IRP_MJ_PNP クラス ドライバーの DispatchPnP ルーチンを呼び出します。 記憶域クラス ドライバーは、次のいずれかの場合にクエリ削除要求を失敗させる必要があります。

  • デバイスにシステム ページング ファイルまたは休止状態ファイルが含まれている。

  • ドライバーが取り消す必要のない長い操作 (テープの巻き戻しや書式設定など) を実行している。

  • デバイス (CREATEs) に未処理のハンドルがある。

このようなデバイスを削除するとクラッシュ ダンプが無効になるため、デバイスがクラッシュ ダンプを要求した場合、記憶域クラス ドライバーはクエリ削除要求も失敗する可能性があります。

記憶域クラス ドライバーがクエリ削除要求に応答して STATUS_SUCCESS を返す場合、PnP マネージャーは、PnP 削除要求 (IRP_MN_REMOVE_DEVICE を使用した IRP_MJ_PNP) を使用してクラス ドライバーの DispatchPnP ルーチンを呼び出します。 記憶域クラス ドライバーの DispatchPnP ルーチンは、内部 RemoveDevice ルーチンを呼び出すか、同じ機能をインラインで実装します。

記憶域クラス ドライバーの RemoveDevice ルーチンは、次の操作を行う必要があります。

  • ドライバーによって割り当てられたメモリやイベントなどの未処理のリソースをすべて解放します。

  • ドライバーによって作成されたシンボリック リンク (存在する場合) を削除します。

  • デバイス オブジェクト (FDO) を削除します。

  • 次の下位ドライバーに要求を転送します。

記憶域クラス ドライバーが起動時に PDO を作成した場合 (パーティション分割されたメディア デバイス上のパーティションを表す場合など)、PnP マネージャーが記憶域クラス ドライバーに削除要求を送信するときに、このような PDO は既に削除されています。

デバイス オブジェクトが削除された後でも、0 以外の参照カウントがある場合、デバイス オブジェクトは、参照カウントが 0 に達するまでシステム内に保持され、サイレント モードで表示されなくなります。 記憶域クラス ドライバーは、デバイス オブジェクトが削除された後、デバイス オブジェクト ポインターの使用を試みることはできません。

削除要求の処理の詳細については、デバイスの削除を参照してください。