Здравствуйте.
Имеется код библиотеки для инжекта с дефолтной менюшкой на ImGui. Никак не получается выгрузить dll без крашей. Без ImGui dll выгружается.
Подскажите пожалуйста где ошибка.
dllmain.cpp
Имеется код библиотеки для инжекта с дефолтной менюшкой на ImGui. Никак не получается выгрузить dll без крашей. Без ImGui dll выгружается.
Подскажите пожалуйста где ошибка.
dllmain.cpp
C++:
#include "includes.h"
// data
void* d3d9Device[119];
BYTE EndSceneBytes[7]{ 0 };
tEndScene oEndScene = nullptr;
extern LPDIRECT3DDEVICE9 pDevice = nullptr;
WNDPROC oWndProc;
static HWND windoww = NULL;
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
void InitImGui(LPDIRECT3DDEVICE9 pDevice) {
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\Arial.ttf", 25, NULL, io.Fonts->GetGlyphRangesCyrillic());
io.ConfigFlags = ImGuiConfigFlags_NoMouseCursorChange;
ImGui_ImplWin32_Init(windoww);
ImGui_ImplDX9_Init(pDevice);
}
//hook function
bool openmenu = false;
bool init = false;
bool crosshair = false;
void APIENTRY hkEndScene(LPDIRECT3DDEVICE9 o_pDevice) {
if (!pDevice)
pDevice = o_pDevice;
if (!init) {
InitImGui(o_pDevice);
init = true;
}
//DrawFilledRect(25, 25, 100, 100, D3DCOLOR_ARGB(255, 255, 255, 255));
// unHook
if (GetAsyncKeyState(VK_END)) {
// kiero::shutdown();
}
// open menu
if (GetAsyncKeyState(VK_NUMPAD1) & 1) {
openmenu = !openmenu;
}
if (openmenu) {
ImGui_ImplDX9_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
ImGui::Begin("Hello");
ImGui::Checkbox(u8"Рисуем crosshair", &crosshair);
ImGui::End();
ImGui::EndFrame();
ImGui::Render();
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
}
// drawing stuff
// Function
if (crosshair) {
//DrawFilledRect(screenX / 2 - 2, screenY / 2 - 2, 4, 4, D3DCOLOR_ARGB(255, 255, 255, 255));
DrawFilledRect(windowWidth / 2 - 2, windowHeight / 2 - 2, 4, 4, D3DCOLOR_ARGB(255, 255, 255, 255));
}
//DrawFilledRect(windowWidth / 2 - 2, windowHeight / 2 - 2, 4, 4, D3DCOLOR_ARGB(255, 255, 255, 255));
oEndScene(pDevice);
}
LRESULT _stdcall WndProc(const HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if (true && ImGui_ImplWin32_WndProcHandler(hwnd, uMsg, wParam, lParam))
return true;
return CallWindowProc(oWndProc, hwnd, uMsg, wParam, lParam);
}
DWORD WINAPI HackThread(HMODULE hModule) {
// hook
if (GetD3D9Device(d3d9Device, sizeof(d3d9Device))) {
memcpy(EndSceneBytes, (char*)d3d9Device[42], 7);
oEndScene = (tEndScene)TrampHook((char*)d3d9Device[42], (char*)hkEndScene, 7);
windoww = GetProcessWindow();
oWndProc = (WNDPROC)SetWindowLongPtr(windoww, GWL_WNDPROC, (LONG_PTR)WndProc);
}
while (!GetAsyncKeyState(VK_END)) {
Sleep(1);
}
openmenu = false;
Beep(300, 100);
pDevice->Release();
ImGui_ImplDX9_Shutdown();
ImGui_ImplWin32_Shutdown();
//if (ImGui::GetCurrentContext()) ImGui::DestroyContext();
//FreeLibraryAndExitThread(G.mod, 0);
// unhook
Patch((BYTE*)d3d9Device[42], EndSceneBytes, 7);
// ImGui_ImplDX9_Shutdown();
//if (ImGui::GetCurrentContext()) ImGui::DestroyContext();
// uninject
FreeLibraryAndExitThread(hModule, 0);
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
CloseHandle(CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)HackThread, hModule, 0, nullptr));
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}