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++)