lua502/lua/lua502_sdk/chook.cpp
2020-02-25 05:09:07 +02:00

57 lines
No EOL
1.1 KiB
C++

#include "chook.h"
#include "tier0/memdbgon.h"
CHook::CHook(DWORD Func,SIZE_T Size)
{
pFunc = Func;
DetourSize = Size;
OrigBytes = (PBYTE)malloc(Size);
}
CHook::~CHook()
{
if(hooked)
UnHookFunction();
}
DWORD CHook::HookFunction(DWORD Hook)
{
DWORD dwProtect;
pHook = Hook;
hooked = true;
VirtualProtect((LPVOID)pFunc,DetourSize,PAGE_EXECUTE_READWRITE,&dwProtect);
memcpy(OrigBytes,(LPVOID)pFunc,DetourSize);
memset((LPVOID)pFunc,'\x90',DetourSize);
*(PBYTE)pFunc = 0xE9;
*(PDWORD)(pFunc+1) = (pHook - pFunc) - 5;
pOrig = (DWORD)VirtualAlloc(NULL,DetourSize+5,MEM_RESERVE | MEM_COMMIT,PAGE_EXECUTE_READWRITE);
memcpy((LPVOID)pOrig,OrigBytes,DetourSize);
*(PBYTE)(pOrig+DetourSize) = 0xE9;
*(PDWORD)(pOrig+DetourSize+1) = ((pFunc+DetourSize) - pOrig) - DetourSize - 5;
VirtualProtect((LPVOID)pFunc,DetourSize,dwProtect,NULL);
return pOrig;
}
DWORD CHook::UnHookFunction()
{
DWORD dwProtect;
hooked = false;
VirtualProtect((LPVOID)pFunc,DetourSize,PAGE_EXECUTE_READWRITE,&dwProtect);
memcpy((LPVOID)pFunc,OrigBytes,DetourSize);
free(OrigBytes);
VirtualFree((LPVOID)pOrig,DetourSize+5,MEM_RELEASE | MEM_DECOMMIT);
return pFunc;
}