Проверка ввода-вывода
Средство проверки драйверов имеет два уровня проверки ввода-вывода:
Проверка ввода-вывода уровня 1 всегда активна при выборе проверки ввода-вывода.
Проверка ввода-вывода уровня 2 всегда активна при выборе проверки ввода-вывода в Windows XP и более поздних версиях.
См. также: расширенная проверка ввода-вывода в Windows 7 и более поздних версиях операционной системы Windows, улучшенная проверка ввода-вывода автоматически активируется при выборе проверки ввода-вывода. Он недоступен или необходим, чтобы выбрать его в качестве отдельного параметра.
Проверка ввода-вывода уровня 1
Если включена проверка ввода-вывода уровня 1, все ip-адреса, полученные через 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 отображаются разными способами: на синем экране, в файле аварийного дампа и в отладчике ядра.
На синем экране эти ошибки отмечаются сообщением ОБ ОШИБКЕ ПРОВЕРКИ СИСТЕМЫ ВВОДА-ВЫВОДА и строкой ОШИБКИWDM DRIVER XXX, где XXX — код ошибки ввода-вывода.
В файле аварийного дампа большинство этих ошибок отмечаются сообщением BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION), а также кодом ошибки ввода-вывода. В этом случае код ошибки ввода-вывода отображается как первый параметр проверки ошибки 0xC9. Оставшаяся часть отмечается сообщением о проверке ошибок 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION), а также кодом ошибки проверяющего драйвера. В этом случае код ошибки проверки драйвера отображается в качестве первого параметра проверки ошибки 0xC4.
В отладчике ядра (KD или WinDbg) эти ошибки отмечаются сообщением WDM DRIVER ERROR и описательной текстовой строкой. Если отладчик ядра активен, можно игнорировать ошибки уровня 2 и возобновить системную операцию. (Это невозможно при любых других проверках ошибок.)
Синий экран, файл аварийного дампа и отладчик ядра отображают дополнительные сведения. Полное описание большинства сообщений об ошибках уровня ввода-вывода 2 см. в разделе "Проверка ошибок" 0xC9. Оставшаяся часть см. в разделе "Проверка ошибок" 0xC4.
Начиная с Окна Vista параметр проверки ввода-вывода проверяет наличие следующих ошибок драйвера:
Слишком долгое время для завершения и отмены irPs, которые были созданы в приложениях пользовательского режима.
Освобождение блокировки удаления, которая еще не была приобретена.
Вызов IoReleaseRemoveLock или IoReleaseRemoveLockAndWait с параметром тега, который отличается от параметра тега, используемого в соответствующем вызове IoAcquireRemoveLock.
Вызов IoCallDriver с отключенными прерываниями.
Вызов IoCallDriver в IRQL больше DISPATCH_LEVEL.
Возврат из подпрограммы отправки драйвера с отключенными прерываниями.
Возврат из подпрограммы отправки драйвера с измененным IRQL.
Возврат из подпрограммы отправки драйвера с отключенными API. В этом случае драйвер может вызывать KeEnterCriticalRegion больше раз, чем KeLeaveCriticalRegion, что является основной причиной для проверки ошибок 0x20 (KERNEL_APC_PENDING_DURING_EXIT) и проверки ошибок 0x1 (APC_INDEX_MISMATCH).
Начиная с Windows 7, параметр проверки ввода-вывода проверяет наличие следующих ошибок драйвера:
- Пытается освободить IP-адреса путем вызова ExFreePool. IrPs необходимо освободить с помощью IoFreeIrp.
Кроме того, этот параметр можно использовать для обнаружения другой распространенной ошибки драйвера — повторной инициализации блокировки. Удаление структур данных блокировки должно быть выделено внутри расширений устройства. Это гарантирует, что диспетчер ввода-вывода освобождает память, содержащую структуру 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
Использование диспетчера проверки драйверов
- Выберите " Создать настраиваемые параметры" (для разработчиков кода) и нажмите кнопку "Далее".
- Выберите отдельные параметры из полного списка.
- Выберите (проверьте) проверку ввода-вывода.
Функция проверки ввода-вывода также включена в стандартные параметры. Чтобы использовать эту функцию, в диспетчере проверки драйверов нажмите кнопку "Создать стандартные параметры".