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__