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


Обнаружение повреждения памяти специального пула памяти в Диспетчере драйверов

Повреждение памяти является распространенной проблемой драйвера. Ошибки драйвера могут привести к сбою в течение длительного времени после внесения ошибок. Наиболее распространенными из этих ошибок являются доступ к памяти, которая уже освобождена, и выделение n байтов, а затем доступ к n+1 байтам.

Чтобы обнаружить повреждение памяти, средство проверки драйверов может выделить память драйвера из специального пула и отслеживать этот пул для неправильного доступа. Поддержка специального пула предоставляется для подпрограмм, предоставляемых системой в режиме ядра, таких как ExAllocatePoolWithTag , а также для подпрограмм, предоставляемых системой GDI, таких как EngAllocMem.

Специальный пул методом выравнивания

Доступны два выравнивания специального пула:

  • Выравнивание "Verify Start" лучше при обнаружении переполнения буфера при доступе.
  • Выравнивание Verify End лучше для выявления переполнения доступа.

Дополнительную информацию об использовании параметров Проверить начало и Проверить окончание см. в разделе Обнаружение переполнений и недополнений. Обратите внимание, что подавляющее большинство повреждений памяти связано с переполнением, а не с превышением.

Если функция специального пула активна и выбрана Проверка окончания , каждое выделение памяти, запрошенное драйвером, размещается на отдельной странице. Возвращается самый высокий возможный адрес, позволяющий выделить место на странице, чтобы память выравнивалась с конца страницы. Предыдущая часть страницы написана с использованием особых структур. Предыдущая страница и следующая страница помечаются недоступными.

Если драйвер пытается получить доступ к памяти после окончания выделения, средство проверки драйверов немедленно обнаружит это и вызовет проверку ошибок 0xCD. Если драйвер записывает в память до начала буфера, это изменит шаблоны (предположительно). При освобождении буфера средство проверки драйверов обнаружит изменение и выдает проверку ошибок 0xC1.

Если драйвер считывает или записывает в буфер после его освобождения, средство проверки драйверов выдаст ошибку проверки 0xCC.

При выборе параметра "Проверить начало" буфер памяти выравнивается с началом страницы. При выполнении этого параметра выполняется немедленная проверка ошибок и переполнение приводит к возникновению ошибки при освобождении памяти. В противном случае этот параметр идентичен параметру "Проверить конец ".

Проверка завершения — это выравнивание по умолчанию, так как ошибки переполнения гораздо чаще используются в драйверах, чем ошибки при выполнении.

Отдельное выделение памяти может переопределить эти настройки и выбрать требуемое выравнивание, вызвав ExAllocatePoolWithTagPriority с параметром Priority, установленным как XxxSpecialPoolOverrun или XxxSpecialPoolUnderrun. (Эта подпрограмма не может активировать или отключить функцию специального пула или запросить специальный пул выделения памяти, который в противном случае будет выделен из обычного пула. Только выравнивание можно контролировать с помощью этой процедуры.)

В Windows 7 и более поздних версиях операционной системы Windows специальный пул поддерживает память, выделенную с помощью следующих API ядра:

Специальный пул по тегу пула или размеру выделения

Помимо функции специального пула средства проверки драйверов, которая запрашивает специальный пул для выделения указанным драйвером, существует два других способа использования специального пула:

  • Тег пула. Запросите выделение специального пула для всех аллокаций с указанным тегом пула.

  • Размер. Запросите специальный пул для всех выделений размером в указанном диапазоне.

Чтобы запросить специальный пул для тега пула или диапазона размеров, используйте средство Gflags, включенное в Средства отладки для Windows. Дополнительные сведения см. в разделе "Использование программы глобальных флагов".

Вы можете использовать функцию специального пула средства проверки драйверов и специальные функции пула Gflags одновременно. Если вы это делаете, помните, что специальный пул ограничен, что не все попытки выделить из специального пула успешны, и что Windows возвращает статус успешного выполнения для неудачных попыток выделить из специального пула, замещаемые выделением из обычных пулов памяти.

Эффективность специального пула

Не все специальные запросы пула выполняются. Каждое выделение из специального пула использует одну страницу неизменяемой физической памяти и две страницы виртуального адресного пространства. Если пул исчерпан, память выделяется стандартным способом, пока специальный пул не станет доступным снова. При заполнении специального запроса пула из стандартного пула функция запроса не возвращает ошибку, так как запрос пула выполнен успешно. Таким образом, не рекомендуется одновременно проверять несколько драйверов, если активируется функция специального пула.

Один драйвер, который делает множество небольших запросов памяти, также может истощить этот пул. В этом случае может быть предпочтительно назначить теги пула выделению памяти драйвера и выделить специальный пул одному тегу пула за раз.

Размер специального пула увеличивается с объемом физической памяти в системе; в идеале это должно быть не менее 1 Гигабайт (ГБ). На компьютерах x86, так как виртуальное пространство (помимо физического) используется, не используйте параметр загрузки /3GB . Рекомендуется также увеличить минимальное/максимальное количество файла страницы на два или три.

Чтобы убедиться, что все ресурсы драйвера проверяются, рекомендуется нагружать драйвер в течение длительного времени.

Мониторинг специального пула

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

Когда счетчик успешные выделения пулов в специальном пуле равен счетчику успешные выделения пулов, это означает, что специального пула было достаточно для всех выделений памяти. Если предыдущий счётчик меньше второго, то специальный пул был исчерпан по крайней мере один раз.

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

Если функция специального пула включена, но из специального пула выделено менее 95% всех ресурсных блоков, в менеджере проверки драйверов появится предупреждение. В Windows 2000 это предупреждение появится на экране состояния драйвера . В Windows XP и более поздних версиях это предупреждение появится на экране глобальных счетчиков . В этом случае необходимо проверить более короткий список драйверов, проверить отдельные пулы по тегу пула или добавить в систему больше физической памяти.

Расширение отладчика ядра !verifier также можно использовать для мониторинга использования специального пула. Он представляет аналогичную информацию диспетчеру проверки драйверов. Сведения о расширениях отладчика см. в разделе "Отладка Windows".

Активация опции специального пула

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

Замечание

Чтобы активировать функцию специального пула по метке пула или размеру выделения, или задать выравнивание Проверка начала (обнаружение подзапусков) и Проверка конца (обнаружение переполнения), используйте утилиту Global Flags; эти параметры выравнивания применяются ко всем выделениям специального пула.

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

    В командной строке параметр "Специальный пул" представлен битом 0 (0x1). Чтобы активировать специальный пул, используйте значение флага 0x1 или добавьте 0x1 в значение флага. Рассмотрим пример.

    verifier /flags 0x1 /driver MyDriver.sys
    

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

    Yyou также может активировать и деактивировать специальный пул без перезагрузки компьютера, добавив параметр /volatile в команду. Рассмотрим пример.

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

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

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

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

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

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