Проблемы с 64-разрядной моделью драйвера windows (WDDM)

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

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

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

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

Поскольку 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-разрядной операционной системе.