Dxgi.dll
dxgi.dll (расово верн. DirectX Graphics Infrastructure, надмозг. Инфраструктура графики DirectX) — культовая, былинная и несущая боль динамическая библиотека, живущая в недрах операционной системы Windows, начиная с версии Vista и заканчивая актуальными десятками и одиннадцатками. Для рядового пользователя, чей компьютерный кругозор ограничен ярлыком Доты и порнхабом, данный файл представляет собой загадочную херню, отсутствие которой вызывает экзистенциальный ужас и немоту, ибо любимая игрушка отказывается запускаться, выплевывая на экран страшные ругательства. Для красноглазиков и разработчиков игровых движков — это базовый слой абстракции, без которого современный графон был бы невозможен в принципе. Входит в стандартный пакет DirectX, является собственностью корпорации зла Microsoft и объектом лютого фапа любителей инжектить шейдеры во все поля.
Суть[править]
Чтобы понять, зачем нужен этот кусок кода весом в пару сотен килобайт, нужно совершить небольшой экскурс в историю, когда мониторы были толстыми, а школота не знала слова рейтрейсинг. В стародавние времена, когда миром правили Windows XP и DirectX 9, жизнь была проще, но архитектура графической подсистемы напоминала тарелку со спагетти, уроненную на пол. Direct3D 9 делал всё сам: и рисовал полигоны, и управлял окнами, и переключал разрешения экрана. Это приводило к тому, что драйверы видеокарт писались через задницу, а любой чих в сторону графического режима мог повесить систему намертво.
С приходом Висты (Longhorn, R.I.P.) мелкомягкие решили перепилить всё на корню. Они посмотрели на тот ужас, который творился в ядре XP, перекрестились и создали WDDM (Windows Display Driver Model). Чтобы Direct3D 10 не занимался херней типа перечисления мониторов, эту задачу вынесли в отдельную сущность. Так родился DXGI.
Фактически, dxgi.dll — это сутенер, который сводит вашу видеокарту (будь то божественная GeForce или нищебродская встройка от Intel) с операционной системой и запущенным приложением. Он отвечает за самые низменные, но необходимые вещи:
- Enumeration: Перечисление видеоадаптеров. Именно dxgi сообщает игре, что у вас две видеокарты, и одна из них — бесполезный кусок кремния в процессоре.
- Swap Chain: Цепочка буферов обмена. Святая святых. DXGI решает, какой кадр и когда будет выведен на ваш заляпанный монитор. Он управляет Back Buffer’ом и Front Buffer’ом, чтобы вы не видели, как отрисовывается каждая строка пикселей (хотя если выключить VSync, то увидите тиринг и dxgi тут не виноват).
- Window Association: Тот самый Alt+Tab. DXGI контролирует переход из оконного режима в полноэкранный и обратно. Когда этот процесс глючит и игра сворачивается, но звук остается, а мышка пропадает — это DXGI поссорился с DWM (Desktop Window Manager).
Без dxgi.dll Direct3D 10, 11 и 12 просто не умеют разговаривать с железом на понятном языке, превращая мощный игровой ПК в тыкву, способную лишь гудеть вентиляторами.
Моддинг[править]
Однако есть у dxgi.dll и светлая, хотя и весьма специфическая сторона. Продвинутые юзеры, которым ванильная графика в Skyrim, GTA V или Cyberpunk 2077 кажется слишком унылой, знают этот файл как входные ворота в мир улучшайзеров. Речь идет о знаменитых библиотеках постобработки типа ENBSeries, ReShade, SweetFX или Special K.
Механизм Proxy DLL[править]
Механизм работы этих штук прост и гениален, как удар ломом. Это называется DLL Hijacking (в хорошем смысле) или Hooking.
- Моддер берет свою кастомную библиотеку, которая умеет накладывать шейдеры (Bloom, Ambient Occlusion, цветокоррекцию, от которой вытекают глаза, резкость а-ля наждачка).
- Называет этот файл dxgi.dll.
- Кладет его прямо в папку с `game.exe`.
При запуске игра, будучи тупой программой, следует стандартному порядку поиска DLL: сначала смотрит в текущую папку (о, dxgi.dll, привет!), а уже потом лезет в системные папки. В итоге игра подхватывает поддельный файл, думая, что это системный компонент.
Фейковый dxgi.dll перехватывает вызовы `CreateSwapChain` и `Present`, накладывает свои эффекты, делая картинку как в кино (или как в кислотном трипе, тут уж как повезет с пресетом), а затем передает управление настоящему системному файлу из System32. Этот метод позволяет творить чудеса с играми, разработчики которых положили болт на графику. Именно благодаря этому мы имеем тысячи скриншотов, где старая добрая GTA San Andreas блестит, как намазанная маслом лысина Брюса Уиллиса, а лужи отражают всё, вплоть до комплексов игрока.
Пацаны, поставил ENB, переименовал dxgi.dll, теперь вместо игры черный экран и звук ошибки Windows. Но зато видеокарта греется, значит работает!
Конфликты[править]
Часто случается так, что юзер хочет и ENB, и ReShade одновременно. Оба хотят называться `d3d11.dll` или `dxgi.dll`. Начинается танец с бубном: один файл переименовывается в `dxgi.dll`, другой в `d3d11.dll`, в конфигах прописываются прокси-библиотеки… В итоге игра крашится при запуске, потому что оверлей Steam подрался с оверлеем Discord, а те вместе запинали ReShade, который пытался хукнуть DXGI.
Античиты[править]
Обратная сторона медали — античиты. Системы защиты в онлайн-играх (всякие BattlEye, Easy Anti-Cheat, Vanguard) люто ненавидят, когда кто-то подменяет системные библиотеки. Для них любой левый dxgi.dll в папке с игрой — это потенциальный Wallhack, ESP или Aimbot.
Логика античита проста: Ты подменил системный файл, перехватываешь рендеринг? Значит, можешь рисовать квадратики вокруг голов врагов. В БАН!. Поэтому любители сделать картинку поконтрастнее в мультиплеерных шутерах (например, в PUBG или Apex Legends) часто улетают в перманентный бан, после чего бегут на форумы рассказывать прохладные истории о том, что я ничего не юзал, это просто Решейд, разбаньте, админы козлы.
Хотя некоторые игры официально разрешают ReShade (вайтлистят подпись файла), любое обновление античита может превратить вас из честного графодрочера в грязного читера за секунду.
Техническая порнография[править]
Если заглянуть под капот через IDA Pro, то dxgi.dll экспортирует кучу функций с зубодробительными названиями вроде `CreateDXGIFactory2`, `IDXGISwapChain::Present1` и прочую COM-ересь. Самая мякотка заключается во взаимодействии с драйверами.
DXGI эволюционировал вместе с Windows:
- DXGI 1.0 (Vista): База. Умел создавать Swap Chain и перечислять адаптеры. Часто вызывал BSOD при кривых драйверах.
- DXGI 1.1 (Win 7): Добавили `Synchronized Shared Surfaces`. Теперь Direct3D 10 и 11 могли дружить.
- DXGI 1.2 (Win 8): Появился Flip Model. Это революция. Раньше использовался `BitBlt` (тупое копирование памяти), что было медленно и жрало батарею. Flip Model позволяет просто перебрасывать указатели на видеопамять. Меньше задержка, больше FPS, меньше тиринга в оконном режиме.
- DXGI 1.3 — 1.6 (Win 8.1 — Win 10/11): Поддержка Multi-plane Overlays (MPO), переменной частоты обновления (VRR, G-Sync, FreeSync), HDR (High Dynamic Range) и широкого цветового охвата. Теперь черный цвет действительно черный, а белый выжигал сетчатку, если у тебя есть монитор за 100500 денег.
TDR[править]
DXGI тесно связан с механизмом TDR (Timeout Detection and Recovery). Когда драйвер видеокарты зависает (потому что ты переразгнал свою GTX 1060, надеясь получить производительность RTX 5090), DXGI это видит. Если драйвер не отвечает 2 секунды, DXGI говорит ядру винды: Шеф, всё пропало!. Раньше (в XP) это был синий экран смерти (BSOD). Теперь экран гаснет, потом мигает, и появляется сообщение: Видеодрайвер перестал отвечать и был успешно восстановлен. Скажите спасибо DXGI, что вам не пришлось жать кнопку Reset и терять несохраненный курсовик.