|
// 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(exIndexOutOfRange);
}
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
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.