Problemas del modelo de controlador de pantalla de Windows (WDDM) de 64 bits

Para permitir que las aplicaciones de 32 bits se ejecuten en un sistema operativo de 64 bits, se debe proporcionar un controlador de pantalla en modo usuario de 32 bits, además del controlador de pantalla en modo usuario de 64 bits que requieren las aplicaciones de 64 bits. Sin embargo, solo se requiere la versión de 64 bits de un controlador de miniporte de pantalla en un sistema operativo de 64 bits. Windows en Windows (WOW64) permite que las aplicaciones de 32 bits se ejecuten en un sistema operativo de 64 bits. Para obtener más información, consulte Compatibilidad con E/S de 32 bits en el controlador de 64 bits.

Para instalar un controlador de pantalla en modo usuario de 32 bits en un sistema operativo de 64 bits, se debe establecer la siguiente entrada en una sección del registro de complementos del archivo INF para el controlador de miniporte de pantalla del dispositivo gráfico. Esto debe ocurrir para que el nombre DLL del controlador de pantalla del modo de usuario de 32 bits se agregue al registro durante la instalación del controlador:

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

El archivo INF debe contener información para dirigir al sistema operativo para copiar el controlador de pantalla en modo usuario de 32 bits en el directorio %systemroot%\SysWOW64 del sistema. Para obtener más información, consulte la sección Inf CopyFiles Directive and INF DestinationDirs (Directiva INF CopyFiles) y INF DestinationDirs (Directorios de destino de INF).

Dado que WOW64 no puede procesar estructuras de datos opacas o sin tipo, como la estructura de D3DDDICB_ALLOCATE pasada a través de la función pfnAllocateCb , no puede realizar una conversión automática de 32 bits a 64 bits. Por lo tanto, para que WOW64 funcione correctamente, debe tener en cuenta los siguientes elementos al escribir un controlador de pantalla en modo usuario de 32 bits para que se ejecute en un sistema operativo de 64 bits:

  • Evite punteros o tipos de datos que sean sensibles a varios sistemas operativos, como, SIZE_T o HANDLE. Junto con la creación del tamaño de toda la variable de estructura, estos tipos de datos de ancho variable hacen que la alineación y la posición de los miembros individuales sean diferentes. Si los miembros de ancho variable son inevitables, puede agregar otro miembro para indicar que la estructura de datos se origina en un controlador de pantalla en modo usuario de 32 bits. El controlador de miniporte de pantalla de 64 bits puede realizar correctamente la conversión.

  • Incluso si los miembros de ancho variable no están presentes, es posible que tenga que tener en cuenta los requisitos de alineación específicos de la arquitectura. Por ejemplo, en x64, un UINT64 (o QWORD) debe estar alineado con 8 bytes. Dado que un controlador de pantalla en modo de usuario de 32 bits compilado por un compilador de 32 bits estándar podría no alinear correctamente estos tipos nativos de 64 bits, es posible que el controlador de miniporte de pantalla de 64 bits no pueda acceder con precisión a los datos del controlador de pantalla en modo usuario de 32 bits. Sin embargo, puede forzar la alineación mediante las directivas del compilador pragma adecuadas. Aunque el uso de directivas de compilador pragma puede provocar un ligero desperdicio de espacio en sistemas operativos de 32 bits, esto le permite usar controladores de pantalla idénticos en modo usuario de 32 bits en sistemas operativos de 32 y 64 bits. Si no puede forzar la alineación mediante las directivas del compilador pragma adecuadas, el controlador de pantalla en modo usuario de 32 bits que se ejecuta con WOW64 en un sistema operativo de 64 bits debe ser diferente del controlador de pantalla en modo usuario de 32 bits que se ejecuta en un sistema operativo de 32 bits.