Обработка блоков запросов потока
Операционная система отправляет все запросы ввода-вывода на устройстве в драйвер класса. Драйвер класса, в свою очередь, запрашивает сведения о конкретном оборудовании из мини-драйвера, передавая SРБ в мини-диск. Драйвер класса указывает операцию, запрашиваемую в элементе Command блока запросов потока.
Как мини-диск в целом, так и каждый поток в мини-накопителе могут получать запросы ввода-вывода. Мини-диск должен предоставлять подпрограмму StrMiniReceiveDevicePacket для обработки запросов на уровне устройства. Каждый поток должен поддерживать две подпрограммы для обработки запросов ввода-вывода: одну для запросов данных и одну для запросов управления. Драйвер класса вызывает обратный вызов запроса данных StrMiniReceiveStreamDataPacket для обработки всех запросов на чтение и запись в потоке. Все остальные запросы для потока передаются в StrMiniReceiveStreamControlPacket.
Если драйвер класса обрабатывает синхронизацию для мини-драйвера, он помещает в очередь потоковые запросы и отправляет их в мини-диск по одному. Драйвер класса поддерживает три отдельные очереди: одну для запросов устройств и по одной для потоковых данных и запросов управления. Мини-диск может сообщить о готовности к новому запросу из одной из этих очередей следующим образом:
Тип запроса | Подпрограмма | Параметр NotificationType подпрограммы |
---|---|---|
запрос устройства |
ReadyForNextDeviceRequest |
|
Запрос на управление потоком |
ReadyForNextStreamControlRequest |
|
запрос потоковой передачи данных |
ReadyForNextStreamDataRequest |
Когда драйвер класса вызывает StrMiniReceiveXXXPacket, он передает блок запроса потока в мини-диск. Подпрограмма мини-накопителя имеет единственный доступ к блоку запроса потока, пока не сообщает драйверу класса, что запрос завершен.
Когда мини-диск завершает обработку запроса, он должен сообщить драйверу класса, что он завершил запрос следующим образом:
Мини-driver должен задать состояние запроса в поле Состояние блока потокового запроса.
Мини-driver должен сообщить, что он завершил запрос, вызвав StreamClassDeviceNotification или StreamClassStreamNotification. Чтобы завершить запрос устройства, мини-driver вызывает StreamClassDeviceNotification с параметром NotificationType DeviceRequestComplete. Чтобы завершить потоковый запрос, мини-driver вызывает StreamClassStreamNotification с параметром NotificationType StreamRequestComplete.
Если драйвер класса обрабатывает синхронизацию и если мини-драйвер еще не дал драйверу класса сигнал о том, что он готов к другому запросу в этой очереди, он должен сделать это сейчас.
Мини-диск можно объединить 2 и 3, вызвав StreamClassCompleteRequestAndMarkQueueReady.
Мини-driver обрабатывает запросы асинхронно, поэтому драйверу класса может потребоваться отменить запрос или имитировать время ожидания. Для этих целей мини-диск должен предоставить процедуру StrMiniCancelPacket и StrMiniRequestTimeout . Драйвер класса вызывает соответствующую подпрограмму мини-драйвера, когда он отменяет или время ожидания запроса.
Драйвер класса отменяет запрос, когда базовый запрос ввода-вывода отменен операционной системой. Драйвер класса и времени ожидания запросов, которые занимают слишком много времени для обработки. Он уменьшает счетчик на сколько секунд, пока не иссыкает время ожидания запроса в элементе TimeoutCounter блока запросов потока. Если мини-диск должен отложить обработку запроса на длительный период времени, он должен задать для элемента TimeoutCounter нулевое значение . Драйвер класса не будет искоренять время ожидания запроса. Когда мини-диск возобновляет обработку запроса, он должен сбросить значение TimeoutCounter , равное элементу TimeoutOriginal блока запросов потока. Мини-диск может сбросить TimeoutOriginal , чтобы изменить продолжительность времени до истечения времени ожидания запроса. Дополнительные сведения см . в HW_STREAM_REQUEST_BLOCK.