Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Все драйверы должны быть переносимыми на всех аппаратных платформах, поддерживаемых Windows. Чтобы обеспечить кроссплатформенную переносимость драйверов, необходимо выполнить следующее:
Код в C (без языка сборки).
Взаимодействуйте с Windows только с помощью интерфейсов программирования и заголовков, предоставляемых в WDK.
Драйверы программирования в C
Все драйверы в режиме ядра должны быть записаны в C, чтобы их можно было перекомпилировать с помощью компилятора C, повторного связывания и запуска на разных платформах Microsoft Windows без перезаписи или замены любого кода. Большинство компонентов операционной системы кодируются полностью в C, с небольшими частями компонентов HAL и ядра, написанными на языке сборки, чтобы операционная система была легко переносимой на аппаратных платформах. Нельзя использовать множество конструкций языка C++ в драйверах режима ядра, поэтому следует тщательно оценивать использование таких конструкций. Дополнительные сведения о проблемах, возникающих при включении функций C++, см. в техническом документе C++ для драйверов режима ядра: Pros и Cons .
Драйверы не должны полагаться на функции любой библиотеки поддержки, совместимой с системой, или библиотеку поддержки C, если эти функции не гарантированы поддержкой других системных компиляторов. Как правило, код драйвера должен соответствовать стандарту ANSI C и не зависеть от того, что этот стандарт описывает как "определяемый реализацией".
Чтобы написать переносимые драйверы, рекомендуется избежать:
Зависимости от типов данных, которые могут различаться по размеру или макету от одной платформы к другой.
Вызов любой стандартной функции библиотеки среды выполнения C, которая поддерживает состояние.
Вызов любой стандартной функции библиотеки среды выполнения C, для которой операционная система предоставляет альтернативную подпрограмму поддержки.
Использование интерфейсов WDK-Supplied
Каждый исполнительный компонент Windows NT экспортирует набор поддерживающих подпрограмм для работы с драйверами в режиме ядра, которые вызываются драйверами и всеми другими компонентами режима ядра. Если базовая реализация поддерживающей функции изменяется со временем, её вызывающие остаются переносимыми, так как интерфейс декларирующего компонента не изменяется.
WDK предоставляет набор файлов заголовков, определяющих системные типы данных и константы, используемые драйверами (и всеми другими компонентами режима ядра) для обеспечения переносимости с одной платформы на другую. Все драйверы режима ядра включают один из главных файлов заголовков режима ядра WDK, Wdm.h или Ntddk.h. Файлы главных заголовков извлекают не только системные заголовки, определяющие базовые типы режима ядра, но и соответствующие выборки из заголовков, специфичных для архитектуры процессора, когда драйвер компилируется с соответствующей директивой компилятора.
Некоторые драйверы, такие как драйверы минипорта SCSI, драйверы NDIS и драйверы видеопорта, включают другие системные файлы заголовков.
Если драйверу требуются определения, зависящие от платформы, рекомендуется изолировать эти определения в инструкциях #ifdef , чтобы каждый драйвер можно скомпилировать и связать для соответствующей аппаратной платформы. Однако практически всегда можно избежать реализации условно скомпилированного кода в драйвере, используя подпрограммы поддержки, макросы, константы и типы, предоставляемые основными заголовочными файлами WDK.
Драйверы в режиме ядра могут использовать подпрограммы RtlXxx в режиме ядра, которые описаны в WDK. Драйверы режима ядра не могут вызывать подпрограммы RtlXxx в режиме пользователя.