Поделиться через


Обработка блоков запросов потока

Операционная система отправляет все запросы ввода-вывода на устройстве в драйвер класса. Драйвер класса, в свою очередь, запрашивает сведения о конкретном оборудовании из мини-драйвера, передавая SРБ в мини-диск. Драйвер класса указывает операцию, запрашиваемую в элементе Command блока запросов потока.

Как мини-диск в целом, так и каждый поток в мини-накопителе могут получать запросы ввода-вывода. Мини-диск должен предоставлять подпрограмму StrMiniReceiveDevicePacket для обработки запросов на уровне устройства. Каждый поток должен поддерживать две подпрограммы для обработки запросов ввода-вывода: одну для запросов данных и одну для запросов управления. Драйвер класса вызывает обратный вызов запроса данных StrMiniReceiveStreamDataPacket для обработки всех запросов на чтение и запись в потоке. Все остальные запросы для потока передаются в StrMiniReceiveStreamControlPacket.

Если драйвер класса обрабатывает синхронизацию для мини-драйвера, он помещает в очередь потоковые запросы и отправляет их в мини-диск по одному. Драйвер класса поддерживает три отдельные очереди: одну для запросов устройств и по одной для потоковых данных и запросов управления. Мини-диск может сообщить о готовности к новому запросу из одной из этих очередей следующим образом:

Тип запроса Подпрограмма Параметр NotificationType подпрограммы

запрос устройства

StreamClassDeviceNotification

ReadyForNextDeviceRequest

Запрос на управление потоком

StreamClassStreamNotification

ReadyForNextStreamControlRequest

запрос потоковой передачи данных

StreamClassStreamNotification

ReadyForNextStreamDataRequest

Когда драйвер класса вызывает StrMiniReceiveXXXPacket, он передает блок запроса потока в мини-диск. Подпрограмма мини-накопителя имеет единственный доступ к блоку запроса потока, пока не сообщает драйверу класса, что запрос завершен.

Когда мини-диск завершает обработку запроса, он должен сообщить драйверу класса, что он завершил запрос следующим образом:

  1. Мини-driver должен задать состояние запроса в поле Состояние блока потокового запроса.

  2. Мини-driver должен сообщить, что он завершил запрос, вызвав StreamClassDeviceNotification или StreamClassStreamNotification. Чтобы завершить запрос устройства, мини-driver вызывает StreamClassDeviceNotification с параметром NotificationType DeviceRequestComplete. Чтобы завершить потоковый запрос, мини-driver вызывает StreamClassStreamNotification с параметром NotificationType StreamRequestComplete.

  3. Если драйвер класса обрабатывает синхронизацию и если мини-драйвер еще не дал драйверу класса сигнал о том, что он готов к другому запросу в этой очереди, он должен сделать это сейчас.

Мини-диск можно объединить 2 и 3, вызвав StreamClassCompleteRequestAndMarkQueueReady.

Мини-driver обрабатывает запросы асинхронно, поэтому драйверу класса может потребоваться отменить запрос или имитировать время ожидания. Для этих целей мини-диск должен предоставить процедуру StrMiniCancelPacket и StrMiniRequestTimeout . Драйвер класса вызывает соответствующую подпрограмму мини-драйвера, когда он отменяет или время ожидания запроса.

Драйвер класса отменяет запрос, когда базовый запрос ввода-вывода отменен операционной системой. Драйвер класса и времени ожидания запросов, которые занимают слишком много времени для обработки. Он уменьшает счетчик на сколько секунд, пока не иссыкает время ожидания запроса в элементе TimeoutCounter блока запросов потока. Если мини-диск должен отложить обработку запроса на длительный период времени, он должен задать для элемента TimeoutCounter нулевое значение . Драйвер класса не будет искоренять время ожидания запроса. Когда мини-диск возобновляет обработку запроса, он должен сбросить значение TimeoutCounter , равное элементу TimeoutOriginal блока запросов потока. Мини-диск может сбросить TimeoutOriginal , чтобы изменить продолжительность времени до истечения времени ожидания запроса. Дополнительные сведения см . в HW_STREAM_REQUEST_BLOCK.