Windows 顯示器驅動程式模型 (WDDM) 64 位問題
若要允許 32 位應用程式在 64 位作業系統上執行,除了 64 位應用程式所需的 64 位使用者模式顯示驅動程式之外,還必須提供 32 位使用者模式顯示驅動程式。 不過,64 位作業系統上只需要 64 位版本的顯示迷你埠驅動程式。 Windows 上的 Windows (WOW64) 可讓 32 位應用程式在 64 位作業系統上執行。 如需詳細資訊,請參閱 64 位驅動程式中的支援 32 位 I/O。
若要在 64 位作業系統上安裝 32 位使用者模式顯示驅動程式,必須在圖形裝置顯示迷你埠驅動程式的 INF 檔案的增益集登錄區段中設定下列專案。 這必須發生,以便在驅動程式安裝期間將 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 正常運作,您必須在撰寫 32 位使用者模式顯示驅動程式以在 64 位作業系統上執行時考慮下列專案:
避免對多個作業系統有敏感性的指標或資料類型,例如,SIZE_T或 HANDLE。 除了調整整個結構變數的大小之外,這些變數寬度資料類型會讓個別成員的對齊和位置不同。 如果變數寬度成員無法避免,您可以新增另一個成員,以指出資料結構源自 32 位使用者模式顯示驅動程式。 接著,64 位顯示器迷你埠驅動程式可以正確執行轉換。
即使變數寬度成員不存在,您可能需要考慮架構特定的對齊需求。 例如,在 x64 上,UINT64 (或 QWORD) 應該對齊 8 位元組。 由於標準 32 位編譯器所編譯的 32 位使用者模式顯示驅動程式可能無法正確對齊這些原生 64 位類型,因此 64 位顯示迷你埠驅動程式可能無法正確存取來自 32 位使用者模式顯示驅動程式的資料。 不過,您可以使用適當的 pragma 編譯器指示詞來強制對齊。 雖然使用 pragma 編譯器指示詞可能會導致 32 位作業系統上的空間稍微浪費,但這可讓您在 32 位和 64 位作業系統上使用相同的 32 位使用者模式顯示驅動程式。 如果您無法使用適當的 pragma 編譯器指示詞強制對齊,在 64 位作業系統上使用 WOW64 執行的 32 位使用者模式顯示驅動程式必須與在 32 位作業系統上執行的 32 位使用者模式顯示驅動程式不同。