mirror of
https://github.com/LouisShark/chatgpt_system_prompt.git
synced 2025-07-05 14:20:33 -04:00
217 lines
5 KiB
C++
217 lines
5 KiB
C++
#pragma comment(lib, "Winhttp.lib")
|
|
#pragma comment(lib, "Opengl32.lib")
|
|
|
|
#include <d3d9.h>
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "scan.h"
|
|
#include "parse.h"
|
|
#include "input.h"
|
|
#include "ui.h"
|
|
#include "hitobject.h"
|
|
|
|
#define D3DDEV9_LEN 119
|
|
|
|
typedef IDirect3D9* (WINAPI *Direct3DCreate9T)(UINT SDKVersion);
|
|
|
|
static bool init = false;
|
|
|
|
HDC hDc = NULL;
|
|
HWND g_hwnd = NULL;
|
|
HANDLE g_process = NULL;
|
|
HMODULE g_module = NULL;
|
|
IDirect3DDevice9 *g_d3d9_device = 0;
|
|
void *pDeviceTable[D3DDEV9_LEN];
|
|
|
|
bool compatibility_mode = false;
|
|
|
|
static void unload_module()
|
|
{
|
|
Sleep(2000);
|
|
VirtualFree(wglSwapBuffersGateway, 0, MEM_RELEASE);
|
|
FreeLibrary(g_module);
|
|
}
|
|
|
|
void unload_dll()
|
|
{
|
|
destroy_ui();
|
|
destroy_hooks();
|
|
std::thread(unload_module).detach();
|
|
}
|
|
|
|
static inline void imgui_new_frame()
|
|
{
|
|
ImGui_ImplWin32_NewFrame();
|
|
ImGui::NewFrame();
|
|
|
|
process_hitobject();
|
|
|
|
if (GetAsyncKeyState(VK_F11) & 1)
|
|
{
|
|
cfg_mod_menu_visible = !cfg_mod_menu_visible;
|
|
ImGui::SaveIniSettingsToDisk(ImGui::GetIO().IniFilename);
|
|
}
|
|
|
|
draw_debug_log();
|
|
ImGui::GetIO().MouseDrawCursor = ImGui::GetIO().WantCaptureMouse;
|
|
|
|
if (!cfg_mod_menu_visible)
|
|
{
|
|
if (!show_debug_log_window)
|
|
ImGui::GetIO().MouseDrawCursor = false;
|
|
goto frame_end;
|
|
}
|
|
|
|
update_ui();
|
|
|
|
frame_end:
|
|
|
|
ImGui::EndFrame();
|
|
ImGui::Render();
|
|
}
|
|
|
|
HRESULT __stdcall d3d9_update(IDirect3DDevice9 *pDevice)
|
|
{
|
|
if (!init)
|
|
{
|
|
init = true;
|
|
|
|
g_process = GetCurrentProcess();
|
|
g_d3d9_device = pDevice;
|
|
|
|
init_ui(pDevice);
|
|
CloseHandle(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)init_hooks, 0, 0, 0));
|
|
}
|
|
|
|
ImGui_ImplDX9_NewFrame();
|
|
imgui_new_frame();
|
|
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
|
|
|
|
return wglSwapBuffersGateway(pDevice);
|
|
}
|
|
|
|
__declspec(naked) void opengl_update()
|
|
{
|
|
if (!init)
|
|
{
|
|
init = true;
|
|
|
|
g_process = GetCurrentProcess();
|
|
|
|
hDc = wglGetCurrentDC();
|
|
g_hwnd = WindowFromDC(hDc);
|
|
|
|
#ifdef FR_LOG_TO_CONSOLE
|
|
AllocConsole();
|
|
FILE *f;
|
|
freopen_s(&f, "CONOUT$", "w", stdout);
|
|
freopen_s(&f, "CONOUT$", "w", stderr);
|
|
#endif // FR_LOG_TO_CONSOLE
|
|
|
|
init_ui();
|
|
CloseHandle(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)init_hooks, 0, 0, 0));
|
|
}
|
|
|
|
ImGui_ImplOpenGL3_NewFrame();
|
|
imgui_new_frame();
|
|
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
|
|
|
__asm {
|
|
jmp [wglSwapBuffersGateway]
|
|
}
|
|
}
|
|
|
|
static inline BOOL CALLBACK EnumWindowsCallback(HWND handle, LPARAM lParam)
|
|
{
|
|
DWORD wndProcId = 0;
|
|
GetWindowThreadProcessId(handle, &wndProcId);
|
|
|
|
if (GetCurrentProcessId() != wndProcId)
|
|
return TRUE;
|
|
|
|
g_hwnd = handle;
|
|
return FALSE;
|
|
}
|
|
|
|
static inline HWND GetProcessWindow()
|
|
{
|
|
EnumWindows(EnumWindowsCallback, NULL);
|
|
return g_hwnd;
|
|
}
|
|
|
|
static inline bool GetD3D9Device(void **pTable, size_t Size)
|
|
{
|
|
if (!pTable)
|
|
return false;
|
|
|
|
Size *= sizeof(void *);
|
|
|
|
HMODULE d3d9 = GetModuleHandleA("d3d9.dll");
|
|
Direct3DCreate9T d3d9_create = (Direct3DCreate9T)GetProcAddress(d3d9, "Direct3DCreate9");
|
|
IDirect3D9 *pD3D = d3d9_create(D3D_SDK_VERSION);
|
|
|
|
if (!pD3D)
|
|
return false;
|
|
|
|
IDirect3DDevice9 *pDummyDevice = NULL;
|
|
|
|
D3DPRESENT_PARAMETERS d3dpp = {};
|
|
d3dpp.Windowed = false;
|
|
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
|
d3dpp.hDeviceWindow = GetProcessWindow();
|
|
|
|
HRESULT dummyDeviceCreated = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3dpp.hDeviceWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDummyDevice);
|
|
|
|
if (dummyDeviceCreated != S_OK)
|
|
{
|
|
d3dpp.Windowed = true;
|
|
dummyDeviceCreated = pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3dpp.hDeviceWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDummyDevice);
|
|
|
|
if (dummyDeviceCreated != S_OK)
|
|
{
|
|
pD3D->Release();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
memcpy(pTable, *reinterpret_cast<void ***>(pDummyDevice), Size);
|
|
|
|
pDummyDevice->Release();
|
|
pD3D->Release();
|
|
return true;
|
|
}
|
|
|
|
DWORD WINAPI freedom_main(HMODULE hModule)
|
|
{
|
|
g_module = hModule;
|
|
|
|
SwapBuffersHook = Hook<Trampoline32>("wglSwapBuffers", "opengl32.dll", (BYTE *)opengl_update, (BYTE *)&wglSwapBuffersGateway, 5);
|
|
SwapBuffersHook.src += 14;
|
|
SwapBuffersHook.Enable();
|
|
|
|
// NOTE(Ciremun): one second is enough... right?
|
|
Sleep(1000);
|
|
|
|
if (!init)
|
|
{
|
|
// NOTE(Ciremun): Compatibility Mode
|
|
SwapBuffersHook.Disable();
|
|
compatibility_mode = true;
|
|
if (GetD3D9Device((void **)pDeviceTable, D3DDEV9_LEN))
|
|
{
|
|
void *pEndScene = pDeviceTable[42];
|
|
SwapBuffersHook = Hook<Trampoline32>((BYTE *)pEndScene, (BYTE *)d3d9_update, (BYTE *)&wglSwapBuffersGateway, 7);
|
|
SwapBuffersHook.Enable();
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
|
|
{
|
|
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
|
|
CloseHandle(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)freedom_main, hModule, 0, 0));
|
|
return TRUE;
|
|
}
|