Проверка ввода-вывода
Средство проверки драйверов имеет два уровня проверки ввода-вывода:
Проверка ввода-вывода уровня 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
Использование диспетчера проверки драйверов
- Выберите Создать пользовательские параметры (для разработчиков кода) и нажмите кнопку Далее.
- Выберите Выбрать отдельные параметры из полного списка.
- Выберите (проверка) проверку ввода-вывода.
Функция проверки ввода-вывода также включена в стандартные параметры. Чтобы использовать эту функцию, в диспетчере проверки драйверов щелкните Создать стандартные параметры.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по