创建框架请求对象

框架请求对象表示 I/O 管理器已发送到驱动程序的 I/O 请求。 基于框架的驱动程序通过调用 框架请求对象方法来处理每个 I/O 请求。

每个 I/O 请求都包含一个 WDM I/O 请求数据包 (IRP 结构) ,但基于框架的驱动程序通常不需要访问 IRP 结构。

大多数框架请求对象由框架创建,但驱动程序也可以创建请求对象。

由框架创建的请求对象

当基于框架的驱动程序从 I/O 管理器接收 I/O (IRP) 的 I/O 请求数据包时,框架会截获 IRP 并创建框架请求对象。 框架将请求对象放入 I/O 队列,如果驱动程序已注册队列 的请求处理程序 ,则调用相应的处理程序。

下图演示了框架为读取操作创建请求对象时发生的步骤。

说明在基于框架的驱动程序中为读取操作创建请求对象的步骤的示意图。

以下步骤对应于上图中的数字:

  1. 用户模式应用程序通过调用 Microsoft Win32 ReadFile 函数读取文件。

  2. ReadFile 函数调用在内核模式下运行的 I/O 管理器。

  3. I/O 管理器分配 IRP 结构,并将 IRP_MJ_READ 函数代码存储在 结构中。

  4. I/O 管理器调用驱动程序 xDispatchRead 标准驱动程序例程,传递指向 IRP 结构的指针。 由于驱动程序 x 是基于框架的驱动程序,因此框架提供驱动程序的 DispatchRead 例程。

  5. 框架创建一个表示 IRP 结构的请求对象。 框架将请求对象添加到驱动程序的队列对象之一。

  6. 框架调用驱动程序的 EvtIoRead 请求处理程序,传递队列对象句柄和请求对象句柄。

请求驱动程序创建的对象

基于框架的驱动程序还可以创建请求对象。 例如,如果驱动程序收到一个读取或写入请求,该请求量大于驱动程序的 I/O 目标 一次可以处理的数据量,则驱动程序可能会创建请求对象。 在这种情况下,驱动程序可以将数据划分为多个较小的请求,并使用其他请求对象将这些较小的请求发送到一个或多个 I/O 目标。

若要创建请求对象,驱动程序应调用 WdfRequestCreate ,后跟初始化请求的框架对象方法,例如 WdfUsbTargetPipeFormatRequestForRead

如果驱动程序在 WDM 调度例程中接收 WDM IRP,然后使用框架对其进行服务或转发,则该驱动程序可以调用 WdfRequestCreateFromIrp