Создание надежных драйверов Kernel-Mode
Драйверы составляют значительный процент от общего объема кода, выполняемого в режиме ядра. Драйвер в режиме ядра является, по сути, компонентом операционной системы. Таким образом, надежные и безопасные драйверы значительно влияют на общую надежность операционной системы. Чтобы создать надежный драйвер в режиме ядра, следуйте приведенным ниже рекомендациям.
Обеспечьте правильную защиту объектов устройств.
Доступ пользователей к драйверам и устройствам системы контролируется дескрипторами безопасности, которые система назначает объектам устройств. Чаще всего система задает параметры безопасности устройства при установке устройства. Дополнительные сведения см. в разделе Создание безопасных установок устройств. Иногда драйвер может играть определенную роль в управлении доступом к устройству. Дополнительные сведения см. в разделе Защита объектов устройств.
Проверьте правильность объектов устройства.
Если драйвер создает несколько типов объектов устройств, он должен проверка, какой тип он получает в каждом IRP. Дополнительные сведения см. в разделе Сбой проверки объектов устройства.
Используйте "безопасные строковые" функции.
При управлении строками драйвер должен использовать безопасные строковые функции вместо строковых функций, которые предоставляются в библиотеках среды выполнения языка C/C++. Дополнительные сведения см. в разделе Использование безопасных строковых функций.
Проверка дескрипторов объектов.
Драйверы, которые получают дескриптора объектов в качестве входных данных, должны проверять, что дескрипторы допустимы, доступны и имеют ожидаемый тип. Дополнительные сведения об использовании дескрипторов объектов см. в следующих разделах:
Правильная поддержка многопроцессоров.
Никогда не предполагайте, что драйвер будет работать только в однопроцессорных системах. Сведения о методах программирования, которые можно использовать для обеспечения правильной работы драйвера в многопроцессорных системах, см. в следующих разделах:
Правильно обрабатывать состояние драйвера.
Важно всегда проверять, находится ли драйвер в том состоянии, в которое он входит. Например, если драйвер получает IRP, он уже обслуживает IRP того же типа? Если драйвер не проверка для этой ситуации, первый IRP может быть потерян. Дополнительные сведения см. в разделе Сбой проверки состояния драйвера.
Проверка входных значений IRP.
С точки зрения надежности и безопасности важно проверять все значения, связанные с IRP, такие как адреса буфера и длина. В следующих разделах содержатся сведения о проверке входных значений IRP.
DispatchReadWrite с использованием буферизованного ввода-вывода
Ошибки при буферизованном вводе-выводе
DispatchReadWrite с использованием прямого ввода-вывода
Ошибки при прямом вводе-выводе
Проблемы безопасности для кодов элементов управления вводом-выводом
Правильно обрабатывать стек ввода-вывода.
При передаче 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
Дополнительные сведения о правильной обработке IRP см. в разделе Дополнительные ошибки в разделе Обработка IRP.
Использование средства проверки драйверов
Средство проверки драйверов — это наиболее важный инструмент, который можно использовать для обеспечения надежности драйвера. Средство проверки драйверов может проверка для различных распространенных проблем с драйверами, включая те, которые рассматриваются в этом разделе. Однако использование средства проверки драйверов не заменяет тщательное и вдумчивое проектирование программного обеспечения.