home *** CD-ROM | disk | FTP | other *** search
/ Windows Graphics Programming / Feng_Yuan_Win32_GDI_DirectX.iso / Samples / Chapt_07 / GDIObj / GDIObj.cpp next >
Encoding:
C/C++ Source or Header  |  2000-05-20  |  6.0 KB  |  229 lines

  1. //-----------------------------------------------------------------------------------//
  2. //              Windows Graphics Programming: Win32 GDI and DirectDraw               //
  3. //                             ISBN  0-13-086985-6                                   //
  4. //                                                                                   //
  5. //  Written            by  Yuan, Feng                             www.fengyuan.com   //
  6. //  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
  7. //  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
  8. //                                                                                   //
  9. //  FileName   : gdiobj.cpp                                                             //
  10. //  Description: GDI object table monitoring tool, Windows NT/2000, Chapter 7        //
  11. //  Version    : 1.00.000, May 31, 2000                                              //
  12. //-----------------------------------------------------------------------------------//
  13.  
  14. #define STRICT
  15. #define WIN32_LEAN_AND_MEAN
  16.  
  17. #include <windows.h>
  18. #include <vector>
  19. #include <stdio.h>
  20. #include <psapi.h> 
  21. #include <tchar.h>
  22.  
  23. void GetProcessName(DWORD processID, TCHAR szProcessName[])
  24. {
  25.     _tcscpy(szProcessName, _T("unknown"));
  26.  
  27.     // Get a handle to the process.
  28.     HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
  29.                                    FALSE, processID );
  30.  
  31.     if ( hProcess==NULL )
  32.         return;
  33.     
  34.     HMODULE hMod;
  35.     DWORD cbNeeded;
  36.  
  37.     if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
  38.        GetModuleBaseName( hProcess, hMod, szProcessName, MAX_PATH );
  39.  
  40.     CloseHandle( hProcess );
  41. }
  42.  
  43.  
  44. #include "..\..\include\Dialog.h"
  45. #include "..\..\include\ListView.h"
  46. #include "..\..\include\GDITable.h"
  47.  
  48. #include "resource.h"
  49.  
  50. typedef struct
  51. {
  52.     DWORD    processid;
  53.     int     nObject[7];
  54.     int     nNew   [7];
  55. }    ProcessInfo;
  56.  
  57. using namespace std;
  58.  
  59. class KGDIObjectTable : public KDialog
  60. {
  61.     KListView   m_process;
  62.     KGDITable   m_gditable;
  63.  
  64.     vector<ProcessInfo> m_info;
  65.  
  66.     void UpdateTable(void);
  67.  
  68.     virtual BOOL DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  69.     {
  70.         switch (uMsg)
  71.         {
  72.             case WM_INITDIALOG:
  73.                 m_hWnd = hWnd;
  74.  
  75.                 m_process.FromDlgItem(hWnd, IDC_PROCESS);
  76.  
  77.                 m_process.AddColumn(0, 40,  "PID");
  78.                 m_process.AddColumn(1, 100, "Process");
  79.  
  80.                 m_process.AddColumn(2, 50, "Total");
  81.                 m_process.AddColumn(3, 40, "DC");
  82.                 m_process.AddColumn(4, 50, "Region");
  83.                 m_process.AddColumn(5, 45, "Bitmap");
  84.                 m_process.AddColumn(6, 50, "Palette");
  85.                 m_process.AddColumn(7, 40, "Font");
  86.                 m_process.AddColumn(8, 45, "Brush");
  87.                 m_process.AddColumn(9, 45, "Other");
  88.  
  89.                 UpdateTable();
  90.                 SetTimer(hWnd, 101, 1000, NULL);
  91.                 return TRUE;
  92.  
  93.             case WM_COMMAND:
  94.                 switch ( LOWORD(wParam) )
  95.                 {
  96.                     case IDOK:
  97.                         EndDialog(hWnd, 1);
  98.                         return TRUE;
  99.                 }
  100.  
  101.             case WM_TIMER:
  102.                 UpdateTable();
  103.         }
  104.  
  105.         return FALSE;
  106.     }
  107.  
  108. };
  109.  
  110. typedef enum
  111. {
  112.     DEF_TYPE    = 0,
  113.     DC_TYPE     = 1,
  114.     UNUSED1     = 2,
  115.     UNUSED2     = 3,
  116.     RGN_TYPE    = 4,
  117.     SURF_TYPE   = 5,
  118.     CLIOBJ_TYPE = 6,
  119.     PATH_TYPE   = 7,
  120.     PAL_TYPE    = 8,
  121.     ICMLCS_TYPE = 9,
  122.     LFONT_TYPE  = 10,
  123.     RFONT_TYPE  = 11,
  124.     PFE_TYPE    = 12,
  125.     PFT_TYPE    = 13,
  126.     ICMCXF_TYPE = 14,
  127.     ICMDLL_TYPE = 15,
  128.     BRUSH_TYPE  = 16,
  129.     UNUSED3     = 17,
  130.     UNUSED4     = 18,
  131.     SPACE_TYPE  = 19,
  132.     UNUSED5     = 20,
  133.     META_TYPE   = 21,
  134.     EFSTATE_TYPE= 22,
  135.     BMFD_TYPE   = 23,
  136.     VTFD_TYPE   = 24,
  137.     TTFD_TYPE   = 25,
  138.     RC_TYPE     = 26,
  139.     TEMP_TYPE   = 27,
  140.     DRVOBJ_TYPE = 28,
  141.     DCIOBJ_TYPE = 29,
  142.     SPOOL_TYPE  = 30
  143. };
  144.  
  145. const int MAXGDIHANDLE = 16384;
  146.  
  147. void KGDIObjectTable::UpdateTable(void)
  148. {
  149.     // clear nNew array for an updating
  150.     for (int i=0; i<m_info.size(); i++)
  151.         memset(m_info[i].nNew, 0, sizeof(m_info[i].nNew));
  152.  
  153.     for (i=0; i<MAXGDIHANDLE; i++) // all GDI handles
  154.     {
  155.         GDITableCell cell = m_gditable[i];
  156.         cell._nProcess = m_gditable.GetProcess(i);
  157.         cell._nCount   = m_gditable.GetCount(i);
  158.  
  159.         // if kernel object point is invalid, object is deleted
  160.         if ( (unsigned) cell.pKernel < 0x80000000 )
  161.             continue;
  162.  
  163.         // search for the processid in m_info table
  164.         int k = -1;
  165.         
  166.         for (int j=0; j<m_info.size(); j++)
  167.             if ( m_info[j].processid == cell._nProcess )
  168.             {
  169.                 k = j;
  170.                 break;
  171.             }
  172.  
  173.         if ( k==-1) 
  174.         {
  175.             ProcessInfo pi = { 0 };
  176.  
  177.             m_info.push_back(pi);
  178.             k = m_info.size() - 1;
  179.             
  180.             m_info[k].processid = cell._nProcess;
  181.         
  182.             TCHAR szPath[MAX_PATH];
  183.             GetProcessName(m_info[k].processid, szPath);
  184.             // new process in listview
  185.             m_process.AddItem(0, m_info[k].processid);
  186.             m_process.AddItem(1, szPath);
  187.         }
  188.  
  189.         switch ( cell.nType & 0x1F ) // 0..31
  190.         {
  191.             case DC_TYPE   : m_info[k].nNew[0] ++; break;
  192.             case RGN_TYPE  : m_info[k].nNew[1] ++; break;
  193.             case SURF_TYPE : m_info[k].nNew[2] ++; break;
  194.             case PAL_TYPE  : m_info[k].nNew[3] ++; break;
  195.             case LFONT_TYPE: m_info[k].nNew[4] ++; break;
  196.             case BRUSH_TYPE: m_info[k].nNew[5] ++; break;
  197.             default       :  m_info[k].nNew[6] ++; break;
  198.         }
  199.     }
  200.  
  201.     // update any changed process
  202.     for (i=0; i<m_info.size(); i++)
  203.         // if changed
  204.         if ( memcmp(m_info[i].nObject, m_info[i].nNew, sizeof(m_info[i].nNew)) )
  205.         {
  206.             memcpy(m_info[i].nObject, m_info[i].nNew, sizeof(m_info[i].nNew));
  207.  
  208.             m_process.SetItem(i, 2, 
  209.                 m_info[i].nObject[0] + m_info[i].nObject[1] +
  210.                 m_info[i].nObject[2] + m_info[i].nObject[3] +
  211.                 m_info[i].nObject[4] + m_info[i].nObject[5] +
  212.                 m_info[i].nObject[6]);
  213.         
  214.             m_process.SetItem(i, 3, m_info[i].nObject[0]);
  215.             m_process.SetItem(i, 4, m_info[i].nObject[1]);
  216.             m_process.SetItem(i, 5, m_info[i].nObject[2]);
  217.             m_process.SetItem(i, 6, m_info[i].nObject[3]);
  218.             m_process.SetItem(i, 7, m_info[i].nObject[4]);
  219.             m_process.SetItem(i, 8, m_info[i].nObject[5]);
  220.             m_process.SetItem(i, 9, m_info[i].nObject[6]);
  221.         }
  222. }
  223.  
  224. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int)
  225. {
  226.     KGDIObjectTable gdiobj;
  227.  
  228.     return gdiobj.Dialogbox(hInstance, MAKEINTRESOURCE(IDD_GDIOBJ));
  229. }