Надежно вызов функций OpenGL в инъекции DLL в WindowsC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Надежно вызов функций OpenGL в инъекции DLL в Windows

Сообщение Anonymous »

Я разрабатываю инструмент впрыска DLL для приложения OpenGL (основной профиль, версия> 3.3) для перехвата данных геометрии. Мне нужно вызывать функции OpenGL, такие как gldrawelements и glgetintegerv из моего инъецированного dll.
Мой первоначальный подход использовал жесткие смещения в Nvoglv64.dll :
:
typedef void(APIENTRY *FP_glDrawElements)(GLenum mode, GLsizei count,
GLenum type, const GLvoid *indices);
// The function offset in nvoglv64.dll
static const DWORD_PTR glDrawElements_OFFSET = 0x8625A0;
static FP_glDrawElements real_glDrawElements = nullptr;

// Then...
const char *NAME = "nvoglv64.dll";
HMODULE h_mod = GetModuleHandleA(NAME);
MODULEINFO mod_info;
if (h_mod == 0) {
debug_output("Fail to get module.");
}
if (!GetModuleInformation(GetCurrentProcess(), h_mod, &mod_info, sizeof(mod_info))) {
debug_output("Fail to get module information.");
}
char path[MAX_PATH];
GetModuleFileNameA(h_mod, path, MAX_PATH);
debug_output(std::format("OpenGL module found: {}", path));
DWORD_PTR actual_base = (DWORD_PTR)mod_info.lpBaseOfDll;
real_glDrawElements =
(FP_glDrawElements)(actual_base + glDrawElements_OFFSET);

Это работает для большинства функций, но не удается для GlgetIntegerv , поскольку его реализация находится в OpenGL32.dll вместо драйвера dll.
Я пытался использовать Glad:

gladLoadGL(); // Without context-specific loader
< /code>
Но это не удается, так как мне не хватает обратного вызова загрузчика, такого как glfwgetprocaddress < /code>.
Как я могу надежно получить указатели функций OpenGL, когда: < /p>
  • может быть в любом opengl32.dll (proxy) или vendor dlls (e.g.g. ng.g. ng. /> Я нахожусь в контексте инъекции DLL без GLFW/GLUT
  • Приложение использует современный OpenGL (основной профиль)
Что мне делать?


Подробнее здесь: https://stackoverflow.com/questions/796 ... in-windows
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»