OpenGL/DirectX Hook - похож на FRAPS

Можно ли определить, какие приложения используют OpenGL или DirectX, аналогичные тем, что делает FRAPS? (Возможно, используя какую-то форму крючка)? Мне, вероятно, не нужно будет рисовать в окне, мне просто нужно знать, какие процессы выполняют некоторую форму 3D-рендеринга на данный момент.

(Edit:) Если вы не знакомы с ним, FRAPS - это программа, которая может использоваться для создания счетчика "Frame-per-second" в 3D-приложении. FRAPS находит все запущенные 3D-приложения самостоятельно, не указывая имя процесса.

Пример счетчика "Кадр в секунду", обращенного к внешней игре: enter image description here

Ответ 1

Вероятно, самый простой способ - проверить наличие явных библиотек OpenGL и DirectX, возможно, также неплохо добавить в DLL драйвера OGL тоже (например, nvogl), это можно сделать с помощью EnumProcesses и EnumProcessModulesEx, используя p/invoke, это, по крайней мере, даст вам начальный набор процессов, возможно, используя OGL или DX.

Конечно, некоторые приложения загружают оба API и используют только один или только условно используют один из GFX API (хотя последнее происходит только со специализированными инструментами и т.п.), для этого, IMO, лучший способ проверить - выполнить некоторую форму инъекции или прикрепление к процессу, как отладчик, затем подключить либо Present для DX, либо wglSwapBuffers для OGL.

Возможно, вам удастся избежать использования крючка, перечислив дескрипторы GDI и поиская контексты визуализации DXGI или OGL, насколько это жизнеспособно, я не знаю.

Ответ 2

Из того, что я понимаю, FRAPS использует подход с относительно грубой силой, чтобы определить, где лежать магазин. Процесс начинается с SetWindowsHookEx, чтобы запросить, чтобы ОС загружала DLL FRAPS в каждый запущенный процесс, который он может [и будущие процессы]. Магия в DLL сводится к выполнению процедурного набора тестов с использованием GetModuleHandleA, чтобы наблюдать, подключен ли к процессу, который он подключил, к любым модулям OpenGL/DirectX. Если все вызовы возвращают NULL, хук пытается удалить себя из процесса.

С другой стороны, если процесс загрузил их, он просто перехватывает соответствующую функцию рендеринга из этой библиотеки, удаляя защиту и вставляя JMP-крючок. wglSwapBuffers обычно является единственным релевантным в OpenGL. Когда процесс вызывает эту функцию, он вызывает вызов модуля FRAPS, а затем FRAPS захватывает задний буфер в свою очередь для кодирования в AVI и отображает его небольшое указание. Затем он обрабатывает исходный запрос для wglSwapBuffers и возвращает выполнение обратно в программу.

Что касается запроса на С#... просмотрите EasyHook (http://easyhook.codeplex.com/) и посмотрите, не работает ли он для вас. У меня лично нет опыта работы с этим API.

Ответ 3

Вы должны взглянуть на Как наложить графику на игры Windows? и связанная статья http://www.ring3circus.com/gameprogramming/case-study-fraps/.

Вторая ссылка имеет некоторый код концепции, который должен делать фактическую часть крючка. Он также более подробно описывает, как и почему, чем я чувствую, как копировать и вставлять в этот ответ.