Принудительная проверка IRQL

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

Если включена принудительная проверка IRQL, средство проверки драйверов оказывает крайнее давление на использование системной памяти. Всякий раз, когда проверяемый драйвер запрашивает спин-блокировку, вызывает KeSynchronizeExecution или вызывает IRQL до DISPATCH_LEVEL или выше, весь системный пул, код и данные (включая страничные коды и данные драйвера) обрезаются из рабочего набора. Если драйвер пытается получить доступ к любой из этой памяти, средство проверки драйверов выдает ошибку проверка.

Начиная с Windows Vista, этот параметр также заставляет средство проверки драйверов обнаруживать, когда определенные объекты синхронизации включаются в страничной памяти. Эти объекты синхронизации не могут быть разыкачены по страницам, так как ядро операционной системы обращается к ним с повышенными привилегиями IRQL. Средство проверки драйверов может обнаруживать доступные для страниц структуры KTIMER, PRKMUTEX, PKSPIN_LOCK, PRKEVENT, PKSPIN_LOCK, PRKSEMAPHORE, PERESOURCE и FAST_MUTEX .

Это давление на использование памяти не повлияет непосредственно на драйверы, которые не выбраны для проверки. Если драйвер, который не выбран для проверки, вызывает IRQL, он не запускает действие обрезки. Однако когда проверяемый драйвер вызывает IRQL, средство проверки драйверов обрезает страницы, которые могут использоваться драйверами, которые не проверяются. Поэтому ошибки, зафиксированные драйверами, которые не проверяются, иногда могут перехватываться, когда этот параметр активен.

Мониторинг вызовов IRQL и спин-блокировок

Можно отслеживать количество вызовов IRQL, блокировок спина и вызовов KeSynchronizeExecution , выполняемых проверяемыми драйверами. Также можно отслеживать количество операций, когда средство проверки драйверов обрезало выстраимую память из рабочего набора. Эти статистические данные могут отображаться диспетчером проверки драйверов, Verifier.exe командной строке или в файле журнала. Дополнительные сведения см. в разделе Мониторинг глобальных счетчиков .

Для мониторинга этой статистики также можно использовать расширение отладчика ядра !verifier . В нем представлена информация, аналогичная информации диспетчера проверки драйверов. В Windows XP и более поздних версиях расширение !verifier 0x8 отображает журнал последних изменений IRQL, внесенных проверяемыми драйверами. Дополнительные сведения о расширениях отладчика см. в разделе Отладка Windows.

Вызов KeEnterCriticalRegion или KeLeaveCriticalRegion в DISPATCH_LEVEL или выше

KeEnterCriticalRegion и KeLeaveCriticalRegion — это API, которые можно использовать для синхронизации выполнения критической последовательности кода драйвера с доставкой обычных вызовов асинхронных процедур ядра (APC). API KeEnterCriticalRegion и KeLeaveCriticalRegion не могут вызываться по адресу IRQL = DISPATCH_LEVEL или выше. Вызов KeEnterCriticalRegion или KeLeaveCriticalRegion в DISPATCH_LEVEL или выше может привести к зависаю системы или повреждению памяти.

Начиная с Windows 7 средство проверки драйверов обнаруживает вызовы этих API в DISPATCH_LEVEL или более поздней версии, если включен параметр Принудительно проверять IRQL.

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

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

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

    В командной строке параметр Force IRQL Checking представлен битом 1 (0x2). Чтобы активировать принудительная проверка IRQL, используйте значение флага 0x2 или добавьте 0x2 к значению флага. Пример:

    verifier /flags 0x2 /driver MyDriver.sys
    

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

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

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

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

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

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

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

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