bool patch(uintptr_t address, const char* value, size_t value_size) { detail::memory_protect protect_(address, value_size); if (protect_.success()) { DWORD written; if (::WriteProcessMemory(::GetCurrentProcess(), (LPVOID)address, value, value_size, &written)) { ::FlushInstructionCache(::GetCurrentProcess(), (LPVOID)address, value_size); return true; } } return false; }
uintptr_t replace_pointer(uintptr_t address, uintptr_t new_value) { uintptr_t old_value = 0; memory_protect protect_(address); if (protect_.success()) { DWORD written = 0; if (!::ReadProcessMemory(::GetCurrentProcess(), (LPCVOID)address, &old_value, sizeof(uintptr_t), &written)) { return 0; } if (!::WriteProcessMemory(::GetCurrentProcess(), (LPVOID)address, &new_value, sizeof(uintptr_t), &written)) { return 0; } } return old_value; }