檢查驅動程式 I/O 堆疊位置的時機
系統會在每個傳入 IRP 的驅動程式 I/O 堆疊位置中設定主要 I/O 函式程式碼。
驅動程式的分派常式必須檢查驅動程式的 I/O 堆疊位置是否有 IRP,以判斷下列任何條件是否保留該怎麼做:
分派常式會處理多個主要 I/O 函式程式碼。
分派常式必須處理特定主要函式程式碼的一組次要函式程式碼。 具有次要函式代碼的 IRP 包括 IRP_MJ_PNP 和 IRP_MJ_POWER,以及 SCSI 埠驅動程式和檔案系統驅動程式必須處理的特定 IRP。
設備磁碟機或緊密結合之較高層級驅動程式的分派常式會處理 IRP_MJ_DEVICE_CONTROL 或 IRP_MJ_INTERNAL_DEVICE_CONTROL 要求,這些要求具有一組相關聯的 I/O 控制程式碼。
若要取得驅動程式 I/O 堆疊位置的指標,其分派常式會呼叫 IoGetCurrentIrpStackLocation。
較高層級驅動程式的分派常式一律會呼叫 IoGetCurrentIrpStackLocation ,並呼叫 IoGetNextIrpStackLocation 以取得下一個較低驅動程式 I/O 堆疊位置的指標,以取得它們為下一個較低驅動程式設定的 IRP 時,在 驅動程式堆疊下傳遞 IRP時。
設備磁碟機的 DispatchDeviceControl 常式或 DispatchInternalDeviceControl 常式,或其可能緊密結合的類別驅動程式 () ,必須判斷驅動程式的 I/O 控制項程式碼是在 Parameters.DeviceIoControl.IoControlCode 的驅動程式 I/O 堆疊位置中設定的每個要求。 I/O 控制項程式碼包含在驅動程式的 I/O 堆疊位置中。
在大部分情況下,較高層級驅動程式的 DispatchDeviceControl 或 DispatchInternalDeviceControl 常式只會在 IRP 中設定堆疊位置之後,將 IRP_MJ_DEVICE_CONTROL 或 IRP_MJ_INTERNAL_DEVICE_CONTROL 要求傳遞給下一個較低的驅動程式。 不過,SCSI 類別驅動程式必須檢查特定 SCSI 埠 I/O 控制程式碼 ,才能正確設定 SCSI 埠驅動程式的 I/O 堆疊位置,再傳遞這些要求。