Back

// PSLModules.cpp : Implementation of CPSLModules

#include "stdafx.h"
#include "PSLModule.h"
#include "PSLModules.h"
#include <Psapi.h>

// Initial size of the buffer for modules enumeration:
DWORD CPSLModules::m_ModulesSizeNeeded = 100;

CPSLModules::CPSLModules()
{
}

HRESULT CPSLModules::OnIndexOutOfRange()
{
   return MakeException(EX_INDEXOUTOFRANGE);
}

HRESULT CPSLModules::FinalConstruct()
{
   PSL_BEGIN

   InternalUpdate();

   PSL_END
}

void CPSLModules::FinalRelease()
{
}

void CPSLModules::InternalUpdate()
{
   CCritSecLock cs(m_csCollection);
   m_coll.clear();
   cs.Unlock();

   DWORD dwSizeNeeded = 0;
   HMODULE * pModules = new HMODULE[m_ModulesSizeNeeded];
   if(!::EnumProcessModules(::GetCurrentProcess(), pModules, m_ModulesSizeNeeded * sizeof(HMODULE), &dwSizeNeeded))
   {
      delete []pModules;
      return;
   }
   if(dwSizeNeeded > m_ModulesSizeNeeded * sizeof(HMODULE))
   {
      m_ModulesSizeNeeded = dwSizeNeeded / sizeof(HMODULE) + 10;
      delete []pModules;
      pModules = new HMODULE[m_ModulesSizeNeeded];
      if(!::EnumProcessModules(::GetCurrentProcess(), pModules, m_ModulesSizeNeeded * sizeof(HMODULE), &dwSizeNeeded) || dwSizeNeeded > m_ModulesSizeNeeded * sizeof(HMODULE))
      {
         // This should never happen in reality;
         delete []pModules;
         return;
      }
   }
   cs.Lock();
   CComObject<CPSLModule> * pModule = NULL;
   for(DWORD i = 0;i < dwSizeNeeded / sizeof(HMODULE);i ++)
   {
      CComObject<CPSLModule>::CreateInstance(&pModule);
      pModule->Initialize(pModules[i]);
      m_coll.push_back(CComPtr<IPSLModule>(pModule));
   }
   delete []pModules;
}

////////////////////////////////////////////////////////////////////////
// Interface Implementation;
////////////////////////////////////////////////////////////////////////

STDMETHODIMP CPSLModules::Update()
{
   PSL_BEGIN

   InternalUpdate();

   PSL_END
}

Top