上位レベル ドライバーの StartIo ルーチン
どの上位レベルドライバーも StartIo ルーチンを持つことができます。 ただし、そのようなドライバーは既存の下位レベルドライバーとの相互運用性は低く、性能特性も劣る可能性があります。
上位レベルドライバーの StartIo ルーチンには、次のような効果があります:
着信 IRP は、ドライバーの DispatchXxx ルーチンから IoStartPacket を呼び出し、また IoCompletion ルーチンから IoStartNextPacket を呼び出すことによってキューに入れることができ、それによって IRP は StartIo ルーチンを介し一度に 1 つずつ処理されます。
ドライバーの StartIo ルーチンがボトルネックになる可能性があるため、I/Oのデマンド が多い期間にドライバーの I/O スループットが著しく遅くなる可能性があります。
ドライバーの StartIo ルーチンは、IRQL = DISPATCH_LEVELの各IRPで IoCallDriver を呼び出し、それによってすべての低レベルドライバーのディスパッチルーチンもIRQL = DISPATCH_LEVELで実行されます。 これにより、下位ドライバーがディスパッチルーチンで呼び出せるサポートルーチンの セットが制限されます。 ほとんどのドライバー作成者は、自分のドライバーのディスパッチルーチンが IRQL < DISPATCH_LEVELで実行されると前提しているため、上位レベルドライバーは、既存の多くの下位レベルドライバーと相互運用できる可能性は低くなります。
StartIo ルーチンは、このルーチンとそのチェーン内のすべての下位レベルドライバーのディスパッチルーチンがIRQL = DISPATCH_LEVELで実行されるため、システム全体のスループットを低下させます。
標準ドライバールーチンが実行されるIRQLの詳細は、 ハードウェアの優先順位の管理を参照してください。
システムが提供するどの上位ドライバーには StartIo ルーチンがありませんが、これはドライバー自体、その上と下のすべてのドライバー、およびシステム全体の IRP 処理が遅くなる可能性があるためです。
ほとんどの上位レベルドライバーは、ディスパッチルーチンから下位レベルドライバーにIRPを送信し、 IoCompletion ルーチンで必要なクリーン処理を実行するだけです。
ただし、上位レベルドライバーは、特定の種類の操作を要求する IRP のために内部キューを設定したり、SCSI ポートドライバーのように、一連の異種基盤デバイスにバインドされた IRP を保持するために内部キューを設定したりすることができます。 詳細は、 IRPのキューイングとデキューイングを参照してください。