57 lines
No EOL
1.1 KiB
C++
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;
|
|
} |