416 lines
9.7 KiB
C++
416 lines
9.7 KiB
C++
#include "pch.h"
|
||
#include "imguiC.h"
|
||
#include "DNFTOOL.h"
|
||
|
||
#ifdef _WIN64
|
||
#define SELF_PTR LONG_PTR
|
||
#define WNDPROC_INDEX GWLP_WNDPROC
|
||
#else
|
||
#define SELF_PTR DWORD
|
||
#define WNDPROC_INDEX GWL_WNDPROC
|
||
|
||
#endif
|
||
typedef HRESULT(WINAPI* Reset_t)(LPDIRECT3DDEVICE9, D3DPRESENT_PARAMETERS*); // 16
|
||
typedef long(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9); // 42
|
||
typedef LRESULT(__stdcall* WndProc_t)(const HWND, UINT, WPARAM, LPARAM);
|
||
|
||
D3DPRESENT_PARAMETERS g_present;
|
||
IDirect3D9* g_Direct3D9 = NULL;
|
||
IDirect3DDevice9* g_pd3dDevice = NULL;
|
||
HWND g_hWnd = NULL;
|
||
|
||
Reset_t oReset;
|
||
EndScene_t oBeginScene;
|
||
EndScene_t oEndScene;
|
||
WndProc_t oWndProc;
|
||
|
||
DWORD* dDeviceVT = NULL;
|
||
|
||
|
||
extern LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
||
|
||
static bool IMGUISW = false;
|
||
|
||
LRESULT __stdcall hkWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) return true;
|
||
switch (msg) {
|
||
case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK:
|
||
case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK:
|
||
if (checkBoxFalgs_1) return true;
|
||
}
|
||
|
||
|
||
return CallWindowProc(oWndProc, hWnd, msg, wParam, lParam);
|
||
}
|
||
|
||
void MineImGuiInit(IDirect3DDevice9* pd3dDevice)
|
||
{
|
||
// 检查IMGUI 版本
|
||
IMGUI_CHECKVERSION();
|
||
|
||
// 创建IMGUI上下文
|
||
ImGui::CreateContext();
|
||
|
||
ImGuiIO& io = ImGui::GetIO();
|
||
// 关闭imgui 配置文件的显示
|
||
io.ConfigFlags = ImGuiConfigFlags_NoMouseCursorChange;
|
||
io.WantSaveIniSettings = false;
|
||
io.IniFilename = NULL;
|
||
|
||
//ImGuiStyle& style = ImGui::GetStyle();
|
||
ImGui::StyleColorsDark();
|
||
//ImGui::StyleColorsClassic();
|
||
//ImGui::StyleColorsLight();
|
||
//LoadMyStype();
|
||
|
||
//SetLayeredWindowAttributes();
|
||
// 设置字体---为了显示中文
|
||
ImFontConfig f_cfg;
|
||
f_cfg.FontDataOwnedByAtlas = false;
|
||
//const ImFont* font = io.Fonts->AddFontFromMemoryTTF((void*)baidu_font_data, baidu_font_size, 17.0f, &f_cfg, io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
|
||
const ImFont* font = io.Fonts->AddFontFromFileTTF("Fonts/simsun.ttc", 11.5f, &f_cfg, io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
|
||
|
||
ImGui_ImplWin32_Init(g_hWnd);
|
||
ImGui_ImplDX9_Init(pd3dDevice);
|
||
|
||
}
|
||
|
||
|
||
LPDIRECT3DTEXTURE9 g_texture;
|
||
void imguiC::LoadImg()
|
||
{
|
||
|
||
//unsigned char* buffer = GetNPK();
|
||
|
||
|
||
|
||
/*
|
||
for (int y = 0; y < 118; y++)
|
||
memcpy((unsigned char*)lock_rect.pBits + lock_rect.Pitch * y, buffer + (203 * 4) * y, (203 * 4));
|
||
*/
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
namespace Gdiplus
|
||
{
|
||
using std::min;
|
||
using std::max;
|
||
};
|
||
#include <atlimage.h>
|
||
|
||
bool TmainBeginSate = TRUE;
|
||
void DrawCustom(IDirect3DDevice9* pd3dDevice)
|
||
{
|
||
// 界面开始绘制
|
||
ImGui_ImplDX9_NewFrame();
|
||
ImGui_ImplWin32_NewFrame();
|
||
|
||
ImGui::NewFrame();
|
||
|
||
// 窗口大小
|
||
ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_FirstUseEver);
|
||
ImGui::SetNextWindowSize(ImVec2(800, 600), ImGuiCond_FirstUseEver);
|
||
//ImGui::SetNextWindowBgAlpha(0);
|
||
|
||
ImGui::Begin(u8"imgui_Test", &TmainBeginSate, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize);
|
||
|
||
|
||
ImDrawList* draw_list = ImGui::GetForegroundDrawList();
|
||
|
||
|
||
|
||
|
||
CImage Img;
|
||
DWORD adwBitmasks[3] = { 0x0000000f, 0x000000f0, 0x00000f00 };
|
||
Img.CreateEx(100, 100, 16, BI_BITFIELDS, adwBitmasks, 0);
|
||
Img.Save(L"Test.png");
|
||
|
||
ImGui::Image(Img, ImVec2(400, 400));
|
||
draw_list->AddText(ImVec2(400, 400), 0xfaff0000,u8"倾泪寒");
|
||
/*
|
||
pd3dDevice->CreateTexture(203, 118, 1, D3DUSAGE_DYNAMIC, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &g_texture, NULL);
|
||
|
||
|
||
D3DLOCKED_RECT lock_rect;
|
||
g_texture->LockRect(0, &lock_rect, NULL, 0);
|
||
|
||
char* nPbit = (char*)lock_rect.pBits;
|
||
int nPitch = lock_rect.Pitch;
|
||
int stride = nPitch / (4 * 3);//划分为3等份,stride为步长
|
||
|
||
DWORD* pwd = (DWORD*)nPbit;
|
||
for (UINT row = 0; row < 240; row++)
|
||
{
|
||
for (int col = 0; col < stride; col++)
|
||
{
|
||
pwd[row * nPitch / 4 + col] = 0xFFFF0000;
|
||
pwd[row * nPitch / 4 + col + stride] = 0xFF00FF00;
|
||
pwd[row * nPitch / 4 + col + 2 * stride] = 0xFF0000FF;
|
||
}
|
||
}
|
||
g_texture->UnlockRect(0);
|
||
|
||
ImGui::Image(g_texture, ImGui::GetContentRegionAvail());
|
||
*/
|
||
|
||
//ImGui::Checkbox(u8"禁用鼠标 ", &checkBoxFalgs_1); ImGui::SameLine();
|
||
////CString tmpste = (checkBoxFalgs_1) ? "ON" : "OFF";
|
||
////ImGui::Text(u8"[ %S ]", tmpste);
|
||
|
||
//if (ImGui::BeginTabBar("tab1", tab_bar_flags))
|
||
//{
|
||
// loadTab1();
|
||
// loadTab2();
|
||
// loadTab3();
|
||
// loadTab4();
|
||
//}
|
||
|
||
//BYTE* PNGB = GetNPK();
|
||
//ImGui::RenderText(ImVec2(203, 118), (char*)PNGB);
|
||
/*
|
||
std::vector<unsigned char> encoded;
|
||
unsigned error_enc = lodepng::encode(encoded, PNGB, 203, 118, LodePNGColorType::LCT_RGBA, unsigned(8));
|
||
|
||
static ImTextureID bg_tex_id = 0;
|
||
if (!bg_tex_id)
|
||
{
|
||
//这里使用opencv加载图片当然你也可以使用其他方式加载图片
|
||
//loadTexture是一个自定义的函数用于图片字符加载为纹理,不知道怎么加载纹理的可以自行百度
|
||
|
||
|
||
bg_tex_id = &encoded;
|
||
}
|
||
|
||
ImGui::Image(bg_tex_id, ImGui::GetContentRegionAvail());
|
||
*/
|
||
|
||
|
||
ImGui::EndTabBar();
|
||
ImGui::End();
|
||
ImGui::EndFrame();
|
||
ImGui::Render();
|
||
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
|
||
|
||
}
|
||
|
||
HRESULT __stdcall hkEndScene(IDirect3DDevice9* pd3dDevice)
|
||
{
|
||
/*
|
||
static int num = 0;
|
||
std::cout << "D3d:" << num << std::endl;
|
||
++num;
|
||
*/
|
||
g_pd3dDevice = pd3dDevice;
|
||
Helpers::UnHookFunction((PVOID*)(&oEndScene), hkEndScene);
|
||
|
||
// IMGUI初始化
|
||
static bool firstCall = TRUE;
|
||
if (firstCall)
|
||
{
|
||
firstCall = !firstCall;
|
||
MineImGuiInit(pd3dDevice);
|
||
oWndProc = (WNDPROC)SetWindowLongPtr(g_hWnd, WNDPROC_INDEX, (LONG_PTR)hkWndProc);
|
||
}
|
||
|
||
if (IMGUISW == true)
|
||
{
|
||
//DrawCustom(pd3dDevice);
|
||
IMGUISW = false;
|
||
}
|
||
//DrawCustom();
|
||
|
||
HRESULT result = pd3dDevice->EndScene();
|
||
Helpers::HookFunction((PVOID*)(&oEndScene), hkEndScene);
|
||
return result;
|
||
}
|
||
|
||
HRESULT __stdcall hkReset(IDirect3DDevice9* pd3dDevice, D3DPRESENT_PARAMETERS* pPresentationParameters)
|
||
{
|
||
std::cout << "Im Going" << std::endl;
|
||
Helpers::UnHookFunction((PVOID*)(&oReset), &hkReset);
|
||
ImGui_ImplDX9_InvalidateDeviceObjects();
|
||
HRESULT tmpReset = pd3dDevice->Reset(pPresentationParameters);
|
||
ImGui_ImplDX9_CreateDeviceObjects();
|
||
Helpers::HookFunction((PVOID*)(&oReset), hkReset);
|
||
return tmpReset;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
IDirect3DDevice9* imguiC::GetD3dDev9()
|
||
{
|
||
return g_pd3dDevice;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
typedef struct tagWNDINFO
|
||
{
|
||
DWORD dwProcessId;
|
||
HWND hWnd;
|
||
} WNDINFO, * LPWNDINFO;
|
||
//枚举窗口过程
|
||
static BOOL CALLBACK EnumProc(HWND hWnd, LPARAM lParam)
|
||
{
|
||
DWORD dwProcessId;
|
||
GetWindowThreadProcessId(hWnd, &dwProcessId);
|
||
LPWNDINFO pInfo = (LPWNDINFO)lParam;
|
||
|
||
if (dwProcessId == pInfo->dwProcessId)
|
||
{
|
||
pInfo->hWnd = hWnd;
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
//获取主窗口句柄
|
||
static HWND GetProcessMainWnd()
|
||
{
|
||
DWORD dwProcessId = ::GetCurrentProcessId();
|
||
WNDINFO wi;
|
||
wi.dwProcessId = dwProcessId;
|
||
wi.hWnd = NULL;
|
||
EnumWindows(EnumProc, (LPARAM)&wi);
|
||
return wi.hWnd;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
void imguiC::Init()
|
||
{
|
||
IMGUISW = true;
|
||
/*
|
||
static bool Sw = false;
|
||
if (!Sw)
|
||
{
|
||
// 检查IMGUI 版本
|
||
IMGUI_CHECKVERSION();
|
||
ImGui::CreateContext();
|
||
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
||
io.ConfigFlags = ImGuiConfigFlags_NoMouseCursorChange;
|
||
io.WantSaveIniSettings = false;
|
||
io.IniFilename = NULL;
|
||
|
||
ImGui::StyleColorsDark();
|
||
|
||
ImFontConfig f_cfg;
|
||
f_cfg.FontDataOwnedByAtlas = false;
|
||
const ImFont* font = io.Fonts->AddFontFromMemoryTTF((void*)baidu_font_data, baidu_font_size, 17.0f, &f_cfg, io.Fonts->GetGlyphRangesChineseSimplifiedCommon());
|
||
|
||
ImGui_ImplWin32_Init(g_hWnd);
|
||
ImGui_ImplDX9_Init(g_pd3dDevice);
|
||
Sw = true;
|
||
}
|
||
|
||
|
||
//g_pd3dDevice->BeginScene();
|
||
|
||
// 界面开始绘制
|
||
ImGui_ImplDX9_NewFrame();
|
||
ImGui_ImplWin32_NewFrame();
|
||
|
||
ImGui::NewFrame();
|
||
|
||
// 窗口大小
|
||
ImGui::SetNextWindowPos(ImVec2(50, 50), ImGuiCond_FirstUseEver);
|
||
ImGui::SetNextWindowSize(ImVec2(350, 450), ImGuiCond_FirstUseEver);
|
||
|
||
ImGui::Begin(u8"Imgui_Test", &TmainBeginSate);
|
||
|
||
ImGui::EndTabBar();
|
||
ImGui::End();
|
||
ImGui::EndFrame();
|
||
ImGui::Render();
|
||
ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData());
|
||
|
||
//g_pd3dDevice->EndScene();
|
||
*/
|
||
}
|
||
|
||
|
||
|
||
|
||
void imguiC::Run()
|
||
{
|
||
//while (true)
|
||
//{
|
||
// if (DNFTOOL::GetHook(0x1A5FB4C, "0x14+0x28+") == 6)
|
||
// {
|
||
// std::cout << "开始注入" << std::endl;
|
||
// break;
|
||
// }
|
||
//}
|
||
|
||
// 获取目标游戏窗口句柄
|
||
//g_hWnd = FindWindowA("DNF Taiwan", "DNF Taiwan");
|
||
g_hWnd = GetProcessMainWnd();
|
||
//std::cout << g_hWnd << std::endl;
|
||
// 创建D39设备对象
|
||
g_Direct3D9 = Direct3DCreate9(D3D_SDK_VERSION);
|
||
|
||
// 初始化参数结构体
|
||
memset(&g_present, 0, sizeof(g_present));
|
||
g_present.Windowed = TRUE;
|
||
g_present.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
||
g_present.BackBufferFormat = D3DFMT_UNKNOWN;
|
||
g_present.EnableAutoDepthStencil = TRUE;
|
||
g_present.AutoDepthStencilFormat = D3DFMT_D16;
|
||
|
||
|
||
// 创建d3d9设备标识
|
||
HRESULT result = g_Direct3D9->CreateDevice(
|
||
D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
|
||
g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
|
||
&g_present, &g_pd3dDevice
|
||
);
|
||
|
||
//// 开始hook对应的D3D9函数
|
||
dDeviceVT = (DWORD*)*(DWORD*)g_pd3dDevice;
|
||
oReset = (Reset_t)dDeviceVT[16];
|
||
oBeginScene = (EndScene_t)dDeviceVT[41];
|
||
oEndScene = (EndScene_t)dDeviceVT[42];
|
||
|
||
Helpers::HookFunction((PVOID*)(&oReset), hkReset);
|
||
//Helpers::HookFunction((PVOID*)(&oBeginScene), hkBeginScene);
|
||
Helpers::HookFunction((PVOID*)(&oEndScene), hkEndScene);
|
||
|
||
|
||
|
||
|
||
}
|