IRP_MJ_DEVICE_CONTROL (FS 和篩選驅動程式)

傳送時

I/O 管理員、其他作業系統元件和其他核心模式驅動程序會傳送IRP_MJ_DEVICE_CONTROL要求。 通常,此 IRP 會代表名為 Win32 DeviceIoControl 函式的使用者模式應用程式傳送,或代表名為 ZwDeviceIoControlFile 的核心模式元件。

作業:檔案系統驅動程式

文件系統驅動程式應該擷取和譯碼檔案物件,以判斷是否已在開啟磁碟區的句柄上發出要求。 如果是,文件系統驅動程式應該將 IRP 傳遞給裝載磁碟區之儲存裝置裝置驅動程式。 如果沒有,驅動程式應該會失敗 IRP。

作業:舊版文件系統篩選驅動程式

篩選驅動程式應該執行任何必要的處理,並視篩選的本質而定,完成 IRP 或將其向下傳遞至堆疊上的下一個較低驅動程式。

參數

文件系統或篩選驅動程式會針對指定的 IRP 呼叫 IoGetCurrentIrpStackLocation ,以取得 IRP 中本身堆疊位置的指標。 在下列參數中, Irp 指向 IRP而 IrpSp 指向 IO_STACK_LOCATION。 驅動程式可以使用下列 IRP 成員中設定的資訊,以及 IRP 堆疊位置中設定的資訊來處理裝置控制要求。

  • DeviceObject 是目標裝置物件的指標。

  • Irp->AssociatedIrp.SystemBuffer 指向系統提供的輸入緩衝區,以傳遞給目標裝置的裝置驅動程式。 用於METHOD_BUFFERED或METHOD_DIRECT I/O。 是否需要此參數,取決於特定的 I/O 控制項程式代碼。

  • Irp->IoStatus 指向 IO_STATUS_BLOCK結構, 該結構會接收最終完成狀態和所要求作業的相關信息。 如需詳細資訊,請參閱 ZwDeviceIoControlFileIoStatusBlock 參數描述。

  • Irp->MdlAddress 是記憶體描述項清單的位址, (MDL) 描述要傳遞給目標裝置裝置驅動程式的輸出緩衝區。 用於METHOD_DIRECT I/O。 是否需要此參數,取決於特定的 I/O 控制項程式代碼。

  • Irp->RequestorMode 指出要求作業之進程的執行模式,也就是 KernelModeUserMode

  • Irp->UserBuffer 指向呼叫端提供的輸出緩衝區,以傳遞至目標裝置的裝置驅動程式。 用於METHOD_BUFFERED或METHOD_NEITHER I/O。 此參數是否為選擇性或必要,取決於特定的 I/O 控件程式代碼。

  • IrpSp->FileObject 指向與 DeviceObject 相關聯的檔案物件。

    IrpSp-FileObject> 參數包含 RelatedFileObject 字段的指標,這也是FILE_OBJECT結構。 FILE_OBJECT結構的 RelatedFileObject 字段在處理IRP_MJ_DEVICE_CONTROL期間無效,不應使用。

  • IrpSp->MajorFunction 設定為 IRP_MJ_DEVICE_CONTROL。

  • IrpSp->Parameters.DeviceIoControl.InputBufferLengthIrp-AssociatedIrp.SystemBuffer> 所指向之緩衝區位元組的大小。

  • IrpSp->Parameters.DeviceIoControl.IoControlCode 是要傳遞至目標裝置的裝置驅動程式的 IOCTL 函式程式代碼。

    如需IOCTL要求的詳細資訊,請參閱 Windows SDK 檔中 的使用 I/O 控制代碼 和「裝置輸入和輸出控制代碼」。

  • IrpSp->Parameters.DeviceIoControl.OutputBufferLengthIrp-UserBuffer> 所指向之緩衝區位元組的大小。

  • IrpSp->Parameters.DeviceIoControl.Type3InputBuffer 是使用 METHOD_NEITHER核心模式要求的輸入緩衝區。

另請參閱

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoBuildDeviceIoControlRequest

IoGetCurrentIrpStackLocation

IoGetFunctionCodeFromCtlCode

IRP

IRP_MJ_DEVICE_CONTROL (WDK 核心參考)

使用 I/O 控制程式碼

ZwDeviceIoControlFile