на главную
об игре

Можно ли запустить на DirectX 10?

Кто нибудь запустил на Directx 10? у меня например выдает ошибку с модулем nvwgf2umx.dll

14
61
Комментарии:  61
Ваш комментарий

Dimchik94
и чё толку он его обновит? Игра - only DirectX11

Драйвер последний стоит, в системных требованиях написано что 10 тоже совместим

Crysis_Net_2
дальше смотри что написано
Additional Notes: Supported Video Cards at time of release: NVIDIA GeForce GTS 450 or better, GeForce 500, 600, 700, 900 series / AMD Radeon HD 5670 or better, Radeon HD 6000, 7000, R7, R9 series / Intel HD4600, HD5200
ни одной видеокарты, у которой DirectX 10 потолок.

ezumagumu
ну значит как я и говорил - при инициализации функции D3D11CreateDevice идёт перечисление аппаратного уровня поддержки
D3D_FEATURE_LEVEL featureLevels[]
{
D3D_FEATURE_LEVEL_9_1, // DirectX 9
D3D_FEATURE_LEVEL_9_2, // DirectX 9b
D3D_FEATURE_LEVEL_9_3, // DirectX 9c
D3D_FEATURE_LEVEL_10_0, // DirectX 10
D3D_FEATURE_LEVEL_10_1, // DirectX 10.1
D3D_FEATURE_LEVEL_11_0, // DirectX 11
D3D_FEATURE_LEVEL_11_1 // DirectX 11.1
};

nfstherun.1
да хоть васи пупкина, что от этого изменится?

кто-нибудь вообще вкуривает о чём я говорю? Или у всех всё завист от репаков, таблеток и прочего говна

не знаю чего там в требованиях, но импорт только d3d11.dll с функцией D3D11CreateDevice
правда там может стоять уровень аппаратной поддержки D3D_FEATURE_LEVEL_10_0 (ещё не проверял) тогда должна запуститься

итак, открываем в дизассемблере IDA наш АСС.ехе (гораздо удобнее было бы использовать OllyDBG. но увы 64 битная версия отладчика до сих пор находится в стадии разработки), немного ждём (до конца не нужно, полная загрузка будет долгой) и переходим на вкладку Imports. Ищем там библиотеку, отвечающую за графику в целом (в нашем случае это d3d11.dll - эта библиотека инициализирует видеокарту), видим, что из неё импортируется одна функция - D3D11CreateDevice (расписывать её не буду, кому интересно читайте MSDN)

щёлкаем по ней мышкой и IDA автоматически перекидывает нас в секцию импорта

особенность IDA в том, что она умеет определять адрес, на который ссылается данная функция (т.е. адрес "шаг назад"). Щелкаем мышью по функции D3D11CreateDevice и попадаем уже в секцию кода

где у нас есть небольшая программа с безусловным переходом (ассемблерная команда jmp - сокращённо от JUMP). Т.е. процессор, выполняя последовательно код, дойдя до этого джампа перейдёт в секцию импорта и вызовет из библиотеки d3d11.dll функцию инициализации видеокарты D3D11CreateDevice одним из аргументов которой, является уровень аппаратной поддержки D3D_FEATURE_LEVEL, который принимает несколько значений, описанных мною выше.
щелкнув по переходу мы попадём в секцию кода

в которой определен вызов (ассемблерная команда call) той небольшой программы с jmp. Это и есть первая точка, с которой начинается вся эта эпопея с инициализацией видеокарты.

вот теперь есть 2 варианта дальнейшего развития событий:
- внедрять свой код прямо в экзешник (менять библиотеку на d3d10.dll и функцию на D3D10CreateDevice), но не факт, что игра заработает (возможно есть функции, зависящие от d3d11.dll, которых физически нет в d3d10.dll, нужно глубже анализировать), или же искать D3D_FEATURE_LEVEL (чтобы изменить D3D_FEATURE_LEVEL_11_0 на D3D_FEATURE_LEVEL_10_0), но это как иголку в стоге сена, т.к. имя аргументов не читается, и оно всего лишь одно из миллионов значений;
- либо второй, писать хук для D3D11CreateDevice с "правильным" параметром D3D_FEATURE_LEVEL и инжектить в загруженный в память код в ту небольшую программу с jmp с одной лишь разницой - этот джамп будет переходить в секцию импорта не на d3d11.dll, а на нашу загруженную в процесс игры библиотеку.

в общем я тут немного в крекинг влез уже)) обычно такое внедрение в таблицу импорта (IAT) делают крякеры, например реализация кряка этой игры от codex:
они вшили в IAT библиотеки binkw64.dll некую секцию кода .NewIT

посмотрев её в hex-редакторе можно увидеть, что это просто вызов их собственной библиотеки codex.dll

в которой есть три функции (я их подробно не анализировал, но там просто эмулятор uplay_r1_loader64.dll)

т.е. экзешник при вызове binkw64.dll по таблице импорта этой библиотеки переходит к библиотеки codex.dll, которая в свою очередь заставляет думать игру что запущен оригинальный загрузчик uplay.
иначе говоря, они сделали первый вариант (внедрили свой код прямо в исполняемый файл).

tesla707
only DirectX11
Нет, системки из Steam:

OS: Windows 7 SP1 or Windows 8/8.1 (64bit versions only)
Processor: Intel Core2Quad Q6600 @ 2.4 GHz or AMD Athlon II X4 620 @ 2.6 GHzH
Memory: 2 GB RAM
Graphics: nVidia GeForce GTS450 or AMD Radeon HD5670 (1024MB VRAM) or Intel HD4600
DirectX: Version 10
Hard Drive: 12 GB available space
Sound Card: DirectX Compatible Sound Card with latest driver

Я ни как не вкурю!!! у меня BF бегал норм! на директе 10! здесь вроде как тот же двиган! но не прет!

Dimchik94
ну во-первых, к тому, что мне этим заниматься лень)) если кто-то что-то понял вперёд дерзайте, будут вопросы помогу. Если будет время свободное, попробую. Внедрением кода в исполняемый файл (крэкингом) я никогда не занимался, так что тема для меня новая и потребуется время чтобы всё собрать воедино (теорию я понимаю как и что должно быть, а с практикой надо опять лезть в WinAPI в недокументированные функции).
а во-вторых, человек попросил объяснить что и как нужно сделать для запуска на dx10, я и объяснил.

кстати, обратите внимание на 4 скрин на эти строки
mov [rsp+68h+var_18], 0B000h
mov [rsp+68h+var_14], 0A100h
mov [rsp+68h+var_10], 0A000h

тут ничего особого нет - операнд mov (передвинуть, от английского MOVE), перемещает значения, стоящие после запятой в 64 битные регистры. Я сразу не обратил внимание (время то уже позднее было), но 0A000h, 0A100h и 0B000h - ёмаё, это же значения самих D3D_FEATURE_LEVEL (0A000h и 0xA000 это одна и та же запись одного значения - первая с префиксом h используется в ассемблере (на чём и дизит IDA), а вторая с аббревиатурой 0х используется в сишных языках)
typedef enum D3D_FEATURE_LEVEL
{
D3D_FEATURE_LEVEL_9_1 = 0x9100,
D3D_FEATURE_LEVEL_9_2 = 0x9200,
D3D_FEATURE_LEVEL_9_3 = 0x9300,
D3D_FEATURE_LEVEL_10_0 = 0xA000,
D3D_FEATURE_LEVEL_10_1 = 0xA100,
D3D_FEATURE_LEVEL_11_0 = 0xB000,
D3D_FEATURE_LEVEL_11_1 = 0xB100,
D3D_FEATURE_LEVEL_11_2 = 0xB200,
D3D_FEATURE_LEVEL_12_0 = 0xC000
} D3D_FEATURE_LEVEL;

это уже интересно. Т.е. функция D3D11CreateDevice и данное перечисление выглядят следующим образом
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_11_0
};

D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, D3D11_CREATE_DEVICE_BGRA_SUPPORT, ARRAYSIZE(featureLevels), 1, D3D11_SDK_VERSION, &device, nullptr, &context);

короче, что-то не даёт воспользоваться значениями 0xA000 и 0xA100 и как-будто залочено на 0xB000.

tesla707
mov [rsp+68h+var_18], 0B000h
mov [rsp+68h+var_14], 0A100h
mov [rsp+68h+var_10], 0A000h
это уже интересно. Т.е. функция D3D11CreateDevice и данное перечисление выглядят следующим образом
D3D_FEATURE_LEVEL featureLevels[] =
{D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_11_0};
короче, что-то не даёт воспользоваться значениями 0xA000 и 0xA100 и как-будто залочено на 0xB000.


В результате ты что поменял? Просто 0B000h убрал?

tesla707
не заработает как я понял

mazinily
Увы, но я больше не занимаюсь программированием. Это было хобби (на протяжении нескольких лет, вроде начал заниматься во времена assassins creed 2 с её DRM))) ), теперь нет времени на это. Жизнь идёт, появляются новые ценности, новая работа, поэтому чем-то приходится жертвовать, от чего-то отказываться. Я уже больше чем полгода как не пишу программ и не анализирую код.

ЗАГРУЗИТЬ ВСЕ КОММЕНТАРИИ
Новое на форуме Assassin's Creed: Rogue