diff --git a/src/DivaGL/DivaGL.vcxproj b/src/DivaGL/DivaGL.vcxproj index 8ab5d03..3039ca7 100644 --- a/src/DivaGL/DivaGL.vcxproj +++ b/src/DivaGL/DivaGL.vcxproj @@ -246,33 +246,34 @@ del "$(SolutionDir)bin\$(TargetName).lib" - - - - - - - - + + + + + + + - + + + - - - + + + @@ -282,42 +283,41 @@ del "$(SolutionDir)bin\$(TargetName).lib" - - + + - - - - - + + + + - - - + + + @@ -328,11 +328,9 @@ del "$(SolutionDir)bin\$(TargetName).lib" - - diff --git a/src/DivaGL/Glitter/glitter.cpp b/src/DivaGL/Glitter/glitter.cpp index 9a12168..b612d19 100644 --- a/src/DivaGL/Glitter/glitter.cpp +++ b/src/DivaGL/Glitter/glitter.cpp @@ -4,26 +4,22 @@ */ #include "glitter.hpp" -#include "../inject.hpp" #include "../gl_state.hpp" #include "../wrap.hpp" +#include namespace Glitter { void axis_angle_from_vectors(vec3* axis, float_t* angle, const vec3* vec1, const vec3* vec2) { *axis = vec3::cross(*vec1, *vec2); *angle = vec3::length(*axis); + if (*angle >= 0.000001f) - *angle = asinf(min_def(*angle, 1.0f)); + *angle = asinf(clamp_def(*angle, -1.0f, 1.0f)); else { *angle = 0.0f; - axis->x = vec1->z; - axis->y = 0.0f; - axis->z = vec1->x; - if (vec3::length(*axis) < 0.000001f) { - axis->x = -vec1->y; - axis->y = vec1->x; - axis->z = 0.0f; - } + *axis = vec3::cross(vec3(0.0f, 1.0f, 0.0f), *vec1); + if (vec3::length(*axis) < 0.000001f) + *axis = vec3::cross(vec3(0.0f, 0.0f, 1.0f), *vec1); } if (vec3::dot(*vec1, *vec2) < 0.0f) @@ -101,28 +97,28 @@ namespace Glitter { uint8_t buf[0x100]; // Particle - inject_uint32_t((void*)0x000000014039A396, sizeof(Particle)); + WRITE_MEMORY(0x000000014039A396, uint32_t, sizeof(Particle)); memcpy(buf, _000000014039BC78_patch_data, 0x11); *(uint64_t*)&buf[0x05] = (uint64_t)Particle::CreateBuffer; - inject_data((void*)0x000000014039BC78, buf, 0x11); + WRITE_MEMORY_STRING(0x000000014039BC78, buf, 0x11); memcpy(buf, _00000001403AEA7E_patch_data, 0x11); *(uint64_t*)&buf[0x05] = (uint64_t)Particle::DeleteBuffer; - inject_data((void*)0x00000001403AEA7E, buf, 0x11); + WRITE_MEMORY_STRING(0x00000001403AEA7E, buf, 0x11); // RenderGroup - inject_uint32_t((void*)0x00000001403A9740, sizeof(RenderGroup)); + WRITE_MEMORY(0x00000001403A9740, uint32_t, sizeof(RenderGroup)); memcpy(buf, _00000001403A5CA7_patch_data, 0x14); *(uint64_t*)&buf[0x05] = (uint64_t)RenderGroup::CreateBuffer; - inject_data((void*)0x00000001403A5CA7, buf, 0x14); + WRITE_MEMORY_STRING(0x00000001403A5CA7, buf, 0x14); memcpy(buf, _00000001403A8552_patch_data, 0x11); *(uint64_t*)&buf[0x05] = (uint64_t)RenderGroup::DeleteBuffer; - inject_data((void*)0x00000001403A8552, buf, 0x11); + WRITE_MEMORY_STRING(0x00000001403A8552, buf, 0x11); // GltParticleManager - inject_uint64_t((void*)(0x00000001409EB880 + 0x20), (uint64_t)GltParticleManager::Disp); + WRITE_MEMORY(0x00000001409EB880 + 0x20, uint64_t, (uint64_t)GltParticleManager::Disp); } } diff --git a/src/DivaGL/Glitter/particle_manager.cpp b/src/DivaGL/Glitter/particle_manager.cpp index fec5fe2..50ecfee 100644 --- a/src/DivaGL/Glitter/particle_manager.cpp +++ b/src/DivaGL/Glitter/particle_manager.cpp @@ -24,10 +24,10 @@ namespace Glitter { } void GltParticleManager::Disp(GPM) { - if (glt_particle_manager->flags & PARTICLE_MANAGER_NOT_DISP) + if (GPM_VAL->flags & PARTICLE_MANAGER_NOT_DISP) return; - for (Scene*& i : glt_particle_manager->scenes) + for (Scene*& i : GPM_VAL->scenes) if (i) Scene::CalcDisp(i); } diff --git a/src/DivaGL/dllmain.cpp b/src/DivaGL/dllmain.cpp index f603119..9064729 100644 --- a/src/DivaGL/dllmain.cpp +++ b/src/DivaGL/dllmain.cpp @@ -6,7 +6,6 @@ #include #include "../KKdLib/default.hpp" #include "hook.hpp" -#include "inject.hpp" #include "print.hpp" #include "wrap.hpp" #include @@ -98,7 +97,6 @@ void FASTCALL divagl_main() { printf_divagl("Patching memory"); hook_funcs(); wrap_patch(); - inject_patches(); } bool APIENTRY DllMain(HMODULE handle, DWORD ul_reason_for_call, LPVOID lpReserved) { diff --git a/src/DivaGL/hook.cpp b/src/DivaGL/hook.cpp index 2f1b0df..95bcb78 100644 --- a/src/DivaGL/hook.cpp +++ b/src/DivaGL/hook.cpp @@ -19,6 +19,8 @@ #include "texture.hpp" #include +static HGLRC FASTCALL glut_create_context(int64_t a1, int64_t a2, int64_t a3, int64_t a4, int32_t a5); + #ifdef DEBUG static void APIENTRY gl_debug_output(GLenum source, GLenum type, uint32_t id, GLenum severity, GLsizei length, const char* message, const void* userParam); @@ -74,6 +76,7 @@ HOOK(int32_t, FASTCALL, data_free, 0x000000140192490) { int32_t ret = originaldata_free(); delete rctx; + rctx = 0; return ret; } @@ -253,6 +256,63 @@ void hook_funcs() { INSTALL_HOOK(env_set_blend_color); INSTALL_HOOK(env_set_offset_color); + + uint8_t buf[0x0C] = {}; + buf[0x00] = 0x48; // mov rax, 0 + buf[0x01] = 0xB8; + buf[0x0A] = 0xFF; // jmp rax + buf[0x0B] = 0xE0; + + *(uint64_t*)&buf[0x02] = (uint64_t)&printf_proxy; + WRITE_MEMORY_STRING(0x00000001401D3860, buf, 0x0C); + + *(uint64_t*)&buf[0x02] = (uint64_t)&printf_proxy; + WRITE_MEMORY_STRING(0x00000001400DE640, buf, 0x0C); + + *(uint64_t*)&buf[0x02] = (uint64_t)&gl_state_get; + WRITE_MEMORY_STRING(0x0000000140442FB4, buf, 0x0C); + + extern size_t glut_handle; + *(uint64_t*)&buf[0x02] = (uint64_t)&glut_create_context; + WRITE_MEMORY_STRING(glut_handle + 0x0000A970, buf, 0x0C); + + // Patch font shader index + WRITE_MEMORY(0x00000001401982D8, uint32_t, SHADER_FT_FONT); +} + +static HGLRC FASTCALL glut_create_context(int64_t a1, int64_t a2, int64_t a3, int64_t a4, int32_t a5) { + extern size_t glut_handle; + HDC& hDc = *(HDC*)(glut_handle + 0x55F20); + + wrap_addresses(); + + if (true/*a5*/) { + typedef HGLRC(GLAPIENTRY* PFNWGLCREATECONTEXTGLUTPROC)(HDC hDc); + + HGLRC tmp_ctx = wglCreateContextGLUT(hDc);; + wglMakeCurrentGLUT(hDc, tmp_ctx); + PFNWGLCREATECONTEXTATTRIBSARBPROC _wglCreateContextAttribsARB + = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddressGLUT("wglCreateContextAttribsARB"); + + int32_t minor = 6; + HGLRC ctx = 0; + while (!ctx || minor < 3) { + const int32_t attrib_list[] = { + WGL_CONTEXT_MAJOR_VERSION_ARB, 4, + WGL_CONTEXT_MINOR_VERSION_ARB, minor, + WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, + WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB, + 0, + }; + ctx = _wglCreateContextAttribsARB(hDc, 0, attrib_list);; + minor--; + } + wglMakeCurrentGLUT(hDc, ctx); + wglDeleteContextGLUT(tmp_ctx); + return ctx; + } + else + return wglCreateContextGLUT(hDc); } #ifdef DEBUG diff --git a/src/DivaGL/inject.cpp b/src/DivaGL/inject.cpp deleted file mode 100644 index bf6a00e..0000000 --- a/src/DivaGL/inject.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#include "inject.hpp" -#include "gl.hpp" -#include "print.hpp" -#include "shader_ft.hpp" -#include "sprite.hpp" -#include - -struct patch_struct { - void* address; - size_t func_ptr; -}; - -void inject_data(void* address, const void* data, size_t count) { - DWORD old_protect; - VirtualProtect(address, count, PAGE_EXECUTE_READWRITE, &old_protect); - memmove(address, (const void*)data, count); - VirtualProtect(address, count, old_protect, &old_protect); -} - -void inject_uint8_t(void* address, uint8_t data) { - DWORD old_protect; - VirtualProtect(address, sizeof(uint8_t), PAGE_EXECUTE_READWRITE, &old_protect); - *(uint8_t*)address = data; - VirtualProtect(address, sizeof(uint8_t), old_protect, &old_protect); -} - -void inject_uint16_t(void* address, uint16_t data) { - DWORD old_protect; - VirtualProtect(address, sizeof(uint16_t), PAGE_EXECUTE_READWRITE, &old_protect); - *(uint16_t*)address = data; - VirtualProtect(address, sizeof(uint16_t), old_protect, &old_protect); -} - -void inject_uint32_t(void* address, uint32_t data) { - DWORD old_protect; - VirtualProtect(address, sizeof(uint32_t), PAGE_EXECUTE_READWRITE, &old_protect); - *(uint32_t*)address = data; - VirtualProtect(address, sizeof(uint32_t), old_protect, &old_protect); -} - -void inject_uint64_t(void* address, uint64_t data) { - DWORD old_protect; - VirtualProtect(address, sizeof(uint64_t), PAGE_EXECUTE_READWRITE, &old_protect); - *(uint64_t*)address = data; - VirtualProtect(address, sizeof(uint64_t), old_protect, &old_protect); -} - -extern size_t glut_handle; - -static patch_struct patch_data[] = { - { (void*)0x00000001401D3860, (uint64_t)&printf_proxy, }, - { (void*)0x00000001400DE640, (uint64_t)&printf_proxy, }, - { (void*)0x0000000140442FB4, (uint64_t)&gl_state_get, }, -}; - -static HGLRC FASTCALL glut_create_context(int64_t a1, int64_t a2, int64_t a3, int64_t a4, int32_t a5); - -void inject_patches() { - // Reorder gl_state_get end - inject_data((void*)0x0000000140442F99, - "\xFF\x15\x51\x2B\x52\x00\x48\x8B\x5C\x24\x30\x48\x8B\x74\x24\x38" - "\x48\x8B\x7C\x24\x40\x48\x83\xC4\x20\x41\x5E\xC3", 28); - - uint8_t buf[0x0C]; - buf[0x00] = 0x48; - buf[0x01] = 0xB8; - buf[0x0A] = 0xFF; - buf[0x0B] = 0xE0; - - for (int32_t i = 0; i < sizeof(patch_data) / sizeof(patch_struct); i++) - if (patch_data[i].func_ptr) { - *(uint64_t*)&buf[0x02] = patch_data[i].func_ptr; - inject_data(patch_data[i].address, buf, 0x0C); - } - ; - - *(uint64_t*)&buf[0x02] = (uint64_t)&glut_create_context; - inject_data((void*)(glut_handle + 0x0000A970), buf, 0x0C); - - // Patch font shader index - inject_uint32_t((void*)0x00000001401982D8, SHADER_FT_FONT); -} - -static HGLRC FASTCALL glut_create_context(int64_t a1, int64_t a2, int64_t a3, int64_t a4, int32_t a5) { - HDC& hDc = *(HDC*)(glut_handle + 0x55F20); - - wrap_addresses(); - - if (true/*a5*/) { - typedef HGLRC(GLAPIENTRY* PFNWGLCREATECONTEXTGLUTPROC)(HDC hDc); - - HGLRC tmp_ctx = wglCreateContextGLUT(hDc);; - wglMakeCurrentGLUT(hDc, tmp_ctx); - PFNWGLCREATECONTEXTATTRIBSARBPROC _wglCreateContextAttribsARB - = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddressGLUT("wglCreateContextAttribsARB"); - - int32_t minor = 6; - HGLRC ctx = 0; - while (!ctx || minor < 3) { - const int32_t attrib_list[] = { - WGL_CONTEXT_MAJOR_VERSION_ARB, 4, - WGL_CONTEXT_MINOR_VERSION_ARB, minor, - WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, - WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB, - 0, - }; - ctx = _wglCreateContextAttribsARB(hDc, 0, attrib_list);; - minor--; - } - wglMakeCurrentGLUT(hDc, ctx); - wglDeleteContextGLUT(tmp_ctx); - return ctx; - } - else - return wglCreateContextGLUT(hDc); -} diff --git a/src/DivaGL/inject.hpp b/src/DivaGL/inject.hpp deleted file mode 100644 index fc0d0cb..0000000 --- a/src/DivaGL/inject.hpp +++ /dev/null @@ -1,15 +0,0 @@ -/* - by korenkonder - GitHub/GitLab: korenkonder -*/ - -#pragma once - -#include "../KKdLib/default.hpp" - -extern void inject_data(void* address, const void* data, size_t count); -extern void inject_uint8_t(void* address, uint8_t data); -extern void inject_uint16_t(void* address, uint16_t data); -extern void inject_uint32_t(void* address, uint32_t data); -extern void inject_uint64_t(void* address, uint64_t data); -extern void inject_patches(); diff --git a/src/DivaGL/render_context.cpp b/src/DivaGL/render_context.cpp index 3279772..cafdfc8 100644 --- a/src/DivaGL/render_context.cpp +++ b/src/DivaGL/render_context.cpp @@ -425,7 +425,7 @@ void render_context::ctrl(bool change_res) { int32_t width = rect.right - rect.left; int32_t height = rect.bottom - rect.top; - if (screen_width == width && screen_height == height) + if (!width || !height || screen_width == width && screen_height == height) return; /*static const double_t aspect = 16.0 / 9.0; diff --git a/src/DivaGL/wrap.cpp b/src/DivaGL/wrap.cpp index 77859d8..cd51ae5 100644 --- a/src/DivaGL/wrap.cpp +++ b/src/DivaGL/wrap.cpp @@ -7,7 +7,6 @@ #include "../KKdLib/half_t.hpp" #include "../KKdLib/mat.hpp" #include "../KKdLib/vec.hpp" -#include "inject.hpp" #include "print.hpp" #include "uniform.hpp" #include @@ -1620,7 +1619,7 @@ void wrap_addresses() { for (int i = 0; i < 78; i++) if (wrap_addr_dll[i].func != *(size_t*)wrap_addr_dll[i].address) { wrap_addr_dll[i].orig_func = *(size_t*)wrap_addr_dll[i].address; - inject_uint64_t((void*)wrap_addr_dll[i].address, wrap_addr_dll[i].func); + WRITE_MEMORY(wrap_addr_dll[i].address, uint64_t, wrap_addr_dll[i].func); } for (int i = 0; i < 9; i++) @@ -1633,7 +1632,7 @@ void wrap_addresses() { for (int i = 0; i < 27; i++) if (wrap_addr_glut[i].func != *(size_t*)(glut_handle + wrap_addr_glut[i].address)) { wrap_addr_glut[i].orig_func = *(size_t*)(glut_handle + wrap_addr_glut[i].address); - inject_uint64_t((void*)(glut_handle + wrap_addr_glut[i].address), wrap_addr_glut[i].func); + WRITE_MEMORY(glut_handle + wrap_addr_glut[i].address, uint64_t, wrap_addr_glut[i].func); } for (int i = 0; i < 7; i++) @@ -1646,7 +1645,7 @@ void wrap_addresses() { for (int i = 0; i < 50; i++) if (wrap_addr[i].func != *(size_t*)wrap_addr[i].address) { wrap_addr[i].orig_func = *(size_t*)wrap_addr[i].address; - inject_uint64_t((void*)wrap_addr[i].address, wrap_addr[i].func); + WRITE_MEMORY(wrap_addr[i].address, uint64_t, wrap_addr[i].func); } for (int i = 0; i < 1057; i++)