处理流请求块

操作系统将设备上的所有 I/O 请求调度到类驱动程序。 类驱动程序又通过将 SDB 传递给微型驱动程序,从微型驱动程序请求特定于硬件的信息。 类驱动程序指定它在流请求块的 Command 成员中请求的操作。

微型驱动程序作为一个整体以及微型驱动程序中的每个流都可能接收 I/O 请求。 微型驱动程序必须提供 StrMiniReceiveDevicePacket 例程来处理设备范围的请求。 每个流必须支持两个例程来处理 I/O 请求:一个用于数据请求,一个用于控制请求。 类驱动程序调用数据请求回调 StrMiniReceiveStreamDataPacket 来处理流上的所有读取和写入请求。 流的其他所有请求将传递到 StrMiniReceiveStreamControlPacket

如果类驱动程序正在处理微型驱动程序的同步,它会将流请求排队,并将它们一次一个调度到微型驱动程序。 类驱动程序维护三个单独的队列 -- 一个用于设备请求,另一个用于流数据和控制请求。 微型驱动程序可能会发出信号,表明它已准备好从以下队列之一发出新请求:

请求类型 例程所返回的值 例程的 NotificationType 参数

设备请求

StreamClassDeviceNotification

ReadyForNextDeviceRequest

流控制请求

StreamClassStreamNotification

ReadyForNextStreamControlRequest

流数据请求

StreamClassStreamNotification

ReadyForNextStreamDataRequest

当类驱动程序调用 StrMiniReceiveXXX数据包时,它会将流请求块交给微型驱动程序。 微型驱动程序的例程具有对流请求块的唯一访问权限,直到它向已完成请求的类驱动程序发出信号。

微型驱动程序处理完请求后,应向类驱动程序发出已完成请求的信号,如下所示:

  1. 微型驱动程序应在流请求块的 “状态” 字段中设置请求的状态。

  2. 微型驱动程序应通过调用 StreamClassDeviceNotificationStreamClassStreamNotification 来发出已完成请求的信号。 为了完成设备请求,微型驱动程序使用 DeviceRequestComplete 的 NotificationType 参数调用 StreamClassDeviceNotification。 为了完成流请求,微型驱动程序使用 StreamRequestComplete 的 NotificationType 参数调用 StreamClassStreamNotification

  3. 如果类驱动程序正在处理同步,并且微型驱动程序尚未向类驱动程序发出信号,表示它已准备好在此队列上的另一个请求,则它应立即执行此操作。

微型驱动程序可以通过调用 StreamClassCompleteRequestAndMarkQueueReady 来组合 2 和 3。

微型驱动程序异步处理请求,因此类驱动程序可能需要取消或超时请求。 出于这些目的,微型驱动程序必须提供 StrMiniCancelPacketStrMiniRequestTimeout 例程。 类驱动程序在取消或超时请求时调用相应的微型驱动程序例程。

当操作系统取消基础 I/O 请求时,类驱动程序会取消请求。 类驱动程序超时处理时间过长的请求 -- 它会递减一个计数器的秒数,直到它超时流请求块的 TimeoutCounter 成员中的请求。 如果微型驱动程序必须长时间延迟对请求的处理,则它应将 TimeoutCounter 成员设置为零 ,然后类驱动程序不会超时请求。 微型驱动程序恢复处理请求后,它应将 TimeoutCounter 重置为等于流请求块的 TimeoutOriginal 成员。 微型驱动程序可以重置 TimeoutOriginal 以更改请求超时前的时间长度。有关详细信息 ,请参阅HW_STREAM_REQUEST_BLOCK