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

指向数据缓冲区的指针。 如果 majorFunctionIRP_MJ_WRITE,则缓冲区包含要写入的数据。 如果 MajorFunctionIRP_MJ_READ,则缓冲区接收数据。 如果 MajorFunctionIRP_MJ_FLUSH_BUFFERSIRP_MJ_SHUTDOWN,则此参数必须为 NULL

[in, optional] Length

Buffer 指向的缓冲区的长度(以字节为单位)。 对于磁盘等设备,此值必须是扇区大小的整数倍。 从 Windows 8 开始,扇区大小可以是 4,096 或 512 字节。 在早期版本的 Windows 中,扇区大小始终为 512 字节。 此参数是读取和写入请求所必需的,但对于刷新和关闭请求,此参数必须为零。

[in, optional] StartingOffset

指向磁盘上的偏移量的指针,用于读取和写入请求。 此值的单位和含义特定于驱动程序。 此参数是读取和写入请求所必需的,但对于刷新和关闭请求,此参数必须为零。

[in] Event

指向调用方分配和初始化的事件对象的指针。 当较低级别的驱动程序完成请求的操作时,I/O 管理器将事件设置为“已信号”状态。 调用 IoCallDriver 后,驱动程序可以等待事件对象。

[out] IoStatusBlock

指向位置的指针,该位置接收 I/O 状态块,该块在 IRP 由较低级别驱动程序完成时设置。

返回值

如果操作成功, IoBuildSynchronousFsdRequest 将返回指向初始化的 IRP 结构的指针,并从提供的参数设置下一个较低级别的驱动程序的 I/O 堆栈位置。 否则,例程返回 NULL

注解

(FSD) 或其他更高级别的驱动程序的文件系统驱动程序可以调用 IoBuildSynchronousFsdRequest 来设置它同步发送到较低级别驱动程序的 IRP。

IoBuildSynchronousFsdRequest 分配并设置一个 IRP,该 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 开始可用。
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL
DDI 符合性规则 ForwardedAtBadIrqlFsdSync (wdm) HwStorPortProhibitedDDi (storport) IoBuildSynchronousFsdRequestNoFree (wdm) IoBuildSynchronousFsdReRequestWait (wdm) IoBuildSynchronousFsdRequestWaitTimeout (wdm) PowerIrpDDis (wdm) SignalEventInCompletion (wdm)

另请参阅

IO_STACK_LOCATION

IRP

IoAllocateIrp

IoBuildAsynchronousFsdRequest

IoBuildDeviceIoControlRequest

IoCompleteRequest

KeInitializeEvent

KeWaitForSingleObject