上位レベルのドライバーは、 StartIo ルーチンを持つことができます。 ただし、このようなドライバーは、既存の下位レベルのドライバーと相互運用できる可能性は低く、パフォーマンス特性が低い可能性があります。
上位レベルのドライバーの StartIo ルーチンには、次の効果があります。
着信 IRP は、ドライバーの DispatchXxx ルーチンから IoStartPacket を呼び出し、IoStartNextPacket をその IoCompletion ルーチンから呼び出すことでキューに入れることができ、これにより StartIo ルーチンを介して IRP が一度に 1 つずつ処理されます。
ドライバーの I/O スループットは、 その StartIo ルーチンがボトルネックになる可能性があるため、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 のキューに入れるとキューからはずすを参照してください。