| 441 | return NULL; |
| 442 | } |
| 443 | int32_t InitFunctionHookByAddress(Hook_Info* OutputInfo, bool WrapFunction, void* Target, void* HookedF, int32_t* OutErrorCode) |
| 444 | { |
| 445 | if (OutputInfo > NULL && Target > NULL && HookedF > NULL) |
| 446 | { |
| 447 | if (ColdHook_Vars::Inited) |
| 448 | { |
| 449 | ULONG_PTR TNextInstruction = NULL; |
| 450 | SIZE_T TrampolineISize = NULL; |
| 451 | SIZE_T MaxHSize = 5; |
| 452 | DWORD OldP = NULL; |
| 453 | int32_t Code = NULL; |
| 454 | |
| 455 | BYTE HookDataB[0x100] = { 0 }; |
| 456 | bool BytesStored = false; |
| 457 | |
| 458 | void* Redirection = NULL; |
| 459 | void* JumpTo = NULL; |
| 460 | |
| 461 | if (!ColdHook_Service::IsAddressRegisteredAsHook(Target)) |
| 462 | { |
| 463 | SIZE_T ChangedHookSize = NULL; |
| 464 | |
| 465 | Redirection = ColdHook_Service::AllocateTrampoline((ULONG_PTR)Target, 0x1000, &Code, &ChangedHookSize); |
| 466 | if (ChangedHookSize != NULL) { |
| 467 | MaxHSize = ChangedHookSize; |
| 468 | } |
| 469 | if (WrapFunction) |
| 470 | { |
| 471 | unsigned int DecodedI = ColdHook_Service::DisasmRange(&TrampolineISize, &TNextInstruction, MaxHSize, (ULONG_PTR)Target, |
| 472 | distorm_version(), Target); |
| 473 | if (Redirection > NULL) |
| 474 | { |
| 475 | if (DecodedI != NULL) |
| 476 | { |
| 477 | if (Code == NULL) // If 64 bit hook |
| 478 | { |
| 479 | // Install jump to our hooked function. |
| 480 | *(BYTE*)Redirection = 0xFF; |
| 481 | *((BYTE*)(ULONG_PTR)Redirection + sizeof(BYTE)) = 0x25; |
| 482 | std::memset((void*)((ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE)), NULL, sizeof(DWORD)); |
| 483 | |
| 484 | *(void**)((ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD)) = HookedF; |
| 485 | |
| 486 | // Copy instructions that would be overwritten |
| 487 | std::memcpy((void*)((ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(void*)), Target, TrampolineISize); |
| 488 | |
| 489 | // Apply the return back jump |
| 490 | *((BYTE*)(ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(void*) + TrampolineISize) = 0xFF; |
| 491 | *((BYTE*)(ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(void*) + TrampolineISize + sizeof(BYTE)) = 0x25; |
| 492 | std::memset((void*)((ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(void*) + TrampolineISize + sizeof(BYTE) + sizeof(BYTE)), NULL, sizeof(DWORD)); |
| 493 | *(void**)((ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(void*) + TrampolineISize + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD)) = (void*)TNextInstruction; |
| 494 | |
| 495 | JumpTo = Redirection; |
| 496 | Redirection = (void*)((ULONG_PTR)Redirection + sizeof(BYTE) + sizeof(BYTE) + sizeof(DWORD) + sizeof(void*)); |
| 497 | } |
| 498 | else if (Code == FALIED_OUT_RANGE) |
| 499 | { |
| 500 | std::memcpy((void*)Redirection, Target, TrampolineISize); |
nothing calls this directly
no test coverage detected