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


Требования к подпрограмме ControllerControl

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

Обычно подпрограмма ControllerControl выполняет по крайней мере следующее:

  1. Обновления или инициализирует любой контекст, который драйвер поддерживает в расширении устройства целевого объекта устройства и в расширении контроллера.

    Если драйвер использует DMA, его подпрограмма ControllerControl обычно отвечает за определение того, должен ли данный запрос на передачу быть разделен на частичную передачу из-за ограничений, накладываемых системой или устройством на размер каждой передачи DMA. В таких случаях подпрограмма ControllerControl также отвечает за вызов AllocateAdapterChannel , если у драйвера есть подпрограмма AdapterControl .

    Если драйвер использует piO, его подпрограмма ControllerControl также отвечает за разделение запросов на передачу, если требуется его оборудование, на диапазоны частичной передачи и за вызов MmGetSystemAddressForMdlSafe с MDL в Irp-MdlAddress>.

  2. Программирует оборудование для запрошенной операции ввода-вывода.

    Если доступ к расширению устройства или контроллера можно получить из ISR, подпрограмма ControllerControl должна использовать подпрограмму SynchCritSection , которая вызывается путем вызова KeSynchronizeExecution. Дополнительные сведения см. в разделе Использование критических разделов.

Если у драйвера есть подпрограмма Отмена, ее подпрограмма ControllerControl также должна проверка поле Irp-Cancel>, чтобы определить, следует ли отменить текущий IRP, и выполнить одно из следующих действий:

Если для параметра Irp-Cancel> задано значение TRUE, подпрограмма ControllerControl должна выполнять следующие действия:

  1. Задайте STATUS_CANCELLED для параметра Состояние и ноль для параметра Сведения в блоке состояния ввода-вывода IRP.

  2. Вызовите IoFreeController , чтобы освободить объект контроллера, чтобы можно было быстро начать следующую операцию устройства.

  3. Вызовите IoStartNextPacket или отмените следующий IRP, если драйвер управляет собственной очередью.

  4. Завершите отмененное IRP с помощью IoCompleteRequest и возврата управления.

Если для параметра Irp-Cancel> не задано значение TRUE, подпрограмма ControllerControl должна выполнять следующие действия.

  1. Вызовите IoSetCancelRoutine , чтобы сбросить точку входа процедуры Отмены для IRP до NULL. Получите блокировку отмены спина для этого вызова, если драйвер использует предоставленную диспетчером ввода-вывода очередь устройств в объекте устройства.

  2. Запрограммируйте оборудование для запрошенной операции ввода-вывода с помощью подпрограммы SynchCritSection , которая вызывается путем вызова KeSynchronizeExecution. Дополнительные сведения см. в разделе Использование критических разделов.

Дополнительные сведения об обработке отменяемых irP см. в разделе Отмена irPs.

Для большинства операций ввода-вывода, управляемых прерываниями, за исключением перекрывающихся операций на разных устройствах, подключенных к физическому контроллеру или адаптеру, подпрограмма ControllerControl должна возвращать KeepObject , так как подпрограмма DpcForIsr или CustomDpc завершает операцию и IRP.

Как только операции ввода-вывода для удовлетворения текущего запроса будут выполнены, подпрограмма, которая завершит IRP, должна вызвать IoFreeController и IoStartNextPacket , чтобы следующий запрос можно было обработать как можно быстрее.

Если подпрограмма ControllerControl сама завершает IRP или если она может настроить операцию, например поиск диска, для одного целевого объекта (диска), который может перекрываться с операцией для другого объекта устройства, подпрограмма ControllerControl должна возвращать DeallocateObject.