Программирование драйверов Windows

Старт операции ввода/вывода


В том случае, если рабочая процедура решит задействовать механизм System Queuing и послать Диспетчеру ввода/вывода запрос на вызов процедуры StartIo, то тот выполнит проверку, не занято ли устройство. Диспетчер ввода/вывода может это установить путем проверки, завершены или нет IRP для данного устройства. Если предыдущий запрос еще не завершен, новый запрос на старт операции ввода/вывода помещается в очередь. В противном случае, процедура StartIo вызывается непосредственно.

Ожидается, что процедура старта ввода/вывода, реализация которой возлагается исключительно на разработчика драйвера, выполняет следующие задачи (или часть из них):

  • Проверяет код IRP функции (чтение, запись и т.п.) и выполняет установочные действия для данного типа операций.
  • В случае, если устройство (то есть объект устройства, которому адресован IRP пакет) по логике работы олицетворяет только одну из функций сложного реального устройства, запрашивает исключительный доступ к заранее созданному объекту контроллера, планируя при этом вызов соответствующей процедуры ControllerControl.
  • В случае, если запрос требует DMA операций, выполняет надлежащие операции над объектом адаптера и планирует вызов процедуры AdapterControl (которая будет вызвана, сразу же, как только условия исключительного доступа к соответствующему DMA каналу будут удовлетворены).
  • Использует процедуру SynchCritSection для выполнения безопасного доступа к тем ресурсам, которые могут потребоваться процедуре обработки прерываний.
  • Возвращает управление Диспетчеру ввода/вывода в ожидании сигналов прерывания от устройства.
  • Пример драйвера с использованием механизма System Queuing подробно рассматривается в главе 11.



    Содержание раздела