rendered paste body#include "w3jdebug.h"
CIAT IAT;
HMODULE hModuleSelf;
HMODULE WINAPI GameLoadLibraryA(LPCSTR lpFileName);
// For our patches
extern "C"
{
unsigned long GameGetChatMessage = 0;
void GameChatInterceptionHook();
extern unsigned char patch_chat_interception[];
}
bool ServerStart()
{
IAT.SetParentModule(GetModuleHandle(0));
IAT.LocateForModule("kernel32.dll");
IAT.RedirectImport("LoadLibraryA", GameLoadLibraryA);
return true;
}
void ServerStop()
{
// check to see if the jass debugger is initialized before freeing any memory
}
void GameDllPostLoad(HMODULE hModuleGame)
{
PIMAGE_SECTION_HEADER SectionText = GetImageSectionHeader(hModuleGame, ".text\0\0\0");
unsigned char *low, *high;
low = (unsigned char*)hModuleGame + SectionText->VirtualAddress;
high = low + SectionText->Misc.VirtualSize;
DoPatch(patch_chat_interception, low, high);
}
HMODULE WINAPI GameLoadLibraryA(LPCSTR lpFileName)
{
HMODULE hModule = LoadLibraryA(lpFileName);
if (_strcmpi(lpFileName, "game.dll") == 0)
GameDllPostLoad(hModule);
return hModule;
}
#define WORLDFRAMEMESSAGE 0
#define WORLDFRAMEUNITMESSAGE 1
#define WORLDFRAMECHATMESSAGE 2
#define WORLDFRAMETOPMESSAGE 3
__declspec (naked)
void __stdcall GamePrintUIMessage(char *message, float seconds, unsigned long alpha, unsigned char UI = WORLDFRAMECHATMESSAGE)
{
__asm
{
mov edx, [esp+0x10]
cmp edx, 3
jbe far $+7
ret
push 0
push [esp+0xC]
lea eax, [esp+0x14]
push eax
push [esp+0x10]
mov ecx, dword ptr ds:[0x6F86E424] ; Some big object
mov ecx, [ecx+0x3D8+4*edx] ; Frame objects located at 3D8, 3DC, 3E0, and 3E4
mov edx, [ecx] ; edx = 0x6F65F720
call dword ptr ds:[edx+0x6C]
ret 0x10
}
}
char * __fastcall OnGameTypedChatMessage(char *message)
{
char msg[200];
wsprintf(msg, "|c00C000F0You just typed: |r|c0000FF00%s|r", message);
GamePrintUIMessage(msg, 20.0, 0xFFFFFFFF, 0);
GamePrintUIMessage(msg, 20.0, 0xFFFFFFFF, 1);
GamePrintUIMessage(msg, 20.0, 0xFFFFFFFF, 2);
GamePrintUIMessage(msg, 20.0, 0xFFFFFFFF, 3);
return 0;
}
__declspec(naked)
void GameChatInterceptionHook()
{
__asm
{
call GameGetChatMessage
mov ecx, eax
cmp byte ptr ds:[eax], 0
jne OnGameTypedChatMessage
ret
}
}