I/O 要求封包

大部分傳送至設備驅動器的要求會封裝在 I/O 要求封包中, (IRP) 。 操作系統元件或驅動程式會藉由呼叫 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 的其他部分會保存堆疊中特定驅動程式專屬的資訊。