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 >
C/C++ Source or Header  |  2005-01-05  |  5KB  |  169 lines

  1. #include "stdafx.h"
  2. #include "resource.h"
  3. #include "CModulesList.h"
  4. #include "CConfiguration.h"
  5. #include "Aclapi.h"
  6. #include "psapi.H"
  7. #include "2kwrapper.h"
  8.  
  9. CString CModuleInfo::GetDisplayString(DWORD dwIndex)
  10. {
  11.     switch(dwIndex)
  12.     {
  13.     case 0: return m_strBaseName;
  14.     case 1: return m_strPathName;
  15.     case 2: return m_strProcessID;
  16.     case 3: return m_strProcessName;
  17.     }
  18.     return CString();
  19. }
  20.  
  21.  
  22. COLORREF CModuleInfo::GetTextColor()
  23. {
  24.     return RGB(0,0,0);
  25. }
  26.  
  27. CString CModuleInfo::GetInfoTip()
  28. {
  29.     return m_strModuleName;
  30. }
  31.  
  32. CModuleInfo::CModuleInfo( LPCTSTR lpszModuleName, DWORD dwProcessID, LPCTSTR lpszProcessName )
  33.     :   m_strModuleName( lpszModuleName ),
  34.         m_dwProcessID( dwProcessID ),
  35.         m_strProcessName( lpszProcessName )
  36. {
  37.     m_strProcessID.Format(_T("%ld"), m_dwProcessID );
  38.     LPTSTR p = tstrrchr( lpszModuleName, _T('\\'));
  39.     if( p )
  40.     {
  41.         m_strBaseName = p+1;
  42.         *p = 0;
  43.         m_strPathName = lpszModuleName;
  44.         *p = _T('\\');
  45.     }
  46. }
  47.  
  48. #define PROCESS_SORT_STRING_METHOD(NAME)                                    \
  49. static int SortBy##NAME(const CModuleInfo** ps1, const CModuleInfo** ps2)   \
  50. {                                                                           \
  51.     return (*ps1)->m_str##NAME.CompareNoCase((*ps2)->m_str##NAME);          \
  52. }
  53.  
  54.  
  55. #define PROCESS_SORT_INTEGER(NAME)                                          \
  56. static int SortBy##NAME(const CModuleInfo** ps1, const CModuleInfo** ps2)   \
  57. {                                                                           \
  58.     return LONG((*ps1)->m_dw##NAME)-LONG((*ps2)->m_dw##NAME);               \
  59. }
  60.  
  61.  
  62. PROCESS_SORT_STRING_METHOD(BaseName)
  63. PROCESS_SORT_STRING_METHOD(PathName)
  64. PROCESS_SORT_INTEGER(ProcessID)
  65. PROCESS_SORT_STRING_METHOD(ProcessName)
  66.  
  67. static GENERICCOMPAREFN SortMethods[] = {
  68.     GENERICCOMPAREFN(&SortByBaseName),
  69.     GENERICCOMPAREFN(&SortByPathName),
  70.     GENERICCOMPAREFN(&SortByProcessID),
  71.     GENERICCOMPAREFN(&SortByProcessName),
  72. };
  73.  
  74.  
  75. CModuleList::CModuleList()
  76.     :   CListViewEntries(SortMethods, _T("ModulesList"))
  77. {
  78.     CreateColumns( _T("Name"), _T("Path"), _T("Process ID"), _T("Process Name"), NULL );
  79.     m_strTitle.Format( TEXT("pserv ") CURRENT_VERSION TEXT(": modules on local machine") );
  80. }
  81.  
  82. BOOL CModuleList::Refresh()
  83. {
  84.     DWORD dwArrayOfProcessIds[1024], dwNeeded;
  85.  
  86.     DeleteObjects(m_Entries);
  87.  
  88.     if( !EnumProcesses( dwArrayOfProcessIds, sizeof(dwArrayOfProcessIds), &dwNeeded ) )
  89.         return FALSE;
  90.  
  91.     // Calculate how many process IDs were returned
  92.     DWORD dwCount = dwNeeded / sizeof(DWORD);
  93.  
  94.     for( DWORD dwIndex = 0; dwIndex < dwCount; dwIndex++ )
  95.     {
  96.         DWORD dwProcessID = dwArrayOfProcessIds[dwIndex];
  97.         if( dwProcessID > 2 )
  98.         {
  99.             HANDLE hProcess = OpenProcess( PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, dwProcessID );
  100.             if( hProcess )
  101.             {
  102.                 HMODULE hArray[1024];
  103.                 DWORD dwNeeded, dwModuleCount;
  104.  
  105.                 CString strProcessName;
  106.  
  107.                 if( EnumProcessModules(hProcess,hArray,sizeof(hArray),&dwNeeded ) )
  108.                 {
  109.                     dwModuleCount = dwNeeded / sizeof(HMODULE);
  110.                     TCHAR szFileName[1024];
  111.                     
  112.                     for( DWORD dwHandleIndex = 0; dwHandleIndex < dwModuleCount; dwHandleIndex++ )
  113.                     {
  114.                         if( GetModuleFileNameEx( hProcess, hArray[dwHandleIndex], szFileName, sizeof(szFileName) ) )
  115.                         {
  116.                             if( (lpfnGetLongPathName != NULL) && 
  117.                                 (tstrchr(szFileName,'~') != NULL) )
  118.                             {
  119.                                 TCHAR szLongPath[1024];
  120.                                 if( lpfnGetLongPathName(szFileName,szLongPath,sizeof(szLongPath)) )
  121.                                 {
  122.                                     lstrcpy(szFileName,szLongPath);
  123.                                 }
  124.                             }
  125.                             if( !dwHandleIndex )
  126.                                 strProcessName = szFileName;
  127.  
  128.                             m_Entries.Add( new CModuleInfo( szFileName, dwProcessID, strProcessName ) );
  129.                         }
  130.                     }
  131.  
  132.                 }
  133.                 CloseHandle( hProcess );
  134.             }
  135.         }
  136.     }
  137.     return TRUE;
  138. }
  139.  
  140. void CModuleList::ConnectTo( LPCTSTR lpszMachine )
  141. {
  142.     // TODO: display error msg here ....
  143.     //m_strServiceMachine = lpszMachine;
  144. }
  145.  
  146. void CModuleList::ExportXmlToFile( CFile* pFile )
  147. {
  148.     PrintToFile(pFile, _T("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"?>\r\n")
  149.               _T("<modules>\r\n") );
  150.                                
  151.     for(int n = 0, nmax = m_Entries.GetSize(); n < nmax; n++ )
  152.     {
  153.         CModuleInfo* p = (CModuleInfo*)m_Entries.GetAt(n);
  154.         PrintToFile(pFile, _T("\t<module>\r\n") );
  155.         PrintToFile(pFile, _T("\t\t<name>%s</name>\r\n"),(LPCTSTR)  XmlEscape(p->m_strBaseName) );
  156.         PrintToFile(pFile, _T("\t\t<path>%s</path>\r\n"), (LPCTSTR) XmlEscape(p->m_strPathName) );
  157.         PrintToFile(pFile, _T("\t</module>\r\n") );
  158.     }
  159.  
  160.     PrintToFile(pFile, _T("</modules>"));
  161. }
  162.  
  163.  
  164. UINT CModuleList::GetContextMenuID()
  165. {
  166.     return IDR_CONTEXTMENU_MODULES;
  167. }
  168.  
  169.