Что означает код BSOD 2 (DEVICE_QUEUE_NOT_BUSY)?

 
Также может означать:
КонстантаТипОС
ERROR_FILE_NOT_FOUNDОшибка WindowsWindows
STATUS_WAIT_2NTSTATUSWindows
KERN_PROTECTION_FAILUREКод возврата ядра macOSmacOS
ippStsMisalignedBufСтатус Intel IPPЛюбая
WDSMCCLIENT_CATEGORYHRESULTWindows
ENOENTerrnoЛюбая
Предыдущий Следующий
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.


Нужно найти другой код? Найти другой код состояния или ошибки.