#include <windows.h>

DWORD GetJMP(DWORD dwSrcAddr, DWORD dwDestAddr)
{
      return (DWORD)dwDestAddr-dwSrcAddr-5;
}

VOID HotPatchingHooker(PDWORD pdwFuncAddr, PDWORD pdwCallback)
{
     DWORD dwOldProtect;
     
     BYTE JMP[] = "\xE9\x00\x00\x00\x00"; // On complètera l'address plus tard
     
     VirtualProtect((PUCHAR)pdwFuncAddr - 0x5, 0x7, PAGE_READWRITE, &dwOldProtect);

     memcpy(pdwFuncAddr, "\xEb\xF9", 0x2); //Saut court
     
     *(PDWORD)(JMP+1) = GetJMP((DWORD)((PUCHAR)pdwFuncAddr-0x5), (DWORD)pdwCallback);
     
     memcpy((PUCHAR)pdwFuncAddr-0x5, JMP, 0x5); //Saut long
     
     VirtualProtect((PUCHAR)pdwFuncAddr - 0x5, 0x7, dwOldProtect, &dwOldProtect);
     
     return;
}