次の方法で共有


Windows Display Driver Model (WDDM) の 64 ビット問題

32 ビット アプリケーションを 64 ビット オペレーティング システムで実行できるようにするには、64 ビット アプリケーションに必要な 64 ビット ユーザー モードディスプレイ ドライバーに加えて、32 ビット ユーザー モード ディスプレイ ドライバーを提供する必要があります。 ただし、64 ビット オペレーティング システムでは、ディスプレイ ミニポート ドライバーの 64 ビット バージョンのみが必要です。 Windows on Windows (WOW64) を使用すると、32 ビット アプリケーションを 64 ビット オペレーティング システムで実行できます。 詳細については、「 64 ビット ドライバーでの 32 ビット I/O のサポート」を参照してください。

64 ビット オペレーティング システムに 32 ビット ユーザー モードのディスプレイ ドライバーをインストールするには、グラフィックス デバイスのディスプレイ ミニポート ドライバーの INF ファイルの追加レジストリ セクションで次のエントリを設定する必要があります。 これは、ドライバーのインストール中に 32 ビット ユーザー モード ディスプレイ ドライバーの DLL 名がレジストリに追加されるようにする必要があります。

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

INF ファイルには、システムの %systemroot%\SysWOW64 ディレクトリに 32 ビット ユーザー モードのディスプレイ ドライバーをコピーするオペレーティング システムを指示する情報が含まれている必要があります。 詳細については、「 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 ビット ユーザー モードディスプレイ ドライバーのデータに正確にアクセスできない可能性があります。 ただし、適切な プラグマ コンパイラ ディレクティブを使用して、強制的に配置することができます。 プラグマ コンパイラ ディレクティブを使用すると、32 ビット オペレーティング システムの領域がわずかに無駄になる可能性がありますが、これにより、32 ビットオペレーティング システムと 64 ビット オペレーティング システムで同じ 32 ビット ユーザー モード ディスプレイ ドライバーを使用できます。 適切な プラグマ コンパイラ ディレクティブを使用して配置を強制できない場合、64 ビット オペレーティング システムで WOW64 を使用して実行される 32 ビット ユーザー モード ディスプレイ ドライバーは、32 ビット オペレーティング システムで実行されている 32 ビット ユーザー モードディスプレイ ドライバーとは異なる必要があります。