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


Специальное обнаружение повреждения памяти пула в средства проверки драйверов

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

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

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

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

  • Проверка выравнивания "Начало " лучше всего подходит для обнаружения недостаточного доступа.
  • Выравнивание "Проверить конец " лучше при обнаружении переполнения доступа.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Специальная эффективность пула

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

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

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

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

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

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

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

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

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

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

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

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

Примечание

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

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

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

    verifier /flags 0x1 /driver MyDriver.sys
    

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

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

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

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

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

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

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

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