Windows 显示驱动程序模型 (WDDM) 64 位问题

若要允许 32 位应用程序在 64 位操作系统上运行,除了 64 位应用程序所需的 64 位用户模式显示驱动程序外,还必须提供 32 位用户模式显示驱动程序。 但是,64 位操作系统上只需要显示微型端口驱动程序的 64 位版本。 Windows (WOW64) 使 32 位应用程序能够在 64 位操作系统上运行。 有关详细信息,请参阅 在 64 位驱动程序中支持 32 位 I/O

若要在 64 位操作系统上安装 32 位用户模式显示驱动程序,必须在图形设备的显示微型端口驱动程序的 INF 文件的 add-registry 节中设置以下条目。 必须执行此操作,以便在驱动程序安装期间将 32 位用户模式显示驱动程序的 DLL 名称添加到注册表:

 [Xxx_SoftwareDeviceSettings]
...
 HKR,, UserModeDriverNameWow, %REG_MULTI_SZ%, Xxx.dll
...

INF 文件必须包含指示操作系统将 32 位用户模式显示驱动程序复制到系统的 %systemroot%\SysWOW64 目录中的信息。 有关详细信息,请参阅 INF CopyFiles 指令INF DestinationDirs 部分

由于 WOW64 无法处理不透明或非类型化的数据结构,例如通过 pfnAllocateCb 函数传递的 D3DDDICB_ALLOCATE 结构,因此它无法执行从 32 位到 64 位的自动转换。 因此,若要使 WOW64 正常工作,在编写要在 64 位操作系统上运行的 32 位用户模式显示驱动程序时,必须考虑以下事项:

  • 避免使用对多个操作系统敏感的指针或数据类型,例如,SIZE_T或 HANDLE。 除了使整个结构变量的大小,这些可变宽度数据类型使各个成员的对齐和位置不同。 如果可变宽度成员不可避免,可以添加另一个成员来指示数据结构源自 32 位用户模式显示驱动程序。 然后,64 位显示微型端口驱动程序可以正确执行转换。

  • 即使不存在可变宽度成员,也可能需要考虑特定于体系结构的对齐要求。 例如,在 x64 上,UINT64 (或 QWORD) 应对齐 8 字节。 由于标准 32 位编译器编译的 32 位用户模式显示驱动程序可能无法正确对齐这些本机 64 位类型,因此 64 位显示微型端口驱动程序可能无法准确访问 32 位用户模式显示驱动程序中的数据。 但是,可以使用适当的 杂注 编译器指令强制对齐。 尽管使用 pragma 编译器指令可能会导致 32 位操作系统上略微浪费空间,但这允许你在 32 位和 64 位操作系统上使用相同的 32 位用户模式显示驱动程序。 如果无法使用适当的 杂注 编译器指令强制对齐,则在 64 位操作系统上使用 WOW64 运行的 32 位用户模式显示驱动程序必须与在 32 位操作系统上运行的 32 位用户模式显示驱动程序不同。