Annotation of mstools/samples/sdktools/pviewer/pviewer.c, revision 1.1.1.1

1.1       root        1: 
                      2: /******************************************************************************\
                      3: *       This is a part of the Microsoft Source Code Samples. 
                      4: *       Copyright (C) 1993 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: 
                     13: /******************************************************************************
                     14: 
                     15:                         P R O C E S S   V I E W E R
                     16: 
                     17:     Name:       pviewer.c
                     18: 
                     19:     Description:
                     20:         This program demonstrates the usage of special registry APIs
                     21:         for collecting performance data.
                     22: 
                     23:         C files used in this app:
                     24:             pviewer.c       - this file
                     25:             pviewdat.c      - updates the dialog
                     26:             objdata.c       - access performance data objects
                     27:             instdata.c      - access performance data instances
                     28:             cntrdata.c      - access performance data counters
                     29: 
                     30: ******************************************************************************/
                     31: 
                     32: 
                     33: 
                     34: 
                     35: #include <windows.h>
                     36: #include <winperf.h>
                     37: #include "perfdata.h"
                     38: #include "pviewdat.h"
                     39: #include "pviewdlg.h"
                     40: #include <string.h>
                     41: #include <stdio.h>
                     42: 
                     43: 
                     44: 
                     45: #define INDEX_STR_LEN       10
                     46: #define MACHINE_NAME_LEN    MAX_COMPUTERNAME_LENGTH+2
                     47: #define MACHINE_NAME_SIZE   MACHINE_NAME_LEN+1
                     48: 
                     49: 
                     50: /****
                     51: Globals
                     52: ****/
                     53: 
                     54: TCHAR           INDEX_PROCTHRD_OBJ[2*INDEX_STR_LEN];
                     55: TCHAR           INDEX_COSTLY_OBJ[3*INDEX_STR_LEN];
                     56: 
                     57: TCHAR           gszMachineName[MACHINE_NAME_SIZE];
                     58: TCHAR           gszCurrentMachine[MACHINE_NAME_SIZE];
                     59: 
                     60: DWORD           gPerfDataSize = 50*1024;            // start with 50K
                     61: PPERF_DATA      gpPerfData;
                     62: 
                     63: DWORD           gCostlyDataSize = 100*1024;         // start wiih 100K
                     64: PPERF_DATA      gpCostlyData;
                     65: 
                     66: 
                     67: PPERF_OBJECT    gpProcessObject;                    // pointer to process objects
                     68: PPERF_OBJECT    gpThreadObject;                     // pointer to thread objects
                     69: PPERF_OBJECT    gpThreadDetailsObject;              // pointer to thread detail objects
                     70: PPERF_OBJECT    gpAddressSpaceObject;               // pointer to address space objects
                     71: PPERF_OBJECT    gpImageObject;                      // pointer to image objects
                     72: 
                     73: 
                     74: HKEY            ghPerfKey = HKEY_PERFORMANCE_DATA;  // get perf data from this key
                     75: HKEY            ghMachineKey = HKEY_LOCAL_MACHINE;  // get title index from this key
                     76: 
                     77: 
                     78: HCURSOR         ghCursor[2];                        // 0 = arrow, 1 = hourglass
                     79: 
                     80: HANDLE          ghMemUpdateEvent;                   // to signal a refresh of mem stats
                     81: HANDLE          ghMemUpdateMutex;                   // to restrict overlapping refreshes
                     82: 
                     83: 
                     84: 
                     85: 
                     86: /****
                     87: Prototypes
                     88: ****/
                     89: 
                     90: BOOL CALLBACK   PviewDlgProc (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
                     91: void    PviewDlgRefresh (HWND hWnd);
                     92: void    PviewDlgRefreshCostlyData (HWND hPviewDlg);
                     93: void    PviewDlgRefreshProcess (HWND hWnd);
                     94: void    PviewDlgRefreshThread (HWND hWnd);
                     95: void    PviewDlgRefreshCurSelProcess (HWND hWnd);
                     96: void    PviewDlgRefreshCurSelThread (HWND hWnd);
                     97: WORD    PviewDlgGetCurSelPriority (HWND hWnd);
                     98: BOOL    PviewDlgChangePriority (HWND hWnd, DWORD wParam, WORD wItem);
                     99: BOOL    PviewDlgTerminateProcess (HWND hPviewDlg);
                    100: 
                    101: BOOL CALLBACK   MemDlgProc (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam);
                    102: void    MemDlgUpdateThread (HWND hWnd);
                    103: void    MemDlgRefresh (HWND hWnd, HWND hPviewDlg);
                    104: void    MemDlgRefreshCurSelImage (HWND hMemDlg, HWND hPviewDlg);
                    105: 
                    106: INT     GetCurSelText (HWND hList, LPTSTR str);
                    107: DWORD   GetCurSelData (HWND hWnd, DWORD dwList);
                    108: INT     ReSelectText (HWND hList, INT StartIndex, LPTSTR str);
                    109: void    SetPerfIndexes (HWND hWnd);
                    110: DWORD   GetTitleIdx (HWND hWnd, LPTSTR TitleSz[], DWORD LastIndex, LPTSTR Name);
                    111: void    SetListBoxTabStops (HWND hWnd);
                    112: void    SetLocalMachine (void);
                    113: BOOL    ConnectComputer (HWND hWnd);
                    114: void    DisableControls (HWND hPviewDlg);
                    115: void    EnableControls (HWND hPviewDlg);
                    116: 
                    117: 
                    118: 
                    119: 
                    120: //********************************************************
                    121: //
                    122: //  WinMain --
                    123: //
                    124: //      Build Up: create the program's dialog box,
                    125: //          load the desired icons, enter the message
                    126: //          loop.
                    127: //
                    128: //      Tear Down: free up the memory allocated by the
                    129: //          dialog box proc, and exit.
                    130: //
                    131: int WINAPI WinMain (HINSTANCE   hInstance,
                    132:                     HINSTANCE   hPrevInstance,
                    133:                     LPSTR       lpCmdLine,
                    134:                     int         nCmdShow)
                    135: {
                    136: HANDLE  hWndDialog;
                    137: MSG     msg;
                    138: 
                    139: 
                    140:     // load our default cursors
                    141:     //
                    142:     ghCursor[0] = LoadCursor (0, IDC_ARROW);
                    143:     ghCursor[1] = LoadCursor (0, IDC_WAIT);
                    144: 
                    145:     // open our dialog box
                    146:     //
                    147:     hWndDialog = CreateDialogParam (hInstance,
                    148:                                     MAKEINTRESOURCE (PVIEW_DLG),
                    149:                                     NULL,
                    150:                                     (DLGPROC) PviewDlgProc,
                    151:                                     (LONG)0);
                    152: 
                    153:     // associate the icon with our window
                    154:     //
                    155:     SetClassLong (hWndDialog, GCL_HICON, (LONG)LoadIcon(hInstance, TEXT("VIEWPICON")) );
                    156: 
                    157: 
                    158:     // the almighty Windows message loop:
                    159:     //
                    160:     while (GetMessage (&msg, NULL, 0, 0))
                    161:         if (!IsDialogMessage (hWndDialog, &msg))
                    162:             {
                    163:             TranslateMessage (&msg);
                    164:             DispatchMessage (&msg);
                    165:             }
                    166: 
                    167:     // close up shop
                    168:     //
                    169:     DestroyWindow (hWndDialog);
                    170:     LocalFree (gpPerfData);
                    171: 
                    172:     return 0;
                    173: }
                    174: 
                    175: 
                    176: 
                    177: 
                    178: /*****************
                    179: PviewDlg functions
                    180: *****************/
                    181: 
                    182: //********************************************************
                    183: //
                    184: //  PviewDlgProc --
                    185: //
                    186: //      Pview dialog procedure
                    187: //
                    188: BOOL CALLBACK   PviewDlgProc   (HWND    hWnd,
                    189:                                 UINT    wMsg,
                    190:                                 WPARAM  wParam,
                    191:                                 LPARAM  lParam)
                    192: {
                    193: WORD    wItem;
                    194: 
                    195: 
                    196:     switch (wMsg)
                    197:         {
                    198: 
                    199:         case WM_INITDIALOG:
                    200:             SetListBoxTabStops (hWnd);
                    201:             SendDlgItemMessage (hWnd, PVIEW_COMPUTER, EM_LIMITTEXT, MACHINE_NAME_LEN, 0);
                    202:             PostMessage (hWnd, WM_COMMAND, PVIEW_REFRESH, 0);
                    203:             break;
                    204: 
                    205:         case WM_CLOSE:
                    206:             PostQuitMessage (0);
                    207:             break;
                    208: 
                    209:         case WM_COMMAND:
                    210:             //
                    211:             // handle our app-specific controls:
                    212:             //
                    213:             switch (LOWORD (wParam))
                    214:                 {
                    215:                 // works just like "close"
                    216:                 //
                    217:                 case PVIEW_EXIT:
                    218:                     PostQuitMessage (0);
                    219:                     break;
                    220: 
                    221:                 // if somebody moved the highlight in the thread list,
                    222:                 //  update the view
                    223:                 //
                    224:                 case PVIEW_THREAD_LIST:
                    225:                     if (HIWORD(wParam) == LBN_DBLCLK || HIWORD(wParam) == LBN_SELCHANGE)
                    226:                         {
                    227:                         PviewDlgRefreshCurSelThread (hWnd);
                    228:                         PostMessage (hWnd, WM_COMMAND, PVIEW_REFRESH_COSTLY_DATA, 0);
                    229:                         }
                    230:                     break;
                    231: 
                    232:                 // if somebody clicked on a new process, update all of the
                    233:                 //  affected information.
                    234:                 //
                    235:                 case PVIEW_PROCESS_LIST:
                    236:                     if (HIWORD(wParam) == CBN_DBLCLK || HIWORD(wParam) == CBN_SELCHANGE)
                    237:                         {
                    238:                         PviewDlgRefreshCurSelProcess (hWnd);
                    239:                         PostMessage (hWnd, WM_COMMAND, PVIEW_REFRESH_COSTLY_DATA, 0);
                    240:                         if (HIWORD(wParam) == CBN_DBLCLK)
                    241:                             PostMessage (hWnd, WM_COMMAND, PVIEW_MEMORY_DETAIL, 0);
                    242:                         }
                    243:                     break;
                    244: 
                    245:                 // the user wishes to view the memory stats in detail:
                    246:                 //
                    247:                 case PVIEW_MEMORY_DETAIL:
                    248:                     //
                    249:                     // check to see if we can get exclusive access
                    250:                     //  to the memory statistics
                    251:                     //
                    252:                     if (WaitForSingleObject (ghMemUpdateMutex, 0))
                    253: 
                    254:                         // we can't, so just return.
                    255:                         //
                    256:                         return FALSE;
                    257: 
                    258:                     else
                    259:                         {
                    260:                         // we have exclusive access, so start up the
                    261:                         //  memory statistics dialog.
                    262:                         //
                    263:                         // release the mutex first so the dialog can use it.
                    264:                         //
                    265:                         ReleaseMutex (ghMemUpdateMutex);
                    266:                         DialogBoxParam (NULL,
                    267:                                         MAKEINTRESOURCE (MEMORY_DLG),
                    268:                                         hWnd,
                    269:                                         (DLGPROC) MemDlgProc,
                    270:                                         (LONG)hWnd);
                    271:                         }
                    272:                     break;
                    273: 
                    274:                 // somebody clicked one of the priority radio
                    275:                 //  buttons.  Find out which one was selected...
                    276:                 //
                    277:                 case PVIEW_PRIORITY_HIGH:
                    278:                 case PVIEW_PRIORITY_NORMAL:
                    279:                 case PVIEW_PRIORITY_IDL:
                    280:                     if (SendDlgItemMessage (hWnd, PVIEW_PRIORITY_HIGH, BM_GETCHECK, 0, 0))
                    281:                         wItem = PVIEW_PRIORITY_HIGH;
                    282:                     else if (SendDlgItemMessage (hWnd, PVIEW_PRIORITY_NORMAL, BM_GETCHECK, 0, 0))
                    283:                         wItem = PVIEW_PRIORITY_NORMAL;
                    284:                     else
                    285:                         wItem = PVIEW_PRIORITY_IDL;
                    286: 
                    287:                     // if the user actually clicked on a NEW state,
                    288:                     //  do the change.
                    289:                     //
                    290:                     if (LOWORD(wParam) != wItem)
                    291:                         {
                    292:                         // of course, if it's a remote machine, disallow
                    293:                         //  the modification.
                    294:                         //
                    295:                         if (lstrcmp (gszCurrentMachine, gszMachineName))
                    296:                             {
                    297:                             SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
                    298:                             SetFocus (GetDlgItem (hWnd, wItem));
                    299:                             MessageBox (hWnd,
                    300:                                         TEXT("Cannot change process priority on remote machine"),
                    301:                                         TEXT("Set priority"),
                    302:                                         MB_ICONEXCLAMATION|MB_OK);
                    303:                             }
                    304: 
                    305:                         // at this point, we know we are affecting the local
                    306:                         //  machine, and a change has to be made.
                    307:                         //  Just Do It(TM).
                    308:                         //
                    309:                         else if (PviewDlgChangePriority (hWnd, wParam, wItem))
                    310:                             PviewDlgRefresh (hWnd);
                    311: 
                    312:                         }
                    313:                     break;
                    314: 
                    315:                 case PVIEW_THREAD_HIGHEST:
                    316:                 case PVIEW_THREAD_ABOVE:
                    317:                 case PVIEW_THREAD_NORMAL:
                    318:                 case PVIEW_THREAD_BELOW:
                    319:                 case PVIEW_THREAD_LOWEST:
                    320:                     //
                    321:                     // this selection hasn't been fleshed out yet.
                    322:                     //
                    323:                     PviewDlgRefreshCurSelThread (hWnd);
                    324:                     break;
                    325: 
                    326:                 // terminate the selected process
                    327:                 //
                    328:                 case PVIEW_TERMINATE:
                    329:                     if (PviewDlgTerminateProcess (hWnd))
                    330:                         PviewDlgRefresh (hWnd);
                    331:                     break;
                    332: 
                    333:                 // if the text has changed, we want to connect and
                    334:                 //  view another system's processes...
                    335:                 //
                    336:                 case PVIEW_COMPUTER:
                    337:                     if (HIWORD(wParam) == EN_CHANGE)
                    338:                         EnableWindow (GetDlgItem (hWnd, PVIEW_CONNECT), TRUE);
                    339:                     else
                    340:                         return FALSE;
                    341:                     break;
                    342: 
                    343:                 // we were told to connect, go ahead and try...
                    344:                 //
                    345:                 case PVIEW_CONNECT:
                    346:                     if (ConnectComputer (hWnd))
                    347:                         {
                    348:                         SetPerfIndexes (hWnd);
                    349:                         PviewDlgRefresh (hWnd);
                    350:                         }
                    351:                     break;
                    352: 
                    353:                 // refresh the current information displayed
                    354:                 //
                    355:                 case PVIEW_REFRESH:
                    356:                     if (ConnectComputer (hWnd))
                    357:                         SetPerfIndexes (hWnd);
                    358:                     PviewDlgRefresh (hWnd);
                    359:                     break;
                    360: 
                    361:                 // refresh the currently updated costly
                    362:                 //  statistics
                    363:                 //
                    364:                 case PVIEW_REFRESH_COSTLY_DATA:
                    365:                     if (WaitForSingleObject (ghMemUpdateMutex, 0))
                    366:                         return FALSE;
                    367: 
                    368:                     PviewDlgRefreshCostlyData (hWnd);
                    369:                     ReleaseMutex (ghMemUpdateMutex);
                    370:                     break;
                    371: 
                    372:                 default:
                    373:                     return FALSE;
                    374:                 }
                    375:             break;
                    376: 
                    377:         default:
                    378:             return FALSE;
                    379:         }
                    380: 
                    381:     return TRUE;
                    382: }
                    383: 
                    384: 
                    385: 
                    386: 
                    387: //********************************************************
                    388: //
                    389: //  PviewDlgRefresh --
                    390: //
                    391: //      Refresh the pview dialog.
                    392: //
                    393: void    PviewDlgRefresh (HWND hWnd)
                    394: {
                    395: static  HANDLE  hMemUpdateThread = NULL;
                    396: static  DWORD   MemUpdateThreadID;
                    397: 
                    398: 
                    399:     SetCursor (ghCursor[1]);
                    400: 
                    401: 
                    402:     if (hMemUpdateThread)       // get memory data
                    403:         SetEvent (ghMemUpdateEvent);
                    404:     else
                    405:         hMemUpdateThread = CreateThread (NULL,
                    406:                                          0,
                    407:                                          (LPTHREAD_START_ROUTINE)MemDlgUpdateThread,
                    408:                                          (LPVOID)hWnd,
                    409:                                          0,
                    410:                                          &MemUpdateThreadID);
                    411: 
                    412: 
                    413:     // get performance data
                    414:     //
                    415:     gpPerfData = RefreshPerfData (ghPerfKey, INDEX_PROCTHRD_OBJ, gpPerfData, &gPerfDataSize);
                    416: 
                    417:     gpProcessObject = FindObject (gpPerfData, PX_PROCESS);
                    418:     gpThreadObject  = FindObject (gpPerfData, PX_THREAD);
                    419: 
                    420: 
                    421:     // refresh
                    422:     //
                    423:     PviewDlgRefreshProcess (hWnd);
                    424:     PviewDlgRefreshThread (hWnd);
                    425: 
                    426:     SetCursor (ghCursor[0]);
                    427: 
                    428: }
                    429: 
                    430: 
                    431: 
                    432: 
                    433: //********************************************************
                    434: //
                    435: //  PviewDlgRefreshCostlyData --
                    436: //
                    437: //      Refresh the costly data.
                    438: //
                    439: void    PviewDlgRefreshCostlyData (HWND hPviewDlg)
                    440: {
                    441: LPTSTR          szProcessName;
                    442: LPTSTR          szThreadName;
                    443: PPERF_INSTANCE  pInstance;
                    444: DWORD           dwIndex;
                    445: 
                    446: 
                    447:     dwIndex       = GetCurSelData (hPviewDlg, PVIEW_PROCESS_LIST);
                    448:     pInstance     = FindInstanceN (gpProcessObject, dwIndex);
                    449:     szProcessName = InstanceName (pInstance);
                    450: 
                    451:     RefreshPviewDlgMemoryData (hPviewDlg,
                    452:                                pInstance,
                    453:                                gpProcessObject,
                    454:                                gpAddressSpaceObject);
                    455: 
                    456: 
                    457:     dwIndex      = GetCurSelData (hPviewDlg, PVIEW_THREAD_LIST);
                    458:     pInstance    = FindInstanceN (gpThreadObject, dwIndex);
                    459:     szThreadName = InstanceName (pInstance);
                    460: 
                    461:     RefreshPviewDlgThreadPC (hPviewDlg,
                    462:                              szProcessName,
                    463:                              szThreadName,
                    464:                              gpThreadDetailsObject,
                    465:                              gpCostlyData);
                    466: 
                    467: }
                    468: 
                    469: 
                    470: 
                    471: 
                    472: //********************************************************
                    473: //
                    474: //  PviewDlgRefreshProcess --
                    475: //
                    476: //      Refresh the process list and data in pview dialog.
                    477: //
                    478: void    PviewDlgRefreshProcess (HWND hWnd)
                    479: {
                    480: TCHAR   szProcessString[256];
                    481: INT     nProcess;
                    482: INT     nIndex;
                    483: HWND    hProcessList;
                    484: DWORD   dwProcessIndex;
                    485: 
                    486: 
                    487:     // refresh process list
                    488:     //
                    489:     hProcessList = GetDlgItem (hWnd, PVIEW_PROCESS_LIST);
                    490:     nProcess     = GetCurSelText (hProcessList, szProcessString);
                    491: 
                    492:     SendMessage (hProcessList, WM_SETREDRAW, FALSE, 0);
                    493:     SendMessage (hProcessList, LB_RESETCONTENT, 0, 0);
                    494:     SendMessage (hProcessList, LB_SETITEMDATA, 0, 0);
                    495: 
                    496: 
                    497:     RefreshProcessList (hProcessList, gpProcessObject);
                    498: 
                    499:     // refresh process data
                    500:     //
                    501:     if (nProcess != LB_ERR)
                    502:         nIndex = ReSelectText (hProcessList, nProcess, szProcessString);
                    503:     else
                    504:         nIndex = 0;
                    505: 
                    506: 
                    507:     dwProcessIndex = SendMessage (hProcessList, LB_GETITEMDATA, nIndex, 0);
                    508: 
                    509:     RefreshProcessData (hWnd, gpProcessObject, dwProcessIndex);
                    510: 
                    511:     SendMessage (hProcessList, WM_SETREDRAW, TRUE, 0);
                    512: 
                    513: }
                    514: 
                    515: 
                    516: 
                    517: 
                    518: //********************************************************
                    519: //
                    520: //  PviewDlgRefreshThread --
                    521: //
                    522: //      Refresh the thread list and data in pview dialog.
                    523: //
                    524: void    PviewDlgRefreshThread (HWND hWnd)
                    525: {
                    526: TCHAR           szThreadString[256];
                    527: INT             nThread;
                    528: INT             nIndex;
                    529: HWND            hThreadList;
                    530: DWORD           dwThreadIndex;
                    531: 
                    532: PPERF_INSTANCE  pProcessInstance;
                    533: DWORD           dwProcessIndex;
                    534: 
                    535: 
                    536:     // get process info
                    537:     //
                    538:     dwProcessIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
                    539:     pProcessInstance = FindInstanceN (gpProcessObject, dwProcessIndex);
                    540: 
                    541: 
                    542:     // refresh thread list
                    543:     //
                    544:     hThreadList  = GetDlgItem (hWnd, PVIEW_THREAD_LIST);
                    545:     nThread      = GetCurSelText (hThreadList, szThreadString);
                    546: 
                    547:     SendMessage (hThreadList, WM_SETREDRAW, FALSE, 0);
                    548:     SendMessage (hThreadList, LB_RESETCONTENT, 0, 0);
                    549:     SendMessage (hThreadList, LB_SETITEMDATA, 0, 0);
                    550: 
                    551:     RefreshThreadList (hThreadList, gpThreadObject, dwProcessIndex);
                    552: 
                    553: 
                    554:     // refresh thread data
                    555:     //
                    556:     if (nThread != LB_ERR)
                    557:         nIndex = ReSelectText (hThreadList, nThread, szThreadString);
                    558:     else
                    559:         nIndex = 0;
                    560: 
                    561:     dwThreadIndex    = SendMessage (hThreadList, LB_GETITEMDATA, nIndex, 0);
                    562: 
                    563:     RefreshThreadData (hWnd,
                    564:                        gpThreadObject,
                    565:                        dwThreadIndex,
                    566:                        gpProcessObject,
                    567:                        pProcessInstance);
                    568: 
                    569:     SendMessage (hThreadList, WM_SETREDRAW, TRUE, 0);
                    570: 
                    571: }
                    572: 
                    573: 
                    574: 
                    575: 
                    576: //********************************************************
                    577: //
                    578: //  PviewDlgGetCurSelPriority --
                    579: //
                    580: //      Get the process priority of currently selected process.
                    581: //
                    582: WORD    PviewDlgGetCurSelPriority (HWND hWnd)
                    583: {
                    584: DWORD           dwIndex;
                    585: PPERF_INSTANCE  pInst;
                    586: 
                    587:     dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
                    588:     pInst = FindInstanceN (gpProcessObject, dwIndex);
                    589:     return ProcessPriority (gpProcessObject, pInst);
                    590: }
                    591: 
                    592: 
                    593: 
                    594: 
                    595: //********************************************************
                    596: //
                    597: //  PviewDlgRefreshCurSelProcess --
                    598: //
                    599: //      Refresh the data of currently selected process.
                    600: //
                    601: void    PviewDlgRefreshCurSelProcess (HWND hWnd)
                    602: {
                    603: DWORD   dwIndex;
                    604: 
                    605:     dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
                    606:     RefreshProcessData (hWnd, gpProcessObject, dwIndex);
                    607: 
                    608:     PviewDlgRefreshThread (hWnd);
                    609: }
                    610: 
                    611: 
                    612: 
                    613: 
                    614: //********************************************************
                    615: //
                    616: //  PviewDlgRefreshCurSelThread --
                    617: //
                    618: //      Refresh the data of currently selected thread.
                    619: //
                    620: void    PviewDlgRefreshCurSelThread (HWND hWnd)
                    621: {
                    622: PPERF_INSTANCE  pProcessInstance;
                    623: DWORD           dwIndex;
                    624: 
                    625:     dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
                    626:     pProcessInstance = FindInstanceN (gpProcessObject, dwIndex);
                    627: 
                    628:     dwIndex = GetCurSelData (hWnd, PVIEW_THREAD_LIST);
                    629: 
                    630:     RefreshThreadData (hWnd,
                    631:                        gpThreadObject,
                    632:                        dwIndex,
                    633:                        gpProcessObject,
                    634:                        pProcessInstance);
                    635: }
                    636: 
                    637: 
                    638: 
                    639: 
                    640: //********************************************************
                    641: //
                    642: //  PviewDlgChangePriority --
                    643: //
                    644: //      Change process priority.
                    645: //
                    646: BOOL    PviewDlgChangePriority (HWND hWnd, DWORD wParam, WORD wItem)
                    647: {
                    648: DWORD           dwIndex;
                    649: PPERF_INSTANCE  pInst;
                    650: PPERF_COUNTER   pCountID;
                    651: DWORD           *pProcessID;
                    652: DWORD           ProcessID;
                    653: HANDLE          hProcess;
                    654: BOOL            bStat;
                    655: 
                    656: 
                    657: 
                    658:     dwIndex = GetCurSelData (hWnd, PVIEW_PROCESS_LIST);
                    659:     pInst = FindInstanceN (gpProcessObject, dwIndex);
                    660: 
                    661: 
                    662:     if (pCountID = FindCounter (gpProcessObject, PX_PROCESS_ID))
                    663:         {
                    664:         pProcessID = (DWORD *) CounterData (pInst, pCountID);
                    665:         ProcessID = *pProcessID;
                    666:         }
                    667:     else
                    668:         {
                    669:         SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
                    670:         SetFocus (GetDlgItem (hWnd, wItem));
                    671:         MessageBox (hWnd,
                    672:                     TEXT("Cannot find ID for this process"),
                    673:                     TEXT("Set priority"),
                    674:                     MB_ICONEXCLAMATION|MB_OK);
                    675:         return FALSE;
                    676:         }
                    677: 
                    678: 
                    679:     hProcess = OpenProcess (PROCESS_SET_INFORMATION, FALSE, ProcessID);
                    680:     if (!hProcess)
                    681:         {
                    682:         SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
                    683:         SetFocus (GetDlgItem (hWnd, wItem));
                    684:         MessageBox (hWnd,
                    685:                     TEXT("Unable to open the process; Priority not changed"),
                    686:                     TEXT("Set priority"),
                    687:                     MB_ICONEXCLAMATION|MB_OK);
                    688:         return FALSE;
                    689:         }
                    690: 
                    691: 
                    692: 
                    693:     switch (wParam)
                    694:         {
                    695:         case PVIEW_PRIORITY_HIGH:
                    696:             bStat = SetPriorityClass (hProcess, HIGH_PRIORITY_CLASS);
                    697:             break;
                    698: 
                    699:         case PVIEW_PRIORITY_NORMAL:
                    700:             bStat = SetPriorityClass (hProcess, NORMAL_PRIORITY_CLASS);
                    701:             break;
                    702: 
                    703:         case PVIEW_PRIORITY_IDL:
                    704:             bStat = SetPriorityClass (hProcess, IDLE_PRIORITY_CLASS);
                    705:             break;
                    706: 
                    707:         default:
                    708:             break;
                    709:         }
                    710: 
                    711: 
                    712:     CloseHandle (hProcess);
                    713: 
                    714:     if (!bStat)
                    715:         {
                    716:         SendDlgItemMessage (hWnd, wItem, BM_SETCHECK, 1, 0);
                    717:         SetFocus (GetDlgItem (hWnd, wItem));
                    718:         MessageBox (hWnd,
                    719:                     TEXT("Unable to change priority"),
                    720:                     TEXT("Set priority"),
                    721:                     MB_ICONEXCLAMATION|MB_OK);
                    722:         return FALSE;
                    723:         }
                    724: 
                    725: 
                    726:     return TRUE;
                    727: 
                    728: }
                    729: 
                    730: 
                    731: 
                    732: 
                    733: //********************************************************
                    734: //
                    735: //  PviewDlgTerminateProcess --
                    736: //
                    737: //      Terminate the current selected process.
                    738: //
                    739: BOOL    PviewDlgTerminateProcess (HWND hPviewDlg)
                    740: {
                    741: DWORD           dwIndex;
                    742: PPERF_INSTANCE  pInst;
                    743: PPERF_COUNTER   pCountID;
                    744: DWORD           *pProcessID;
                    745: DWORD           ProcessID;
                    746: HANDLE          hProcess;
                    747: TCHAR           szTemp[50];
                    748: 
                    749: 
                    750:     dwIndex = GetCurSelData (hPviewDlg, PVIEW_PROCESS_LIST);
                    751:     pInst = FindInstanceN (gpProcessObject, dwIndex);
                    752: 
                    753: 
                    754:     if (pCountID = FindCounter (gpProcessObject, PX_PROCESS_ID))
                    755:         {
                    756:         pProcessID = (DWORD *) CounterData (pInst, pCountID);
                    757:         ProcessID = *pProcessID;
                    758:         }
                    759:     else
                    760:         {
                    761:         MessageBox (hPviewDlg,
                    762:                     TEXT("Cannot find ID for this process"),
                    763:                     TEXT("Terminate Process"),
                    764:                     MB_ICONEXCLAMATION|MB_OK);
                    765:         return FALSE;
                    766:         }
                    767: 
                    768: 
                    769:     wsprintf (szTemp, TEXT("Terminate process %s (ID %#x)?"),
                    770:               InstanceName (pInst), ProcessID);
                    771: 
                    772:     if (MessageBox (hPviewDlg, szTemp, TEXT("Terminate Process"), MB_ICONSTOP|MB_OKCANCEL) != IDOK)
                    773:         return FALSE;
                    774: 
                    775: 
                    776:     hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, ProcessID);
                    777:     if (!hProcess)
                    778:         {
                    779:         MessageBox (hPviewDlg,
                    780:                     TEXT("Unable to open the process; Process not terminated"),
                    781:                     TEXT("Terminate Process"),
                    782:                     MB_ICONEXCLAMATION|MB_OK);
                    783:         return FALSE;
                    784:         }
                    785: 
                    786: 
                    787:     if (!TerminateProcess (hProcess, 99))
                    788:         {
                    789:         MessageBox (hPviewDlg,
                    790:                     TEXT("Unable to terminate the process."),
                    791:                     TEXT("Terminate Process"),
                    792:                     MB_ICONEXCLAMATION|MB_OK);
                    793: 
                    794:         CloseHandle (hProcess);
                    795:         return FALSE;
                    796:         }
                    797: 
                    798: 
                    799:     CloseHandle (hProcess);
                    800: 
                    801:     return TRUE;
                    802: 
                    803: }
                    804: 
                    805: 
                    806: 
                    807: 
                    808: /***************
                    809: MemDlg functions
                    810: ***************/
                    811: 
                    812: //********************************************************
                    813: //
                    814: //  MemDlgProc --
                    815: //
                    816: //      MemoryDlg procedure
                    817: //
                    818: BOOL CALLBACK   MemDlgProc (HWND    hWnd,
                    819:                             UINT    wMsg,
                    820:                             WPARAM  wParam,
                    821:                             LPARAM  lParam)
                    822: {
                    823: static HWND hPviewDlg;
                    824: 
                    825: 
                    826:     switch (wMsg)
                    827:         {
                    828:         case WM_INITDIALOG:
                    829:             hPviewDlg = (HWND)lParam;
                    830:             PostMessage (hWnd, WM_COMMAND, MEMORY_REFRESH, 0);
                    831:             break;
                    832: 
                    833:         case WM_QUIT:
                    834:         case WM_CLOSE:
                    835:             EndDialog (hWnd, TRUE);
                    836:             break;
                    837: 
                    838:         case WM_COMMAND:
                    839:             switch (LOWORD (wParam))
                    840:                 {
                    841:                 // get the memory statistics for the currently selected
                    842:                 //  process/thread
                    843:                 //
                    844:                 case MEMORY_IMAGE:
                    845:                     if (HIWORD(wParam) == CBN_DBLCLK || HIWORD(wParam) == CBN_SELCHANGE)
                    846:                         {
                    847:                         if (WaitForSingleObject (ghMemUpdateMutex, 0))
                    848:                             return FALSE;
                    849: 
                    850:                         MemDlgRefreshCurSelImage (hWnd, hPviewDlg);
                    851:                         ReleaseMutex (ghMemUpdateMutex);
                    852:                         }
                    853:                     else
                    854:                         return FALSE;
                    855:                     break;
                    856: 
                    857:                 // refresh the current memory statistics,
                    858:                 //  retry if we can't get the mutex
                    859:                 //
                    860:                 case MEMORY_REFRESH:
                    861:                     if (WaitForSingleObject (ghMemUpdateMutex, 1000))
                    862:                         {
                    863:                         // can't get the mutex, retry...
                    864:                         //
                    865:                         PostMessage (hWnd, WM_COMMAND, MEMORY_REFRESH, 0);
                    866:                         return FALSE;
                    867:                         }
                    868: 
                    869:                     MemDlgRefresh (hWnd, hPviewDlg);
                    870:                     ReleaseMutex (ghMemUpdateMutex);
                    871:                     break;
                    872: 
                    873:                 case IDCANCEL:
                    874:                 case IDOK:
                    875:                     EndDialog (hWnd, TRUE);
                    876:                     break;
                    877: 
                    878:                 default:
                    879:                     return FALSE;
                    880:                 }
                    881:         default:
                    882:             return FALSE;
                    883:         }
                    884: 
                    885: 
                    886:     return TRUE;
                    887: 
                    888: }
                    889: 
                    890: 
                    891: 
                    892: 
                    893: //********************************************************
                    894: //
                    895: //  MemDlgUpdateThread --
                    896: //
                    897: //      This function runs in a separate thread to collect memory data.
                    898: //
                    899: void MemDlgUpdateThread (HWND hPviewDlg)
                    900: {
                    901: 
                    902:     ghMemUpdateMutex = CreateMutex (NULL, TRUE, NULL);
                    903:     ghMemUpdateEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
                    904: 
                    905: 
                    906:     while (TRUE)
                    907:         {
                    908:         EnableWindow (GetDlgItem (hPviewDlg, PVIEW_MEMORY_DETAIL), FALSE);
                    909: 
                    910: 
                    911:         gpCostlyData = RefreshPerfData (ghPerfKey,
                    912:                                         INDEX_COSTLY_OBJ,
                    913:                                         gpCostlyData,
                    914:                                         &gCostlyDataSize);
                    915: 
                    916: 
                    917:         gpAddressSpaceObject  = FindObject (gpCostlyData, PX_PROCESS_ADDRESS_SPACE);
                    918:         gpThreadDetailsObject = FindObject (gpCostlyData, PX_THREAD_DETAILS);
                    919:         gpImageObject         = FindObject (gpCostlyData, PX_IMAGE);
                    920: 
                    921: 
                    922:         EnableWindow (GetDlgItem (hPviewDlg, PVIEW_MEMORY_DETAIL), TRUE);
                    923: 
                    924:         ReleaseMutex (ghMemUpdateMutex);
                    925: 
                    926:         PostMessage (hPviewDlg, WM_COMMAND, PVIEW_REFRESH_COSTLY_DATA, 0);
                    927: 
                    928: 
                    929:         WaitForSingleObject (ghMemUpdateEvent, INFINITE);
                    930:         WaitForSingleObject (ghMemUpdateMutex, INFINITE);
                    931:         }
                    932: 
                    933: }
                    934: 
                    935: 
                    936: 
                    937: 
                    938: //********************************************************
                    939: //
                    940: //  MemDlgRefresh --
                    941: //
                    942: //      Refresh the memory dialog.
                    943: //
                    944: void MemDlgRefresh (HWND hMemDlg, HWND hPviewDlg)
                    945: {
                    946: HWND            hImageList;
                    947: DWORD           dwIndex;
                    948: BOOL            bStat;
                    949: PPERF_INSTANCE  pInstance;
                    950: 
                    951: 
                    952:     hImageList = GetDlgItem (hMemDlg, MEMORY_IMAGE);
                    953: 
                    954:     SendMessage (hImageList, WM_SETREDRAW, FALSE, 0);
                    955:     SendMessage (hImageList, CB_RESETCONTENT, 0, 0);
                    956:     SendMessage (hImageList, CB_SETITEMDATA, 0, 0);
                    957: 
                    958:     dwIndex = GetCurSelData (hPviewDlg, PVIEW_PROCESS_LIST);
                    959:     pInstance = FindInstanceN (gpProcessObject, dwIndex);
                    960: 
                    961:     bStat = RefreshMemoryDlg (hMemDlg,
                    962:                               pInstance,
                    963:                               gpProcessObject,
                    964:                               gpAddressSpaceObject,
                    965:                               gpImageObject);
                    966: 
                    967:     SendMessage (hImageList, WM_SETREDRAW, TRUE, 0);
                    968:     SendMessage (hImageList, CB_SETCURSEL, 0, 0);
                    969: 
                    970:     if (!bStat)
                    971:         {
                    972:         MessageBox (hMemDlg,
                    973:                     TEXT("Unable to retrieve memory detail"),
                    974:                     TEXT("Memory detail"),
                    975:                     MB_ICONSTOP|MB_OK);
                    976:         PostMessage (hMemDlg, WM_CLOSE, 0, 0);
                    977:         }
                    978: 
                    979: }
                    980: 
                    981: 
                    982: 
                    983: 
                    984: //********************************************************
                    985: //
                    986: //  MemDlgRefreshCurSelImage --
                    987: //
                    988: //      Refresh the current selected image for memory dialog.
                    989: //
                    990: void    MemDlgRefreshCurSelImage (HWND hMemDlg, HWND hPviewDlg)
                    991: {
                    992: HWND    hList;
                    993: INT     nIndex;
                    994: DWORD   dwIndex;
                    995: 
                    996: 
                    997:     hList = GetDlgItem (hMemDlg, MEMORY_IMAGE);
                    998:     nIndex = SendMessage (hList, CB_GETCURSEL, 0, 0);
                    999: 
                   1000:     if (nIndex == CB_ERR)
                   1001:         nIndex = 0;
                   1002: 
                   1003:     dwIndex = SendMessage (hList, CB_GETITEMDATA, nIndex, 0);
                   1004: 
                   1005:     if (dwIndex == 0xFFFFFFFF)
                   1006:         MemDlgRefresh (hMemDlg, hPviewDlg);
                   1007:     else
                   1008:         RefreshMemoryDlgImage (hMemDlg, dwIndex, gpImageObject);
                   1009: 
                   1010: }
                   1011: 
                   1012: 
                   1013: 
                   1014: 
                   1015: /****************
                   1016: utility functions
                   1017: ****************/
                   1018: 
                   1019: //********************************************************
                   1020: //
                   1021: //  GetCurSelText --
                   1022: //
                   1023: //      Get the text of current selection.  Used for later ReSelectText().
                   1024: //
                   1025: INT     GetCurSelText (HWND hList, LPTSTR str)
                   1026: {
                   1027: INT     Index;
                   1028: INT     Length;
                   1029: 
                   1030:     Index = SendMessage (hList, LB_GETCURSEL, 0, 0);
                   1031:     Length = SendMessage (hList, LB_GETTEXT, Index, (DWORD)str);
                   1032: 
                   1033:     return Index;
                   1034: }
                   1035: 
                   1036: 
                   1037: 
                   1038: 
                   1039: //********************************************************
                   1040: //
                   1041: //  GetCurSelData --
                   1042: //
                   1043: //      Get the data associated with the current selection.
                   1044: //
                   1045: DWORD   GetCurSelData (HWND hWnd, DWORD dwList)
                   1046: {
                   1047: HWND    hList;
                   1048: INT     nIndex;
                   1049: DWORD   dwIndex;
                   1050: 
                   1051: 
                   1052:     hList  = GetDlgItem (hWnd, dwList);
                   1053:     nIndex = SendMessage (hList, LB_GETCURSEL, 0, 0);
                   1054: 
                   1055:     if (nIndex == LB_ERR)
                   1056:         nIndex = 0;
                   1057: 
                   1058:     dwIndex = SendMessage (hList, LB_GETITEMDATA, nIndex, 0);
                   1059: 
                   1060:     return dwIndex;
                   1061: }
                   1062: 
                   1063: 
                   1064: 
                   1065: 
                   1066: //********************************************************
                   1067: //
                   1068: //  ReSelectText --
                   1069: //
                   1070: //      Reselect the line specified by str.  Returns the new index.  If cannot
                   1071: //      find the line or any error, then 0 is returned.
                   1072: //
                   1073: INT     ReSelectText (HWND hList, INT StartIndex, LPTSTR str)
                   1074: {
                   1075: INT     Index;
                   1076: INT     Length;
                   1077: TCHAR   SaveChar = TEXT('\0');
                   1078: 
                   1079: 
                   1080:     Index = SendMessage (hList, LB_FINDSTRING, StartIndex, (DWORD)str);
                   1081: 
                   1082:     if (Index == LB_ERR)
                   1083:         {
                   1084:         Length = lstrlen (str);
                   1085: 
                   1086:         while (Index == LB_ERR && Length)
                   1087:             {
                   1088:             SaveChar = str[Length-1];
                   1089:             str[Length-1] = TEXT('\0');
                   1090: 
                   1091:             Index = SendMessage (hList, LB_FINDSTRING, StartIndex, (DWORD)str);
                   1092: 
                   1093:             str[Length-1] = SaveChar;
                   1094:             Length--;
                   1095:             }
                   1096:         }
                   1097: 
                   1098:     if (Index == LB_ERR)
                   1099:         return 0;
                   1100:     else
                   1101:         {
                   1102:         SendMessage (hList, LB_SETCURSEL, Index, 0);
                   1103:         return Index;
                   1104:         }
                   1105: 
                   1106: }
                   1107: 
                   1108: 
                   1109: 
                   1110: 
                   1111: //********************************************************
                   1112: //
                   1113: //  SetPerfIndexes
                   1114: //
                   1115: //      Setup the perf data indexes.
                   1116: //
                   1117: void    SetPerfIndexes (HWND hWnd)
                   1118: {
                   1119: LPTSTR  TitleBuffer;
                   1120: LPTSTR  *Title;
                   1121: DWORD   Count;
                   1122: TCHAR   szTemp[50];
                   1123: DWORD   dwR;
                   1124: 
                   1125: 
                   1126:     dwR = GetPerfTitleSz (ghMachineKey, &TitleBuffer, &Title, &Count);
                   1127: 
                   1128:     if (dwR != ERROR_SUCCESS)
                   1129:         {
                   1130:         wsprintf (szTemp, TEXT("Unable to retrieve counter indexes, ERROR -> %#x"), dwR);
                   1131:         MessageBox (hWnd, szTemp, TEXT("Pviewer"), MB_OK|MB_ICONEXCLAMATION);
                   1132:         return;
                   1133:         }
                   1134: 
                   1135: 
                   1136:     PX_PROCESS                       = GetTitleIdx (hWnd, Title, Count, PN_PROCESS);
                   1137:     PX_PROCESS_CPU                   = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_CPU);
                   1138:     PX_PROCESS_PRIV                  = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIV);
                   1139:     PX_PROCESS_USER                  = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_USER);
                   1140:     PX_PROCESS_WORKING_SET           = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_WORKING_SET);
                   1141:     PX_PROCESS_PEAK_WS               = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PEAK_WS);
                   1142:     PX_PROCESS_PRIO                  = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIO);
                   1143:     PX_PROCESS_ELAPSE                = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_ELAPSE);
                   1144:     PX_PROCESS_ID                    = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_ID);
                   1145:     PX_PROCESS_PRIVATE_PAGE          = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_PAGE);
                   1146:     PX_PROCESS_VIRTUAL_SIZE          = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_VIRTUAL_SIZE);
                   1147:     PX_PROCESS_PEAK_VS               = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PEAK_VS);
                   1148:     PX_PROCESS_FAULT_COUNT           = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_FAULT_COUNT);
                   1149: 
                   1150:     PX_THREAD                        = GetTitleIdx (hWnd, Title, Count, PN_THREAD);
                   1151:     PX_THREAD_CPU                    = GetTitleIdx (hWnd, Title, Count, PN_THREAD_CPU);
                   1152:     PX_THREAD_PRIV                   = GetTitleIdx (hWnd, Title, Count, PN_THREAD_PRIV);
                   1153:     PX_THREAD_USER                   = GetTitleIdx (hWnd, Title, Count, PN_THREAD_USER);
                   1154:     PX_THREAD_START                  = GetTitleIdx (hWnd, Title, Count, PN_THREAD_START);
                   1155:     PX_THREAD_SWITCHES               = GetTitleIdx (hWnd, Title, Count, PN_THREAD_SWITCHES);
                   1156:     PX_THREAD_PRIO                   = GetTitleIdx (hWnd, Title, Count, PN_THREAD_PRIO);
                   1157:     PX_THREAD_BASE_PRIO              = GetTitleIdx (hWnd, Title, Count, PN_THREAD_BASE_PRIO);
                   1158:     PX_THREAD_ELAPSE                 = GetTitleIdx (hWnd, Title, Count, PN_THREAD_ELAPSE);
                   1159: 
                   1160:     PX_THREAD_DETAILS                = GetTitleIdx (hWnd, Title, Count, PN_THREAD_DETAILS);
                   1161:     PX_THREAD_PC                     = GetTitleIdx (hWnd, Title, Count, PN_THREAD_PC);
                   1162: 
                   1163:     PX_IMAGE                         = GetTitleIdx (hWnd, Title, Count, PN_IMAGE);
                   1164:     PX_IMAGE_NOACCESS                = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_NOACCESS);
                   1165:     PX_IMAGE_READONLY                = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_READONLY);
                   1166:     PX_IMAGE_READWRITE               = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_READWRITE);
                   1167:     PX_IMAGE_WRITECOPY               = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_WRITECOPY);
                   1168:     PX_IMAGE_EXECUTABLE              = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_EXECUTABLE);
                   1169:     PX_IMAGE_EXE_READONLY            = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_EXE_READONLY);
                   1170:     PX_IMAGE_EXE_READWRITE           = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_EXE_READWRITE);
                   1171:     PX_IMAGE_EXE_WRITECOPY           = GetTitleIdx (hWnd, Title, Count, PN_IMAGE_EXE_WRITECOPY);
                   1172: 
                   1173:     PX_PROCESS_ADDRESS_SPACE         = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_ADDRESS_SPACE);
                   1174:     PX_PROCESS_PRIVATE_NOACCESS      = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_NOACCESS);
                   1175:     PX_PROCESS_PRIVATE_READONLY      = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_READONLY);
                   1176:     PX_PROCESS_PRIVATE_READWRITE     = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_READWRITE);
                   1177:     PX_PROCESS_PRIVATE_WRITECOPY     = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_WRITECOPY);
                   1178:     PX_PROCESS_PRIVATE_EXECUTABLE    = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_EXECUTABLE);
                   1179:     PX_PROCESS_PRIVATE_EXE_READONLY  = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_EXE_READONLY);
                   1180:     PX_PROCESS_PRIVATE_EXE_READWRITE = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_EXE_READWRITE);
                   1181:     PX_PROCESS_PRIVATE_EXE_WRITECOPY = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_PRIVATE_EXE_WRITECOPY);
                   1182: 
                   1183:     PX_PROCESS_MAPPED_NOACCESS       = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_NOACCESS);
                   1184:     PX_PROCESS_MAPPED_READONLY       = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_READONLY);
                   1185:     PX_PROCESS_MAPPED_READWRITE      = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_READWRITE);
                   1186:     PX_PROCESS_MAPPED_WRITECOPY      = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_WRITECOPY);
                   1187:     PX_PROCESS_MAPPED_EXECUTABLE     = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_EXECUTABLE);
                   1188:     PX_PROCESS_MAPPED_EXE_READONLY   = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_EXE_READONLY);
                   1189:     PX_PROCESS_MAPPED_EXE_READWRITE  = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_EXE_READWRITE);
                   1190:     PX_PROCESS_MAPPED_EXE_WRITECOPY  = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_MAPPED_EXE_WRITECOPY);
                   1191: 
                   1192:     PX_PROCESS_IMAGE_NOACCESS        = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_NOACCESS);
                   1193:     PX_PROCESS_IMAGE_READONLY        = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_READONLY);
                   1194:     PX_PROCESS_IMAGE_READWRITE       = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_READWRITE);
                   1195:     PX_PROCESS_IMAGE_WRITECOPY       = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_WRITECOPY);
                   1196:     PX_PROCESS_IMAGE_EXECUTABLE      = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_EXECUTABLE);
                   1197:     PX_PROCESS_IMAGE_EXE_READONLY    = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_EXE_READONLY);
                   1198:     PX_PROCESS_IMAGE_EXE_READWRITE   = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_EXE_READWRITE);
                   1199:     PX_PROCESS_IMAGE_EXE_WRITECOPY   = GetTitleIdx (hWnd, Title, Count, PN_PROCESS_IMAGE_EXE_WRITECOPY);
                   1200: 
                   1201: 
                   1202:     wsprintf (INDEX_PROCTHRD_OBJ, TEXT("%ld %ld"), PX_PROCESS, PX_THREAD);
                   1203:     wsprintf (INDEX_COSTLY_OBJ, TEXT("%ld %ld %ld"),
                   1204:               PX_PROCESS_ADDRESS_SPACE, PX_IMAGE, PX_THREAD_DETAILS);
                   1205: 
                   1206: 
                   1207:     LocalFree (TitleBuffer);
                   1208:     LocalFree (Title);
                   1209: 
                   1210: }
                   1211: 
                   1212: 
                   1213: 
                   1214: 
                   1215: //********************************************************
                   1216: //
                   1217: //  GetTitleIdx
                   1218: //
                   1219: //      Searches Titles[] for Name.  Returns the index found.
                   1220: //
                   1221: DWORD   GetTitleIdx (HWND hWnd, LPTSTR Title[], DWORD LastIndex, LPTSTR Name)
                   1222: {
                   1223: DWORD   Index;
                   1224: 
                   1225:     for (Index = 0; Index <= LastIndex; Index++)
                   1226:         if (Title[Index])
                   1227:             if (!lstrcmpi (Title[Index], Name))
                   1228:                 return Index;
                   1229: 
                   1230:     MessageBox (hWnd, Name, TEXT("Pviewer cannot find index"), MB_OK);
                   1231:     return 0;
                   1232: }
                   1233: 
                   1234: 
                   1235: 
                   1236: 
                   1237: //********************************************************
                   1238: //
                   1239: //  SetListBoxTabStops --
                   1240: //
                   1241: //      Set tab stops in the two list boxes.
                   1242: //
                   1243: void    SetListBoxTabStops (HWND hWnd)
                   1244: {
                   1245: HWND    hListBox;
                   1246: INT     Tabs[4] = {22*4, 36*4, 44*4};
                   1247: 
                   1248:     hListBox = GetDlgItem (hWnd, PVIEW_PROCESS_LIST);
                   1249:     SendMessage (hListBox, LB_SETTABSTOPS, 3, (DWORD)Tabs);
                   1250: 
                   1251:     hListBox = GetDlgItem (hWnd, PVIEW_THREAD_LIST);
                   1252:     SendMessage (hListBox, LB_SETTABSTOPS, 3, (DWORD)Tabs);
                   1253: }
                   1254: 
                   1255: 
                   1256: 
                   1257: 
                   1258: //********************************************************
                   1259: //
                   1260: //  SetLocalMachine --
                   1261: //
                   1262: //      Set local machine as performance data focus.
                   1263: //
                   1264: //      Sets    ghPerfKey
                   1265: //              ghMachineKey
                   1266: //              gszMachineName
                   1267: //              gszCurrentMachine
                   1268: //
                   1269: void    SetLocalMachine (void)
                   1270: {
                   1271: TCHAR   szName[MACHINE_NAME_SIZE];
                   1272: DWORD   dwSize = MACHINE_NAME_SIZE;
                   1273: 
                   1274: 
                   1275:     // performance_data key on local machine
                   1276:     //
                   1277:     ghPerfKey    = HKEY_PERFORMANCE_DATA;
                   1278:     ghMachineKey = HKEY_LOCAL_MACHINE;
                   1279: 
                   1280: 
                   1281: 
                   1282:     // get computer name
                   1283:     GetComputerName (szName, &dwSize);
                   1284: 
                   1285: 
                   1286: 
                   1287:     if (szName[0] != '\\' || szName[1] != '\\')     // must have two '\\'
                   1288:         {
                   1289:         wsprintf (gszMachineName, TEXT("\\\\%s"), szName);
                   1290:         lstrcpy (gszCurrentMachine, gszMachineName);
                   1291:         }
                   1292:     else
                   1293:         {
                   1294:         lstrcpy (gszMachineName, szName);
                   1295:         lstrcpy (gszCurrentMachine, gszMachineName);
                   1296:         }
                   1297: 
                   1298: }
                   1299: 
                   1300: 
                   1301: 
                   1302: 
                   1303: //********************************************************
                   1304: //
                   1305: //  ConnectComputer --
                   1306: //
                   1307: //      Connect to a computer with name entered in PVIEW_COMPUTER.
                   1308: //      If a new connection is made, then return TRUE else return FALSE.
                   1309: //
                   1310: //      Sets    gszCurrentMachine
                   1311: //              ghPerfKey
                   1312: //              ghMachineKey
                   1313: //
                   1314: BOOL    ConnectComputer (HWND hWnd)
                   1315: {
                   1316: DWORD   dwR;
                   1317: HKEY    hKey;
                   1318: TCHAR   szTemp[MACHINE_NAME_SIZE];
                   1319: TCHAR   szTemp2[MACHINE_NAME_SIZE+100];
                   1320: BOOL    bResult = TRUE;
                   1321: 
                   1322: 
                   1323: 
                   1324:     SetCursor (ghCursor[1]);
                   1325: 
                   1326: 
                   1327:     if (!GetDlgItemText (hWnd, PVIEW_COMPUTER, szTemp, sizeof (szTemp)))
                   1328:         {
                   1329:         SetLocalMachine ();
                   1330:         SetDlgItemText (hWnd, PVIEW_COMPUTER, gszCurrentMachine);
                   1331:         }
                   1332: 
                   1333:     else if (!lstrcmpi (szTemp, gszCurrentMachine))     // didn't change name
                   1334:         bResult = FALSE;
                   1335: 
                   1336:     else if (!lstrcmpi (szTemp, gszMachineName))        // local machine
                   1337:         {
                   1338:         SetLocalMachine ();
                   1339:         EnableControls (hWnd);
                   1340:         }
                   1341: 
                   1342:     else
                   1343:         {
                   1344:         // a remote machine, connect to it
                   1345:         //
                   1346:         dwR = RegConnectRegistry (szTemp, HKEY_PERFORMANCE_DATA, &hKey);
                   1347: 
                   1348:         if (dwR != ERROR_SUCCESS)
                   1349:             {
                   1350:             wsprintf (szTemp2, TEXT("Cannot connect to computer %s"), szTemp);
                   1351:             MessageBox (hWnd, szTemp2, TEXT(""), MB_ICONEXCLAMATION|MB_OK);
                   1352: 
                   1353:             SetDlgItemText (hWnd, PVIEW_COMPUTER, gszCurrentMachine);
                   1354: 
                   1355:             bResult = FALSE;
                   1356:             }
                   1357:         else
                   1358:             {
                   1359:             // connected
                   1360:             //
                   1361:             lstrcpy (gszCurrentMachine, szTemp);
                   1362:             ghPerfKey = hKey;
                   1363: 
                   1364:             DisableControls (hWnd);
                   1365: 
                   1366: 
                   1367:             // we also need to get the remote machine's title indexes.
                   1368:             //
                   1369:             dwR = RegConnectRegistry (gszCurrentMachine, HKEY_LOCAL_MACHINE, &hKey);
                   1370: 
                   1371:             if (dwR == ERROR_SUCCESS)
                   1372:                 ghMachineKey = hKey;
                   1373:             else
                   1374:                 // unable to connect, so we'll use our own indexes.
                   1375:                 //
                   1376:                 ghMachineKey = HKEY_LOCAL_MACHINE;
                   1377:             }
                   1378:         }
                   1379: 
                   1380:     SetCursor (ghCursor[0]);
                   1381: 
                   1382: 
                   1383:     EnableWindow (GetDlgItem (hWnd, PVIEW_CONNECT), FALSE);
                   1384: 
                   1385: 
                   1386:     return bResult;
                   1387: 
                   1388: }
                   1389: 
                   1390: 
                   1391: 
                   1392: 
                   1393: //********************************************************
                   1394: //
                   1395: //  DisableControls --
                   1396: //
                   1397: //      Disable controls that don't make sense on remote machine
                   1398: //
                   1399: void DisableControls (HWND hPviewDlg)
                   1400: {
                   1401:     EnableWindow (GetDlgItem (hPviewDlg, PVIEW_TERMINATE), FALSE);
                   1402:     EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_HIGH), FALSE);
                   1403:     EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_NORMAL), FALSE);
                   1404:     EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_IDL), FALSE);
                   1405: }
                   1406: 
                   1407: 
                   1408: 
                   1409: 
                   1410: //********************************************************
                   1411: //
                   1412: //  EnableControls --
                   1413: //
                   1414: //      Enable controls disabled by DisableControl().
                   1415: //
                   1416: void EnableControls (HWND hPviewDlg)
                   1417: {
                   1418:     EnableWindow (GetDlgItem (hPviewDlg, PVIEW_TERMINATE), TRUE);
                   1419:     EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_HIGH), TRUE);
                   1420:     EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_NORMAL), TRUE);
                   1421:     EnableWindow (GetDlgItem (hPviewDlg, PVIEW_PRIORITY_IDL), TRUE);
                   1422: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.