WDDM(Windows 디스플레이 드라이버 모델) 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가 올바르게 작동하려면 64비트 운영 체제에서 실행되도록 32비트 사용자 모드 표시 드라이버를 작성할 때 다음 항목을 고려해야 합니다.

  • SIZE_T 또는 HANDLE과 같은 여러 운영 체제에 중요한 포인터 또는 데이터 형식을 방지합니다. 이러한 변수 너비 데이터 형식은 전체 구조체 변수의 크기를 만드는 것과 함께 개별 멤버의 맞춤 및 위치를 다르게 만듭니다. 변수 너비 멤버를 피할 수 없는 경우 다른 멤버를 추가하여 데이터 구조가 32비트 사용자 모드 표시 드라이버에서 시작되었음을 나타낼 수 있습니다. 그런 다음 64비트 디스플레이 미니포트 드라이버가 변환을 제대로 수행할 수 있습니다.

  • 가변 너비 멤버가 없더라도 아키텍처별 맞춤 요구 사항을 고려해야 할 수 있습니다. instance 경우 x64에서 UINT64(또는 QWORD)를 8 바이트 정렬해야 합니다. 표준 32비트 컴파일러에서 컴파일된 32비트 사용자 모드 디스플레이 드라이버가 이러한 네이티브 64비트 형식을 올바르게 정렬하지 못할 수 있으므로 64비트 디스플레이 미니포트 드라이버는 32비트 사용자 모드 디스플레이 드라이버의 데이터에 정확하게 액세스하지 못할 수 있습니다. 그러나 적절한 pragma 컴파일러 지시문을 사용하여 강제로 정렬할 수 있습니다. pragma 컴파일러 지시문을 사용하면 32비트 운영 체제에서 약간의 공간이 낭비될 수 있지만 32비트 및 64비트 운영 체제에서 동일한 32비트 사용자 모드 디스플레이 드라이버를 사용할 수 있습니다. 적절한 pragma 컴파일러 지시문을 사용하여 강제로 정렬할 수 없는 경우 64비트 운영 체제에서 WOW64를 사용하여 실행되는 32비트 사용자 모드 표시 드라이버는 32비트 운영 체제에서 실행되는 32비트 사용자 모드 디스플레이 드라이버와 달라야 합니다.