| Предыдущий | Следующий |
| EM_INITIALIZATION_ERROR | ATTEMPTED_WRITE_TO_CM_PROTECTED_STORAGE |
DRIVER_RETURNED_HOLDING_CANCEL_LOCK
Она означает, что драйвер вернулся из подпрограммы отмены, продолжая удерживать глобальную блокировку отмены.
Из-за этого все последующие вызовы отмены завершаются неудачно, что приводит к взаимоблокировке или другой проверке ошибки.
Как правило, причиной такой ошибки являются некачественные драйверы принтеров.
Лучшее, хотя и не самое быстрое решение — запросить исправление у производителя. Для этого
свяжитесь с производителем и отправьте ему dmp-файлы, созданные при возникновении ошибки. Однако в качестве
временного решения можно использовать описанную ниже процедуру.
Как устранить DRIVER_RETURNED_HOLDING_CANCEL_LOCK при подключении сетевого принтера
Убедитесь, что KBKB5005565 и KB5005568 были полностью удалены.
Для проверки выполните следующие действия:
- Откройте панель управления.
- Выберите «Программы» > «Программы и компоненты» > «Просмотр установленных обновлений».
- Найдите KBKB5005565 и KB5005568 и удалите их, если они всё ещё установлены.
Также можно попробовать следующие действия:
МЕТОД 1: добавьте принтер вручную по его IP-адресу
- Откройте «Параметры» > «Устройства».
- Нажмите «Устройства и принтеры».
- Нажмите «Добавить принтер», затем ссылку «Необходимый принтер отсутствует в списке».
- Выберите добавление принтера по TCP/IP-адресу или имени узла.
- Узнайте IP-адрес принтера и следуйте инструкциям на экране.
МЕТОД 2: отключите RPC-шифрование диспетчера печати
- Запустите редактор реестра.
- Перейдите к HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print.
- Щёлкните правой кнопкой мыши раздел Print и выберите «Создать» > «Параметр DWORD (32 бита)».
- Назовите новый параметр RpcAuthnLevelPrivacyEnabled.
- Дважды щёлкните новый параметр и задайте ему значение 0.
Внутреннее устройство DRIVER_RETURNED_HOLDING_CANCEL_LOCK
Важно
Эта статья предназначена для программистов. Если при работе с компьютером появился синий экран с кодом DRIVER_RETURNED_HOLDING_CANCEL_LOCK, см. Устранение ошибок синего экрана.
Параметры DRIVER_RETURNED_HOLDING_CANCEL_LOCK
| Параметр | Описание |
|---|---|
| 1 | Адрес отменённого IRP; он может быть уже недействителен. |
| 2 | Адрес подпрограммы cancel. |
Примечания
Спин-блокировка отмены должна была быть освобождена подпрограммой cancel.
Для отмены отдельного пакета запроса I/O (IRP) драйвер вызывает функцию IoCancelIrpIoCancelIrp.
Эта функция захватывает спин-блокировку отмены, устанавливает в IRP флаг отмены, а затем вызывает
подпрограмму cancel, указанную в соответствующем поле IRP, если она задана.
Подпрограмма cancel должна освободить спин-блокировку отмены. Если подпрограмма cancel
не задана, спин-блокировка отмены освобождается.
Использование системной спин-блокировки отмены и DRIVER_RETURNED_HOLDING_CANCEL_LOCK
Система предоставляет единственную спин-блокировку отмены, которая захватывается или освобождается, когда определённые системные подпрограммы
вызываются.
Подпрограммы драйвера, изменяющие состояние допускающих отмену IRP, включая все подпрограммы, которые могут завершить
IRP с состоянием STATUS_CANCELLED, должны захватывать и освобождать системную спин-блокировку отмены в соответствии с
рекомендациями этого раздела.
В драйверах, использующих очередь устройства диспетчера I/O, любая подпрограмма драйвера, кроме подпрограммы Cancel,
которая изменяет состояние отменяемости IRP, должна сначала вызвать IoAcquireCancelSpinLock для захвата системной
спин-блокировки отмены.
Захват спин-блокировки отмены гарантирует, что только вызывающая сторона сможет изменить состояние отменяемости этого IRP.
Пока вызывающая сторона удерживает спин-блокировку, диспетчер I/O не может вызвать подпрограмму Cancel драйвера для этого
IRP. Аналогично, другая подпрограмма драйвера, например DispatchCleanup, не может одновременно пытаться изменить
состояние отменяемости этого IRP.
В драйверах, самостоятельно управляющих очередями IRP и использующих собственные спин-блокировки для синхронизации доступа к очереди,
подпрограммам драйвера не требуется захватывать спин-блокировку отмены перед вызовом IoSetCancelRoutine.
Однако такие драйверы должны проверить указатель подпрограммы Cancel, возвращённый IoSetCancelRoutine, чтобы определить,
не началось ли уже выполнение подпрограммы Cancel. Подробности см. в разделе об использовании спин-блокировки, предоставляемой драйвером.
Любая подпрограмма драйвера, вызвавшая IoAcquireCancelSpinLock, должна как можно быстрее вызвать IoReleaseCancelSpinLock.
В противном случае система создаст проверку ошибки DRIVER_RETURNED_HOLDING_CANCEL_LOCK (0x0000011B).
Драйвер никогда не должен вызывать IoCompleteRequest для IRP, удерживая спин-блокировку. Попытка завершить
IRP при удержании спин-блокировки может привести к взаимоблокировке.
Нужно найти другой код? Найти другой код состояния или ошибки.
