IoBuildSynchronousFsdRequest 函式 (wdm.h)

IoBuildSynchronousFsdRequest 例程會為同步處理的 I/O 要求配置並設定 IRP。

語法

__drv_aliasesMem PIRP IoBuildSynchronousFsdRequest(
  [in]           ULONG            MajorFunction,
  [in]           PDEVICE_OBJECT   DeviceObject,
  [in, out]      PVOID            Buffer,
  [in, optional] ULONG            Length,
  [in, optional] PLARGE_INTEGER   StartingOffset,
  [in]           PKEVENT          Event,
  [out]          PIO_STATUS_BLOCK IoStatusBlock
);

參數

[in] MajorFunction

IRP 的主要函式程序代碼。 此程式代碼可以是 IRP_MJ_PNPIRP_MJ_READIRP_MJ_WRITEIRP_MJ_FLUSH_BUFFERSIRP_MJ_SHUTDOWN

[in] DeviceObject

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

[in, out] Buffer

數據緩衝區的指標。 如果MajorFunction是IRP_MJ_WRITE,則緩衝區會包含要寫入的數據。 如果MajorFunction是IRP_MJ_READ,則緩衝區會接收數據。 如果MajorFunction是IRP_MJ_FLUSH_BUFFERSIRP_MJ_SHUTDOWN,此參數必須是NULL

[in, optional] Length

Buffer 所指向之緩衝區的長度,以位元組為單位。 對於磁碟之類的裝置,此值必須是扇區大小的整數倍數。 從 Windows 8 開始,扇區大小可以是 4,096 或 512 個字節。 在舊版 Windows 中,扇區大小一律為 512 個字節。 讀取和寫入要求需要此參數,但排清和關機要求必須為零。

[in, optional] StartingOffset

磁碟上位移的指標,用於讀取和寫入要求。 此值的單位和意義是驅動程式特定的。 讀取和寫入要求需要此參數,但排清和關機要求必須為零。

[in] Event

呼叫端配置和初始化事件物件的指標。 當較低層級驅動程式完成要求的作業時,I/O 管理員會將事件設定為 Signaled 狀態。 呼叫 IoCallDriver之後,驅動程式可以等候事件物件。

[out] IoStatusBlock

接收較低層級驅動程式完成 IRP 時所設定之 I/O 狀態區塊的位置指標。

傳回值

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

備註

文件系統驅動程式 (FSD) 或其他較高層級驅動程式可以呼叫 IoBuildSynchronousFsdRequest ,以設定同步傳送至較低層級驅動程式的 IRP。

IoBuildSynchronousFsdRequest 會配置並設定 IRP,要求較低層級的驅動程式執行同步讀取、寫入、排清或關機作業。 IRP 包含足夠的資訊來啟動作業。

較低層級的驅動程式可能會對提供給此例程的參數施加限制。 例如,磁碟驅動器可能需要為 LengthStartingOffset 提供的值是裝置扇區大小的整數倍數。

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

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

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

規格需求

需求
最低支援的用戶端 從 Windows 2000 開始提供。
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL <= APC_LEVEL
DDI 合規性規則 ForwardedAtBadIrqlFsdSync (wdm) HwStorPortProhibitedDDIs (storport) IoBuildSynchronousFsdRequestNoFree (wdm) IoBuildSynchronousFsdRequestWait (wdm) IoBuildSynchronousFsdRequestWaitTimeout (wdm) PowerIrpDDis (wdm) SignalEventInCompletion (wdm)

另請參閱

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompleteRequest

KeInitializeEvent

KeWaitForSingleObject