#ifndef KX_MEMORY_CHUNK_H #define KX_MEMORY_CHUNK_H #include #include #include #include // SymCleanup() typedef BOOL (__stdcall *tSC)( IN HANDLE hProcess ); // SymFunctionTableAccess() typedef PVOID (__stdcall *tSFTA)( HANDLE hProcess, DWORD AddrBase ); // SymGetLineFromAddr() typedef BOOL (__stdcall *tSGLFA)( IN HANDLE hProcess, IN DWORD dwAddr, OUT PDWORD pdwDisplacement, OUT PIMAGEHLP_LINE Line ); // SymGetModuleBase() typedef DWORD (__stdcall *tSGMB)( IN HANDLE hProcess, IN DWORD dwAddr ); // SymGetModuleInfo() typedef BOOL (__stdcall *tSGMI)( IN HANDLE hProcess, IN DWORD dwAddr, OUT PIMAGEHLP_MODULE ModuleInfo ); // SymGetOptions() typedef DWORD (__stdcall *tSGO)( VOID ); // SymGetSymFromAddr() typedef BOOL (__stdcall *tSGSFA)( IN HANDLE hProcess, IN DWORD dwAddr, OUT PDWORD pdwDisplacement, OUT PIMAGEHLP_SYMBOL Symbol ); // SymInitialize() typedef BOOL (__stdcall *tSI)( IN HANDLE hProcess, IN PSTR UserSearchPath, IN BOOL fInvadeProcess ); // SymLoadModule() typedef DWORD (__stdcall *tSLM)( IN HANDLE hProcess, IN HANDLE hFile, IN PSTR ImageName, IN PSTR ModuleName, IN DWORD BaseOfDll, IN DWORD SizeOfDll ); // SymSetOptions() typedef DWORD (__stdcall *tSSO)( IN DWORD SymOptions ); // StackWalk() typedef BOOL (__stdcall *tSW)( DWORD MachineType, HANDLE hProcess, HANDLE hThread, LPSTACKFRAME StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE ReadMemoryRoutine, PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine, PTRANSLATE_ADDRESS_ROUTINE TranslateAddress ); // UnDecorateSymbolName() typedef DWORD (__stdcall WINAPI *tUDSN)( PCSTR DecoratedName, PSTR UnDecoratedName, DWORD UndecoratedLength, DWORD Flags ); #define MAX_MODULE_NAME32 255 #define TH32CS_SNAPMODULE 0x00000008 #pragma pack( push, 8 ) typedef struct tagMODULEENTRY32 { DWORD dwSize; DWORD th32ModuleID; // This module DWORD th32ProcessID; // owning process DWORD GlblcntUsage; // Global usage count on the module DWORD ProccntUsage; // Module usage count in th32ProcessID's context BYTE * modBaseAddr; // Base address of module in th32ProcessID's context DWORD modBaseSize; // Size in bytes of module starting at modBaseAddr HMODULE hModule; // The hModule of this module in th32ProcessID's context char szModule[MAX_MODULE_NAME32 + 1]; char szExePath[MAX_PATH]; } MODULEENTRY32; typedef MODULEENTRY32 * PMODULEENTRY32; typedef MODULEENTRY32 * LPMODULEENTRY32; #pragma pack( pop ) struct ModuleEntry { std::string imageName; std::string moduleName; DWORD baseAddress; DWORD size; }; typedef std::vector< ModuleEntry > ModuleList; typedef ModuleList::iterator ModuleListIter; class kxMemoryChunk { public: // Methods kxMemoryChunk(size_t size = 0); ~kxMemoryChunk(); void* operator new(size_t size); void operator delete(void* ptr); static kxMemoryChunk* GetBegin(); static kxMemoryChunk* GetEnd(); static unsigned long int GetCount(); static void Delete(void* data_ptr); static void Check(); protected: static void LazyCleanup(); static void LazyInit(); static void Dump(kxMemoryChunk* chunk); static bool FillModuleList( ModuleList& modules, DWORD pid, HANDLE hProcess ); static void EnumumAndLoadModuleSymbols( HANDLE hProcess, DWORD pid ); static bool FillModuleListPSAPI( ModuleList& modules, DWORD pid, HANDLE hProcess ); static bool FillModuleListTH32( ModuleList& modules, DWORD pid ); public: // DATA STACKFRAME m_StackFrame; CONTEXT m_Context; kxMemoryChunk* m_Prev; kxMemoryChunk* m_Next; void* m_Data; size_t m_Size; static HMODULE m_hImagehlpDll; static DWORD m_ImageType; static HANDLE m_hProcess; static HANDLE m_hThread; protected: // Vsechno zverstvo se deje zde... static kxMemoryChunk* m_Begin; static kxMemoryChunk* m_End; static unsigned long int m_Count; static tSC pSC; static tSFTA pSFTA; static tSGLFA pSGLFA; static tSGMB pSGMB; static tSGMI pSGMI; static tSGO pSGO; static tSGSFA pSGSFA; static tSI pSI; static tSLM pSLM; static tSSO pSSO; static tSW pSW; static tUDSN pUDSN; }; void* operator new(size_t size); void operator delete(void* ptr); #endif // KX_MEMORY_CHUNK_H