デバイス オブジェクトとコントローラー オブジェクトの解放

ドライバーがデバイスやコントローラー オブジェクトを削除するときは、事前に、他のドライバーのオブジェクトへのポインターや割り込みオブジェクトなど、対応するデバイスまたはコントローラー拡張機能に格納されている外部リソースへの参照を解放する必要があります。 その後、ドライバーは、作成したデバイス オブジェクトごとに IoDeleteDevice を呼び出すことができます。 以前に IoCreateController を呼び出した WDM 以外のドライバーも、IoDeleteController を呼び出す必要があります。

ドライバーがデバイス拡張機能で記憶域を提供するカーネル定義オブジェクトは、Unload ルーチンが対応するデバイス オブジェクトで IoDeleteDevice を呼び出すと、自動的に解放されます。 一般に、ドライバーがデバイス拡張機能でそのオブジェクトの記憶域を提供した場合、KeInitializeXxx を呼び出して設定した DriverEntry ルーチンや Reinitialize ルーチンは、IoDeleteDevice への呼び出しで解放できます。 たとえば、ドライバーに CustomTimerDpc ルーチンがあり、デバイス拡張機能で必要な DPC オブジェクトとタイマー オブジェクトの記憶域を提供している場合、IoDeleteDevice の呼び出しでこれらのシステム リソースは解放されます。

同様に、ドライバーがコントローラー拡張機能で記憶域を提供するカーネル定義オブジェクトは、Unload ルーチンが、対応するコントローラー オブジェクトを使用して IoDeleteController を呼び出すと自動的に解放されます。

DriverEntry ルーチンまたは、Reinitialize ルーチンが、特定の種類のデバイス数を増分するために IoGetConfigurationInformation を呼び出すと、対応するデバイス オブジェクトを削除されるので、Unload ルーチンも IoGetConfigurationInformation を呼び出して、I/O マネージャーのグローバル構成情報構造体でそのデバイス数を減分する必要があります。

制御を返す前に Unload ルーチンには、他のドライバー ルーチンによってまだ解放されていない他のドライバー割り当てリソースを解放する役割もあります。