home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Softwarová Záchrana 3
/
Softwarova-zachrana-3.bin
/
pserv.cpl
/
pserv-2.4.exe
/
source
/
cmoduleslist.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2005-01-05
|
5KB
|
169 lines
#include "stdafx.h"
#include "resource.h"
#include "CModulesList.h"
#include "CConfiguration.h"
#include "Aclapi.h"
#include "psapi.H"
#include "2kwrapper.h"
CString CModuleInfo::GetDisplayString(DWORD dwIndex)
{
switch(dwIndex)
{
case 0: return m_strBaseName;
case 1: return m_strPathName;
case 2: return m_strProcessID;
case 3: return m_strProcessName;
}
return CString();
}
COLORREF CModuleInfo::GetTextColor()
{
return RGB(0,0,0);
}
CString CModuleInfo::GetInfoTip()
{
return m_strModuleName;
}
CModuleInfo::CModuleInfo( LPCTSTR lpszModuleName, DWORD dwProcessID, LPCTSTR lpszProcessName )
: m_strModuleName( lpszModuleName ),
m_dwProcessID( dwProcessID ),
m_strProcessName( lpszProcessName )
{
m_strProcessID.Format(_T("%ld"), m_dwProcessID );
LPTSTR p = tstrrchr( lpszModuleName, _T('\\'));
if( p )
{
m_strBaseName = p+1;
*p = 0;
m_strPathName = lpszModuleName;
*p = _T('\\');
}
}
#define PROCESS_SORT_STRING_METHOD(NAME) \
static int SortBy##NAME(const CModuleInfo** ps1, const CModuleInfo** ps2) \
{ \
return (*ps1)->m_str##NAME.CompareNoCase((*ps2)->m_str##NAME); \
}
#define PROCESS_SORT_INTEGER(NAME) \
static int SortBy##NAME(const CModuleInfo** ps1, const CModuleInfo** ps2) \
{ \
return LONG((*ps1)->m_dw##NAME)-LONG((*ps2)->m_dw##NAME); \
}
PROCESS_SORT_STRING_METHOD(BaseName)
PROCESS_SORT_STRING_METHOD(PathName)
PROCESS_SORT_INTEGER(ProcessID)
PROCESS_SORT_STRING_METHOD(ProcessName)
static GENERICCOMPAREFN SortMethods[] = {
GENERICCOMPAREFN(&SortByBaseName),
GENERICCOMPAREFN(&SortByPathName),
GENERICCOMPAREFN(&SortByProcessID),
GENERICCOMPAREFN(&SortByProcessName),
};
CModuleList::CModuleList()
: CListViewEntries(SortMethods, _T("ModulesList"))
{
CreateColumns( _T("Name"), _T("Path"), _T("Process ID"), _T("Process Name"), NULL );
m_strTitle.Format( TEXT("pserv ") CURRENT_VERSION TEXT(": modules on local machine") );
}
BOOL CModuleList::Refresh()
{
DWORD dwArrayOfProcessIds[1024], dwNeeded;
DeleteObjects(m_Entries);
if( !EnumProcesses( dwArrayOfProcessIds, sizeof(dwArrayOfProcessIds), &dwNeeded ) )
return FALSE;
// Calculate how many process IDs were returned
DWORD dwCount = dwNeeded / sizeof(DWORD);
for( DWORD dwIndex = 0; dwIndex < dwCount; dwIndex++ )
{
DWORD dwProcessID = dwArrayOfProcessIds[dwIndex];
if( dwProcessID > 2 )
{
HANDLE hProcess = OpenProcess( PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, dwProcessID );
if( hProcess )
{
HMODULE hArray[1024];
DWORD dwNeeded, dwModuleCount;
CString strProcessName;
if( EnumProcessModules(hProcess,hArray,sizeof(hArray),&dwNeeded ) )
{
dwModuleCount = dwNeeded / sizeof(HMODULE);
TCHAR szFileName[1024];
for( DWORD dwHandleIndex = 0; dwHandleIndex < dwModuleCount; dwHandleIndex++ )
{
if( GetModuleFileNameEx( hProcess, hArray[dwHandleIndex], szFileName, sizeof(szFileName) ) )
{
if( (lpfnGetLongPathName != NULL) &&
(tstrchr(szFileName,'~') != NULL) )
{
TCHAR szLongPath[1024];
if( lpfnGetLongPathName(szFileName,szLongPath,sizeof(szLongPath)) )
{
lstrcpy(szFileName,szLongPath);
}
}
if( !dwHandleIndex )
strProcessName = szFileName;
m_Entries.Add( new CModuleInfo( szFileName, dwProcessID, strProcessName ) );
}
}
}
CloseHandle( hProcess );
}
}
}
return TRUE;
}
void CModuleList::ConnectTo( LPCTSTR lpszMachine )
{
// TODO: display error msg here ....
//m_strServiceMachine = lpszMachine;
}
void CModuleList::ExportXmlToFile( CFile* pFile )
{
PrintToFile(pFile, _T("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"?>\r\n")
_T("<modules>\r\n") );
for(int n = 0, nmax = m_Entries.GetSize(); n < nmax; n++ )
{
CModuleInfo* p = (CModuleInfo*)m_Entries.GetAt(n);
PrintToFile(pFile, _T("\t<module>\r\n") );
PrintToFile(pFile, _T("\t\t<name>%s</name>\r\n"),(LPCTSTR) XmlEscape(p->m_strBaseName) );
PrintToFile(pFile, _T("\t\t<path>%s</path>\r\n"), (LPCTSTR) XmlEscape(p->m_strPathName) );
PrintToFile(pFile, _T("\t</module>\r\n") );
}
PrintToFile(pFile, _T("</modules>"));
}
UINT CModuleList::GetContextMenuID()
{
return IDR_CONTEXTMENU_MODULES;
}