#pragma once namespace big { class detour_hook { public: explicit detour_hook(std::string name, void* detour); explicit detour_hook(std::string name, void* target, void* detour); ~detour_hook() noexcept; detour_hook(detour_hook&& that) = delete; detour_hook& operator=(detour_hook&& that) = delete; detour_hook(detour_hook const&) = delete; detour_hook& operator=(detour_hook const&) = delete; void set_target_and_create_hook(void* target); void enable(); void disable(); template T get_original() { return static_cast(m_original); } void fix_hook_address(); private: void create_hook(); std::string m_name; void* m_original{}; void* m_target{}; void* m_detour{}; }; }