可移植

所有驱动程序都必须跨所有 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 例程。