共用方式為


IRP_MJ_INTERNAL_DEVICE_CONTROL (FS 和篩選驅動程式)

傳送時

I/O 管理員、其他作業系統元件和其他內核模式驅動程式會傳送IRP_MJ_INTERNAL_DEVICE_CONTROL要求。

不同於 IRP_MJ_DEVICE_CONTROL 要求,IRP_MJ_INTERNAL_DEVICE_CONTROL要求只會用於核心模式元件之間的通訊。 雖然IRP_MJ_DEVICE_CONTROL要求通常源自對 DeviceIoControlZwDeviceIoControlFile 的呼叫,但這些例程無法建立IRP_MJ_INTERNAL_DEVICE_CONTROL要求。 不過,這兩種類型的 IRP 都可以呼叫 IoBuildDeviceIoControlRequest 來建立。

作業:檔案系統驅動程式

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

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

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

參數

文件系統或篩選驅動程式會使用指定的 IRP 呼叫 IoGetCurrentIrpStackLocation ,以取得 IRP 中本身 堆疊位置 的指標,如下列清單所示的 IrpSp。 (IRP 會顯示為 Irp.) 驅動程式可以使用 IRP 的下列成員中所設定的資訊,以及處理設備控制要求中的 IRP 堆疊位置:

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

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

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

  • 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_INTERNAL_DEVICE_CONTROL期間無效,不應使用。

  • IrpSp->MajorFunction 設定為 IRP_MJ_INTERNAL_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

IRP_MJ_INTERNAL_DEVICE_CONTROL (WDK 核心參考)

使用 I/O 控制程式碼

ZwDeviceIoControlFile