转发 I/O 请求
当驱动程序收到无法处理的 I/O 请求时,它通常会执行以下操作之一:
它将收到的请求转发给另一个驱动程序。
它会创建其他请求并将其发送到另一个驱动程序。
基于框架的驱动程序 使用 I/O 目标转发请求,这些目标表示系统上的其他驱动程序。 驱动程序可以使用以下任一技术将请求转发到 I/O 目标:
驱动程序可以通过调用 WdfDeviceGetIoTarget、 WdfRequestFormatRequestUsingCurrentType 和 WdfRequestSend,将 I/O 请求转发到下一个较低的驱动程序。
仅当驱动程序收到请求时,此方法才有用,该请求不需要在转发之前对其进行修改。
驱动程序可以调用 WdfFdoInitSetFilter 将自身注册为筛选器驱动程序。
如果筛选器驱动程序未为特定类型的 I/O 请求提供 I/O 队列,框架会自动将该类型的请求转发到下一个较低的驱动程序。
通常,函数驱动程序会检查每个 I/O 请求的内容。 如果函数驱动程序无法处理请求,它可能会修改请求并将其转发到 I/O 目标。 或者,它可能会创建一个或多个新请求并将其发送到 I/O 目标。
框架的 I/O 目标对象定义了几种用于将 I/O 请求发送到其他驱动程序的方法。 例如,驱动程序可以调用 WdfIoTargetFormatRequestForRead,后跟 WdfRequestSend,以将读取请求发送到 I/O 目标。 有关 I/O 目标的详细信息,请参阅 使用 I/O 目标。
极少数情况下,驱动程序编写器可能需要在将请求发送到 I/O 目标之前指定请求的基础 WDM I/O 堆栈位置 的内容。 对于这些情况,驱动程序可以在调用 WdfRequestSend 之前调用 WdfRequestWdmFormatUsingStackLocation。
有时,驱动程序必须将相同的请求发送到多个 I/O 目标,通常是因为驱动程序必须向其所有设备发送单个命令。 在向 I/O 目标发送请求之前,驱动程序可以调用 WdfRequestChangeTarget 来验证 I/O 目标是否可访问。
驱动程序最终必须完成它转发到 I/O 目标的每个请求,除非它在调用 WdfRequestSend 时设置WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET标志。
请注意,当驱动程序转发请求时,框架不会从字面上将框架请求对象从发送驱动程序传输到接收驱动程序。 相反,框架会在接收请求的驱动程序中创建一个新的请求对象。 只有请求的基础 I/O 请求数据包 (IRP) 才会从一个驱动程序传输到另一个驱动程序。