Windows では、インストール可能なドライバーの複数のインスタンスを使用できます。 システムは、ドライバーが開かれるたびにドライバーのインスタンスを作成し、ドライバーが閉じられたときにインスタンスを破棄します。 ドライバー インスタンスは、複数のデバイスをサポートするインストール可能なドライバーや、複数のアプリケーションまたは同じアプリケーションによって複数回開かれる場合に特に便利です。
ドライバーがインスタンスを追跡できるように、システムは、インスタンスの作成後にドライバー インスタンス ハンドルを各ドライバー メッセージと共に送信します。 このハンドルはインスタンスを一意に識別するため、インストール可能なドライバーは、多くの場合、そのハンドルを、インスタンスに対して明示的に割り当てられているメモリやその他のリソースに関連付けます。
最初のインスタンスが開かれると、システムはその順序で DRV_LOAD、DRV_ENABLE、および DRV_OPEN メッセージをドライバーに送信します。 DRV_LOADメッセージとDRV_ENABLE メッセージは、ドライバーがメモリ内にあり、操作が有効になったことをドライバーに通知します。 DRV_OPEN メッセージは、インスタンス ハンドルを識別し、インスタンスの構成情報を含めることができます。 同じドライバーのインスタンスを開くたびに、システムはDRV_OPENメッセージのみを送信します。
DRV_LOAD メッセージを処理する場合、ドライバーは通常、レジストリから構成設定を読み取り、ドライバーと関連するハードウェアを構成し、ドライバーのすべてのインスタンスで使用するメモリを割り当てます。 ドライバーは、構成を完了またはメモリを割り当てることができない場合は、すぐにメモリからドライバーを削除し、後続のメッセージが送信されないようにシステムを指示する 0 を返します。 DRV_ENABLE メッセージを処理するときに、ドライバーは、入力と出力 (I/O) 要求を受信して処理するハードウェアを準備します。 準備には、割り込みハンドラーのインストールが含まれる場合があります。
DRV_OPEN メッセージを処理する場合、ドライバーは、ドライバーの特定のインスタンスに必要なメモリまたはリソースを割り当て、0 以外の値を返します。 システムは、インスタンスの後続のドライバー メッセージで ドライバー識別子として、この 0 以外の値を使用します。 ドライバーは、任意の目的でこの識別子を使用できます。 たとえば、一部のドライバーでは、識別子のメモリ ハンドルを使用して、特定のインスタンスに関する情報を含むメモリにすばやくアクセスできます。
多くのインストール可能なドライバーは、DRV_OPEN メッセージの 2 番目のパラメーターを処理し、インスタンスを開くときにドライバーに追加情報を送信する手段をシステムとアプリケーションに提供します。 パラメーターには、1 つの値または値のセットを含む構造体のアドレスを指定できます。 DRV_OPEN処理するときに、ドライバーはパラメーターをチェックして値であるかどうかを判断し、指定された値 (存在する場合) を使用してインスタンスの作成を完了します。
システムは、インスタンスが閉じられるたびに DRV_CLOSE メッセージを送信します。 メッセージと共に送信されたインスタンス ハンドルは、閉じるインスタンスを識別します。 最後の残りのインスタンスが閉じられると、システムはその順序でDRV_CLOSE、DRV_DISABLE、および DRV_FREE メッセージを送信します。 DRV_CLOSE メッセージは、インスタンスを閉じるようドライバーに指示し、DRV_DISABLEメッセージとDRV_FREEメッセージは、無効になり、すぐにメモリから解放されることをドライバーに通知します。
DRV_CLOSE メッセージを処理する場合、ドライバーは通常、インスタンスに割り当てられているメモリまたはリソースを解放します。 DRV_DISABLE メッセージを処理する場合、ドライバーは、割り込みハンドラーの削除を含む可能性がある非アクティブな状態で任意のハードウェアを配置します。 DRV_FREE メッセージを処理すると、ドライバーは、まだ割り当てられているメモリまたはリソースを解放します。
複数のインスタンスをサポートするために、インストール可能なドライバーは必要ありません。 ドライバーは、DRV_OPEN メッセージに対して 0 を返すことによって、インスタンスが作成されないようにすることができます。