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


Исполняемый код драйвера - часть 7


Как было сказано, работа с процедурой StartIo и системной очередью незавершенных IRP пакетов без особых усилий со стороны разработчика драйвера дает сериализацию (последовательную обработку) пакетов, отражающих поступившие запросы от клиентов драйвера. Если драйвер зарегистрировал процедуру StartIo и затем в обработчиках запросов от клиента ставит IRP пакеты в очередь на обработку соответствующим образом (вызовом IoStartPacket и т.д., что выполняет обработчик DeviceControlRoutine в отношении пакетов с IOCTL кодом, равным IOCTL_SEND_TO_PORT), то Диспетчер ввода/вывода в каждый момент времени будет "выдавать" драйверу (точнее, объекту устройства) не более чем по одному пакету. Эти порции так и будут попадать в процедуру StartIo в связке "объект устройства"-"IRP пакет". Не нужно организовывать особых "синхронизационных" мероприятий по правильному и безопасному совместному использованию устройства. Процедура StartIo должна только запустить процесс (последовательность событий, а не программный!), в результате которого когда-то завершится обработка IRP пакета (успешно или нет, не имеет принципиального значения). Это может быть запуск устройства (прерывание, извещающее о готовности устройства, может вызвать к работе ISR процедуру и целую цепочку событий) или тривиальное программирование последующего запуска отложенной процедуры, как в данном случае. До момента объявления IRP пакета "завершенным" Диспетчер ввода/вывода не вызовет StartIo снова, несмотря на то, что сама процедура StartIo могла уже давно завершить свою работу.

Однако если устройство занято, то появляется желание и далее эксплуатировать механизм системной очереди незавершенных запросов (System Queuing), и поставить запрос снова в эту же очередь, в надежде на то, что очень скоро устройство будет все-таки готово воспринять запрос. В тех случаях, когда в этом действительно имеется необходимость и драйвер собственными силами ведет очередь незавершенных пакетов, ничто не мешает это сделать.


Начало  Назад  Вперед