再初期化ルーチンの記述

段階的に自身を初期化する必要があるドライバーには、 再初期化 ルーチンを含めることができます。 再初期化 ルーチンは、 DriverEntry ルーチンがコントロールを返し、他のドライバーが自身を初期化した後に呼び出されます。 通常、 再初期化 ルーチンは、別のドライバーの起動後に実行する必要があるタスクを実行します。

たとえば、システムのキーボード クラス ドライバー kbdclass は、PnP と従来のキーボード ポートの両方をサポートしています。 PnP マネージャーが検出できない 1 つ以上のレガシー ポートがシステムに含まれている場合、キーボード クラス ドライバーは、ポートごとにデバイス オブジェクトを作成し、ポートの下位レベルのドライバーを介してそれ自体をレイヤー化する必要があります。 その結果、クラス ドライバーには、その DriverEntry および AddDevice ルーチンが呼び出され、他のドライバーが読み込まれた後に呼び出される再初期化ルーチンがあります。 再初期化 ルーチンは、ポートを検出し、それに対するデバイス オブジェクトを作成し、デバイスの他の下位レベルのドライバーにドライバーをレイヤー化しています。

ドライバーの DriverEntry ルーチンは、 IoRegisterDriverReinitialization を呼び出して、実行のために Reinitialize ルーチンをキューに入れます。 再初期化 ルーチンは、 IoRegisterDriverReinitialization 自体を呼び出すこともできます。これにより、ルーチンが再キューされます。 再初期化 するパラメーターの 1 つは、呼び出された回数を示します。

IoRegisterDriverReinitialization の呼び出しには、ドライバー定義のコンテキスト データへのポインターを含めることができます。このデータは、システムが 再初期化の入力として提供します。 If the 再初期化 ルーチンがレジストリを使用する場合、このポインターは再初期化ルーチンへの入力パラメーターではないため、DriverEntryルーチンに渡された RegistryPathDriverEntry ポインターをコンテキスト データに含める必要があります。

再初期化 ルーチンは、 DriverEntry がSTATUS_SUCCESSを返さない場合、呼び出されません。

通常、 再初期化 ルーチンを持つドライバーは、PnP とレガシー デバイスの両方を制御する上位レベルのドライバーです。 PnP マネージャーが検出する (および PnP マネージャーがドライバーの のAddDevice ルーチンを呼び出す) デバイスのデバイス オブジェクトを作成するだけでなく、ドライバーは PnP マネージャーが列挙しないレガシー デバイスのデバイス オブジェクトを作成する必要もあります。 再初期化 ルーチンは、これらのデバイス オブジェクトを作成し、基になるデバイスの次の下位ドライバーにドライバーをレイヤー化します。

ドライバーに 再初期化 ルーチンがある場合は、 「DriverEntry ルーチンの記述」で説明されているのと同じ基本的な手順で初期化します。また、 DriverEntry ルーチンと同じ基本的な要件もあります。