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


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

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

  • Проверка ввода-вывода уровня 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 отображаются разными способами: на синем экране, в файле аварийного дампа и в отладчике ядра.

На синем экране эти ошибки отмечаются сообщением ОШИБКА ПРОВЕРКИ СИСТЕМЫ ВВОДА-ВЫВОДА и строкой 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".

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

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

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

  • Вызов 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. 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
    
  • Использование диспетчера проверки драйверов

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

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