Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Как подразумевает его имя, подпрограмма ControllerControl связана с объектом контроллера. Когда подпрограмма ControllerControl выполняется, оборудование, представленное объектом контроллера, свободно, и расширение контроллера обычно не обращается другой подпрограмме драйвера, если только расширение контроллера не содержит контекст, который разделяется с ISR драйвера.
Обычно подпрограмма ControllerControl выполняет по крайней мере следующее:
Обновляет или инициализирует какой-либо контекст драйвера в расширении целевого объекта устройства и в расширении контроллера.
Если драйвер использует DMA, его подпрограмма ControllerControl обычно отвечает за определение того, должен ли данный запрос на передачу разделиться на частичные передачи из-за каких-либо ограничений, введенных системой или устройствами по размеру каждой передачи DMA. В этих случаях подпрограмма ControllerControl также отвечает за вызов AllocateAdapterChannel , если драйвер имеет подпрограмму AdapterControl .
Если драйвер использует PIO, его подпрограмма ControllerControl также отвечает за разделение запросов передачи на частичные диапазоны передачи, если это требуется его оборудованием, и за вызов MmGetSystemAddressForMdlSafe с MDL в Irp->MdlAddress.
Программирует оборудование для запрошенной операции ввода-вывода
Если к расширению устройства или контроллера можно получить доступ из ISR, подпрограмма ControllerControl должна использовать подпрограмму SynchCritSection , вызываемую вызовом KeSynchronizeExecution. Дополнительные сведения см. в разделе Использование критически важных разделов.
Если у драйвера есть подпрограмма Cancel, подпрограмма ControllerControl также должна проверять поле Irp->Cancel, чтобы определить, следует ли отменить текущий IRP, и выполнить одно из следующих действий:
Если для Irp-Cancel> задано значение TRUE, подпрограмма ControllerControl должна выполнять следующие действия:
Задайте STATUS_CANCELLED для состояния и ноль для информации в блоке состояния ввода-вывода IRP.
Вызовите IoFreeController , чтобы освободить объект контроллера, чтобы следующая операция устройства была быстро запущена.
Вызовите IoStartNextPacket или извлеките следующий IRP из очереди, если драйвер управляет очередью самостоятельно.
Завершите отмененный IRP с помощью IoCompleteRequest и верните управление.
Если для Irp-Cancel> не задано значение TRUE, подпрограмма ControllerControl должна выполнять следующие действия:
Вызовите IoSetCancelRoutine , чтобы сбросить точку входа процедуры Cancel для IRP до NULL. Приобретите спин-блокировку отмены для этого вызова, если драйвер использует очередь устройства, предоставленную диспетчером ввода-вывода, в устройстве.
Программируйте оборудование для запрошенной операции ввода-вывода с помощью подпрограммы SynchCritSection , вызываемой вызовом KeSynchronizeExecution. Дополнительные сведения см. в разделе "Использование критических разделов"
Дополнительные сведения об обработке отменяемых irps см. в разделе "Отмена irPs".
Для большинства прерываемых операций ввода-вывода, кроме перекрывающихся операций на разных устройствах, подключенных к физическому контроллеру или адаптеру, подпрограмма ControllerControl должна возвращать KeepObject, так как подпрограмма DpcForIsr или CustomDpc завершает операцию и IRP.
Как только операции ввода-вывода для удовлетворения текущего запроса выполняются, подпрограмма, которая завершит IRP, должна вызывать IoFreeController и IoStartNextPacket , чтобы следующий запрос можно было обрабатывать как можно быстрее.
Если подпрограмма ControllerControl сама завершает IRP или может настроить операцию, например, поиск диска, для одного из целевых объектов устройства (диска), который может совмещаться с операцией для другого объекта устройства, подпрограмма ControllerControl должна возвращать DeallocateObject.