XTPSkinManagerModuleList.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:10k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPSkinManagerModuleList.cpp: implementation of the CXTPSkinManagerModuleList class.
  2. //
  3. // This file is a part of the XTREME SKINFRAMEWORK MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include <tlhelp32.h>
  22. #include "XTPSkinManagerModuleList.h"
  23. #ifdef _DEBUG
  24. #undef THIS_FILE
  25. static char THIS_FILE[]=__FILE__;
  26. #define new DEBUG_NEW
  27. #endif
  28. //////////////////////////////////////////////////////////////////////////
  29. // CModuleEnumerator
  30. class CXTPSkinManagerModuleList::CModuleEnumerator
  31. {
  32. public:
  33. CModuleEnumerator(DWORD dwProcessId);
  34. virtual ~CModuleEnumerator();
  35. virtual HMODULE GetFirstModule() = 0;
  36. virtual HMODULE GetNextModule() = 0;
  37. virtual BOOL GetModuleInformation(HMODULE hModule, XTP_MODULEINFO* lpmodinfo) = 0;
  38. protected:
  39. int m_dwProcessId;
  40. };
  41. CXTPSkinManagerModuleList::CModuleEnumerator::CModuleEnumerator(DWORD dwProcessId)
  42. : m_dwProcessId(dwProcessId)
  43. {
  44. }
  45. CXTPSkinManagerModuleList::CModuleEnumerator::~CModuleEnumerator()
  46. {
  47. }
  48. //////////////////////////////////////////////////////////////////////////
  49. // CPsapiModuleEnumerator
  50. class CXTPSkinManagerModuleList::CPsapiModuleEnumerator : public CModuleEnumerator
  51. {
  52. typedef BOOL (WINAPI* PFNENUMPROCESSMODULES) ( HANDLE hProcess, HMODULE *lphModule, DWORD cb, LPDWORD lpcbNeeded );
  53. typedef BOOL (WINAPI* PFNGETMODULEINFORMATION) (HANDLE hProcess, HMODULE hModule, XTP_MODULEINFO* lpmodinfo, DWORD cb);
  54. public:
  55. CPsapiModuleEnumerator(DWORD dwProcessId, HMODULE hModPSAPI);
  56. ~CPsapiModuleEnumerator();
  57. virtual HMODULE GetFirstModule();
  58. virtual HMODULE GetNextModule();
  59. virtual BOOL GetModuleInformation(HMODULE hModule, XTP_MODULEINFO* lpmodinfo);
  60. protected:
  61. PFNENUMPROCESSMODULES m_pfnEnumProcessModules;
  62. PFNGETMODULEINFORMATION m_pfnGetModuleInformation;
  63. HMODULE m_hModPSAPI;
  64. HMODULE* m_pModules;
  65. int m_nIndex;
  66. int m_nCount;
  67. };
  68. CXTPSkinManagerModuleList::CPsapiModuleEnumerator::CPsapiModuleEnumerator(DWORD dwProcessId, HMODULE hModPSAPI)
  69. : CModuleEnumerator(dwProcessId)
  70. {
  71. m_hModPSAPI = hModPSAPI;
  72. ASSERT(m_hModPSAPI);
  73. m_pfnEnumProcessModules = NULL;
  74. m_pfnGetModuleInformation = NULL;
  75. if (m_hModPSAPI)
  76. {
  77. m_pfnEnumProcessModules = (PFNENUMPROCESSMODULES) ::GetProcAddress(m_hModPSAPI, "EnumProcessModules");
  78. m_pfnGetModuleInformation = (PFNGETMODULEINFORMATION) ::GetProcAddress(m_hModPSAPI, "GetModuleInformation");
  79. }
  80. m_pModules = NULL;
  81. m_nIndex = 0;
  82. m_nCount = 0;
  83. }
  84. CXTPSkinManagerModuleList::CPsapiModuleEnumerator::~CPsapiModuleEnumerator()
  85. {
  86. if (m_pModules)
  87. {
  88. delete[] m_pModules;
  89. }
  90. }
  91. BOOL CXTPSkinManagerModuleList::CPsapiModuleEnumerator::GetModuleInformation(HMODULE hModule, XTP_MODULEINFO* lpmodinfo)
  92. {
  93. if (!m_pfnGetModuleInformation)
  94. return NULL;
  95. HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, m_dwProcessId);
  96. if (!hProcess)
  97. return FALSE;
  98. if (!m_pfnGetModuleInformation(hProcess, hModule, lpmodinfo, sizeof(XTP_MODULEINFO)))
  99. {
  100. ::CloseHandle(hProcess);
  101. return FALSE;
  102. }
  103. ::CloseHandle(hProcess);
  104. return TRUE;
  105. }
  106. HMODULE CXTPSkinManagerModuleList::CPsapiModuleEnumerator::GetFirstModule()
  107. {
  108. if (!m_pfnEnumProcessModules)
  109. return NULL;
  110. HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, m_dwProcessId);
  111. if (!hProcess)
  112. return NULL;
  113. DWORD cbNeeded = 0;
  114. HMODULE hModule;
  115. if (!m_pfnEnumProcessModules(hProcess, &hModule, sizeof(hModule), &cbNeeded))
  116. {
  117. ::CloseHandle(hProcess);
  118. return NULL;
  119. }
  120. if (cbNeeded == 0)
  121. {
  122. ::CloseHandle(hProcess);
  123. return NULL;
  124. }
  125. m_nCount = cbNeeded / sizeof(HMODULE);
  126. m_pModules = new HMODULE[m_nCount];
  127. if (!m_pfnEnumProcessModules(hProcess, m_pModules, cbNeeded, &cbNeeded))
  128. {
  129. ::CloseHandle(hProcess);
  130. return NULL;
  131. }
  132. m_nIndex = 0;
  133. ::CloseHandle(hProcess);
  134. return m_pModules[0];
  135. }
  136. HMODULE CXTPSkinManagerModuleList::CPsapiModuleEnumerator::GetNextModule()
  137. {
  138. ASSERT(m_pModules != NULL);
  139. if (m_pModules == NULL)
  140. return NULL;
  141. m_nIndex++;
  142. if (m_nIndex >= m_nCount)
  143. return NULL;
  144. return m_pModules[m_nIndex];
  145. }
  146. //////////////////////////////////////////////////////////////////////////
  147. // ToolHelp
  148. class CXTPSkinManagerModuleList::CToolHelpModuleEnumerator : public CModuleEnumerator
  149. {
  150. typedef BOOL (WINAPI* PFNMODULE32FIRST) ( HANDLE hSnapshot, LPMODULEENTRY32 lpme );
  151. typedef BOOL (WINAPI* PFNMODULE32NEXT) ( HANDLE hSnapshot, LPMODULEENTRY32 lpme );
  152. typedef HANDLE (WINAPI* PFNCREATETOOLHELP32SNAPSHOT) ( DWORD dwFlags, DWORD th32ProcessID );
  153. public:
  154. CToolHelpModuleEnumerator(DWORD dwProcessId);
  155. ~CToolHelpModuleEnumerator();
  156. virtual HMODULE GetFirstModule();
  157. virtual HMODULE GetNextModule();
  158. virtual BOOL GetModuleInformation(HMODULE hModule, XTP_MODULEINFO* lpmodinfo);
  159. protected:
  160. HANDLE m_hSnapshot;
  161. PFNCREATETOOLHELP32SNAPSHOT m_pfnCreateToolhelp32Snapshot;
  162. PFNMODULE32NEXT m_pfnModule32Next;
  163. PFNMODULE32FIRST m_pfnModule32First;
  164. MODULEENTRY32 m_me;
  165. };
  166. CXTPSkinManagerModuleList::CToolHelpModuleEnumerator::CToolHelpModuleEnumerator(DWORD dwProcessId)
  167. : CModuleEnumerator(dwProcessId)
  168. {
  169. HMODULE hInstLib = GetModuleHandle(_T("KERNEL32"));
  170. ASSERT(hInstLib);
  171. if (!hInstLib)
  172. return;
  173. //
  174. // We must link to these functions of Kernel32.DLL explicitly. Otherwise
  175. // a module using this code would fail to load under Windows NT, which does not
  176. // have the Toolhelp32 functions in the Kernel32.
  177. //
  178. m_pfnCreateToolhelp32Snapshot = (PFNCREATETOOLHELP32SNAPSHOT)
  179. ::GetProcAddress(hInstLib, "CreateToolhelp32Snapshot");
  180. #ifdef UNICODE
  181. m_pfnModule32First = (PFNMODULE32FIRST)
  182. ::GetProcAddress(hInstLib, "Module32FirstW");
  183. m_pfnModule32Next = (PFNMODULE32NEXT)
  184. ::GetProcAddress(hInstLib, "Module32NextW");
  185. #else
  186. m_pfnModule32First = (PFNMODULE32FIRST)
  187. ::GetProcAddress(hInstLib, "Module32First");
  188. m_pfnModule32Next = (PFNMODULE32NEXT)
  189. ::GetProcAddress(hInstLib, "Module32Next");
  190. #endif
  191. m_hSnapshot = INVALID_HANDLE_VALUE;
  192. m_me.dwSize = sizeof(MODULEENTRY32);
  193. }
  194. CXTPSkinManagerModuleList::CToolHelpModuleEnumerator::~CToolHelpModuleEnumerator()
  195. {
  196. if (m_hSnapshot != INVALID_HANDLE_VALUE)
  197. {
  198. CloseHandle(m_hSnapshot);
  199. }
  200. }
  201. BOOL CXTPSkinManagerModuleList::CToolHelpModuleEnumerator::GetModuleInformation(HMODULE hModule, XTP_MODULEINFO* lpmodinfo)
  202. {
  203. if (m_pfnCreateToolhelp32Snapshot == NULL ||
  204. m_pfnModule32First == NULL || m_pfnModule32Next == NULL)
  205. {
  206. return FALSE;
  207. }
  208. MODULEENTRY32 me;
  209. ZeroMemory(&me, sizeof(MODULEENTRY32));
  210. me.dwSize = sizeof(MODULEENTRY32);
  211. HANDLE hSnapshot = m_pfnCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, m_dwProcessId);
  212. if (hSnapshot == INVALID_HANDLE_VALUE)
  213. return FALSE;
  214. if (!m_pfnModule32First(hSnapshot, &me))
  215. return FALSE;
  216. do
  217. {
  218. if (me.hModule == hModule)
  219. {
  220. lpmodinfo->lpBaseOfDll = me.modBaseAddr;
  221. lpmodinfo->EntryPoint = 0;
  222. lpmodinfo->SizeOfImage = me.modBaseSize;
  223. CloseHandle(hSnapshot);
  224. return TRUE;
  225. }
  226. } while (m_pfnModule32Next(hSnapshot, &me));
  227. CloseHandle(hSnapshot);
  228. return FALSE;
  229. }
  230. HMODULE CXTPSkinManagerModuleList::CToolHelpModuleEnumerator::GetFirstModule()
  231. {
  232. if (m_pfnCreateToolhelp32Snapshot == NULL ||
  233. m_pfnModule32First == NULL || m_pfnModule32Next == NULL)
  234. {
  235. return NULL;
  236. }
  237. m_hSnapshot = m_pfnCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, m_dwProcessId);
  238. if (m_hSnapshot == INVALID_HANDLE_VALUE)
  239. return NULL;
  240. if (m_pfnModule32First(m_hSnapshot, &m_me))
  241. {
  242. return m_me.hModule;
  243. }
  244. return NULL;
  245. }
  246. HMODULE CXTPSkinManagerModuleList::CToolHelpModuleEnumerator::GetNextModule()
  247. {
  248. if (m_hSnapshot == INVALID_HANDLE_VALUE)
  249. return NULL;
  250. if (m_pfnModule32Next(m_hSnapshot, &m_me))
  251. {
  252. return m_me.hModule;
  253. }
  254. return NULL;
  255. }
  256. //////////////////////////////////////////////////////////////////////
  257. // CXTPSkinManagerModuleList
  258. CXTPSkinManagerModuleList::CSharedData::CSharedData()
  259. {
  260. m_hPsapiDll = ::LoadLibraryA("PSAPI.DLL");
  261. m_bExists = m_hPsapiDll != NULL;
  262. if (!m_bExists)
  263. {
  264. HMODULE hModule = ::GetModuleHandle(_T("KERNEL32.DLL"));
  265. if (hModule)
  266. {
  267. if (::GetProcAddress(hModule, "CreateToolhelp32Snapshot") != NULL)
  268. {
  269. m_bExists = TRUE;
  270. }
  271. }
  272. }
  273. }
  274. CXTPSkinManagerModuleList::CSharedData::~CSharedData()
  275. {
  276. if (m_hPsapiDll)
  277. {
  278. //FreeLibrary(m_hPsapiDll); Dangerous to call FreeLibrary in destructors of static objects.
  279. }
  280. }
  281. CXTPSkinManagerModuleList::CSharedData& AFX_CDECL CXTPSkinManagerModuleList::GetSharedData()
  282. {
  283. static CSharedData sData;
  284. return sData;
  285. }
  286. BOOL AFX_CDECL CXTPSkinManagerModuleList::IsEnumeratorExists()
  287. {
  288. return GetSharedData().m_bExists;
  289. }
  290. CXTPSkinManagerModuleList::CXTPSkinManagerModuleList(DWORD dwProcessId)
  291. {
  292. m_pEnumerator = NULL;
  293. if (GetSharedData().m_hPsapiDll)
  294. {
  295. m_pEnumerator = new CPsapiModuleEnumerator(dwProcessId, GetSharedData().m_hPsapiDll);
  296. }
  297. else if (GetSharedData().m_bExists)
  298. {
  299. m_pEnumerator = new CToolHelpModuleEnumerator(dwProcessId);
  300. }
  301. ASSERT(m_pEnumerator);
  302. }
  303. CXTPSkinManagerModuleList::~CXTPSkinManagerModuleList()
  304. {
  305. SAFE_DELETE(m_pEnumerator);
  306. }
  307. HMODULE CXTPSkinManagerModuleList::GetFirstModule()
  308. {
  309. if (m_pEnumerator)
  310. {
  311. return m_pEnumerator->GetFirstModule();
  312. }
  313. return NULL;
  314. }
  315. HMODULE CXTPSkinManagerModuleList::GetNextModule()
  316. {
  317. if (m_pEnumerator)
  318. {
  319. return m_pEnumerator->GetNextModule();
  320. }
  321. return NULL;
  322. }
  323. BOOL CXTPSkinManagerModuleList::GetModuleInformation(HMODULE hModule, XTP_MODULEINFO* lpmodinfo)
  324. {
  325. if (!hModule)
  326. return FALSE;
  327. if (m_pEnumerator)
  328. {
  329. return m_pEnumerator->GetModuleInformation(hModule, lpmodinfo);
  330. }
  331. return FALSE;
  332. }