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