瑞客论坛 www.ruike1.com
016-C
C+主线程代码传递复杂参数的实现【瑞客论坛
www.ruike1.com】
016
C+
主
016-C,C++主线程代码传递复杂参数的实现
2021在线班
郁金香灬老师 QQ 150330575
交流群:158280115
学习目标:
主线直接调用接口
直接调用角色对象CALL测试
UINT_PTR 寻路CALL = 0x727400;
char 参数2[8] = { 0,0,0,0,0,0,0 };//sizeof(char)*8=8
//int 参数二[2] = { 0,0 };//sizeof(int)*2=8
float 坐标[3] = { m_x ,m_y ,m_z }; //>=3
float 坐标xyz[3] = { -9005.76,-131.81, 83.927 }; //>=3 坐标xyz[0] 坐标xyz[1] 坐标xyz[2]
MessageBeep(1);
UINT_PTR ECX参数 = 返回值ECX;// 获取角色对象指针2();
__asm
{
push 0
lea eax, 坐标
push eax
lea eax, 参数2
push eax
push 4
mov ecx, ECX参数 //0x2BEF4B98 //这个参数记得从xdbg里从新获取 不然会出错
call 寻路CALL
}
void CPAGE00::OnBnClickedButton6FindWay()
{
// -8914.91,-136.131,80.4179 //新手村
// -8909.37,-104.881,81.8481 亚努斯*哈默纳克 武器锻造师
//float 坐标[3] = { -9005.76,-131.81, 83.927 };
float x = -8914.91;
float y = -136.131;
float z= 80.4179;
主线CALL_cdecl((UINT_PTR)寻路功能, *(UINT_PTR*)&x, *(UINT_PTR*)&y,*(UINT_PTR*)&z);
}
void CPAGE00::OnBnClickedButton7QuestSlot()
{
// TODO: 在此添加控件通知处理程序代码
主线CALL_cdecl((UINT_PTR)使用快捷栏,3);
}
#include "pch.h"
#include "主线程调用CALL.h"
#include <string>
#include <fstream>
#include <vector>
#include <cstdio>
#include <iostream>
using namespace std;
WNDPROC g_oldWindowProc = 0; //
UINT_PTR _cdecl x86Call8_cdecl(UINT_PTR *argv) //数组传8个参数进来
{
UINT_PTR retvar = 0;
__asm
{
mov eax,argv
push dword ptr[eax + 7 * 4] //参数6
push dword ptr[eax + 6 * 4] //参数5
push dword ptr[eax + 5 * 4] //参数4
push dword ptr[eax + 4 * 4] //参数3
push dword ptr[eax + 3 * 4] //参数2
push dword ptr[eax + 2 * 4] //参数1
mov ecx, dword ptr[eax + 1 * 4] //ecx参数
call dword ptr[eax + 0 * 4] //功能CALL
add esp,0x18 //平栈7个参数
mov retvar,eax
}
return retvar;
}
LRESULT CALLBACK newWindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch (uMsg)
{
case WM_USER + 126:
{
#ifdef DEBUG
printf("WM_USER + 126:pcall=%X begin\n", lParam);
#endif // !DEBUG
__asm
{
call lParam
}
#ifdef DEBUG
printf("WM_USER + 126:pcall=%X End\n", lParam);
#endif // !DEBUG
return 123456;
}
case WM_USER + 128:
{
UINT_PTR *参数列表 = (UINT_PTR*)lParam;
x86Call8_cdecl(参数列表);
break;
}
case WM_USER + 138:
{
break;
}
}
return CallWindowProcA(g_oldWindowProc, hwnd, uMsg, wParam, lParam);
};
//挂接主线程
void 挂接主线程()
{
if (g_oldWindowProc) return;//如果已经挂接过主线程直接返回
HWND h = 获取窗口句柄();
g_oldWindowProc = (WNDPROC)SetWindowLongPtrA(h, GWLP_WNDPROC, (LONG_PTR)newWindowProc);
}
void 卸载主线程()
{
if (g_oldWindowProc==NULL) return;//如果已经挂接过主线程直接返回
HWND h = 获取窗口句柄();
(WNDPROC)SetWindowLongPtrA(h, GWLP_WNDPROC, (LONG_PTR)g_oldWindowProc);
}
void 调用主线代码(UINT_PTR pcall)
{
static HWND h = 获取窗口句柄();
::SendMessageA(h, WM_USER + 126, 0, pcall);
}
UINT_PTR 主线CALL_cdecl(UINT_PTR pcall, UINT_PTR arg1 , UINT_PTR arg2, UINT_PTR arg3, UINT_PTR arg4, UINT_PTR arg5, UINT_PTR arg6, UINT_PTR vecx)
{
static HWND h = 获取窗口句柄();
UINT_PTR 参数列表[10] = { pcall,vecx,arg1,arg2,arg3,arg4,arg5,arg6 };
return::SendMessageA(h, WM_USER + 128, 0, (UINT_PTR)参数列表);
};