LoadedModules.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #pragma once
  2. /////////////////////////////////////////////////////////////////////////////
  3. // LoadedModules.h: Declaration of the CLoadedModules class.
  4. //
  5. /////////////////////////////////////////////////////////////////////////////
  6. // Types
  7. struct CLoadedModule
  8. {
  9. ZString m_strModuleName;
  10. ULONG m_ModuleBase;
  11. ULONG m_ModuleSize;
  12. };
  13. typedef std::map<ULONG, CLoadedModule> CLoadedModuleMap;
  14. typedef CLoadedModuleMap::const_iterator CLoadedModuleIt;
  15. /////////////////////////////////////////////////////////////////////////////
  16. class CLoadedModules
  17. {
  18. // Construction / Destruction
  19. public:
  20. // CLoadedModules();
  21. // ~CLoadedModules();
  22. // Attributes
  23. public:
  24. CLoadedModuleIt begin();
  25. CLoadedModuleIt end();
  26. // Operations
  27. public:
  28. void Add(void* pvImageBase, const ZString& strName);
  29. void Remove(void* pvImageBase);
  30. CLoadedModuleIt find(void* pvImageBase);
  31. CLoadedModuleIt findAddress(void* pvAddress);
  32. void clear();
  33. bool Enumerate(HANDLE hProcess, HANDLE hProcessSym);
  34. void Dump();
  35. // Implementation
  36. private:
  37. static BOOL CALLBACK EnumLoadedModulesProc(PSTR ModuleName,
  38. ULONG ModuleBase, ULONG ModuleSize, PVOID UserContext);
  39. void ResolveEmptyNames(HANDLE hProcess);
  40. void ResolveUnknownSizes(HANDLE hProcessSym);
  41. // Types
  42. private:
  43. typedef CLoadedModuleMap::iterator XLoadedModuleIt;
  44. // Data Members
  45. private:
  46. CLoadedModuleMap m_Modules;
  47. };
  48. /////////////////////////////////////////////////////////////////////////////
  49. // Attributes
  50. /////////////////////////////////////////////////////////////////////////////
  51. //
  52. inline CLoadedModuleIt CLoadedModules::begin()
  53. {
  54. return m_Modules.begin();
  55. }
  56. /////////////////////////////////////////////////////////////////////////////
  57. //
  58. inline CLoadedModuleIt CLoadedModules::end()
  59. {
  60. return m_Modules.end();
  61. }
  62. /////////////////////////////////////////////////////////////////////////////
  63. // Operations
  64. /////////////////////////////////////////////////////////////////////////////
  65. //
  66. inline CLoadedModuleIt CLoadedModules::find(void* pvImageBase)
  67. {
  68. return m_Modules.find(reinterpret_cast<ULONG>(pvImageBase));
  69. }
  70. /////////////////////////////////////////////////////////////////////////////
  71. //
  72. inline void CLoadedModules::clear()
  73. {
  74. // Clear the map
  75. m_Modules.clear();
  76. }
  77. /////////////////////////////////////////////////////////////////////////////
  78. //
  79. inline bool CLoadedModules::Enumerate(HANDLE hProcess, HANDLE hProcessSym)
  80. {
  81. // Enumerate the modules
  82. if (!::EnumerateLoadedModules(hProcess, EnumLoadedModulesProc, this))
  83. return false;
  84. ResolveEmptyNames(hProcess);
  85. ResolveUnknownSizes(hProcessSym);
  86. return true;
  87. }