Windows Display Driver Model (WDDM) 64-Bit-Probleme
Damit 32-Bit-Anwendungen unter einem 64-Bit-Betriebssystem ausgeführt werden können, muss zusätzlich zum 64-Bit-Anzeigetreiber für 64-Bit-Benutzermodusanzeigetreiber, den 64-Bit-Anwendungen benötigen, ein 32-Bit-Benutzermodustreiber bereitgestellt werden. Unter einem 64-Bit-Betriebssystem ist jedoch nur die 64-Bit-Version eines Display-Miniporttreibers erforderlich. Windows unter Windows (WOW64) ermöglicht die Ausführung von 32-Bit-Anwendungen unter einem 64-Bit-Betriebssystem. Weitere Informationen finden Sie unter Unterstützen von 32-Bit-E/A in Ihrem 64-Bit-Treiber.
Um einen 32-Bit-Benutzermodus-Anzeigetreiber auf einem 64-Bit-Betriebssystem zu installieren, muss der folgende Eintrag in einem Add-Registry-Abschnitt der INF-Datei für den Anzeige-Miniporttreiber des Grafikgeräts festgelegt werden. Dies muss geschehen, damit der DLL-Name des 32-Bit-Benutzermodus-Anzeigetreibers während der Treiberinstallation der Registrierung hinzugefügt wird:
[Xxx_SoftwareDeviceSettings]
...
HKR,, UserModeDriverNameWow, %REG_MULTI_SZ%, Xxx.dll
...
Die INF-Datei muss Informationen enthalten, um das Betriebssystem anzuweisen, den 32-Bit-Benutzermodus-Anzeigetreiber in das Verzeichnis %systemroot%\SysWOW64 des Systems zu kopieren. Weitere Informationen finden Sie unter INF CopyFiles-Direktive und ABSCHNITT INF DestinationDirs.
Da WOW64 nicht undurchsichtige oder nicht typisierte Datenstrukturen wie die über die pfnAllocateCb-Funktion übergebeneD3DDDICB_ALLOCATE-Struktur verarbeiten kann, kann keine automatische Konvertierung von 32 Bit in 64 Bit durchgeführt werden. Damit WOW64 ordnungsgemäß funktioniert, müssen Sie daher beim Schreiben eines 32-Bit-Benutzermodustreibers für die Ausführung unter einem 64-Bit-Betriebssystem die folgenden Punkte berücksichtigen:
Vermeiden Sie Zeiger oder Datentypen, die für mehrere Betriebssysteme vertraulich sind, z. B. SIZE_T oder HANDLE. Zusammen mit der Größe der gesamten Strukturvariablen machen diese Datentypen mit variabler Breite die Ausrichtung und Position einzelner Member unterschiedlich. Wenn Elemente mit variabler Breite unvermeidlich sind, können Sie ein weiteres Element hinzufügen, um anzugeben, dass die Datenstruktur von einem 32-Bit-Benutzermodustreiber stammt. Der 64-Bit-Display-Miniporttreiber kann dann die Konvertierung ordnungsgemäß durchführen.
Selbst wenn Elemente mit variabler Breite nicht vorhanden sind, müssen Sie möglicherweise architekturspezifische Ausrichtungsanforderungen berücksichtigen. Für instance sollte ein UINT64 (oder QWORD) unter x64 8 Byte ausgerichtet sein. Da ein von einem standardmäßigen 32-Bit-Compiler kompilierter 32-Bit-Anzeigetreiber diese nativen 64-Bit-Typen möglicherweise nicht ordnungsgemäß ausrichtet, kann der 64-Bit-Anzeige-Miniporttreiber möglicherweise nicht genau auf Daten des 32-Bit-Benutzermodus-Anzeigetreibers zugreifen. Sie können jedoch die Ausrichtung erzwingen, indem Sie die entsprechenden Pragma-Compilerdirektiven verwenden. Obwohl die Verwendung von Pragma-Compilerdirektiven unter 32-Bit-Betriebssystemen zu einer geringfügigen Verschwendung von Speicherplatz führen kann, können Sie auf 32-Bit- und 64-Bit-Betriebssystemen identische 32-Bit-Anzeigetreiber für den Benutzermodus verwenden. Wenn Sie die Ausrichtung nicht mithilfe der entsprechenden Pragma-Compilerdirektiven erzwingen können, muss sich der 32-Bit-Benutzermodus-Anzeigetreiber, der mit WOW64 auf einem 64-Bit-Betriebssystem ausgeführt wird, von dem 32-Bit-Benutzermodus-Anzeigetreiber unterscheiden, der unter einem 32-Bit-Betriebssystem ausgeführt wird.