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