所有驱动程序必须可移植到所有 Windows 支持的硬件平台。 若要实现跨平台可移植性,驱动程序编写器应:
C 中的代码(无程序集语言)。
仅使用 WDK 中提供的编程接口和标头与 Windows 交互。
C 中的编码驱动程序
所有内核模式驱动程序都应以 C 编写,以便可以使用与系统兼容的 C 编译器重新编译、重新链接并在不同的 Microsoft Windows 平台上运行,而无需重写或替换任何代码。 大多数作系统组件都完全用 C 编码,只有少量的 HAL 和内核组件用程序集语言编写,以便作系统在硬件平台上易于移植。 不能在内核模式驱动程序中使用许多C++语言构造,因此应谨慎使用此类构造进行评估。 有关驱动程序包含C++功能时出现的问题的详细信息,请参阅 内核模式驱动程序C++:优点和缺点 白皮书。
如果其他与系统兼容的编译器不支持这些功能,驱动程序不应依赖于任何特定系统兼容的 C 编译器或 C 支持库的功能。 通常,驱动程序代码应符合 ANSI C 标准,不依赖于此标准描述为“实现定义的”的任何内容。
若要编写可移植驱动程序,最好避免:
依赖于在不同平台之间大小或布局可能变化的数据类型。
调用维护状态的任何标准 C 运行时库函数。
调用任何操作系统提供替代支持例程的标准 C 运行时库函数。
使用 WDK-Supplied 接口
每个 Windows NT 执行体组件导出一组内核模式驱动程序支持的例程,供驱动程序和所有其他内核模式组件调用。 如果支持例程的基础实现随时间而改变,则其调用方仍可移植,因为定义组件的接口不会更改。
WDK 提供了一组头文件,用于定义驱动程序(以及所有其他内核模式组件)用来帮助维护从一个平台到另一个平台的可移植性的系统特定的数据类型和常量。 所有内核模式驱动程序都包含一个主 WDK 内核模式头文件、Wdm.h 或 Ntddk.h。 主头文件不仅会拉取定义基本内核模式类型的系统提供的标头,而且还会从任何特定于处理器体系结构的标头(使用相应的编译器指令编译驱动程序时)进行适当的选择。
某些驱动程序(如 SCSI 微型端口驱动程序、 NDIS 驱动程序和 视频微型端口驱动程序)包括其他系统提供的头文件。
如果驱动程序需要依赖于平台的定义,最好在 #ifdef 语句中隔离这些定义,以便为每个驱动程序编译和链接相应的硬件平台。 但是,通过使用 WDK 主头文件提供的支持例程、宏、常量和类型,几乎始终可以避免在驱动程序中实现任何特定于平台的条件编译的代码。
内核模式驱动程序可以使用 WDK 中记录的内核模式 RtlXxx 例程。 内核模式驱动程序无法调用用户模式 RtlXxx 例程。