您的位置:首页 > 其它

创建 I/O 队列

2014-04-23 14:32 176 查看
转:创建 I/O 队列

创建 I/O 队列

1(共 1)对本文的评价是有帮助
- 评价此主题

大多数驱动程序都在其
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 队列使用示例。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: