PnP ドライバーのアンロード ルーチン
PnP ドライバーには、DriverEntry ルーチンによって作成された、メモリ、スレッド、イベントなどのドライバー固有のリソースを削除する Unload ルーチンが必要です。 削除するドライバー固有のリソースがない場合でも、ドライバーには Unload ルーチンが必要になりますが、単に復帰するだけです。
ドライバーの Unload ルーチンは、すべてのドライバーのデバイスが取り出された後、いつでも呼び出すことができます。 PnP マネージャーは、IRQL = PASSIVE_LEVEL のシステム スレッドのコンテキストで、ドライバーの Unload ルーチンを呼び出します。
PnP ドライバーは、PnP デバイス取り出し IRP に応答して、デバイス固有のリソースとデバイス オブジェクトを解放します。 PnP マネージャーは、ドライバーが IoReportDetectedDevice を使用してレポートするルート列挙レガシ デバイスだけでなく、列挙する各 PnP デバイスに代わって、これらの IRP を送信します。
そのため、PnP ドライバーの Unload ルーチンは、通常は単純であり、return ステートメントのみで構成されることがよくあります。 ただし、ドライバーが DriverEntry ルーチンでドライバー全体のリソースを割り当てた場合は、既に割り当てが解除されている場合を除き、その Unload ルーチンでそれらのリソースの割り当てを解除する必要があります。 一般に、PnP ドライバーをアンロードするプロセスは同期操作です。
I/O マネージャーは、IoAllocateDriverObjectExtension を使用してドライバーが割り当てたドライバー オブジェクトとドライバー オブジェクト拡張を解放します。