| Предыдущий | Следующий |
| APC_INDEX_MISMATCH | INVALID_AFFINITY_SET |
DEVICE_QUEUE_NOT_BUSY
Проверка ошибок DEVICE_QUEUE_NOT_BUSY имеет значение 0x00000002.
Эта проверка возникает крайне редко.
Важно
Эта статья предназначена для программистов. Если при работе с компьютером появился синий экран с кодом DEVICE_QUEUE_NOT_BUSY, см. Устранение ошибок синего экрана.
Устранение DEVICE_QUEUE_NOT_BUSY
Расширение !analyze отладки выводит сведения о проверке ошибки и помогает определить первопричину.
Управление очередями устройств
Диспетчер I/O обычно создаёт связанный объект очереди устройства при вызове драйвером IoCreateDevice; исключение составляют FSD. Он также предоставляет IoStartPacket и IoStartNextPacket, с помощью которых драйверы поручают диспетчеру I/O поместить IRP в связанную очередь устройства либо вызвать их подпрограммы StartIo.
Поэтому драйверу редко требуется самостоятельно создавать объекты очередей устройств для IRP, и обычно это не даёт преимуществ. Вероятные кандидаты — такие драйверы, как SCSI port driver, которым необходимо координировать входящие IRP от нескольких тесно связанных class drivers разнородных устройств, обслуживаемых одним controller или bus adapter.
Иными словами, драйвер controller дискового массива скорее использует созданный драйвером controller object, чем дополнительные объекты очередей устройств; драйвер дополнительного bus adapter и набор class drivers несколько чаще применяют дополнительные очереди устройств.
Использование дополнительных очередей устройств с подпрограммой StartIo
Вызывая IoStartPacket и IoStartNextPacket, подпрограммы Dispatch и DpcForIsr (либо CustomDpc) драйвера синхронизируют вызовы StartIo через очередь устройства, созданную диспетчером I/O вместе с device object. Для port driver с подпрограммой StartIo функции IoStartPacket и IoStartNextPacket помещают и извлекают IRP из очереди устройства общего controller/adapter этого драйвера. Если port driver также создаёт дополнительные очереди для запросов от тесно связанных class drivers верхнего уровня, он должен распределять входящие IRP по этим очередям, обычно в StartIo.
Перед вставкой IRP port driver должен определить, к какой дополнительной очереди устройства он относится. Указатель на целевой device object передаётся вместе с IRP в подпрограмму Dispatch драйвера. Драйвер должен сохранить этот указатель для распределения входящих IRP. Обратите внимание: указатель device object, передаваемый в StartIo, указывает на собственный объект драйвера, представляющий controller/adapter устройства, поэтому для этой цели он непригоден.
После постановки IRP в очередь драйвер программирует общий controller/adapter для выполнения запроса. Таким образом, port driver может обрабатывать входящие запросы ко всем устройствам в порядке поступления, пока вызов KeInsertDeviceQueue не поместит IRP в очередь конкретного class driver.
Используя собственную очередь для всех IRP, обрабатываемых через StartIo, нижележащий port driver последовательно выполняет операции через общий controller/adapter устройства или шины для всех подключённых устройств. Иногда удерживая IRP каждого поддерживаемого устройства в отдельной очереди, port driver не допускает обработки IRP уже занятого устройства и одновременно повышает пропускную способность I/O остальных устройств, использующих общее оборудование.
В ответ на IoStartPacket из Dispatch port driver диспетчер I/O либо немедленно вызывает StartIo этого драйвера, либо помещает IRP в очередь, связанную с device object общего controller/adapter.
Port driver должен хранить собственные сведения о состоянии каждого разнородного устройства, обслуживаемого через общий device controller/adapter.
Нужно найти другой код? Найти другой код состояния или ошибки.