#pragma once #include #include #include "theo.h" #include "utils.hpp" // if you change this, make sure // to change it in the client also... #define PACKET_DATA_SIZE 0x1000 // max symbol string size... if you // change this update the client also... #define PACKET_SYMBOL_SIZE 0x1000 namespace theo { enum class theo_packet_type { init, alloc_memory, resolve_symbol, copy_memory, disconnect }; enum class theo_file_type { demo_drv, demo_dll, demo_imgui }; #pragma pack(push, 1) typedef struct _theo_data { theo_packet_type type; union { theo_file_type file; std::uintptr_t entry_point; struct { void* addr; std::size_t alloc_size; std::uint32_t prot; } alloc; struct { void* dest_addr; std::size_t size; std::uint8_t data[PACKET_DATA_SIZE]; } copy_memory; struct { std::uintptr_t symbol_addr; std::size_t symbol_size; char symbol[PACKET_SYMBOL_SIZE]; } resolve; }; } theo_data, * ptheo_data; #pragma pack(pop) class client { public: explicit client(SOCKET client_socket); ~client(); private: void handler() const; void* wrapper_memcpy(void* dest, const void* src, std::size_t size) const; void* wrapper_alloc(std::size_t size, std::uint32_t prot) const; std::uintptr_t wrapper_resolve_symbol(const char* symbol_name) const; const SOCKET client_socket; std::thread handler_thread; }; inline std::map> connections; inline std::map> lib_files; }