共用方式為


IoBuildDeviceIoControlRequest 函式 (wdm.h)

IoBuildDeviceIoControlRequest 例程會配置並設定同步處理的裝置控制要求的 IRP。

語法

__drv_aliasesMem PIRP IoBuildDeviceIoControlRequest(
  [in]            ULONG            IoControlCode,
  [in]            PDEVICE_OBJECT   DeviceObject,
  [in, optional]  PVOID            InputBuffer,
  [in]            ULONG            InputBufferLength,
  [out, optional] PVOID            OutputBuffer,
  [in]            ULONG            OutputBufferLength,
  [in]            BOOLEAN          InternalDeviceIoControl,
  [in, optional]  PKEVENT          Event,
  [out]           PIO_STATUS_BLOCK IoStatusBlock
);

參數

[in] IoControlCode

提供要求中使用的 I/O 控制項程式碼(IOCTL)。 如需裝置類型特定 I/O 控制碼的相關信息,請參閱 Windows 驅動程式套件 (WDK) 中的裝置類型特定區段。

[in] DeviceObject

提供下一個較低驅動程式裝置物件的 DEVICE_OBJECT 結構的指標,代表目標裝置。

[in, optional] InputBuffer

提供要傳遞至較低驅動程式之輸入緩衝區的指標,如果要求未將輸入數據傳遞至較低驅動程式,則 NULL

[in] InputBufferLength

提供輸入緩衝區的長度,以位元組為單位。 如果 InputBufferNULLInputBufferLength 必須是零。

[out, optional] OutputBuffer

提供輸出緩衝區的指標,其中較低驅動程式會傳回數據,如果要求不需要較低的驅動程式傳回數據,則 NULL

[in] OutputBufferLength

提供輸出緩衝區的長度,以位元組為單位。 如果 OutputBuffer 為 NULL ,則 outputBufferLength 必須是零

[in] InternalDeviceIoControl

如果 TRUE,例程會將 IRP 的主要函式程式碼設定為 IRP_MJ_INTERNAL_DEVICE_CONTROL。 否則,例程會將 IRP 的主要函式程式代碼設定為 IRP_MJ_DEVICE_CONTROL

[in, optional] Event

提供呼叫端配置和初始化事件物件的指標。 當較低層級驅動程式完成要求的作業時,I/O 管理員會將事件設定為 Signaled 狀態。 呼叫 IoCallDriver之後,驅動程式可以等候事件物件。 事件 參數是選擇性的,而且可以設定為 NULL。 不過,如果 事件 為 NULL,呼叫端必須提供 ioCompletion 例程,IRP 才能在作業完成時通知呼叫端。

[out] IoStatusBlock

指定要在較低驅動程式完成要求時設定的 I/O 狀態區塊。

傳回值

如果作業成功,IoBuildDeviceIoControlRequest 會傳回 IRP的指標,並從提供的參數設定下一個較低驅動程式的 I/O 堆棧位置。 否則,例程會傳回 NULL

言論

驅動程式可以呼叫 IoBuildDeviceIoControlRequest,為同步傳送至較低層級驅動程式的裝置控制要求設定 IRP。

呼叫 IoBuildDeviceIoControlRequest 以建立要求之後,驅動程式必須呼叫 IoCallDriver,以將要求傳送至下一個較低的驅動程式。 如果 IoCallDriver 傳回STATUS_PENDING,驅動程式必須藉由在指定的 事件上呼叫 KeWaitForSingleObject,等待 IRP 完成。 大部分驅動程式不需要為 IRP 設定 IoCompletion 例程。

IoBuildDeviceIoControlRequest 所建立的 IRP,必須由驅動程式呼叫 IoCompleteRequest來完成。 呼叫 IoBuildDeviceIoControlRequest 的驅動程式不得呼叫 IoFreeIrp,因為 I/O 管理員會在 呼叫 IoCompleteRequest 之後釋放這些同步 IRP。

IoBuildDeviceIoControlRequest 它會建立的 IRP 排入目前線程專屬的 IRP 佇列。 如果線程結束時,I/O 管理員會取消 IRP。

如果呼叫端提供 InputBufferOutputBuffer 參數,此參數必須指向位於系統記憶體中的緩衝區。 呼叫端負責驗證從使用者模式緩衝區複製到輸入緩衝區的任何參數值。 輸入緩衝區可能包含不同方式解譯的參數值,視要求的建立者是使用者模式應用程式還是內核模式驅動程式而定。 在 IoBuildDeviceIoControlRequest 傳回的 IRP 中,RequestorMode 字段一律設定為 KernelMode。 這個值表示要求和要求中包含的任何資訊都是來自受信任的內核模式元件。

如果呼叫端無法驗證它從使用者模式緩衝區複製到輸入緩衝區的參數值,或者如果這些值不能解譯為來自內核模式元件,呼叫端應該將 IRP 中的 RequestorMode 欄位設定為 UserMode。 此設定會通知驅動程式處理緩衝區包含不受信任的使用者模式數據之 I/O 控制項要求。

InputBufferOutputBuffer 參數的內容儲存在 IRP 中的實際方法,取決於 IOCTL 的 TransferType 值。 如需此值的詳細資訊,請參閱 I/O 控制代碼的緩衝區描述

要求

要求 價值
最低支援的用戶端 從 Windows 2000 開始提供。
目標平臺 普遍
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
DDI 合規性規則 HwStorPortProhibitedDIS(storport)IoAllocateIrpSignalEventInCompletion(wdm)IoAllocateIrpSignalEventInCompletion2(wdm)IoAllocateIrpSignalEventInCompletion3(wdm)IoBuildDeviceControlNoFree(wdm)IoBuildDeviceControlWait(wdm)IoBuildDeviceControlWaitTimeout(wdm)IoBuildDeviceIoControlSetEvent(wdm)IrqlIoPassive1(wdm)PowerIrpDDis(wdm)SignalEventInCompletion(wdm)

另請參閱

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildSynchronousFsdRequest

IoCallDriver

IoCompleteRequest

KeInitializeEvent

KeWaitForSingleObject