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


Проверка ввода-вывода

Средство проверки драйверов имеет два уровня проверки ввода-вывода:

  • Проверка ввода-вывода уровня 1 всегда активна при каждом выборе проверки ввода-вывода.

  • Проверка ввода-вывода уровня 2 всегда активна при каждом выборе проверки ввода-вывода в Windows XP и более поздних версиях.

См. также:Расширенная проверка ввода-вывода в Windows 7 и более поздних версиях операционной системы Windows. Расширенная проверка ввода-вывода активируется автоматически при выборе проверки ввода-вывода. Он недоступен или необходимо выбрать его в качестве отдельного параметра.

Проверка ввода-вывода уровня 1

Если включена проверка ввода-вывода уровня 1, все irP, полученные с помощью IoAllocateIrp , выделяются из специального пула и отслеживаются их использование.

Кроме того, средство проверки драйверов проверяет наличие недопустимых вызовов ввода-вывода, в том числе:

  • Пытается освободить IRP, тип которого не IO_TYPE_IRP

  • Передача недопустимых объектов устройств в IoCallDriver

  • Передает IRP в IoCompleteRequest , содержащий недопустимое состояние или для которого по-прежнему задана процедура отмены

  • Изменения в IRQL при вызове процедуры диспетчеризации драйвера

  • Пытается освободить IRP, который остается связанным с потоком

  • Передает объект устройства в IoInitializeTimer , который уже содержит инициализированный таймер.

  • Передает недопустимый буфер в IoBuildAsynchronousFsdRequest или IoBuildDeviceIoControlRequest

  • Передает блок состояния ввода-вывода в IRP, если этот блок состояния ввода-вывода выделен в стеке, который слишком далеко раскрутился.

  • Передает объект события в IRP, когда этот объект события выделяется в стеке, который имеет слишком далекое размножение

Так как специальный пул IRP имеет ограниченный размер, проверка ввода-вывода наиболее эффективна, если она используется только для одного драйвера за раз.

Сбои проверки ввода-вывода уровня 1 вызывают проверка 0xC9 ошибок. Первый параметр этой ошибки проверка указывает, какое нарушение произошло. Полный список параметров см. в 0xC9 проверки ошибок (DRIVER_VERIFIER_IOMANAGER_VIOLATION).

Проверка ввода-вывода уровня 2

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

На синем экране эти ошибки отмечены сообщением IO SYSTEM VERIFICATION ERROR и строкой WDM DRIVER ERRORXXX, где XXX — код ошибки ввода-вывода.

В файле аварийного дампа большинство этих ошибок отмечается сообщением BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION) вместе с кодом ошибки ввода-вывода. В этом случае код ошибки ввода-вывода отображается в качестве первого параметра проверка 0xC9 ошибки. Остальные отмечены сообщением 0xC4 проверки ошибок (DRIVER_VERIFIER_DETECTED_VIOLATION) вместе с кодом ошибки средства проверки драйверов. В этом случае код ошибки средства проверки драйверов отображается в качестве первого параметра проверка 0xC4 ошибки.

В отладчике ядра (KD или WinDbg) эти ошибки отмечаются сообщением WDM DRIVER ERROR и описательной текстовой строкой. Если отладчик ядра активен, можно игнорировать ошибки уровня 2 и возобновить работу системы. (Это невозможно при других проверках ошибок.)

На синем экране, файле аварийного дампа и отладчике ядра также отображаются дополнительные сведения. Полное описание большинства сообщений об ошибках для проверки ввода-вывода уровня 2 см. в разделе 0xC9 проверки ошибок. Остальные сведения см. в разделе 0xC4 проверки ошибок.

Начиная с Windows Vista параметр проверки ввода-вывода проверяет наличие следующих ошибок драйвера:

  • Выполнение и отмена IRP, которые были созданы в приложениях пользовательского режима, занимает слишком много времени.

  • Снятие блокировки удаления, которая еще не была приобретена.

  • Вызов IoReleaseRemoveLock или IoReleaseRemoveLockAndWait с параметром тега, который отличается от параметра тега, используемого в соответствующем вызове IoAcquireRemoveLock .

  • Вызов IoCallDriver с отключенными прерываниями.

  • Вызов IoCallDriver в IRQL больше DISPATCH_LEVEL.

  • Возврат из подпрограммы диспетчеризации драйвера с отключенными прерываниями.

  • Возврат из подпрограммы диспетчеризации драйвера с измененным IRQL.

  • Возврат из подпрограммы диспетчеризации драйвера с отключенными APC. В этом случае драйвер мог вызывать KeEnterCriticalRegion больше раз, чем KeLeaveCriticalRegion, что является основной причиной 0x20 проверки ошибок (KERNEL_APC_PENDING_DURING_EXIT) и 0x1 проверки ошибок (APC_INDEX_MISMATCH).

Начиная с Windows 7, параметр проверки ввода-вывода проверяет наличие следующих ошибок драйвера:

  • Пытается освободить IRP, вызвав ExFreePool. IrP должны быть освобождены с помощью IoFreeIrp.

Кроме того, этот параметр можно использовать для обнаружения другой распространенной ошибки драйвера — повторной инициализации блокировки удаления. Структуры данных remove locks должны быть выделены внутри расширений устройств. Это гарантирует, что диспетчер ввода-вывода освобождает память, содержащую структуру IO_REMOVE_LOCK, только при удалении объекта устройства. Если драйвер выполняет следующие три шага, возможно, что после шага 2 приложение или драйвер по-прежнему содержит ссылку на Device1:

  • Выделяет структуру IO_REMOVE_LOCK, соответствующую Device1, но выполняет выделение за пределами расширения Device1.
  • Вызывает IoReleaseRemoveLockAndWait при удалении device1.
  • Вызывает IoInitializeRemoveLock для той же блокировки, чтобы повторно использовать ее в качестве блокировки удаления для Device2.

Возможно, что после шага 2 приложение или драйвер по-прежнему содержит ссылку на Device1. Приложение или драйвер по-прежнему могут отправлять запросы на Device1, даже если это устройство было удалено. Таким образом, небезопасно повторно использовать ту же память, что и новая блокировка удаления, пока диспетчер ввода-вывода не удалит Device1. Повторное инициализация той же блокировки, когда другой поток пытается получить ее, может привести к повреждению блокировки с непредсказуемыми результатами для драйвера и всей системы.

В Windows 7 и более поздних версиях операционной системы Windows расширенная проверка ввода-вывода активируется автоматически при выборе проверки ввода-вывода.

Активация этого параметра

Функцию проверки ввода-вывода можно активировать для одного или нескольких драйверов с помощью диспетчера проверки драйверов или командной строки Verifier.exe. Дополнительные сведения см. в разделе Выбор параметров средства проверки драйверов.

  • В командной строке.

    В командной строке параметр проверки ввода-вывода представлен битом 4 (0x10). Чтобы активировать проверку ввода-вывода, используйте значение флага 0x10 или добавьте 0x10 к значению флага. Пример:

    verifier /flags 0x10 /driver MyDriver.sys
    

    Функция будет активна после следующей загрузки.

    Вы также можете активировать и отключить проверку ввода-вывода без перезагрузки компьютера, добавив параметр /volatile в команду . Пример:

    verifier /volatile /flags 0x10 /adddriver MyDriver.sys
    

    Этот параметр вступает в силу немедленно, но теряется при завершении работы или перезагрузке компьютера. Дополнительные сведения см. в разделе Использование переменных параметров.

    Функция проверки ввода-вывода также включена в стандартные параметры. Пример:

    verifier /standard /driver MyDriver.sys
    
  • Использование диспетчера проверки драйверов

    1. Выберите Создать пользовательские параметры (для разработчиков кода) и нажмите кнопку Далее.
    2. Выберите Выбрать отдельные параметры из полного списка.
    3. Выберите (проверка) проверку ввода-вывода.

    Функция проверки ввода-вывода также включена в стандартные параметры. Чтобы использовать эту функцию, в диспетчере проверки драйверов щелкните Создать стандартные параметры.