Code:
typedef int (__cdecl * DoString)(DWORD arg1, DWORD arg2, int arg3);
typedef int (__cdecl * GetText)(DWORD pont_string, DWORD menosum, DWORD zero);
typedef int (__thiscall * UpdateDisplay)(DWORD thisptr, DWORD flag);
typedef int (__cdecl * UpdateScale)(DWORD loguid, DWORD higuid);
typedef int (__thiscall * GetText)(DWORD arg1, DWORD arg3, DWORD arg4);
typedef int (__thiscall * ClickToMove)(DWORD thisptr, DWORD type, DWORD guid, DWORD position, DWORD precision);
typedef int (__thiscall * MountDisplay)(DWORD thisptr, DWORD displayid);
typedef int (__cdecl * ClntObjMgrObjectPtr)(DWORD loguid, DWORD higuid, DWORD flag);
typedef int (__cdecl * World__Intersect)(DWORD end, DWORD start, DWORD result, DWORD distance, DWORD flag, DWORD optional);
__declspec(naked) void codeasm(){
DWORD flagz, basead, pointer, data1, data2, data3;
__asm{
nop
pushad
pushfd
push ebp
mov ebp, esp
sub esp, 0x40
call dummy
dummy: pop edx
sub edx, 0xE
add edx, 500
mov eax, [edx+4] //check flag
cmp eax, 0x0
je outh
cmp eax, 0xff
je outh
mov ebx, [edx+0] //check base address
mov basead, ebx
add edx, 0x8
mov flagz, eax
mov pointer, edx
mov ecx, [edx]
mov data1, ecx
mov ecx, [edx+4]
mov data2, ecx
mov ecx, [edx+0x8]
mov data3, ecx
sub edx, 0x8
push edx
mov [edx+4],0x0
}
if(flagz == 1){
UpdateDisplay(basead + WoW::UpdateDisplayInfo)(data1,1);
}else if(flagz == 2){
DoString(basead + WoW::Framescript_ExecuteBuffer)(pointer,pointer,0);
}else if(flagz == 3){
World__Intersect(basead + WoW::CGWorldFrame__Intersect)(pointer+0x30, pointer+0x40, pointer+0x20, pointer+0xC, data1, 0);
}else if(flagz == 4){
ClickToMove(basead + WoW::ClickToMoveOfs)(data1,data2,pointer+0x14,pointer+0x8,0);
}else if(flagz == 5){
GetText(basead + WoW::Framescript_GetText)(pointer,-1,0);
}else if(flagz == 6){
MountDisplay(basead + WoW::MountDisplayChanged)(data1,data2);
}else if(flagz == 7){
ClntObjMgrObjectPtr(basead + WoW::ClntObjMgrObjectPtr)(data1,data2,1);
}else if(flagz == 8){
UpdateScale(basead + WoW::UpdateScale)(data1,data2);
}
__asm{
pop edx // restore EDX value
}
if(flagz != 0){
__asm{
mov [edx + 0x4], 0xff
mov [edx + 0xF0], eax // get EAX value (return)
}
}
__asm{
outh: mov esp, ebp
pop ebp
popfd
popad
nop
nop
// replaced code
mov eax, edi
pop edi
pop esi
pop ebp
ret
}
}