创建 I/O 队列
框架队列对象表示 I/O 队列,这些队列是驱动程序接收的 I/O 请求的容器。 每个驱动程序可以为每个设备创建一个或多个 I/O 队列。 框架队列对象定义驱动程序可以提供的一组 事件回调函数 ,以及驱动程序可以调用的一组对象方法。
当框架收到定向到某个驱动程序设备的 I/O 请求时,框架会将该请求置于相应的 I/O 队列中。 如果驱动程序注册了一个或多个 请求处理程序,则框架可以在每次 I/O 请求可用时通知驱动程序。 或者,驱动程序可以轮询 I/O 队列中的请求。
大多数驱动程序在其 EvtDriverDeviceAdd 回调函数中创建 I/O 队列。 若要为设备创建 I/O 队列,驱动程序调用框架队列对象的 WdfIoQueueCreate 方法 (该方法) 创建框架队列对象。 驱动程序向 方法提供 WDF_IO_QUEUE_CONFIG 结构。 此结构包含有关队列的配置信息,例如队列的 调度方法和 指向 当请求 在队列中可用时框架调用的请求处理程序的指针。 结构还指示队列是否由 电源管理 ,以及驱动程序是否支持对队列的 I/O 请求使用零长度缓冲区。
如果驱动程序将 WDF_IO_QUEUE_CONFIG 结构的 DefaultQueue 成员设置为 TRUE,则队列将成为设备的默认 I/O 队列。 如果驱动程序创建默认 I/O 队列,框架会将设备的所有 I/O 请求置于此队列中,除非创建其他队列来接收某些请求。 驱动程序可以通过调用 WdfDeviceGetDefaultQueue 方法获取设备默认 I/O 队列的句柄。
如果想要对设备使用多个 I/O 队列,驱动程序可以调用 WdfIoQueueCreate 以根据需要创建任意数量的队列对象。 如果驱动程序创建多个队列,它可以调用 WdfDeviceConfigureRequestDispatching,这会指示框架将不同类型的请求定向到不同的队列。 例如,可以指定将所有读取请求传递到一个队列,并将所有写入请求传递到另一个队列。
如果驱动程序创建一组 I/O 队列并调用 WdfDeviceConfigureRequestDispatching 将驱动程序可以接收的每种类型的请求定向到特定队列,则驱动程序不需要默认队列。
如果驱动程序未为特定类型的请求提供 I/O 队列,并且驱动程序是函数驱动程序,则框架会以STATUS_INVALID_DEVICE_REQUEST完成状态值完成该类型的请求。 如果驱动程序是筛选器驱动程序,并且已调用 WdfFdoInitSetFilter,则框架会自动将这些请求转发到驱动程序堆栈中下一个较低的驱动程序。 例如,不处理读取请求的筛选器驱动程序不必提供接收读取请求的 I/O 队列。
有关驱动程序如何使用 I/O 队列的示例,请参阅 I/O 队列的示例用法。