I/O 要求パケット

デバイス ドライバーに送信される要求のほとんどは、I/O 要求パケット (IRP) にパッケージ化されます。オペレーティング システムのコンポーネントまたはドライバーが、IoCallDriver を呼び出すことにより、ドライバーに IRP を送信します。IoCallDriver には、DEVICE_OBJECT へのポインターと IRP へのポインターを指定する 2 つのパラメーターがあります。DEVICE_OBJECT には、関連付けられている DRIVER_OBJECT に対するポインターがあります。コンポーネントから IoCallDriver が呼び出されると、コンポーネントが IRP をデバイス オブジェクトに送信する、あるいは IRP をデバイス オブジェクトに関連付けられたドライバーに送信する、などの表現を使うことがあります。また、IRP を送信する、という言い方の代わりに IRP を渡すIRP を転送する、などの言い方をする場合もあります。

通常、IRP は、1 つのスタック上に配置されたいくつかのドライバーによって処理されます。スタック上の各ドライバーは、それぞれ個別のデバイス オブジェクトに関連付けられます。詳しくは、「デバイス ノードとデバイス スタック」をご覧ください。IRP がデバイス スタックにより処理されると、通常、IRP はまずデバイス スタックの最上段にあるデバイス オブジェクトに送信されます。たとえば、次の図のように、IRP がデバイス スタックによって処理されると、IRP は、デバイス スタックの最上段にあるフィルター デバイス オブジェクト (Filter DO) に送信されます。

デバイス ノードとデバイス スタックの図

下のデバイス スタックへの IRP の受け渡し

I/O マネージャーが、図に示す Filter DO に IRP を送信する例を考えてみましょう。Filter DO に関連付けられたドライバー、AfterThought.sys は IRP を処理した後、デバイス スタックで 1 つ下にあるデバイス オブジェクトであるファンクショナル デバイス オブジェクト (FDO) に IRP を渡します。ドライバーがデバイス スタックで 1 つ下のデバイス オブジェクトに IRP を渡すことを下のデバイス スタックに IRP を渡す、と表現します。

IRP によっては、デバイス スタックを下降して、物理デバイス オブジェクト (PDO) にまで送信されるものもあります。また、PDO よりも上にあるいずれかのドライバーで処理されるため、PDO には到達しない IRP もあります。

自己完結型の IRP

IRP の構造は、ドライバーが I/O 要求を処理するのに必要な情報をすべて保持しているという意味で自己完結型であるといえます。IRP の構造には、スタック中で関与するすべてのドライバーに共通する情報を保持する部分があります。また IRP には、スタック上の特定のドライバーに固有の情報を保持する部分もあります。