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,则缓冲区包含要写入的数据。 如果 MajorFunction IRP_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 管理器将事件设置为 Signaled 状态。 调用 IoCallDriver后,驱动程序可以等待事件对象。

[out] IoStatusBlock

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

返回值

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

言论

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

IoBuildSynchronousFsdRequest 分配并设置一个 IRP,该 IRP 请求较低级别的驱动程序执行同步读取、写入、刷新或关闭作。 IRP 包含足够的信息来启动作。

较低级别的驱动程序可能会对提供给此例程的参数施加限制。 例如,磁盘驱动程序可能需要为 长度 提供的值,StartingOffset 为设备的扇区大小的整数倍数。

调用 IoBuildSynchronousFsdRequest 以创建请求后,驱动程序必须调用 IoCallDriver 以将请求发送到下一个较低的驱动程序。 如果 IoCallDriver 返回STATUS_PENDING,驱动程序必须等待 IRP 完成,方法是在给定 事件上调用 KeWaitForSingleObject。 大多数驱动程序不需要为 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)
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