Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Драйверы составляют значительный процент от общего объема кода, выполняемого в режиме ядра. Драйвер в режиме ядра является, по сути, компонентом операционной системы. Таким образом, надежные и безопасные драйверы значительно влияют на общую надежность операционной системы. Чтобы создать надежный драйвер в режиме ядра, следуйте приведенным ниже рекомендациям.
Обеспечьте правильную защиту объектов устройств.
Доступ пользователей к драйверам и устройствам системы контролируется дескрипторами безопасности, которые система назначает объектам устройств. Чаще всего система задает параметры безопасности устройства при установке устройства. Дополнительные сведения см. в разделе Создание безопасных установок устройств. Иногда драйвер может играть определенную роль в управлении доступом к устройству. Дополнительные сведения см. в разделе Защита объектов устройств.
Проверьте правильность объектов устройства.
Если драйвер создает несколько типов объектов устройств, он должен проверка, какой тип он получает в каждом 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.
Использование средства проверки драйверов
Средство проверки драйверов — это наиболее важный инструмент, который можно использовать для обеспечения надежности драйвера. Средство проверки драйверов может проверка для различных распространенных проблем с драйверами, включая те, которые рассматриваются в этом разделе. Однако использование средства проверки драйверов не заменяет тщательное и вдумчивое проектирование программного обеспечения.