#pragma once #include #include #include #include namespace process { bool attach(std::string_view process_name); [[nodiscard]] std::optional find_pattern(std::string_view module_name, std::string_view pattern) noexcept; [[nodiscard]] std::optional get_export(std::uintptr_t module_base, std::string_view function_name) noexcept; [[nodiscard]] std::optional get_export(std::string_view module_name, std::string_view function_name) noexcept; [[nodiscard]] std::optional> get_loaded_modules() noexcept; [[nodiscard]] std::optional get_module_base(std::string_view module_name) noexcept; [[nodiscard]] std::optional resolve_jmp(std::uintptr_t address) noexcept; [[nodiscard]] std::optional resolve_rip_relative_address(std::uintptr_t address) noexcept; bool read_memory(std::uintptr_t address, void* buffer, std::size_t size) noexcept; bool write_memory(std::uintptr_t address, const void* buffer, std::size_t size) noexcept; std::string read_string(std::uintptr_t address, std::size_t length) noexcept; template T read_memory(const std::uintptr_t address) noexcept { T buffer = {}; read_memory(address, &buffer, sizeof(T)); return buffer; } template bool write_memory(const std::uintptr_t address, const T& buffer) noexcept { return write_memory(address, &buffer, sizeof(T)); } }