I/O 要求パケット
デバイス ドライバーに送信されるほとんどの要求は、I/O 要求パケット (IRP) にパッケージ化されます。 オペレーティング システムのコンポーネントまたはドライバーが、IoCallDriver を呼び出すことにより、ドライバーに IRP を送信します。IoCallDriver には、DEVICE_OBJECT へのポインターと IRP へのポインターを指定する 2 つのパラメーターがあります。 DEVICE_OBJECT には、関連付けられている DRIVER_OBJECT に対するポインターがあります。 コンポーネントが IoCallDriver を呼び出すことを、コンポーネントが「IRP をデバイス オブジェクトに送信する」とか、「IRP をデバイス オブジェクトに関連付けられているドライバーに送信する」と言います。 場合によっては、「IRP を送信する」という語句の代わりに、「IRP を渡す」とか、「IRP を転送する」という語句を使用します。
通常、IRP は、スタックに配置されているいくつかのドライバーによって処理されます。 スタック内の各ドライバーは、デバイス オブジェクトに関連付けられています。 詳細については、「デバイス ノードとデバイス スタック」を参照してください。 IRP がデバイス スタックによって処理される場合、IRP は通常、最初にデバイス スタック内の一番上のデバイス オブジェクトに送信されます。 たとえば、次の図に示されているデバイス スタックによって IRP が処理される場合、IRP は最初にデバイス スタックの一番上にあるフィルター デバイス オブジェクト (Filter DO) に送信されます。
下のデバイス スタックへの IRP の受け渡し
I/O マネージャーが、図の Filter DO に IRP を送信するとします。 Filter DO に関連付けられているドライバー (AfterThought.sys) は、IRP を処理し、デバイス スタック内のすぐ下のデバイス オブジェクトであるファンクション デバイス オブジェクト (FDO) に渡します。 ドライバーがデバイス スタック内のすぐ下のデバイス オブジェクトに IRP を渡すことを、ドライバーが「IRP を下位のデバイス スタックに渡す」と言います。
一部の IRP は、デバイス スタックを下へ物理デバイス オブジェクト (PDO) まで渡されていきます。 他の IRP は、PDO より上のいずれかのドライバーによって完了されるため、PDO には到達しません。
自己完結型の IRP
IRP 構造体は、ドライバーが I/O 要求を処理するために必要なすべての情報を保持しているという意味で、自己完結型です。 IRP 構造体の一部分には、スタックに参加しているすべてのドライバーに共通する情報が保持されます。 IRP の他の部分には、スタック内の特定のドライバーに固有の情報が保持されます。