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


Отчеты об ошибках устройства

Существует три способа сообщить о сбоях устройства.

  • При возвращении из функции обратного вызова объекта устройства, драйвер может указать возвращаемое значение, для которого NT_SUCCESS(status) равно FALSE.

  • Драйвер может вызвать WdfDeviceSetFailed.

  • При возврате из подпрограммы обратного вызова EvtDriverDeviceAdd драйвер функции может указать возвращаемое значение, для которого NT_SUCCESS(status) равно FALSE. Если драйвер, установленный в качестве фильтра, порождает ошибку в EvtDriverDeviceAdd, операционная система пропускает объект устройства фильтра и не сообщает об ошибке PnP.

Каждый из приведенных выше методов приводит к тому, что фреймворк эффективно удаляет устройство. Если драйверы устройства не поддерживают другие устройства в системе, диспетчер ввода-вывода выгрузит драйверы.

Если функция обратного вызова объекта устройства драйвера возвращает значение, для которого NT_SUCCESS(статус) равно FALSE, фреймворк уведомляет диспетчер PnP, который затем пытается перезапустить устройство, запросив драйвер шины повторно переидентифицировать свои устройства. Ваш драйвер будет перезагружен, если он был выгружен.

Если ваш драйвер вызывает WdfDeviceSetFailed, он предоставляет входной аргумент, который определяет, будет ли устройство перезапущено. Значения аргументов : #B0 WdfDeviceFailedAttemptRestart #C1 и #B2 WdfDeviceFailedNoRestart #A3.

#B0 UMDF #C1 До UMDF 2.15 драйвер UMDF должен задать для этого значения значение #B2 WdfDeviceFailedNoRestart #A3. Начиная с версии UMDF 2.15 драйвер UMDF может запросить, чтобы базовый драйвер шины повторно перечислил его, вызвав WdfDeviceSetFailed с FailedAction, установленным в WdfDeviceFailedAttemptRestart. Для получения дополнительной информации см. WdfDeviceSetFailed.

Дополнительные сведения об этих значениях аргументов см. в разделе WDF_DEVICE_FAILED_ACTION. Перед возвратом функции обратного вызова объекта драйвера со значением, для которого NT_SUCCESS(status) равно FALSE, функция обратного вызова может предотвратить перезапуск, вызвав WdfDeviceSetFailed с аргументом WdfDeviceFailedNoRestart. В противном случае эти функции обратного вызова не обязаны вызывать WdfDeviceSetFailed.

Если в течение короткого периода времени несколько последовательных попыток перезапуска завершаются сбоем (так как перезапущенный драйвер снова сообщает об ошибке), платформа перестает перезапускать устройство.

Если функция EvtDeviceD0Entry водителя автобуса возвращает значение, для которого NT_SUCCESS(состояние) равно FALSE, платформа может по-прежнему вызывать функции EvtDeviceD0Entry драйверов, связанных с дочерними устройствами этого водителя автобуса.