www.pudn.com > remote_thread.zip > RemoteRunLib.h
#ifndef _REMOTE_RUN_LIB_H__ #define _REMOTE_RUN_LIB_H__ #pragma warning( disable : 4786 ) #include#include using namespace std; class CRemoteRunLib { public: //-------------------------------- // 保存被加载的exe信息 //-------------------------------- typedef struct _EXEINFO { // 加载基址 HMODULE hInstance; // exe的全路径名 string strExePath; // 从该exe中派生的所有线程ID vector ThreadList; }EXEINFO, *PEXEINFO; public: //------------------------------------------ // 仅在第一次加载remote.dll时被调用 //------------------------------------------ static BOOL InitializeOnce( HMODULE hLibInstance, HMODULE hMainInstance, BOOL isDebugMode ); //------------------------------------------ // 创建、返回进程内唯一实例 //------------------------------------------ static CRemoteRunLib* Instance(); //------------------------------------------ // 注册一个exe模块信息 //------------------------------------------ static BOOL RegisterEXE( HMODULE hEXEHandle, LPCSTR pszAppPath ); //------------------------------------------ // 注销一个exe模块信息 //------------------------------------------ static BOOL UnregisterEXE( int index ); //------------------------------------------ // 维护remote.dll的引用计数,引用计数为0时 // 对象实例将被销毁,remote.dll也被卸载 //------------------------------------------ static long AddRef(); static long Release(); //------------------------------------------- // //------------------------------------------- HMODULE GetMainEXEHandle() const { return m_hMainInstance; } HMODULE GetLibHandle() const { return m_hLibInstance; } //------------------------------------------- // 根据线程ID得到所属exe模块信息 //------------------------------------------- int FindEXEIndex( DWORD tid ); HMODULE FindEXEHandle( DWORD tid ); const PEXEINFO GetEXEInfoByIndex( int i ); //------------------------------------------- // 获得exe的主线程ID列表 //------------------------------------------- BOOL GetMainThreadList( vector & mainThreadList ); //------------------------------------------- // 线程创建、退出,维护exe模块的线程列表 //------------------------------------------- BOOL AddThread( DWORD tid ); BOOL RemoveThread( DWORD tid ); //------------------------------------------------- // 设立这个标志后,UnloadLibrary将调用ExitProcess // 而不是ExitThread //------------------------------------------------- void SetExitProcessFlag() { m_isExitProcess = TRUE; } //-------------------------- // 访问同步 //-------------------------- void Lock() { ::EnterCriticalSection( &m_cs ); } void Unlock() { ::LeaveCriticalSection( &m_cs ); } protected: //---------------------------------------- // 把remote.dll从进程中隐藏起来 //---------------------------------------- BOOL HideLibrary(); //---------------------------------------- // 卸载remote.dll,并退出线程 // 只能在m_nRefCount == 0时调用 //---------------------------------------- static void UnloadLibrary( HMODULE hLibInstance, BOOL isDebugMode, BOOL isExitProcess ); //------------------------------------------------- // 保护构造函数和析构函数,禁止在外部创建和销毁对象 //------------------------------------------------- protected: CRemoteRunLib(); ~CRemoteRunLib(); private: //------------------------ // 对remote.dll的引用计数 //------------------------ long m_nRefCount; //------------------------ // 原始exe基址 //------------------------ HMODULE m_hMainInstance; //------------------------ // remote.dll基址 //------------------------ HMODULE m_hLibInstance; //------------------------ // 由remote.dll加载的模块列表 //------------------------ vector m_exeList; //------------------------ // 用于同步 //------------------------ CRITICAL_SECTION m_cs; //---------------------------- // 指示remote.dll是否已被隐藏, // TRUE为非隐藏模式 //---------------------------- BOOL m_isDebugMode; BOOL m_isExitProcess; //------------------------------------ // 进程中唯一的CRemoteRunLib实例 //------------------------------------ static CRemoteRunLib* _singleton_lib; }; #endif // _REMOTE_RUN_LIB_H__