home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / sdktools / winnt / walker / pstat.c < prev    next >
C/C++ Source or Header  |  1997-10-05  |  23KB  |  792 lines

  1.  
  2. /******************************************************************************\
  3. *       This is a part of the Microsoft Source Code Samples. 
  4. *       Copyright (C) 1993-1997 Microsoft Corporation.
  5. *       All rights reserved. 
  6. *       This source code is only intended as a supplement to 
  7. *       Microsoft Development Tools and/or WinHelp documentation.
  8. *       See these sources for detailed information regarding the 
  9. *       Microsoft samples programs.
  10. \******************************************************************************/
  11.  
  12. #include "pwalk.h"
  13.  
  14. #define ONE_K          1024
  15. #define ONE_MEG       1048576
  16.  
  17. extern HFONT         hFont;
  18. extern LPVOID         lpWalkerList;
  19. extern DBGPROCESS    *lpChildProcess;
  20. extern int         yChar;
  21. extern SIZE         sChar0;
  22.  
  23. /* static variables that determine size of 3D status box */
  24. int    xSTATBOX;
  25. int    cxSTATBOX;
  26. int    dxSTATBOX;
  27. int    ySTATBOX;
  28. int    dyuSTATBOX;
  29. int    dylSTATBOX;
  30.  
  31.  
  32.  
  33. void WINAPI TallyProcessStats (HWND, int *, int *, int *);
  34. void WINAPI DrawBorders (HWND, LPPAINTSTRUCT);
  35. void WINAPI DrawStatusText (HWND, LPPAINTSTRUCT, char *, COLORREF);
  36.  
  37.  
  38. /* status window proc */
  39. LONG WINAPI StatusWndProc (
  40.     HWND    hWnd,
  41.     UINT    uMsg,
  42.     WPARAM  wParam,
  43.     LPARAM  lParam)
  44. {
  45.       LONG          lRet = 1;
  46. static      BOOL          bDefault;
  47. static      char          szDefault[MAX_PATH];
  48. static      COLORREF    crText;
  49.  
  50.     switch (uMsg)
  51.     {
  52.     case WM_CREATE:
  53.         {
  54.         RECT    rc;
  55.  
  56.         SetWindowLong (hWnd,
  57.                WXB_HPENHILITE,
  58.                (LONG)CreatePen (PS_SOLID, 0, GetSysColor (COLOR_BTNHIGHLIGHT)));
  59.         SetWindowLong (hWnd,
  60.                WXB_HPENSHADOW,
  61.                (LONG)CreatePen (PS_SOLID, 0, GetSysColor (COLOR_BTNSHADOW)));
  62.  
  63.         /* initialize default status text */
  64.         LoadString (GetModuleHandle (NULL),
  65.             IDS_STATUSREADY,
  66.             szDefault,
  67.             sizeof (szDefault));
  68.         crText = GetSysColor (COLOR_WINDOWTEXT);
  69.  
  70.         /* add rewalk button */
  71.         GetClientRect (GetParent (hWnd), &rc);
  72.         CreateWindow ("button",
  73.               "Rewalk",
  74.               WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  75.               rc.right-74, -1, 75, sChar0.cy+10*GetSystemMetrics (SM_CYBORDER),
  76.               hWnd,
  77.               (HMENU)IDC_REWALK,
  78.               GetModuleHandle (NULL),
  79.               NULL);
  80.  
  81.         bDefault = TRUE;
  82.         }
  83.         break;
  84.  
  85.     case WM_SIZE:
  86.         {
  87.         RECT    rc;
  88.  
  89.         GetClientRect (GetParent (hWnd), &rc);
  90.  
  91.         xSTATBOX = 10 * GetSystemMetrics (SM_CXBORDER);
  92.         cxSTATBOX = rc.right/3 + 50;
  93.         dxSTATBOX = 4 * GetSystemMetrics (SM_CXBORDER);
  94.         ySTATBOX = 2 * GetSystemMetrics (SM_CYBORDER);
  95.         dyuSTATBOX = 1 * GetSystemMetrics (SM_CYBORDER);
  96.         dylSTATBOX = 2 * GetSystemMetrics (SM_CYBORDER);
  97.  
  98.         /* move child windows in view */
  99.         MoveWindow (GetDlgItem (hWnd, IDC_REWALK),
  100.             rc.right-74,
  101.             -1,
  102.             75,
  103.             yChar+10*GetSystemMetrics (SM_CYBORDER),
  104.             TRUE);
  105.  
  106.         /* make sure we repaint correctly */
  107.         InvalidateRect (hWnd, NULL, TRUE);
  108.         }
  109.         break;
  110.  
  111.     case WM_TIMER:
  112.         {
  113.         RECT    rcStatus;
  114.  
  115.         KillTimer (hWnd, IDT_STATUS);
  116.         bDefault = TRUE;
  117.         /* invalidate status text area */
  118.         SetRect (&rcStatus,
  119.              xSTATBOX+1,
  120.              ySTATBOX+1,
  121.              xSTATBOX+cxSTATBOX,
  122.              ySTATBOX+dylSTATBOX+dyuSTATBOX+yChar);
  123.         InvalidateRect (hWnd, &rcStatus, TRUE);
  124.         crText = GetSysColor (COLOR_WINDOWTEXT);
  125.         }
  126.         break;
  127.  
  128.     case WM_SETTEXT:
  129.         {
  130.         RECT    rcStatus;
  131.  
  132.         /* release current string */
  133.         if (GetWindowLong (hWnd, WXB_LPWINDOWTEXT))
  134.         LocalFree ((HLOCAL)GetWindowLong (hWnd, WXB_LPWINDOWTEXT));
  135.         SetWindowLong (hWnd, WXB_LPWINDOWTEXT, 0);
  136.  
  137.         /* if null string, reset to default */
  138.         if ((char *)lParam == NULL)
  139.         {
  140.         bDefault = TRUE;
  141.         crText = GetSysColor (COLOR_WINDOWTEXT);
  142.         }
  143.         else
  144.         {
  145.         crText = (COLORREF)wParam;
  146.  
  147.         /* allocate space for new string */
  148.         SetWindowLong (hWnd,
  149.                    WXB_LPWINDOWTEXT,
  150.                    (LONG)LocalAlloc (LPTR, strlen ((LPSTR)lParam)+1));
  151.         strcpy ((char *)GetWindowLong (hWnd, WXB_LPWINDOWTEXT), (char *)lParam);
  152.  
  153.         /* restart five second timer */
  154.         KillTimer (hWnd, IDT_STATUS);
  155.         SetTimer (hWnd, IDT_STATUS, 5000, NULL);
  156.  
  157.         bDefault = FALSE;
  158.         }
  159.  
  160.         /* invalidate status text area */
  161.         SetRect (&rcStatus,
  162.              xSTATBOX+1,
  163.              ySTATBOX+1,
  164.              xSTATBOX+cxSTATBOX,
  165.              ySTATBOX+dylSTATBOX+dyuSTATBOX+yChar);
  166.         InvalidateRect (hWnd, &rcStatus, TRUE);
  167.         }
  168.         break;
  169.  
  170.     case WM_PAINT:
  171.         {
  172.         PAINTSTRUCT    ps;
  173.         RECT       rc;
  174.  
  175.         BeginPaint (hWnd, &ps);
  176.         GetClientRect (hWnd, &rc);
  177.  
  178.         /* draw 3D effects in window */
  179.         DrawBorders (hWnd, &ps);
  180.  
  181.         /* update text */
  182.         if (bDefault)
  183.         DrawStatusText (hWnd, &ps, szDefault, crText);
  184.         else
  185.         DrawStatusText (hWnd,
  186.                 &ps,
  187.                 (char *)GetWindowLong (hWnd, WXB_LPWINDOWTEXT),
  188.                 crText);
  189.  
  190.         EndPaint (hWnd, &ps);
  191.         }
  192.         break;
  193.  
  194.     /* user defined message for updating child process information */
  195.     case UM_UPDATE:
  196.         EnableWindow (GetDlgItem (hWnd, IDC_REWALK), ((LPVOID)wParam != NULL));
  197.         break;
  198.  
  199.     case WM_COMMAND:
  200.         if (LOWORD (wParam) == IDC_REWALK)
  201.         PostMessage (GetParent (hWnd), WM_COMMAND, IDM_PROCESSREWALK, 0);
  202.         break;
  203.  
  204.     case WM_DESTROY:
  205.         /* free pen objects */
  206.         DeleteObject ((HPEN)GetWindowLong (hWnd, WXB_HPENHILITE));
  207.         DeleteObject ((HPEN)GetWindowLong (hWnd, WXB_HPENSHADOW));
  208.  
  209.         /* free local memory from window text */
  210.         if (GetWindowLong (hWnd, WXB_LPWINDOWTEXT))
  211.         LocalFree ((HLOCAL)GetWindowLong (hWnd, WXB_LPWINDOWTEXT));
  212.         break;
  213.  
  214.     default:
  215.         lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
  216.         break;
  217.     }
  218.  
  219.     return lRet;
  220. }
  221.  
  222.  
  223.  
  224.  
  225. /* system statistics window proc */
  226. LONG WINAPI SysStatWndProc (
  227.     HWND    hWnd,
  228.     UINT    uMsg,
  229.     WPARAM  wParam,
  230.     LPARAM  lParam)
  231. {
  232.     LONG    lRet = 1;
  233.  
  234. static      MEMORYSTATUS      msInfo, msInfoOld;
  235. static      SYSTEM_INFO      sysInfo, sysInfoOld;
  236. static      DWORD       dwFreeDiskOld, dwFreeDisk;
  237. static      DWORD       dwTotalDiskOld, dwTotalDisk;
  238.  
  239.     switch (uMsg)
  240.     {
  241.     case WM_CREATE:
  242.         /* get system info */
  243.         GlobalMemoryStatus (&msInfo);
  244.         GetSystemInfo (&sysInfo);
  245.         GetFreeDiskSpace (&dwTotalDisk, &dwFreeDisk);
  246.  
  247.         /* update old data with current data */
  248.         msInfoOld = msInfo;
  249.         sysInfoOld = sysInfo;
  250.         dwTotalDiskOld = dwTotalDisk;
  251.         dwFreeDiskOld = dwFreeDisk;
  252.  
  253.         /* create buttons controls */
  254.         CreateWindow ("button",
  255.               "Refresh",
  256.               WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
  257.               100, 210, 75, 25,
  258.               hWnd,
  259.               (HMENU)IDC_REFRESH,
  260.               GetModuleHandle (NULL),
  261.               NULL);
  262.  
  263.         CreateWindow ("button",
  264.               "Cancel",
  265.               WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  266.               205, 210, 75, 25,
  267.               hWnd,
  268.               (HMENU)IDC_CANCEL,
  269.               GetModuleHandle (NULL),
  270.               NULL);
  271.         break;
  272.  
  273.     case WM_CHAR:
  274.         switch (wParam)
  275.         {
  276.         case VK_RETURN:
  277.             GlobalMemoryStatus (&msInfo);
  278.             GetSystemInfo (&sysInfo);
  279.             GetFreeDiskSpace (&dwTotalDisk, &dwFreeDisk);
  280.             InvalidateRect (hWnd, NULL, TRUE);
  281.             UpdateWindow (hWnd);
  282.             break;
  283.  
  284.         case VK_ESCAPE:
  285.             DestroyWindow (hWnd);
  286.             break;
  287.         }
  288.         break;
  289.  
  290.     case WM_COMMAND:
  291.         switch (LOWORD (wParam))
  292.         {
  293.         case IDC_REFRESH:
  294.             /* save previous values */
  295.             msInfoOld = msInfo;
  296.             sysInfoOld = sysInfo;
  297.             dwTotalDiskOld = dwTotalDisk;
  298.             dwFreeDiskOld = dwFreeDisk;
  299.  
  300.             /* get current values */
  301.             GlobalMemoryStatus (&msInfo);
  302.             GetSystemInfo (&sysInfo);
  303.             GetFreeDiskSpace (&dwTotalDisk, &dwFreeDisk);
  304.             InvalidateRect (hWnd, NULL, TRUE);
  305.             UpdateWindow (hWnd);
  306.             break;
  307.  
  308.         case IDC_CANCEL:
  309.             DestroyWindow (hWnd);
  310.             break;
  311.         }
  312.         break;
  313.  
  314.  
  315.     case WM_PAINT:
  316.         {
  317.         PAINTSTRUCT    ps;
  318.         char       szText[100];
  319.         HFONT       hOldFont;
  320.         int        nLen;
  321.         SIZE       size;
  322.         POINT       pt;
  323.         COLORREF       crText;
  324.  
  325.         BeginPaint (hWnd, &ps);
  326.  
  327.         /* set background mode to transparent */
  328.         SetBkMode (ps.hdc, TRANSPARENT);
  329.         hOldFont = SelectObject (ps.hdc, hFont);
  330.  
  331.         /* draw vertical separating line */
  332.         MoveToEx (ps.hdc, 395, 5, &pt);
  333.         LineTo (ps.hdc, 395, 200);
  334.  
  335.         /* refresh change header */
  336.         wsprintf (szText, "%13s", "current value");
  337.         SetRect (&(ps.rcPaint), 0, 5, 395, 20);
  338.         ExtTextOut (ps.hdc, 275, 5, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  339.  
  340.         /* refresh change header */
  341.         wsprintf (szText, "%10s", "changed by");
  342.         SetRect (&(ps.rcPaint), 395, 5, 500, 20);
  343.         ExtTextOut (ps.hdc, 400, 5, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  344.  
  345.         /* memory load statistic */
  346.         nLen = wsprintf (szText, "%30s     %10lu", "Relative memory load [0-100]: ", msInfo.dwMemoryLoad);
  347.         GetTextExtentPoint (ps.hdc, szText, nLen, &size);
  348.         SetRect (&(ps.rcPaint), 0, 20, 395, 35);
  349.         ExtTextOut (ps.hdc, 10, 20, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  350.         if (msInfo.dwMemoryLoad > msInfoOld.dwMemoryLoad)
  351.         {
  352.         crText = SetTextColor (ps.hdc, RGB (0, 100, 0));
  353.         wsprintf (szText, "+%-1lu", (msInfo.dwMemoryLoad-msInfoOld.dwMemoryLoad));
  354.         SetRect (&(ps.rcPaint), 395, 20, 500, 35);
  355.         ExtTextOut (ps.hdc, 400, 20, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  356.         SetTextColor (ps.hdc, crText);
  357.         }
  358.         else if (msInfo.dwMemoryLoad < msInfoOld.dwMemoryLoad)
  359.         {
  360.         crText = SetTextColor (ps.hdc, RGB (100, 0, 0));
  361.         wsprintf (szText, "-%-1lu", (msInfoOld.dwMemoryLoad-msInfo.dwMemoryLoad));
  362.         SetRect (&(ps.rcPaint), 395, 20, 500, 65);
  363.         ExtTextOut (ps.hdc, 400, 20, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  364.         SetTextColor (ps.hdc, crText);
  365.         }
  366.  
  367.         /* pagesize */
  368.         nLen = wsprintf (szText, "%22s             %10lub", "Pagesize granularity: ", sysInfo.dwPageSize);
  369.         GetTextExtentPoint (ps.hdc, szText, nLen, &size);
  370.         SetRect (&(ps.rcPaint), 0, 35, 395, 50);
  371.         ExtTextOut (ps.hdc, 10, 35, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  372.  
  373.         /* total physical memory */
  374.         nLen = wsprintf (szText, "%23s            %10luKb", "Total physical memory: ", msInfo.dwTotalPhys/ONE_K);
  375.         GetTextExtentPoint (ps.hdc, szText, nLen, &size);
  376.         SetRect (&(ps.rcPaint), 0, 50, 395, 65);
  377.         ExtTextOut (ps.hdc, 10, 50, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  378.  
  379.         /* available physical memory */
  380.         nLen = wsprintf (szText, "%27s        %10luKb", "Available physical memory: ", msInfo.dwAvailPhys/ONE_K);
  381.         GetTextExtentPoint (ps.hdc, szText, nLen, &size);
  382.         SetRect (&(ps.rcPaint), 0, 65, 395, 80);
  383.         ExtTextOut (ps.hdc, 10, 65, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  384.         if (msInfo.dwAvailPhys > msInfoOld.dwAvailPhys)
  385.         {
  386.         crText = SetTextColor (ps.hdc, RGB (0, 100, 0));
  387.         wsprintf (szText, "+%-1luKb", (msInfo.dwAvailPhys-msInfoOld.dwAvailPhys)/ONE_K);
  388.         SetRect (&(ps.rcPaint), 395, 65, 500, 80);
  389.         ExtTextOut (ps.hdc, 400, 65, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  390.         SetTextColor (ps.hdc, crText);
  391.         }
  392.         else if (msInfo.dwAvailPhys < msInfoOld.dwAvailPhys)
  393.         {
  394.         crText = SetTextColor (ps.hdc, RGB (100, 0, 0));
  395.         wsprintf (szText, "-%-1luKb", (msInfoOld.dwAvailPhys-msInfo.dwAvailPhys)/ONE_K);
  396.         SetRect (&(ps.rcPaint), 395, 65, 500, 80);
  397.         ExtTextOut (ps.hdc, 400, 65, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  398.         SetTextColor (ps.hdc, crText);
  399.         }
  400.  
  401.         /* total pagefile space */
  402.         nLen = wsprintf (szText, "%24s           %10luMb", "Maximum pagefile space: ", msInfo.dwTotalPageFile/ONE_MEG);
  403.         GetTextExtentPoint (ps.hdc, szText, nLen, &size);
  404.         SetRect (&(ps.rcPaint), 0, 80, 395, 95);
  405.         ExtTextOut (ps.hdc, 10, 80, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  406.         if (msInfo.dwTotalPageFile > msInfoOld.dwTotalPageFile)
  407.         {
  408.         crText = SetTextColor (ps.hdc, RGB (0, 100, 0));
  409.         wsprintf (szText, "+%-1luMb", (msInfo.dwTotalPageFile-msInfoOld.dwTotalPageFile)/ONE_MEG);
  410.         SetRect (&(ps.rcPaint), 395, 80, 500, 95);
  411.         ExtTextOut (ps.hdc, 400, 80, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  412.         SetTextColor (ps.hdc, crText);
  413.         }
  414.         else if (msInfo.dwTotalPageFile < msInfoOld.dwTotalPageFile)
  415.         {
  416.         crText = SetTextColor (ps.hdc, RGB (100, 0, 0));
  417.         wsprintf (szText, "-%-1luMb", (msInfoOld.dwTotalPageFile-msInfo.dwTotalPageFile)/ONE_MEG);
  418.         SetRect (&(ps.rcPaint), 395, 80, 500, 95);
  419.         ExtTextOut (ps.hdc, 400, 65, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  420.         SetTextColor (ps.hdc, crText);
  421.         }
  422.  
  423.         /* available pagefile space */
  424.         nLen = wsprintf (szText, "%26s         %10luMb", "Available pagefile space: ", (msInfo.dwAvailPageFile)/ONE_MEG);
  425.         GetTextExtentPoint (ps.hdc, szText, nLen, &size);
  426.         SetRect (&(ps.rcPaint), 0, 95, 395, 110);
  427.         ExtTextOut (ps.hdc, 10, 95, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  428.         if (msInfo.dwAvailPageFile > msInfoOld.dwAvailPageFile)
  429.         {
  430.         crText = SetTextColor (ps.hdc, RGB (0, 100, 0));
  431.         wsprintf (szText, "+%-1luKb", (msInfo.dwAvailPageFile-msInfoOld.dwAvailPageFile)/ONE_K);
  432.         SetRect (&(ps.rcPaint), 395, 95, 500, 110);
  433.         ExtTextOut (ps.hdc, 400, 95, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  434.         SetTextColor (ps.hdc, crText);
  435.         }
  436.         else if (msInfo.dwAvailPageFile < msInfoOld.dwAvailPageFile)
  437.         {
  438.         crText = SetTextColor (ps.hdc, RGB (100, 0, 0));
  439.         wsprintf (szText, "-%-1luKb", (msInfoOld.dwAvailPageFile-msInfo.dwAvailPageFile)/ONE_K);
  440.         SetRect (&(ps.rcPaint), 395, 95, 500, 110);
  441.         ExtTextOut (ps.hdc, 400, 95, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  442.         SetTextColor (ps.hdc, crText);
  443.         }
  444.  
  445.         /* total virtual address space */
  446.         nLen = wsprintf (szText, "%29s      %10luMb", "Total virtual address space: ", msInfo.dwTotalVirtual/ONE_MEG);
  447.         GetTextExtentPoint (ps.hdc, szText, nLen, &size);
  448.         SetRect (&(ps.rcPaint), 0, 110, 395, 125);
  449.         ExtTextOut (ps.hdc, 10, 110, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  450.  
  451.         /* available virtual address space */
  452.         nLen = wsprintf (szText, "%33s  %10luMb", "Available virtual address space: ", msInfo.dwAvailVirtual/ONE_MEG);
  453.         GetTextExtentPoint (ps.hdc, szText, nLen, &size);
  454.         SetRect (&(ps.rcPaint), 0, 125, 395, 140);
  455.         ExtTextOut (ps.hdc, 10, 125, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  456.  
  457.         /* lowest available virtual address */
  458.         nLen = wsprintf (szText, "%25s            %#08lx", "Minimum virtual address: ", sysInfo.lpMinimumApplicationAddress);
  459.         GetTextExtentPoint (ps.hdc, szText, nLen, &size);
  460.         SetRect (&(ps.rcPaint), 0, 140, 395, 155);
  461.         ExtTextOut (ps.hdc, 10, 140, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  462.  
  463.         /* highest available virtual address */
  464.         nLen = wsprintf (szText, "%25s            %#08lx", "Maximum virtual address: ", sysInfo.lpMaximumApplicationAddress);
  465.         GetTextExtentPoint (ps.hdc, szText, nLen, &size);
  466.         SetRect (&(ps.rcPaint), 0, 155, 395, 170);
  467.         ExtTextOut (ps.hdc, 10, 155, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  468.  
  469.         /* total disk space */
  470.         nLen = wsprintf (szText, "%24s           %10luMb", "Total local disk space: ", dwTotalDisk/ONE_MEG);
  471.         GetTextExtentPoint (ps.hdc, szText, nLen, &size);
  472.         SetRect (&(ps.rcPaint), 0, 170, 395, 185);
  473.         ExtTextOut (ps.hdc, 10, 170, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  474.  
  475.         /* free disk disk space */
  476.         nLen = wsprintf (szText, "%23s            %10luMb", "Free local disk space: ", dwFreeDisk/ONE_MEG);
  477.         GetTextExtentPoint (ps.hdc, szText, nLen, &size);
  478.         SetRect (&(ps.rcPaint), 0, 185, 395, 200);
  479.         ExtTextOut (ps.hdc, 10, 185, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  480.         if (dwFreeDisk > dwFreeDiskOld)
  481.         {
  482.         crText = SetTextColor (ps.hdc, RGB (0, 100, 0));
  483.         wsprintf (szText, "+%-1luMb", (dwFreeDisk-dwFreeDiskOld)/ONE_MEG);
  484.         SetRect (&(ps.rcPaint), 395, 185, 500, 200);
  485.         ExtTextOut (ps.hdc, 400, 185, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  486.         SetTextColor (ps.hdc, crText);
  487.         }
  488.         else if (dwFreeDisk < dwFreeDiskOld)
  489.         {
  490.         crText = SetTextColor (ps.hdc, RGB (100, 0, 0));
  491.         wsprintf (szText, "-%-1luMb", (dwFreeDiskOld-dwFreeDisk)/ONE_MEG);
  492.         SetRect (&(ps.rcPaint), 395, 185, 500, 200);
  493.         ExtTextOut (ps.hdc, 400, 185, ETO_CLIPPED, &(ps.rcPaint), szText, strlen (szText), 0);
  494.         SetTextColor (ps.hdc, crText);
  495.         }
  496.  
  497.         /* replace old font */
  498.         SelectObject (ps.hdc, hOldFont);
  499.         EndPaint (hWnd, &ps);
  500.         }
  501.         break;
  502.  
  503.     default:
  504.         lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
  505.     }
  506.  
  507.     return lRet;
  508. }
  509.  
  510.  
  511.  
  512.  
  513. /* process statistics window proc */
  514. LONG WINAPI ProStatWndProc (
  515.     HWND    hWnd,
  516.     UINT    uMsg,
  517.     WPARAM  wParam,
  518.     LPARAM  lParam)
  519. {
  520.       LONG      lRet = 1;
  521. static      int     nTotalFree, nTotalCommit, nTotalReserve;
  522.  
  523.     switch (uMsg)
  524.     {
  525.     case WM_CREATE:
  526.         {
  527.         /* create buttons controls */
  528.         CreateWindow ("button",
  529.               "Refresh",
  530.               WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
  531.               45, 55, 75, 25,
  532.               hWnd,
  533.               (HMENU)IDC_REFRESH,
  534.               GetModuleHandle (NULL),
  535.               NULL);
  536.  
  537.         CreateWindow ("button",
  538.               "Rewalk",
  539.               WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
  540.               140, 55, 75, 25,
  541.               hWnd,
  542.               (HMENU)IDM_PROCESSREWALK,
  543.               GetModuleHandle (NULL),
  544.               NULL);
  545.  
  546.         CreateWindow ("button",
  547.               "Cancel",
  548.               WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  549.               235, 55, 75, 25,
  550.               hWnd,
  551.               (HMENU)IDC_CANCEL,
  552.               GetModuleHandle (NULL),
  553.               NULL);
  554.  
  555.         /* tally process statictics */
  556.         TallyProcessStats (hWnd, &nTotalFree, &nTotalReserve, &nTotalCommit);
  557.         }
  558.         break;
  559.  
  560.     case WM_CHAR:
  561.         switch (wParam)
  562.         {
  563.         case VK_RETURN:
  564.             InvalidateRect (hWnd, NULL, TRUE);
  565.             UpdateWindow (hWnd);
  566.             break;
  567.  
  568.         case VK_ESCAPE:
  569.             DestroyWindow (hWnd);
  570.             break;
  571.         }
  572.         break;
  573.  
  574.     case WM_PAINT:
  575.         {
  576.         PAINTSTRUCT    ps;
  577.         HFONT       hOldFont;
  578.         char       szText[100];
  579.  
  580.         BeginPaint (hWnd, &ps);
  581.         hOldFont = SelectObject (ps.hdc, hFont);
  582.         SetBkMode (ps.hdc, TRANSPARENT);
  583.  
  584.         /* total free memory */
  585.         wsprintf (szText,
  586.               "%19s          %10luKb",
  587.               "Total free memory: ",
  588.               nTotalFree/ONE_K);
  589.         SetRect (&(ps.rcPaint), ps.rcPaint.left, 0, ps.rcPaint.right, 20);
  590.         ExtTextOut (ps.hdc,
  591.             10,
  592.             5,
  593.             ETO_CLIPPED,
  594.             &(ps.rcPaint),
  595.             szText,
  596.             strlen (szText),
  597.             0);
  598.  
  599.         /* total committed memory */
  600.         wsprintf (szText,
  601.               "%24s     %10luKb",
  602.               "Total committed memory: ",
  603.               nTotalCommit/ONE_K);
  604.         SetRect (&(ps.rcPaint), ps.rcPaint.left, 20, ps.rcPaint.right, 35);
  605.         ExtTextOut (ps.hdc,
  606.             10,
  607.             20,
  608.             ETO_CLIPPED,
  609.             &(ps.rcPaint),
  610.             szText,
  611.             strlen (szText),
  612.             0);
  613.  
  614.         /* total reserved memory */
  615.         wsprintf (szText,
  616.               "%22s       %10luKb",
  617.               "Total reserved memory:",
  618.               nTotalReserve/ONE_K);
  619.         SetRect (&(ps.rcPaint), ps.rcPaint.left, 35, ps.rcPaint.right, 50);
  620.         ExtTextOut (ps.hdc,
  621.             10,
  622.             35,
  623.             ETO_CLIPPED,
  624.             &(ps.rcPaint),
  625.             szText,
  626.             strlen (szText),
  627.             0);
  628.  
  629.         SelectObject (ps.hdc, hOldFont);
  630.         EndPaint (hWnd, &ps);
  631.         }
  632.         break;
  633.  
  634.     case WM_COMMAND:
  635.         switch (LOWORD (wParam))
  636.         {
  637.         case IDM_PROCESSREWALK:
  638.             {
  639.             /* send message to parent to rewalk process */
  640.             SendMessage (GetParent (hWnd), uMsg, wParam, lParam);
  641.  
  642.             /* tally new process statistics */
  643.             TallyProcessStats (hWnd, &nTotalFree, &nTotalReserve, &nTotalCommit);
  644.  
  645.             InvalidateRect (hWnd, NULL, TRUE);
  646.             UpdateWindow (hWnd);
  647.             }
  648.             break;
  649.  
  650.         case IDC_REFRESH:
  651.             InvalidateRect (hWnd, NULL, TRUE);
  652.             UpdateWindow (hWnd);
  653.             break;
  654.  
  655.         case IDC_CANCEL:
  656.             DestroyWindow (hWnd);
  657.             break;
  658.         }
  659.         break;
  660.  
  661.     default:
  662.         lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
  663.     }
  664.  
  665.     return lRet;
  666. }
  667.  
  668.  
  669.  
  670.  
  671. /* determine process statistics from existing information */
  672. void WINAPI TallyProcessStats (
  673.     HWND    hWnd,
  674.     int     *nTotalFree,
  675.     int     *nTotalReserve,
  676.     int     *nTotalCommit)
  677. {
  678.     LPVMOBJECT      lpVMO = (LPVMOBJECT)lpWalkerList;
  679.     int       nRegions, i;
  680.  
  681.     *nTotalFree = 0;
  682.     *nTotalCommit = 0;
  683.     *nTotalReserve = 0;
  684.  
  685.     /* determine number of memory regions by number of entries in listbox */
  686.     nRegions = (int)SendMessage (GetWindow (GetParent (hWnd), GW_CHILD),
  687.                  LB_GETCOUNT,
  688.                  0,
  689.                  0);
  690.  
  691.     /* get stats for all memory regions in process */
  692.     for (i=0; i<nRegions; i++)
  693.     {
  694.     if (lpVMO[i].mbi.State & MEM_FREE)
  695.         *nTotalFree += lpVMO[i].mbi.RegionSize;
  696.     else if (lpVMO[i].mbi.State & MEM_COMMIT)
  697.         *nTotalCommit += lpVMO[i].mbi.RegionSize;
  698.     else
  699.         *nTotalReserve += lpVMO[i].mbi.RegionSize;
  700.     }
  701. }
  702.  
  703.  
  704.  
  705.  
  706. void WINAPI DrawBorders (
  707.     HWND         hWnd,
  708.     LPPAINTSTRUCT    lpps)
  709. {
  710.     POINT       pt;
  711.     HPEN       hOldPen;
  712.  
  713.  
  714.  
  715.     /* draw window hilites for 3D affect */
  716.     hOldPen = SelectObject (lpps->hdc, (HPEN)GetWindowLong (hWnd, WXB_HPENHILITE));
  717.     /* top line across window */
  718.     MoveToEx (lpps->hdc, lpps->rcPaint.left, lpps->rcPaint.top, &pt);
  719.     LineTo (lpps->hdc, lpps->rcPaint.right, lpps->rcPaint.top);
  720.     /* bottom line in status box */
  721.     MoveToEx (lpps->hdc,
  722.           xSTATBOX,
  723.           ySTATBOX+yChar+dyuSTATBOX+dylSTATBOX,
  724.           &pt);
  725.     LineTo (lpps->hdc,
  726.         xSTATBOX+cxSTATBOX,
  727.         ySTATBOX+yChar+dylSTATBOX+dyuSTATBOX);
  728.     /* right line in status box */
  729.     MoveToEx (lpps->hdc, xSTATBOX+cxSTATBOX, ySTATBOX, &pt);
  730.     LineTo (lpps->hdc,
  731.         xSTATBOX+cxSTATBOX,
  732.         ySTATBOX+yChar+dylSTATBOX+dyuSTATBOX+1);
  733.  
  734.     /* draw window shadows for 3D affect */
  735.     hOldPen = SelectObject (lpps->hdc, (HPEN)GetWindowLong (hWnd, WXB_HPENSHADOW));
  736.     /* top line in status box */
  737.     MoveToEx (lpps->hdc, xSTATBOX, ySTATBOX, &pt);
  738.     LineTo (lpps->hdc, xSTATBOX+cxSTATBOX+1, ySTATBOX);
  739.     /* left line in status box */
  740.     MoveToEx (lpps->hdc, xSTATBOX, ySTATBOX, &pt);
  741.     LineTo (lpps->hdc, xSTATBOX, ySTATBOX+yChar+dylSTATBOX+dyuSTATBOX+1);
  742.  
  743.     SelectObject (lpps->hdc, hOldPen);
  744. }
  745.  
  746.  
  747.  
  748.  
  749. void WINAPI DrawStatusText (
  750.     HWND         hWnd,
  751.     LPPAINTSTRUCT    lpps,
  752.     char         *lpszText,
  753.     COLORREF         crText)
  754. {
  755.     HFONT   hOldFont = SelectObject (lpps->hdc, hFont);
  756.     RECT    rcStatus;
  757.  
  758.     SetBkColor (lpps->hdc, GetSysColor (COLOR_BTNFACE));
  759.     SetTextColor (lpps->hdc, crText);
  760.  
  761.     SetRect (&rcStatus,
  762.          xSTATBOX+1,
  763.          ySTATBOX+1,
  764.          xSTATBOX+cxSTATBOX,
  765.          ySTATBOX+dylSTATBOX+dyuSTATBOX+yChar);
  766.  
  767.     ExtTextOut (lpps->hdc,
  768.         xSTATBOX+dxSTATBOX,
  769.         ySTATBOX+dyuSTATBOX,
  770.         ETO_OPAQUE | ETO_CLIPPED,
  771.         &rcStatus,
  772.         lpszText,
  773.         strlen (lpszText),
  774.         NULL);
  775.  
  776.     SelectObject (lpps->hdc, hOldFont);
  777. }
  778.  
  779.  
  780.  
  781.  
  782. void WINAPI SetStatusText (
  783.     HWND    hWnd,
  784.     int     nIDS_STATUS,
  785.     COLORREF    crText)
  786. {
  787.     char    szStatus[MAX_PATH];
  788.  
  789.     LoadString (GetModuleHandle (NULL), nIDS_STATUS, szStatus, sizeof (szStatus));
  790.     SendMessage (GetDlgItem (hWnd, IDC_STATUSWND), WM_SETTEXT, crText, (LONG)szStatus);
  791. }
  792.