Перейти к содержанию
User32

Как програмно узнать версию DirectX

Рекомендуемые сообщения

Здравствуйте. Собственно вопрос в названии темы. Можно ли с помощью WinAPI узнать версию библиотеки DirectX используемой игрой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, User32 сказал:

помощью WinAPI

Не чего умного в голову не приходит)) Но теоретически...

Да можно, по имени загруженой библиотеки

Через EnumProcessModules

возможно есть другие более легкие пути, но т.к. я великий изобретатель велосипедов с квадратными колесами, более толкового варианта не знаю)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, temtriss сказал:

Через EnumProcessModules

Спасибо, попробую.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

речь идет про direct3d? а то в directx еще другие вещи входят)

в одной игре может использоваться более 1 библиотеки d3d, хотя такое не часто конечно

в сталкере последнем вроде было d3d8 d3d9 d3d10 d3d11)

можно попробовать проверить через GetModuleHandle последовательно библиотеки  d3d

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно через хук узнать. Перехватить вызов импортируемой функции инициализации девайса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

DirectXSetupGetVersion() из dsetup.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 24.05.2018 в 22:49, X86Jumps сказал:

речь идет про direct3d? а то в directx еще другие вещи входят)

в одной игре может использоваться более 1 библиотеки d3d, хотя такое не часто конечно

в сталкере последнем вроде было d3d8 d3d9 d3d10 d3d11)

можно попробовать проверить через GetModuleHandle последовательно библиотеки  d3d

 

Хм... тогда другой вопрос. Как найти функцию рендеринга, не зная какая библиотека для этого используется?

 

23 часа назад, JustHack сказал:

Можно через хук узнать. Перехватить вызов импортируемой функции инициализации девайса.

 

Можно поподробнее. Во всех примерах перехватов DirectX функций которые я нашел, библиотека была известна заранее. 

 

 

Изменено пользователем User32

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
21 час назад, partoftheworlD сказал:

DirectXSetupGetVersion() из dsetup.h

 

 

"Retrieves the version number of the Microsoft DirectX components that are currently installed." Это не совсем то что мне нужно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вариантов не много

просто тупо запустить игру и через cheat engine посмотреть

dissect code, посмотреть что используется

D3D11CreateDevice или Direct3DCreate9

можно и без dissect, просто в search code написать одну из этих функций или goto перейти на нее и поставить breakpoint

 

вариант когда через GetModuleHandle тоже подходит, d3d9.dll,d3d11.dll, если один из вариантов возвратит не ноль, значит то и используется

Изменено пользователем X86Jumps

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если из главного потока приложения, которое уже инициализировало директ вызывать еще один раз CreateDevice с верными параметрами, то тебе все равно вернется INVALID_CALL
Инжект в игру, в точке входа либы - CreateDevice

так и определять
18756_0-500x500.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо. Остановился на варианте через GetModuleHandle, но игра теоретически может подгружать одновременно не одну библиотеку и тогда это работать не будет.

 

7 часов назад, X86Jumps сказал:

просто тупо запустить игру и через cheat engine посмотреть

dissect code, посмотреть что используется

D3D11CreateDevice или Direct3DCreate9

можно и без dissect, просто в search code написать одну из этих функций или goto перейти на нее и поставить breakpoint

 

Если на игру повесили протектор это не подойдет. Также  можно и в Ольге посмотреть в меню "intermodular calls".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
24 минуты назад, User32 сказал:

Если на игру повесили протектор это не подойдет

На этот случай можно вешать хук на GetProcAddress и записывать все что игра подгружает, даже если стоит протектор, пакер и виртуалка в добавок. А по твоей теме, тебе нужно получать это https://msdn.microsoft.com/en-us/library/windows/desktop/ff476876(v=vs.85).aspx D3D_FEATURE_LEVEL – параметр, указывающий, какую версию DirectX поддерживает наша видеокарта, который в последствии используется для создания устройства.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так надо конкретно какую то игру определить или как типа injector чтоб определил и делал потом hook для разных интерфейсов?

если второе, то вариант с getmodulehandle в библиотеке не самый плохой

просто без конкретики как то не очень ясно что нужно))

например в cheat engine хук d3d делает так: он грузит последовательно d3d11 d3d10 d3d9 библиотеки и создает интерфейсы на болванке созданного окна

т.к. это в виде dll он уже в памяти процесса игры висит и поэтому вернет в любом случае существующий указатель

а какие не были, получается создаст лишний раз (loadlibrary используется)

тогда как  getmodulehandle  только вернет handle на существующий модуль. Конечно в игре может быть сразу 2 3 рендерера как в каком-нибудь STALKER

но это не часто, или как в ue4 где несколько вариантов рендерера (rhi), но он только 1 раз создается, т.е. как в сталкер не меняется рендерер

 

partoftheworlD ну видеокарта может и d3d12 поддерживать)) а игра tomb raider II будет использовать DirectDevice7))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.