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


Создание надежных драйверов Kernel-Mode

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

  • Обеспечьте правильную защиту объектов устройств.

    Доступ пользователей к драйверам и устройствам системы контролируется дескрипторами безопасности, которые система назначает объектам устройств. Чаще всего система задает параметры безопасности устройства при установке устройства. Дополнительные сведения см. в разделе Создание безопасных установок устройств. Иногда драйвер может играть определенную роль в управлении доступом к устройству. Дополнительные сведения см. в разделе Защита объектов устройств.

  • Проверьте правильность объектов устройства.

    Если драйвер создает несколько типов объектов устройств, он должен проверка, какой тип он получает в каждом IRP. Дополнительные сведения см. в разделе Сбой проверки объектов устройства.

  • Используйте "безопасные строковые" функции.

    При управлении строками драйвер должен использовать безопасные строковые функции вместо строковых функций, которые предоставляются в библиотеках среды выполнения языка C/C++. Дополнительные сведения см. в разделе Использование безопасных строковых функций.

  • Проверка дескрипторов объектов.

    Драйверы, которые получают дескриптора объектов в качестве входных данных, должны проверять, что дескрипторы допустимы, доступны и имеют ожидаемый тип. Дополнительные сведения об использовании дескрипторов объектов см. в следующих разделах:

    Управление объектами

    Сбой проверки дескрипторов объектов

  • Правильная поддержка многопроцессоров.

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

    Методы синхронизации

    Ошибки в многопроцессорной среде

  • Правильно обрабатывать состояние драйвера.

    Важно всегда проверять, находится ли драйвер в том состоянии, в которое он входит. Например, если драйвер получает IRP, он уже обслуживает IRP того же типа? Если драйвер не проверка для этой ситуации, первый IRP может быть потерян. Дополнительные сведения см. в разделе Сбой проверки состояния драйвера.

  • Проверка входных значений IRP.

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

    DispatchReadWrite с использованием буферизованного ввода-вывода

    Ошибки при буферизованном вводе-выводе

    DispatchReadWrite с использованием прямого ввода-вывода

    Ошибки при прямом вводе-выводе

    Проблемы безопасности для кодов элементов управления вводом-выводом

    Ошибки при обращении к адресам User-Space

  • Правильно обрабатывать стек ввода-вывода.

    При передаче IRP в стеке драйверов важно, чтобы драйверы вызывали IoSkipCurrentIrpStackLocation или IoCopyCurrentIrpStackLocationToNext , чтобы настроить расположение следующего стека ввода-вывода драйвера. Не создавайте код, который напрямую копирует одно расположение стека ввода-вывода в следующее.

  • Правильно обрабатывать операции завершения IRP.

    Драйвер никогда не должен завершать IRP со значением состояния STATUS_SUCCESS если он не поддерживает и не обрабатывает IRP. Сведения о правильных способах обработки операций завершения IRP см. в разделе Завершение IRP.

  • Правильно обрабатывать операции отмены IRP.

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

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

    Одним из способов избежать проблем синхронизации, связанных с операциями отмены, является реализация безопасной очереди IRP с отменой. Безопасная для отмены очередь IRP — это управляемая драйвером очередь, которая была представлена для Windows XP и более поздних версий операционной системы, но также обратно совместима с более ранними версиями.

  • Обработка операций очистки IRP и закрытие операций должным образом.

    Убедитесь, что вы понимаете разницу между запросами IRP_MJ_CLEANUP и IRP_MJ_CLOSE . Запросы на очистку поступают после того, как приложение закрывает все дескрипторы в объекте файла, но иногда до завершения всех запросов ввода-вывода. Запросы на закрытие поступают после завершения или отмены всех запросов ввода-вывода для объекта файла. Дополнительные сведения см. в следующих разделах:

    Подпрограммы DispatchCreate, DispatchClose и DispatchCreateClose

    Подпрограммы DispatchCleanup

    Ошибки при обработке операций очистки и закрытия

Дополнительные сведения о правильной обработке IRP см. в разделе Дополнительные ошибки в разделе Обработка IRP.

Использование средства проверки драйверов

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