Баллы, которые следует учитывать для процедур StartIo
При реализации подпрограммы StartIo учитывайте следующие моменты:
Подпрограмма StartIo должна синхронизировать свой доступ к физическому устройству и ко всем общим сведениям о состоянии или ресурсам, которые драйвер хранит в расширении устройства, с другими подпрограммами драйвера, которые обращаются к тому же устройству, расположению памяти или ресурсам.
Если подпрограмма StartIo совместно использует устройство или состояние с ISR, она должна использовать KeSynchronizeExecution для вызова предоставленной драйвером подпрограммы SynchCritSection для программирования устройства или для доступа к общему состоянию. Дополнительные сведения см. в разделе Использование критических разделов.
Если подпрограмма StartIo совместно использует состояние или ресурсы со подпрограммами, отличными от ISR, она должна защищать общее состояние или ресурсы с помощью инициализированной исполнительной блокировки, для которой драйвер предоставляет хранилище. Дополнительные сведения см. в разделе Спин-блокировки.
Если монолитный драйвер устройства, отличный от WDM, настраивает объект контроллера, его подпрограмма StartIo может использовать объект контроллера для синхронизации операций через общее физическое устройство с подключенными (аналогичными) устройствами.
Дополнительные сведения см. в разделе Объекты контроллера .
Если драйвер более высокого уровня не предопределит большие запросы на передачу DMA для базового драйвера устройства, процедура StartIo базового драйвера устройства должна разделить большие запросы на части передачи, а драйвер должен выполнять последовательность операций устройства частичной передачи. Размер каждой частичной передачи должен соответствовать возможностям оборудования: либо возможности устройства драйвера, либо , для подчиненного устройства DMA, возможности системного контроллера DMA, в зависимости от того, что имеет более строгие ограничения.
Дополнительные сведения об использовании системного или master DMA см. в разделе Объекты адаптера и DMA.
Подпрограмма StartIo драйвера, использующего DMA, должна синхронизировать передачу с помощью объекта адаптера.
Подпрограмма StartIo выполняется в irQL = DISPATCH_LEVEL, что ограничивает набор процедур поддержки, которые она может вызывать.
Например, подпрограмма StartIo не может получить доступ к памяти и выделить ее, а также не может ждать, пока объект диспетчера будет установлен в состояние сигнала. С другой стороны, подпрограмма StartIo может получить и освободить выделенный драйвером спин-блокировку с помощью KeAcquireSpinLockAtDpcLevel и KeReleaseSpinLockFromDpcLevel, которые работают быстрее , чем KeAcquireSpinLock и KeReleaseSpinLock.
Дополнительные сведения см. в разделе Управление приоритетами оборудования и спин-блокировками .
Если драйвер содержит irP в состоянии отмены, его подпрограмма StartIo должна проверка, была ли уже отменена входная функция IRP, прежде чем начнет обработку этого запроса на своем устройстве. Дополнительные сведения см. в разделе Отмена IRP.