1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
| #include <windows.h> #include <d3d9.h> #include <iostream>
#include "imgui.h" #include "imgui_impl_win32.h" #include "imgui_impl_dx9.h" #include "MinHook.h"
#pragma comment(lib, "d3d9.lib")
typedef HRESULT(STDMETHODCALLTYPE* EndScene_t)(IDirect3DDevice9*); typedef HRESULT(STDMETHODCALLTYPE* Reset_t)(IDirect3DDevice9*, D3DPRESENT_PARAMETERS*);
EndScene_t oEndScene = nullptr; Reset_t oReset = nullptr;
bool g_Initialized = false;
extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
HRESULT STDMETHODCALLTYPE hkEndScene(IDirect3DDevice9* pDevice) { if (!g_Initialized) { D3DDEVICE_CREATION_PARAMETERS cp; pDevice->GetCreationParameters(&cp);
ImGui::CreateContext(); ImGui_ImplWin32_Init(cp.hFocusWindow); ImGui_ImplDX9_Init(pDevice);
g_Initialized = true; }
ImGui_ImplDX9_NewFrame(); ImGui_ImplWin32_NewFrame(); ImGui::NewFrame();
ImGui::GetBackgroundDrawList()->AddRect(ImVec2(100, 100), ImVec2(300, 300), IM_COL32(255, 0, 0, 255), 0, 0, 2.0f);
ImGui::Begin("D3D9 Hook Menu"); ImGui::Text("Hello from D3D9!"); if (ImGui::Button("Unload DLL")) { } ImGui::End();
ImGui::EndFrame(); ImGui::Render(); ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
return oEndScene(pDevice); }
HRESULT STDMETHODCALLTYPE hkReset(IDirect3DDevice9* pDevice, D3DPRESENT_PARAMETERS* pPresentationParameters) { ImGui_ImplDX9_InvalidateDeviceObjects(); HRESULT hr = oReset(pDevice, pPresentationParameters); if (SUCCEEDED(hr)) { ImGui_ImplDX9_CreateDeviceObjects(); } return hr; }
DWORD WINAPI MainThread(LPVOID lpReserved) { IDirect3D9* pD3D = Direct3DCreate9(D3D_SDK_VERSION); if (!pD3D) return FALSE;
D3DPRESENT_PARAMETERS d3dpp = { 0 }; d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = GetForegroundWindow();
IDirect3DDevice9* pDummyDevice = nullptr; if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, d3dpp.hDeviceWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDummyDevice))) { pD3D->Release(); return FALSE; }
void** vTable = *(void***)pDummyDevice;
if (MH_Initialize() == MH_OK) { MH_CreateHook(vTable[42], &hkEndScene, reinterpret_cast<LPVOID*>(&oEndScene)); MH_CreateHook(vTable[16], &hkReset, reinterpret_cast<LPVOID*>(&oReset)); MH_EnableHook(MH_ALL_HOOKS); }
pDummyDevice->Release(); pD3D->Release();
return TRUE; }
BOOL WINAPI DllMain(HMODULE hMod, DWORD dwReason, LPVOID lpReserved) { if (dwReason == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls(hMod); CreateThread(nullptr, 0, MainThread, hMod, 0, nullptr); } return TRUE; }
|