Оригинальная новость была опубликована 7 октября 2025 г.
История ReactOS охватывает более длительный период, чем жизнь многих нынешних участников проекта. В нём участвовали выдающиеся люди с самыми разными целями. В последние годы одной из ключевых задач стало улучшение поддержки оборудования.
По мере того как ReactOS стремится освоить мир Windows Vista и более новых версий, возникает ряд вопросов о работе оборудования. Vista внесла масштабные изменения в написание и поддержку драйверов устройств. Постепенно мы успешно осваиваем эти нововведения. Сегодня речь пойдёт о WDDM (Windows Display Driver Model — модели драйверов дисплея Windows).
«Перестройка»
Я всегда считал, что документации по видеодрайверам (для обеих архитектур) хватает лишь для старта — но не для глубокого погружения в мир 3D. К счастью, в последние годы ситуация изменилась: появились некоторые драйверы с открытым исходным кодом.
WDDM — это масштабная перестройка: ответственность за управление GPU передаётся от Win32k к поставщику драйвера. Драйвер DirectX (dxgkrnl.sys) взаимодействует с мини‑портовым драйвером, предоставляя разные уровни интерфейсов WDDM.
Версии WDDM (WDDM 1.0, 1.1, 1.2…) описывают, как поддерживаются и реализуются эти интерфейсы. Это отличается от уровня функций, который отображается в DxDiag.

Что случилось с XDDM?
Официально с Windows 8 каждый драйвер GPU должен быть драйвером WDDM. Фактически отброшен был только мини‑портовый драйвер. Vista и 7 по‑прежнему могли загружать старые драйверы GPU на архитектуре XDDM.
За пределами мини‑портового драйвера в современной Windows повсюду сохранились следы XDDM — в том числе в механизмах WDDM. Первый пример — попытка загрузить OpenGL Installable Client Drivers (ICD) в Vista или в более новых версиях.
В WDDM связь с мини‑портовым драйвером стала прямее. Win32k лишь содержит системный вызов, возвращающийся в интерфейс, заполняемый dxgkrnl. Важно: модуль, загружающий OpenGL ICD, почти не изменился.

Интересно, что Vulkan ведет себя схожим образом:

OpenGL ICD — это одно, а как насчет драйвера дисплея?
При запуске Vista и более поздних версий Win32k демонстрирует интересное поведение. Есть два важных драйвера дисплея:
TSDDD.dll — загружается вручную при старте нулевой сессии. Это обычный XDDM‑драйвер, который лишь записывает данные в пустую память.
В NT5.x или ReactOS (на момент написания статьи) если ваша установка не может получить корректное изображение, возникнет ошибка проверки (BSoD) с кодом, указывающим на ошибку инициализации видео. Это всё ещё возможно в Vista и более поздних версиях, но на практике эта ошибка больше не возникает, поскольку CDD выступает в качестве основного драйвера. Фактически, в случае сбоя видеодрайвера, система возвращается к базовому драйверу дисплея.CDD.dll — гораздо интереснее: формально это XDDM‑драйвер, он отправляет два кода управления вводом‑выводом (IOCTL), обеспечивая связь с WDDM; Это единственный канал, через который
dxgkrnlиWin32kв каком-либо содержательном плане.
Технически, между сторожевым таймером, Win32k и Dxgkrnl также происходит некоторое взаимодействие при инициализации для заполнения интерфейса для отправки API D3DKMT для Dxgkrnl; но это происходит только во время инициализации са��ого Dxgkrnl.
Также стоит отметить, что когда это происходит, запрос в Win32k для поиска поддерживаемого видеоадаптера всегда вручную перезаписывается cdd.dll. После запуска драйвера WDDM вы не сможете одновременно запустить драйвер XDDM! Хорошо, это был большой объем информации, но есть несколько важных вещей, которые следует понять. CDD.dll в первую очередь ЯВЛЯЕТСЯ драйвером дисплея XDDM, даже если он преобразует старый стек Win32k в новый стек WDDM, он все равно нагружает Win32k.
Важно: при запуске WDDM‑драйвера невозможно при этом одновременно использовать и XDDM‑драйвер.
Для полной совместимости ReactOS с WDDM наш стек XDDM должен быть в идеальном состоянии. Это не единственная функция Vista+, требующая такой подготовки. DWM (о нём будет отдельный пост) тоже использует механизмы, которые текущая версия Win32k в ReactOS пока не поддерживает. Но мы постоянно совершенствуемся.
Компиляция WDDM‑драйверов в ReactOS
Один из первых компонентов, который нужно было понять, — displib.lib (поставляется с WDK и позволяет компилировать WDDM‑драйверы).
Чтобы скомпилировать WDDM‑драйвер, нужно связать его с библиотекой, реализующей функцию для «запуска» dxgkrnl. WDDM‑драйверы не связываются с dxgkrnl напрямую. Вместо этого:
вы передаёте данные в
dxgkrnlчерез API;dxgkrnlвызывает процедуру инициализации вашего мини‑портового драйвера;этот обратный вызов предоставляет интерфейсы для дальнейшей связи с
dxgkrnl.
Win32k не участвует в запуске мини‑портового драйвера. Мы создали альтернативу, открыв путь для импорта и компиляции WDDM‑драйверов в ReactOS — они работают даже в Windows!
Поддержка WDDM в ReactOS
Теперь, зная, как запускаются WDDM‑драйверы, можно задуматься о поддержке этой архитектуры в ReactOS.
API D3DKMT используются только для ускорения DirectX и OpenGL — их можно пока игнорировать. Как заставить работать сам дисплей?
ReactOS уже поддерживает некоторое 2D‑ускорение и активно развивает поддержку XDDM для GPU AMD. Для управления дисплеем нужны лишь две подсистемы dxgkrnl:
VidPn (Video Presentation Network);
её аппаратная поддержка.
С Windows 8 появились встроенные драйверы WDDM‑минипортов (KMDOD), отключающие 3D‑ускорение. Они проще в понимании и используют меньше интерфейсов dxgkrnl.
Мы создали упрощённый dxgkrnl для эксперимента:
запрашиваем режимы дисплея из сети VidPn;
передаём их в CDD;
загружаем CDD, когда
dxgkrnlактивен.

BasicDisplay.sys из WDK)!ReactOS может взаимодействовать со своим первым драйвером WDDM!
Более гибкая архитектура
Когда я впервые запустил BasicDisplay.sys в ReactOS, я заметил, насколько WDDM снисходительна к неидеальной реализации. Оказалось, что драйверы поставщиков готовы работать даже в ограниченном режиме — например, только для вывода изображения.
ReactOS смогла запустить драйвер NVIDIA для Windows 7 (только дисплей / 2D), выводя изображение на современные мониторы с полным разрешением и частотой обновления. Однако прогресс ограничился не реализацией Win32k, а поддержкой самого оборудования.
Почему я это написал и что будет дальше
С помощью этой записи в блоге я надеялся достичь двух целей.
Во-первых, мы хотели заявить, что ReactOS действительно пытается поддерживать более современное оборудование, но мы не можем просто так остановиться и проигнорировать XDDM.
Для WDDM ТРЕБУЕТСЯ XDDM, нам нужно продолжать совершенствоваться в этой области.
Другая причина в том, что это первая из нескольких записей в блоге, которые я намеревался написать для проекта ReactOS на эту тему.Мы с нетерпением ждем возможности поделиться дополнительной информацией о поддержке оборудования и записями в блоге WDDM.
