ModuleInstance.h
上传用户:jstlsd
上传日期:2007-01-13
资源大小:186k
文件大小:9k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. // ModuleInstance.h
  3. //
  4. // AUTHOR: Ivo Ivanov (ivopi@hotmail.com)
  5. // ver 1.02
  6. // 05 September 2001
  7. //---------------------------------------------------------------------------
  8. #if !defined(_MODULEINSTANCE_H_)
  9. #define _MODULEINSTANCE_H_
  10. #if _MSC_VER > 1000
  11. #pragma once
  12. #endif // _MSC_VER > 1000
  13. //---------------------------------------------------------------------------
  14. //
  15. // Standard includes
  16. //
  17. //---------------------------------------------------------------------------
  18. #include <iostream>
  19. #include <vector>
  20. #include <windows.h>
  21. #include <tlhelp32.h>
  22. //---------------------------------------------------------------------------
  23. //
  24. // Forward declaration
  25. //
  26. //---------------------------------------------------------------------------
  27. class CModuleInstance;
  28. class CModuleList;
  29. class CRunningProcesses;
  30. class CExeModuleInstance;
  31. //---------------------------------------------------------------------------
  32. //
  33. //                   typedefs for ToolHelp32 functions 
  34. //
  35. // We must link to these functions of Kernel32.DLL explicitly. Otherwise 
  36. // a module using this code would fail to load under Windows NT, which does not 
  37. // have the Toolhelp32 functions in the Kernel 32.
  38. //
  39. //---------------------------------------------------------------------------
  40. typedef HANDLE (WINAPI * PFNCREATETOOLHELP32SNAPSHOT)(
  41. DWORD dwFlags,
  42. DWORD th32ProcessID
  43. );
  44. typedef BOOL (WINAPI * PFNPROCESS32FIRST)(
  45.     HANDLE hSnapshot,
  46.     LPPROCESSENTRY32 lppe
  47.     );
  48. typedef BOOL (WINAPI * PFNPROCESS32NEXT)(
  49.     HANDLE hSnapshot,
  50.     LPPROCESSENTRY32 lppe
  51.     );
  52. typedef BOOL (WINAPI * PFNMODULE32FIRST)(
  53.     HANDLE hSnapshot,
  54.     LPMODULEENTRY32 lpme
  55.     );
  56. typedef BOOL (WINAPI * PFNMODULE32NEXT)(
  57.     HANDLE hSnapshot,
  58.     LPMODULEENTRY32 lpme
  59.     );
  60. //---------------------------------------------------------------------------
  61. //
  62. //                   typedefs for PSAPI.DLL functions 
  63. //
  64. //---------------------------------------------------------------------------
  65. typedef BOOL (WINAPI * PFNENUMPROCESSES)(
  66.     DWORD * lpidProcess,
  67.     DWORD   cb,
  68.     DWORD * cbNeeded
  69. );
  70. typedef BOOL (WINAPI * PFNENUMPROCESSMODULES)(
  71.     HANDLE hProcess,
  72.     HMODULE *lphModule,
  73.     DWORD cb,
  74.     LPDWORD lpcbNeeded
  75. );
  76. typedef DWORD (WINAPI * PFNGETMODULEFILENAMEEXA)(
  77.     HANDLE hProcess,
  78.     HMODULE hModule,
  79.     LPSTR lpFilename,
  80.     DWORD nSize
  81. );
  82. //---------------------------------------------------------------------------
  83. //
  84. // class CModuleList
  85. //
  86. // A simple container for maintaining CModuleInstance objects 
  87. // 
  88. //---------------------------------------------------------------------------
  89. class CModuleList: private std::vector<CModuleInstance*>  
  90. {
  91. public:
  92. CModuleList();
  93. virtual ~CModuleList();
  94. //
  95. // Add new object to the container
  96. //
  97. void Add(CModuleInstance &moduleInstance);
  98. // 
  99. // Release all objects and clear the list
  100. //
  101. void ReleaseAll();
  102. //
  103. // Return a module object by its index (Pascal-like style)
  104. //
  105. CModuleInstance* GetModule(DWORD dwIndex) const;
  106. //
  107. // Return number of items in the container
  108. //
  109. DWORD GetCount() const;
  110. };
  111. //---------------------------------------------------------------------------
  112. //
  113. // class CElements
  114. //
  115. //---------------------------------------------------------------------------
  116. class CElements: public CModuleList  
  117. {
  118. public:
  119. CElements();
  120. virtual ~CElements();
  121. };
  122. //---------------------------------------------------------------------------
  123. //
  124. // class CLibHandler
  125. //
  126. //---------------------------------------------------------------------------
  127. class CLibHandler  
  128. {
  129. public:
  130. CLibHandler(CRunningProcesses* pProcesses);
  131. virtual ~CLibHandler();
  132. virtual BOOL PopulateModules(CModuleInstance* pProcess) = 0;
  133. virtual BOOL PopulateProcesses(BOOL bPopulateModules) = 0;
  134. virtual BOOL PopulateProcess(DWORD dwProcessId, BOOL bPopulateModules) = 0;
  135. protected:
  136. CRunningProcesses* m_pProcesses;
  137. };
  138. //---------------------------------------------------------------------------
  139. //
  140. // class CTaskManager
  141. //
  142. //---------------------------------------------------------------------------
  143. class CTaskManager  
  144. {
  145. public:
  146. CTaskManager();
  147. virtual ~CTaskManager();
  148. BOOL Populate(BOOL bPopulateModules);
  149. BOOL PopulateProcess(DWORD dwProcessId, BOOL bPopulateModules);
  150. DWORD GetProcessCount() const;
  151. CExeModuleInstance* GetProcessByIndex(DWORD dwIndex);
  152. CExeModuleInstance* GetProcessById(DWORD dwProcessId);
  153. private:
  154. CLibHandler       *m_pLibHandler;
  155. CRunningProcesses *m_pProcesses;
  156. };
  157. //---------------------------------------------------------------------------
  158. //
  159. // class CLoadedModules
  160. //
  161. //---------------------------------------------------------------------------
  162. class CLoadedModules: public CElements
  163. {
  164. public:
  165. CLoadedModules(DWORD dwProcessId);
  166. virtual ~CLoadedModules();
  167. protected:
  168. DWORD m_dwProcessId;
  169. };
  170. //---------------------------------------------------------------------------
  171. //
  172. // class CRunningProcesses
  173. //
  174. //---------------------------------------------------------------------------
  175. class CRunningProcesses: public CElements
  176. {
  177. public:
  178. CRunningProcesses();
  179. virtual ~CRunningProcesses();
  180. CExeModuleInstance* GetProcessById(DWORD dwProcessId);
  181. };
  182. //---------------------------------------------------------------------------
  183. //
  184. // class CPsapiHandler
  185. //
  186. //---------------------------------------------------------------------------
  187. class CPsapiHandler: public CLibHandler
  188. {
  189. public:
  190. CPsapiHandler(CRunningProcesses* pProcesses);
  191. virtual ~CPsapiHandler();
  192. BOOL Initialize();
  193. void Finalize();
  194. virtual BOOL PopulateModules(CModuleInstance* pProcess);
  195. virtual BOOL PopulateProcesses(BOOL bPopulateModules);
  196. virtual BOOL PopulateProcess(DWORD dwProcessId, BOOL bPopulateModules);
  197. private:
  198. HMODULE                 m_hModPSAPI;
  199.     PFNENUMPROCESSES        m_pfnEnumProcesses;
  200.     PFNENUMPROCESSMODULES   m_pfnEnumProcessModules;
  201.     PFNGETMODULEFILENAMEEXA m_pfnGetModuleFileNameExA;
  202. };
  203. //---------------------------------------------------------------------------
  204. //
  205. // class CToolhelpHandler
  206. //
  207. //---------------------------------------------------------------------------
  208. class CToolhelpHandler: public CLibHandler
  209. {
  210. public:
  211. CToolhelpHandler(CRunningProcesses* pProcesses);
  212. virtual ~CToolhelpHandler();
  213. BOOL Initialize();
  214. virtual BOOL PopulateModules(CModuleInstance* pProcess);
  215. virtual BOOL PopulateProcesses(BOOL bPopulateModules);
  216. virtual BOOL PopulateProcess(DWORD dwProcessId, BOOL bPopulateModules);
  217. private:
  218. BOOL ModuleFirst(HANDLE hSnapshot, PMODULEENTRY32 pme) const;
  219. BOOL ModuleNext(HANDLE hSnapshot, PMODULEENTRY32 pme) const;
  220. BOOL ProcessFirst(HANDLE hSnapshot, PROCESSENTRY32* pe32) const;
  221. BOOL ProcessNext(HANDLE hSnapshot, PROCESSENTRY32* pe32) const;
  222. //
  223. // ToolHelp function pointers
  224. //
  225. PFNCREATETOOLHELP32SNAPSHOT m_pfnCreateToolhelp32Snapshot;
  226. PFNPROCESS32FIRST           m_pfnProcess32First;
  227. PFNPROCESS32NEXT            m_pfnProcess32Next;
  228. PFNMODULE32FIRST            m_pfnModule32First;
  229. PFNMODULE32NEXT             m_pfnModule32Next;
  230. };
  231. //---------------------------------------------------------------------------
  232. //
  233. // class CModuleInstance
  234. //
  235. // Represents exactly one loaded module
  236. // 
  237. //---------------------------------------------------------------------------
  238. class CModuleInstance  
  239. {
  240. public:
  241. CModuleInstance(char *pszName, HMODULE hModule);
  242. virtual ~CModuleInstance();
  243. void AddModule(CModuleInstance* pModuleInstance);
  244. void ReleaseModules();
  245. // Returns Full path and filename of the executable file for the process or DLL
  246. char*    Get_Name() const;
  247. // Sets Full path and filename of the executable file for the process or DLL
  248. void     Set_Name(char *pszName);
  249. // Returns module handle
  250. HMODULE  Get_Module() const;
  251. void     Set_Module(HMODULE module);
  252. // Returns only the filename of the executable file for the process or DLL
  253. char*   GetBaseName() const;
  254. private:
  255. char        *m_pszName;
  256.     HMODULE      m_hModule;
  257. protected:
  258. CModuleList *m_pInternalList;
  259. };
  260. //---------------------------------------------------------------------------
  261. //
  262. // class CExeModuleInstance
  263. //
  264. // Represents exactly one loaded EXE module
  265. // 
  266. //---------------------------------------------------------------------------
  267. class CExeModuleInstance: public CModuleInstance
  268. {
  269. public:
  270. CExeModuleInstance(
  271. CLibHandler* pLibHandler,
  272. char*        pszName, 
  273. HMODULE      hModule, 
  274. DWORD        dwProcessId
  275. );
  276. virtual ~CExeModuleInstance();
  277. // Returns process id
  278. DWORD Get_ProcessId() const;
  279. BOOL PopulateModules();
  280. DWORD GetModuleCount();
  281. CModuleInstance* GetModuleByIndex(DWORD dwIndex);
  282. private:
  283. DWORD        m_dwProcessId;
  284. CLibHandler* m_pLibHandler;
  285. };
  286. #endif // !defined(_MODULEINSTANCE_H_)
  287. //--------------------- End of the file -------------------------------------