0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 209 187 152 0 0 0 0 0 0 0 0 0 0 140 51 8 68 1 0 0 7 1 90 0 128 238 54 0 75 235 89 55 3 0 0 0 0 0 0 0
0x0 to 0x20: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 (????)
0x20 to 0x30: 209 187 152 0 0 0 0 0 0 0 0 0 0 140 51 8 (GUID)
0x30 to 0x34: 68 1 0 0 (SpellID)
0x34 to 0x35: 7 (Unk1) ?
0x35 to 0x36: 1 (stacks)
0x36 to 0x37: 90 (CasterLevel)
0x37 to 0x38: 0 (Unk2)
0x38 to 0x3C: 128 238 54 0
0x3D to 0x40: 75 235 89 55
0x40 to 0x41: 3 (Unk3)
0x41 to 0x48: 0 0 0 0 0 0 0
int HandlerDetour(int a1, uint16 opcode, int a3, int pDataStore)
{
if (opcode == SMSG_WARDEN_DATA)
{
if (*(int*)0x00D31A48 != 0)
{
int vtable = *(int*)(*(int*)0x00D31A4C);
int wardenMain = *(int*)(vtable + 8);
int wardenModule = wardenMain - 0x4099;
if ((wardenModule & 0xFF) == 0 && wardenModuleAddress != wardenModule)
{
wardenModuleAddress = wardenModule;
DWORD oldPFlags;
VirtualProtect((void*)(wardenModule + 0x309F), 1, 0x40, &oldPFlags);
*(byte*)(wardenModule + 0x309F) = 0xE9;
VirtualProtect((void*)(wardenModule + 0x33D1), 1, 0x40, &oldPFlags);
*(byte*)(wardenModule + 0x33D1) = 0;
VirtualProtect((void*)(wardenModule + 0x12AD), 1, 0x40, &oldPFlags);
*(byte*)(wardenModule + 0x12AD) = 0;
auto det = g_memops["WardenScanDetour"];
if (det != nullptr)
delete det;
g_memops["WardenScanDetour"] = new Detour((wardenModule + 0x2A7F), (int)WardenScanDetour);
}
}
}
auto det = g_memops["WardenDataHandler"];
det->Restore();
int res = ((int(__cdecl*)(int, uint16, int, int))det->target)(a1, opcode, a3, pDataStore);
det->Apply();
return res;
}