I/O 要求封包

傳送至設備驅動器的大部分要求會封裝在 I/O 要求封包中(IRPs)。 操作系統元件或驅動程式會呼叫IoCallDriver將IRP傳送至驅動程式,其中包含兩個參數:DEVICE_OBJECT指標和IRP指標。 DEVICE_OBJECT具有相關聯DRIVER_OBJECT的指標。 當元件呼叫 IoCallDriver時,我們會說元件 會將 IRP 傳送至裝置物件 ,或 將 IRP 傳送至與裝置對象相關聯的驅動程式。 有時候我們使用片語會傳遞 IRP 或轉送 IRP,而不是傳送 IRP

一般而言,IRP 是由堆疊中排列的數個驅動程式所處理。 堆疊中的每個驅動程式都會與裝置對象相關聯。 如需詳細資訊,請參閱 裝置節點和裝置堆疊當裝置堆疊處理 IRP 時,IRP 通常會先傳送到裝置堆疊中的最上層裝置物件。 例如,如果 IRP 是由此圖表中顯示的裝置堆疊處理,IRP 會先傳送至裝置堆疊頂端的篩選裝置物件 (Filter DO)。

裝置節點及其裝置堆疊的圖表。

將 IRP 向下傳遞裝置堆疊

假設 I/O 管理員將 IRP 傳送至圖表中的篩選 DO。 與 Filter DO 相關聯的驅動程式AfterThought.sys會處理 IRP,然後將它傳遞給功能裝置物件 (FDO),也就是裝置堆疊中的下一個較低裝置物件。 當驅動程式將 IRP 傳遞至裝置堆疊中的下一個較低裝置物件時,我們會說驅動程式 會將 IRP 向下傳遞裝置堆疊

某些 IRP 會一路向下傳遞裝置堆疊至實體裝置物件 (PDO)。 其他 IRP 永遠不會到達 PDO,因為它們是由 PDO 上方的其中一個驅動程式完成。

IRP 是獨立的

IRP 結構是獨立式的,因為它會保存驅動程序處理 I/O 要求所需的所有資訊。 IRP 結構的某些部分會保存堆疊中所有參與驅動程式通用的資訊。 IRP 的其他部分會保存堆疊中特定驅動程式的特定資訊。