Я хочу объединить EndScene
из произвольного приложения DirectX 9 для создания небольшого наложения. Например, вы можете взять накладку счетчика кадров FRAPS, которая отображается в играх при активации.
Я знаю следующие методы для этого:
-
Создание новой d3d9.dll, которая затем копируется в игровой путь. Поскольку сначала выполняется поиск текущей папки, перед переходом на system32 и т.д., Моя модифицированная DLL загружается, выполняя мой дополнительный код.
Даунсайд: Вы должны положить его туда, прежде чем начать игру.
- То же, что и первый метод, но напрямую заменяет DLL в system32.
Даунсайд: Вы не можете добавить код игры. Вы не можете исключать приложения, в которых вы не хотите, чтобы ваша DLL была загружена.
- Получение смещения EndScene непосредственно из DLL с помощью таких инструментов, как IDA Pro 4.9 Free. Поскольку DLL загружается как есть, вы можете просто добавить это смещение к стартовому адресу DLL, когда он сопоставляется с игрой, чтобы получить фактическое смещение, а затем подключить его.
Даунсайд: Смещение не одинаково для каждой системы.
- Подключив Direct3DCreate9, чтобы получить D3D9, затем подключите D3D9- > CreateDevice, чтобы получить указатель на устройство, а затем подключите Device- > EndScene через виртуальную таблицу.
Даунсайд: DLL не может быть введена, когда процесс уже запущен. Вы должны запустить процесс с помощью флага
CREATE_SUSPENDED
, чтобы подключить начальный файл Direct3DCreate9.- Создание нового устройства в новом окне, как только будет загружена DLL. Затем, получив смещение
EndScene
от этого устройства и подключив его, в результате получается крючок для устройства, которое используется в игре.
Даунсайд: с некоторой информацией, которую я прочитал, создание второго устройства может помешать существующему устройству, и оно может быть связано с оконным и полноэкранным режимами и т.д.
- То же, что и третий метод. Однако вы получите сканирование паттерна, чтобы получить
EndScene
.
Даунсайд: не выглядит надежным.
Как я могу перехватить EndScene
из вложенной DLL, которая может быть загружена, когда игра уже запущена, без необходимости иметь дело с разными d3d9.dll в других системах и с надежным методом? Как FRAPS, например, выполняет его перехваты DirectX?
DLL не должна применяться ко всем играм, только к конкретным процессам, где я вставляю их через CreateRemoteThread
.