Проблемы 64-разрядной модели драйвера отображения Windows (WDDM)

Чтобы разрешить 32-разрядным приложениям работать в 64-разрядной операционной системе, необходимо предоставить 32-разрядный драйвер отображения пользовательского режима в дополнение к 64-разрядному драйверу отображения пользовательского режима, которому требуются 64-разрядные приложения. Однако в 64-разрядной операционной системе требуется только 64-разрядная версия драйвера мини-порта дисплея. Windows в Windows (WOW64) позволяет 32-разрядным приложениям работать в 64-разрядной операционной системе. Дополнительные сведения см. в разделе "Поддержка 32-разрядного ввода-вывода" в 64-разрядном драйвере.

Чтобы установить 32-разрядный драйвер отображения пользовательского режима в 64-разрядной операционной системе, следующая запись должна быть задана в разделе реестра надстроек INF-файла для мини-порта графического устройства. Это должно произойти, чтобы во время установки драйвера имя DLL 32-разрядного драйвера отображения в пользовательском режиме было добавлено в реестр.

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

INF-файл должен содержать сведения, чтобы операционная система могла скопировать 32-разрядный драйвер пользовательского режима отображения в директорию %systemroot%\SysWOW64. Дополнительные сведения см. в разделе INF CopyFiles Directive и разделе INF DestinationDirs Section.

Так как WOW64 не может обрабатывать непрозрачные или нетипизированные структуры данных, такие как структура D3DDDICB_ALLOCATE , переданная через функцию pfnAllocateCb , она не может выполнять автоматическое преобразование с 32-разрядной до 64-разрядной. Поэтому для правильной работы WOW64 необходимо учитывать следующие элементы при написании 32-разрядного драйвера отображения пользовательского режима для запуска в 64-разрядной операционной системе:

  • Избегайте указателей или типов данных, чувствительных к нескольким операционным системам, например SIZE_T или HANDLE. Помимо размера всей переменной структуры, эти типы данных переменной ширины делают выравнивание и положение отдельных элементов разными. Если элементы переменной ширины неизбежны, можно добавить другой элемент, чтобы указать, что структура данных исходит из 32-разрядного драйвера отображения пользовательского режима. Затем 64-разрядный драйвер мини-порта отображения может правильно выполнить преобразование.

  • Даже если элементы переменной ширины отсутствуют, вам может потребоваться рассмотреть требования к выравниванию для конкретной архитектуры. Например, для x64 UINT64 (или QWORD) должен быть выровнен по 8 байтам. Поскольку 32-разрядный драйвер отображения в пользовательском режиме, скомпилированный стандартным 32-разрядным компилятором, может неверно выравнивать эти нативные 64-разрядные типы, 64-разрядный минипорт-драйвер отображения может не иметь точного доступа к данным из 32-разрядного драйвера отображения в пользовательском режиме. Однако вы можете принудительно выполнить выравнивание с помощью соответствующих директив компилятора pragma . Несмотря на то что использование директив компилятора pragma может привести к незначительным затратам места на 32-разрядных операционных системах, это позволяет использовать идентичные 32-разрядные драйверы пользовательского режима в 32-разрядных и 64-разрядных операционных системах. Если вы не можете принудительно установить выравнивание с помощью соответствующих директив компилятора pragma , драйвер отображения в 32-разрядном пользовательском режиме, работающий с помощью WOW64 в 64-разрядной операционной системе, должен отличаться от 32-разрядного драйвера отображения пользовательского режима, работающего в 32-разрядной операционной системе.