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

钩子与API截获

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. // ModuleInstance.cpp
  3. //
  4. // AUTHOR: Ivo Ivanov (ivopi@hotmail.com)
  5. // ver 1.02 
  6. // 05 September 2001
  7. //---------------------------------------------------------------------------
  8. #include "Common.h"
  9. #include "ModuleInstance.h"
  10. #include "SysUtils.h"
  11. //---------------------------------------------------------------------------
  12. //
  13. // class CElements
  14. //
  15. //---------------------------------------------------------------------------
  16. CElements::CElements():
  17. CModuleList()
  18. {
  19. }
  20. CElements::~CElements()
  21. {
  22. }
  23. //---------------------------------------------------------------------------
  24. //
  25. // class CLibHandler
  26. //
  27. //---------------------------------------------------------------------------
  28. CLibHandler::CLibHandler(CRunningProcesses* pProcesses):
  29. m_pProcesses(pProcesses)
  30. {
  31. }
  32. CLibHandler::~CLibHandler()
  33. {
  34. }
  35. //---------------------------------------------------------------------------
  36. //
  37. // class CTaskManager
  38. //
  39. //---------------------------------------------------------------------------
  40. CTaskManager::CTaskManager():
  41. m_pLibHandler(NULL)
  42. {
  43. m_pProcesses = new CRunningProcesses();
  44. if (IsPsapiSupported())
  45. m_pLibHandler = new CPsapiHandler(m_pProcesses);
  46. else
  47. if (IsToolHelpSupported())
  48. m_pLibHandler = new CToolhelpHandler(m_pProcesses);
  49. }
  50. CTaskManager::~CTaskManager()
  51. {
  52. delete m_pLibHandler;
  53. delete m_pProcesses;
  54. }
  55. //---------------------------------------------------------------------------
  56. // Populate
  57. //
  58. // Populate the process and modules list using PSAPI or ToolHlp32
  59. //---------------------------------------------------------------------------
  60. BOOL CTaskManager::Populate(BOOL bPopulateModules)
  61. {
  62. m_pProcesses->ReleaseAll();
  63. return m_pLibHandler->PopulateProcesses(bPopulateModules); 
  64. }
  65. //---------------------------------------------------------------------------
  66. // PopulateProcess
  67. //
  68. // Populate the module list using PSAPI or ToolHlp32
  69. //---------------------------------------------------------------------------
  70. BOOL CTaskManager::PopulateProcess(DWORD dwProcessId, BOOL bPopulateModules)
  71. {
  72. m_pProcesses->ReleaseAll();
  73. return m_pLibHandler->PopulateProcess(dwProcessId, bPopulateModules); 
  74. }
  75. //---------------------------------------------------------------------------
  76. // GetProcessCount
  77. //
  78. // Returns a number of currently loaded processes
  79. //---------------------------------------------------------------------------
  80. DWORD CTaskManager::GetProcessCount() const
  81. {
  82. return m_pProcesses->GetCount();
  83. }
  84. //---------------------------------------------------------------------------
  85. // GetProcessByIndex
  86. //
  87. // Returns a process from the container
  88. //---------------------------------------------------------------------------
  89. CExeModuleInstance* CTaskManager::GetProcessByIndex(DWORD dwIndex)
  90. {
  91. return static_cast<CExeModuleInstance*>(m_pProcesses->GetModule(dwIndex));
  92. }
  93. //---------------------------------------------------------------------------
  94. // GetProcessById
  95. //
  96. // Returns a process by its ID
  97. //---------------------------------------------------------------------------
  98. CExeModuleInstance* CTaskManager::GetProcessById(DWORD dwProcessId)
  99. {
  100. return static_cast<CExeModuleInstance*>
  101. (m_pProcesses->GetProcessById(dwProcessId));
  102. }
  103. //---------------------------------------------------------------------------
  104. //
  105. // class CLoadedModules
  106. //
  107. //---------------------------------------------------------------------------
  108. CLoadedModules::CLoadedModules(DWORD dwProcessId):
  109. CElements(),
  110. m_dwProcessId(dwProcessId)
  111. {
  112. }
  113. CLoadedModules::~CLoadedModules()
  114. {
  115. }
  116. //---------------------------------------------------------------------------
  117. //
  118. // class CRunningProcesses
  119. //
  120. //---------------------------------------------------------------------------
  121. CRunningProcesses::CRunningProcesses():
  122. CElements()
  123. {
  124. }
  125. CRunningProcesses::~CRunningProcesses()
  126. {
  127. }
  128. CExeModuleInstance* CRunningProcesses::GetProcessById(DWORD dwProcessId)
  129. {
  130. CExeModuleInstance* pResult = NULL;
  131. CExeModuleInstance* pProcess;
  132. for (long i = 0; i < GetCount(); i++)
  133. {
  134. pProcess = static_cast<CExeModuleInstance*>( GetModule(i) );
  135. if (pProcess->Get_ProcessId() == dwProcessId)
  136. {
  137. pResult = pProcess;
  138. break;
  139. } // if
  140. } // for
  141. return pResult;
  142. }
  143. //---------------------------------------------------------------------------
  144. //
  145. // class CPsapiHandler
  146. //
  147. //---------------------------------------------------------------------------
  148. CPsapiHandler::CPsapiHandler(CRunningProcesses* pProcesses):
  149. CLibHandler(pProcesses),
  150. m_hModPSAPI(NULL),
  151.     m_pfnEnumProcesses(NULL),
  152.     m_pfnEnumProcessModules(NULL),
  153.     m_pfnGetModuleFileNameExA(NULL)
  154. {
  155. }
  156. CPsapiHandler::~CPsapiHandler()
  157. {
  158. Finalize();
  159. }
  160. //---------------------------------------------------------------------------
  161. // Initialize
  162. //
  163. //---------------------------------------------------------------------------
  164. BOOL CPsapiHandler::Initialize()
  165. {
  166. BOOL bResult = FALSE;
  167.     //
  168.     // Get to the 3 functions in PSAPI.DLL dynamically.  We can't
  169.     // be sure that PSAPI.DLL has been installed
  170.     //
  171.     if (NULL == m_hModPSAPI)
  172.         m_hModPSAPI = ::LoadLibraryA("PSAPI.DLL");
  173.     if (NULL != m_hModPSAPI)
  174. {
  175. m_pfnEnumProcesses = (PFNENUMPROCESSES)
  176. ::GetProcAddress(m_hModPSAPI,"EnumProcesses");
  177. m_pfnEnumProcessModules = (PFNENUMPROCESSMODULES)
  178. ::GetProcAddress(m_hModPSAPI, "EnumProcessModules");
  179. m_pfnGetModuleFileNameExA = (PFNGETMODULEFILENAMEEXA)
  180. ::GetProcAddress(m_hModPSAPI, "GetModuleFileNameExA");
  181. }
  182. bResult = 
  183. m_pfnEnumProcesses
  184. &&  m_pfnEnumProcessModules
  185. &&  m_pfnGetModuleFileNameExA;
  186. return bResult;
  187. }
  188. //---------------------------------------------------------------------------
  189. // Finalize
  190. //
  191. //---------------------------------------------------------------------------
  192. void CPsapiHandler::Finalize()
  193. {
  194. if (NULL != m_hModPSAPI)
  195. ::FreeLibrary(m_hModPSAPI);
  196. }
  197. //---------------------------------------------------------------------------
  198. // PopulateModules
  199. //
  200. // Populate the module list using PSAPI
  201. //---------------------------------------------------------------------------
  202. BOOL CPsapiHandler::PopulateModules(CModuleInstance* pProcess)
  203. {
  204. BOOL   bResult = TRUE;
  205. CModuleInstance  *pDllModuleInstance = NULL;
  206.     if (TRUE == Initialize())
  207. {
  208. DWORD pidArray[1024];
  209. DWORD cbNeeded;
  210. DWORD nProcesses;
  211. // EnumProcesses returns an array with process IDs
  212. if (m_pfnEnumProcesses(pidArray, sizeof(pidArray), &cbNeeded))
  213. {
  214. // Determine number of processes
  215. nProcesses = cbNeeded / sizeof(DWORD);  
  216. // Release the container
  217. pProcess->ReleaseModules();
  218. for (DWORD i = 0; i < nProcesses; i++)
  219. {
  220. HMODULE hModuleArray[1024];
  221. HANDLE  hProcess;
  222. DWORD   pid = pidArray[i];
  223. DWORD   nModules;
  224. // Let's open the process
  225. hProcess = ::OpenProcess(
  226. PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
  227. FALSE, pid);
  228. if (!hProcess)
  229. continue;
  230. if (static_cast<CExeModuleInstance*>(pProcess)->Get_ProcessId() != pid)
  231. {
  232. ::CloseHandle(hProcess);
  233. continue;
  234. }
  235. // EnumProcessModules function retrieves a handle for 
  236. // each module in the specified process. 
  237. if (!m_pfnEnumProcessModules(
  238. hProcess, hModuleArray,
  239. sizeof(hModuleArray), &cbNeeded))
  240. {
  241. ::CloseHandle(hProcess);
  242. continue;
  243. }
  244. // Calculate number of modules in the process                                   
  245. nModules = cbNeeded / sizeof(hModuleArray[0]);
  246. for (DWORD j = 0; j < nModules; j++)
  247. {
  248. HMODULE hModule = hModuleArray[j];
  249. char    szModuleName[MAX_PATH];
  250. m_pfnGetModuleFileNameExA(
  251. hProcess, 
  252. hModule,
  253. szModuleName, 
  254. sizeof(szModuleName)
  255. );
  256. if (0 == j)   // First module is the EXE.  
  257. {
  258. // Do nothing.
  259. } // if
  260. else    // Not the first module.  It's a DLL
  261. {
  262. pDllModuleInstance = new CModuleInstance(
  263. szModuleName, 
  264. hModule
  265. );
  266. pProcess->AddModule(pDllModuleInstance);
  267. } // else
  268. } // for
  269. ::CloseHandle(hProcess);    // We're done with this process handle
  270. } // for
  271. bResult = TRUE;
  272. } // if
  273. else
  274. {
  275. bResult = FALSE;
  276. }
  277. } // if 
  278. else
  279. {
  280. bResult = FALSE;
  281. }
  282.     return bResult;
  283. }
  284. //---------------------------------------------------------------------------
  285. // PopulateProcesses
  286. //
  287. // Populate the process list using PSAPI
  288. //---------------------------------------------------------------------------
  289. BOOL CPsapiHandler::PopulateProcesses(BOOL bPopulateModules)
  290. {
  291. BOOL   bResult = TRUE;
  292. CExeModuleInstance* pProcessInfo;
  293. char    szModuleName[MAX_PATH];
  294.     
  295.     if (TRUE == Initialize())
  296. {
  297. DWORD pidArray[1024];
  298. DWORD cbNeeded;
  299. DWORD nProcesses;
  300.       
  301. if (m_pfnEnumProcesses(pidArray, sizeof(pidArray), &cbNeeded))
  302. {
  303. // Determine number of processes
  304. nProcesses = cbNeeded / sizeof(DWORD);  
  305. m_pProcesses->ReleaseAll();
  306. for (DWORD i = 0; i < nProcesses; i++)
  307. {
  308. HMODULE hModuleArray[1024];
  309. HANDLE hProcess;
  310. DWORD pid = pidArray[i];
  311. DWORD nModules;
  312. hProcess = ::OpenProcess(
  313. PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
  314. FALSE, 
  315. pid
  316. );
  317. if (!hProcess)
  318. continue;
  319. if (!m_pfnEnumProcessModules(hProcess, hModuleArray,
  320. sizeof(hModuleArray), &cbNeeded))
  321. {
  322. ::CloseHandle(hProcess);
  323. continue;
  324. }
  325. // Calculate number of modules in the process                                   
  326. nModules = cbNeeded / sizeof(hModuleArray[0]);
  327. for (DWORD j = 0; j < nModules; j++)
  328. {
  329. HMODULE hModule = hModuleArray[j];
  330. m_pfnGetModuleFileNameExA(
  331. hProcess, 
  332. hModule,
  333. szModuleName, 
  334. sizeof(szModuleName)
  335. );
  336. if (0 == j)   // First module is the EXE.  Just add it to the map
  337. {
  338. pProcessInfo = new CExeModuleInstance(
  339. this,
  340. szModuleName, 
  341. hModule, 
  342. pid
  343. );
  344. m_pProcesses->Add(*pProcessInfo);
  345. if (bPopulateModules)
  346. pProcessInfo->PopulateModules();
  347. break;
  348. } // if
  349. } // for
  350. ::CloseHandle(hProcess);    
  351. } // for
  352.    
  353. bResult = TRUE;
  354. } // if
  355. else
  356. {
  357. bResult = FALSE;
  358. }
  359. } // if 
  360. else
  361. {
  362. bResult = FALSE;
  363. }
  364.    
  365.     return bResult;
  366. }
  367. //---------------------------------------------------------------------------
  368. // PopulateProcess
  369. //
  370. // Populate all modules of a single process
  371. //
  372. //---------------------------------------------------------------------------
  373. BOOL CPsapiHandler::PopulateProcess(DWORD dwProcessId, BOOL bPopulateModules)
  374. {
  375. BOOL   bResult = TRUE;
  376. CExeModuleInstance* pProcessInfo;
  377.     
  378.     if (TRUE == Initialize())
  379. {
  380. m_pProcesses->ReleaseAll();
  381. HMODULE hModuleArray[1024];
  382. HANDLE  hProcess;
  383. DWORD   nModules;
  384. DWORD   cbNeeded;
  385. hProcess = ::OpenProcess(
  386. PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
  387. FALSE, 
  388. dwProcessId
  389. );
  390. if (hProcess) 
  391. {
  392. if (!m_pfnEnumProcessModules(
  393. hProcess, 
  394. hModuleArray,
  395. sizeof(hModuleArray), 
  396. &cbNeeded
  397. ))
  398. ::CloseHandle(hProcess);
  399. else
  400. {
  401. // Calculate number of modules in the process                                   
  402. nModules = cbNeeded / sizeof(hModuleArray[0]);
  403. for (DWORD j = 0; j < nModules; j++)
  404. {
  405. HMODULE hModule = hModuleArray[j];
  406. char    szModuleName[MAX_PATH];
  407. m_pfnGetModuleFileNameExA(
  408. hProcess, 
  409. hModule,
  410. szModuleName, 
  411. sizeof(szModuleName)
  412. );
  413. if (0 == j)   // First module is the EXE.  Just add it to the map
  414. {
  415. pProcessInfo = new CExeModuleInstance(
  416. this,
  417. szModuleName, 
  418. hModule, 
  419. dwProcessId
  420. );
  421. m_pProcesses->Add(*pProcessInfo);
  422. if (bPopulateModules)
  423. pProcessInfo->PopulateModules();
  424. break;
  425. } // if
  426. } // for
  427. ::CloseHandle(hProcess);    
  428. } // if
  429. } // if
  430. } // if 
  431. else
  432. {
  433. bResult = FALSE;
  434. }
  435.     return bResult;
  436. }
  437. //---------------------------------------------------------------------------
  438. //
  439. // class CToolhelpHandler
  440. //
  441. //---------------------------------------------------------------------------
  442. CToolhelpHandler::CToolhelpHandler(CRunningProcesses* pProcesses):
  443. CLibHandler(pProcesses)
  444. {
  445. }
  446. CToolhelpHandler::~CToolhelpHandler()
  447. {
  448. }
  449. //---------------------------------------------------------------------------
  450. // Initialize
  451. //
  452. //---------------------------------------------------------------------------
  453. BOOL CToolhelpHandler::Initialize()
  454. {
  455. BOOL           bResult = FALSE;
  456. HINSTANCE      hInstLib;
  457. hInstLib = ::LoadLibraryA("Kernel32.DLL");
  458. if (NULL != hInstLib)
  459. {
  460. //
  461. // We must link to these functions of Kernel32.DLL explicitly. Otherwise 
  462. // a module using this code would fail to load under Windows NT, which does not 
  463. // have the Toolhelp32 functions in the Kernel32.
  464. //
  465. m_pfnCreateToolhelp32Snapshot = (PFNCREATETOOLHELP32SNAPSHOT) 
  466. ::GetProcAddress(hInstLib, "CreateToolhelp32Snapshot");
  467. m_pfnProcess32First = (PFNPROCESS32FIRST)
  468. ::GetProcAddress(hInstLib, "Process32First");
  469. m_pfnProcess32Next = (PFNPROCESS32NEXT)
  470. ::GetProcAddress(hInstLib, "Process32Next");
  471. m_pfnModule32First = (PFNMODULE32FIRST)
  472. ::GetProcAddress(hInstLib, "Module32First");
  473. m_pfnModule32Next = (PFNMODULE32NEXT)
  474. ::GetProcAddress(hInstLib, "Module32Next");
  475. ::FreeLibrary( hInstLib );
  476. bResult = m_pfnCreateToolhelp32Snapshot &&
  477.       m_pfnProcess32First &&
  478.   m_pfnProcess32Next &&
  479.   m_pfnModule32First &&
  480.   m_pfnModule32Next;
  481. } // if
  482. return bResult;
  483. }
  484. //---------------------------------------------------------------------------
  485. // PopulateModules
  486. //
  487. // Populate the module list using ToolHelp32
  488. //---------------------------------------------------------------------------
  489. BOOL CToolhelpHandler::PopulateModules(CModuleInstance* pProcess)
  490. {
  491. BOOL   bResult = TRUE;
  492. CModuleInstance  *pDllModuleInstance = NULL;
  493. HANDLE hSnapshot = INVALID_HANDLE_VALUE;
  494. hSnapshot = m_pfnCreateToolhelp32Snapshot(
  495. TH32CS_SNAPMODULE, 
  496. static_cast<CExeModuleInstance*>(pProcess)->Get_ProcessId());
  497. MODULEENTRY32 me = { sizeof(me) };
  498. for (BOOL bOk = ModuleFirst(hSnapshot, &me); bOk; bOk = ModuleNext(hSnapshot, &me)) 
  499. {
  500. // We don't need to add to the list the process itself.
  501. // The module list should keep references to DLLs only
  502. if (0 != stricmp(pProcess->GetBaseName(), me.szModule))  
  503. {
  504. pDllModuleInstance = new CModuleInstance(me.szExePath, me.hModule);
  505. pProcess->AddModule(pDllModuleInstance);
  506. }
  507. else
  508. //
  509. // However, we should fix up the module of the EXE, because
  510. // th32ModuleID member has meaning only to the tool help functions
  511. // and it is not usable by Win32 API elements. 
  512. //
  513. {
  514. pProcess->Set_Module( me.hModule );
  515. }
  516. } // for
  517. if (hSnapshot != INVALID_HANDLE_VALUE)
  518. ::CloseHandle(hSnapshot);
  519. return bResult;
  520. }
  521. BOOL CToolhelpHandler::ModuleFirst(HANDLE hSnapshot, PMODULEENTRY32 pme) const
  522. {
  523. return m_pfnModule32First(hSnapshot, pme);
  524. }
  525. BOOL CToolhelpHandler::ModuleNext(HANDLE hSnapshot, PMODULEENTRY32 pme) const
  526. {
  527. return m_pfnModule32Next(hSnapshot, pme);
  528. }
  529. BOOL CToolhelpHandler::ProcessFirst(HANDLE hSnapshot, PROCESSENTRY32* pe32) const
  530. {
  531. return m_pfnProcess32First(hSnapshot, pe32);
  532. }
  533. BOOL CToolhelpHandler::ProcessNext(HANDLE hSnapshot, PROCESSENTRY32* pe32) const
  534. {
  535. return m_pfnProcess32Next(hSnapshot, pe32);
  536. }
  537. //---------------------------------------------------------------------------
  538. // PopulateProcesses
  539. //
  540. // Populate the process list using Toolhelp
  541. //---------------------------------------------------------------------------
  542. BOOL CToolhelpHandler::PopulateProcesses(BOOL bPopulateModules)
  543. {
  544. return PopulateProcess(NULL, bPopulateModules);
  545. }
  546. //---------------------------------------------------------------------------
  547. // PopulateProcess
  548. //
  549. // Populate all modules of a single process
  550. //
  551. //---------------------------------------------------------------------------
  552. BOOL CToolhelpHandler::PopulateProcess(DWORD dwProcessId, BOOL bPopulateModules)
  553. {
  554. BOOL   bResult    = FALSE;
  555. CExeModuleInstance* pProcessInfo;
  556. HANDLE hSnapshot  = INVALID_HANDLE_VALUE;
  557. if (TRUE == Initialize())
  558. {
  559. hSnapshot = m_pfnCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, dwProcessId);
  560. PROCESSENTRY32 pe32 = { sizeof(pe32) };
  561. for (BOOL bOk = ProcessFirst(hSnapshot, &pe32); bOk; bOk = ProcessNext(hSnapshot, &pe32)) 
  562. {
  563. if ( (dwProcessId != NULL) && (dwProcessId != pe32.th32ProcessID) )
  564. continue;
  565. pProcessInfo = new CExeModuleInstance(
  566. this,
  567. pe32.szExeFile, 
  568. NULL,                // We will fix up later this value
  569. pe32.th32ProcessID
  570. );
  571. m_pProcesses->Add(*pProcessInfo);
  572. if (bPopulateModules)
  573. pProcessInfo->PopulateModules();
  574. if (dwProcessId != NULL)
  575. break;
  576. } // for
  577. if (hSnapshot != INVALID_HANDLE_VALUE)
  578. ::CloseHandle(hSnapshot);
  579. bResult = TRUE;
  580. }
  581. return bResult;
  582. }
  583. //---------------------------------------------------------------------------
  584. //
  585. // class CModuleList
  586. //
  587. //---------------------------------------------------------------------------
  588. CModuleList::CModuleList()
  589. {
  590. }
  591. CModuleList::~CModuleList()
  592. {
  593. ReleaseAll();
  594. }
  595. //---------------------------------------------------------------------------
  596. // Add
  597. //
  598. // Add new object to the container
  599. //---------------------------------------------------------------------------
  600. void CModuleList::Add(CModuleInstance &moduleInstance)
  601. {
  602. push_back(&moduleInstance);
  603. }
  604. //---------------------------------------------------------------------------
  605. // ReleaseAll
  606. //
  607. // Release all objects and clear the list
  608. //---------------------------------------------------------------------------
  609. void CModuleList::ReleaseAll()
  610. {
  611. CModuleList::iterator itr;
  612. CModuleInstance *pModuleInstance;
  613. for (itr = begin(); itr != end(); ++itr)
  614. {
  615. pModuleInstance = *itr;
  616. delete pModuleInstance;
  617. } // for
  618. clear();
  619. }
  620. //---------------------------------------------------------------------------
  621. // GetModule
  622. //
  623. // Return a module object by its index (Pascal-like style)
  624. //---------------------------------------------------------------------------
  625. CModuleInstance* CModuleList::GetModule(DWORD dwIndex) const
  626. {
  627. return at(dwIndex);
  628. }
  629. //---------------------------------------------------------------------------
  630. // GetCount
  631. //
  632. // Return number of items in the container
  633. //---------------------------------------------------------------------------
  634. DWORD CModuleList::GetCount() const
  635. {
  636. return size();
  637. }
  638. //---------------------------------------------------------------------------
  639. //
  640. // class CModuleInstance
  641. //
  642. //---------------------------------------------------------------------------
  643. CModuleInstance::CModuleInstance(char *pszName, HMODULE hModule):
  644. m_pszName(NULL),
  645.     m_hModule(NULL),
  646. m_pInternalList(NULL)
  647. {
  648. Set_Name(pszName);
  649. Set_Module(hModule);
  650. }
  651. CModuleInstance::~CModuleInstance()
  652. {
  653. delete m_pInternalList;
  654. if (NULL != m_pszName)
  655. delete [] m_pszName;
  656. }
  657. void CModuleInstance::AddModule(CModuleInstance* pModuleInstance)
  658. {
  659. if (NULL == m_pInternalList)
  660. m_pInternalList = new CModuleList();
  661. m_pInternalList->Add(*pModuleInstance);
  662. }
  663. void CModuleInstance::ReleaseModules()
  664. {
  665. if (NULL != m_pInternalList)
  666. m_pInternalList->ReleaseAll();
  667. }
  668. char* CModuleInstance::Get_Name() const
  669. {
  670. return m_pszName;
  671. }
  672. char* CModuleInstance::GetBaseName() const
  673. {
  674. char *pdest;
  675. int  ch = '\';
  676. // Search backward 
  677. pdest = strrchr(m_pszName, ch);
  678. if(pdest != NULL)
  679. return &pdest[1];
  680. else
  681. return m_pszName;
  682. }
  683. void CModuleInstance::Set_Name(char *pszName)
  684. {
  685. if (NULL != m_pszName)
  686. delete [] m_pszName;
  687. if ((NULL != pszName) && (strlen(pszName)))
  688. {
  689. m_pszName = new char[strlen(pszName) + 1];
  690. strcpy(m_pszName, pszName);
  691. }
  692. else
  693. {
  694. m_pszName = new char[strlen("") + 1];
  695. strcpy(m_pszName, "");
  696. }
  697. }
  698. HMODULE CModuleInstance::Get_Module() const
  699. {
  700. return m_hModule;
  701. }
  702. void CModuleInstance::Set_Module(HMODULE module)
  703. {
  704. m_hModule = module;
  705. }
  706. //---------------------------------------------------------------------------
  707. //
  708. // class CExeModuleInstance
  709. //
  710. //---------------------------------------------------------------------------
  711. CExeModuleInstance::CExeModuleInstance(
  712. CLibHandler* pLibHandler,
  713. char*        pszName, 
  714. HMODULE      hModule, 
  715. DWORD        dwProcessId
  716. ):
  717. CModuleInstance(pszName, hModule),
  718. m_pLibHandler(pLibHandler),
  719. m_dwProcessId(dwProcessId)
  720. {
  721. }
  722. CExeModuleInstance::~CExeModuleInstance()
  723. {
  724. }
  725. DWORD CExeModuleInstance::Get_ProcessId() const
  726. {
  727. return m_dwProcessId;
  728. }
  729. BOOL CExeModuleInstance::PopulateModules()
  730. {
  731. return m_pLibHandler->PopulateModules(this);
  732. }
  733. DWORD CExeModuleInstance::GetModuleCount()
  734. {
  735. return m_pInternalList ? m_pInternalList->GetCount() : 0;
  736. }
  737. CModuleInstance* CExeModuleInstance::GetModuleByIndex(DWORD dwIndex)
  738. {
  739. return m_pInternalList ? m_pInternalList->GetModule(dwIndex) : NULL;
  740. }
  741. //----------------------------End of the file -------------------------------