I/O 堆疊位置

I/O 管理員會為每個設定的 IRP 提供層次驅動程式鏈結中的每個驅動程式 I/O 堆疊位置。 每個 I/O 堆疊位置都包含 IO_STACK_LOCATION 結構。

I/O 管理員會為每個 IRP 建立 I/O 堆疊位置的陣列,其中陣列元素對應至層次驅動程式鏈結中的每個驅動程式。 每個驅動程式都會擁有封包中的其中一個堆疊位置,並呼叫 IoGetCurrentIrpStackLocation 以取得 I/O 作業的驅動程式特定資訊。

這類鏈結中的每個驅動程式都會負責呼叫 IoGetNextIrpStackLocation,然後設定下一個較低驅動程式的 I/O 堆疊位置。 任何較高層級的驅動程式 I/O 堆疊位置也可以用來儲存作業的相關內容,讓驅動程式的 IoCompletion 常式可以執行其清除作業。

分層 驅動程式中的處理 IRP 圖顯示原始 IRP 中的兩個 I/O 堆疊位置,因為它顯示兩個驅動程式、檔案系統驅動程式和大量儲存裝置驅動程式。 在 層次驅動程式處理 IRP 中,驅動程式配置的 IRP 圖中沒有 FSD (檔案系統驅動程式的堆疊位置,) 建立它們。 針對較低層級驅動程式配置 IRP 的任何較高層級驅動程式,也會根據下一個較低驅動程式裝置物件的 StackSize 值,決定新 IRP 應該擁有多少 I/O 堆疊位置。

下圖更詳細地顯示 IRP 的內容。

說明 irp 中 i/o 堆疊位置內容的圖表。

如圖所示,IRP 中的每個驅動程式特定 I/O 堆疊位置都包含下列一般資訊:

  • 主要函式程式碼 (IRP_MJ_XXX) ,指出驅動程式應該執行的基本作業

  • 對於 FSD、較高層級 SCSI 驅動程式和所有 PnP 驅動程式所處理的某些主要函式程式碼,次要函式程式碼 (IRP_MN_XXX) ,指出驅動程式應該執行的基本作業子案例

  • 一組作業特定引數,例如緩衝區的長度和開始位置,以及驅動程式從中傳輸資料的位置

  • 驅動程式建立裝置物件的指標,代表所要求作業的目標 (實體、邏輯或虛擬) 裝置

  • 檔案物件的指標,表示開啟的檔案、裝置、目錄或磁片區

    檔案系統驅動程式會透過 IRP 中的 I/O 堆疊位置來存取檔案物件。 其他驅動程式通常會忽略檔案物件。

特定驅動程式控點可特定裝置類型的特定 IRP 主要和次要函式代碼集。 不過,最低層級驅動程式和中繼驅動程式 (包括 PnP 函式和篩選驅動程式) 通常會處理下列一組基本要求:

  • IRP_MJ_CREATE — 開啟目標裝置物件,指出它存在且可用於 I/O 作業

  • IRP_MJ_READ — 從裝置傳輸資料

  • IRP_MJ_WRITE — 將資料傳輸到裝置

  • IRP_MJ_DEVICE_CONTROL — 根據系統定義的裝置類型特定 I/O 控制程式碼,設定 (或) 重設裝置 (IOCTL)

  • IRP_MJ_CLOSE — 關閉目標裝置物件

  • IRP_MJ_PNP — 在裝置上執行隨插即用作業。 IRP_MJ_PNP要求是由 PnP 管理員透過 I/O 管理員傳送。

  • IRP_MJ_POWER — 在裝置上執行電源作業。 power manager 會透過 I/O 管理員傳送 IRP_MJ_POWER 要求。

如需驅動程式處理所需之主要 IRP 函式代碼的詳細資訊,請參閱 IRP 主要函式代碼

一般而言,I/O 管理員會將至少兩個 I/O 堆疊位置的 IRP 傳送至大量儲存設備磁碟機,因為檔案系統會分層于大型儲存裝置的其他驅動程式上。 I/O 管理員會將具有單一堆疊位置的 IRP 傳送至任何上層其他驅動程式的驅動程式。

不過,I/O 管理員提供將新驅動程式新增至系統中任何現有驅動程式鏈結的支援。 例如,備份指定磁碟分割上資料的中繼 鏡像驅動程式 可能會在一組驅動程式之間插入,例如檔案系統驅動程式和 層次驅動程式中處理 IRP 圖中顯示的最低層級驅動程式。 當這個新的驅動程式將本身附加至裝置堆疊時,I/O 管理員會調整它傳送至檔案系統、鏡像和最低層級驅動程式之所有 IRP 中的 I/O 堆疊位置數目。 配置之 層次驅動程式中處理 IRP 中 檔案系統的每個 IRP,也會包含這類新鏡像驅動程式的另一個 I/O 堆疊位置。

請注意,對於將新驅動程式新增至現有鏈結的支援,表示對 IRP 中 I/O 堆疊位置的任何特定驅動程式存取有特定限制:

  • 層次驅動程式鏈結中的較高層級驅動程式可以安全地存取任何 IRP 中下一個較低層級驅動程式的 I/O 堆疊位置。 這類驅動程式必須在 IRP 中設定下一個較低層級驅動程式的 I/O 堆疊位置。 不過,設計這類較高層級的驅動程式時,您無法預測何時 (,或) 新驅動程式是否會新增至驅動程式正下方的現有鏈結。

    因此,您應該假設任何後續新增的驅動程式都會處理與下一個較低層級驅動程式相同的 IRP 主要函式程式碼, (IRP_MJ_XXX) 。

  • 層次驅動程式鏈結中的最低層級驅動程式可以安全地在任何 IRP 中存取自己的 I/O 堆疊位置。 設計這類驅動程式時,您無法預測何時 (,或) 新的驅動程式是否會新增至裝置驅動程式上方的現有鏈結。

    在設計最低層級驅動程式時,假設驅動程式可以使用傳入自己的 I/O 堆疊位置中的資訊繼續處理 IRP,不論指定 IRP 的原始來源為何,以及其上層的驅動程式數目為何。