Annotation of mstools/samples/sdktools/pviewer/pviewdat.c, revision 1.1.1.2

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 V I E W   D A T A
                     16: 
                     17:     Name:       pviewdat.c
                     18: 
                     19:     Description:
                     20:         This module collects the data to be displayed in pview.
                     21: 
                     22: ******************************************************************************/
                     23: 
                     24: #include    <windows.h>
                     25: #include    <winperf.h>
                     26: #include    "perfdata.h"
                     27: #include    "pviewdat.h"
                     28: #include    "pviewdlg.h"
                     29: #include    <stdio.h>
                     30: #include    <stdlib.h>
                     31: #include    <string.h>
                     32: 
                     33: 
                     34: #define NODATA  TEXT("--------")
                     35: 
                     36: 
                     37: 
                     38: 
                     39: 
                     40: void    FormatTimeFields
                     41:                (double      fTime,
                     42:                 PTIME_FIELD pTimeFld);
                     43: 
                     44: DWORD   PutCounterDWKB
                     45:                (HWND            hWnd,
                     46:                 DWORD           dwItemID,
                     47:                 PPERF_INSTANCE  pInst,
                     48:                 PPERF_OBJECT    pObj,
                     49:                 DWORD           dwCounterIdx);
                     50: 
                     51: DWORD   PutCounterHEX
                     52:                (HWND            hWnd,
                     53:                 DWORD           dwItemID,
                     54:                 PPERF_INSTANCE  pInst,
                     55:                 PPERF_OBJECT    pObj,
                     56:                 DWORD           dwCounterIdx);
                     57: 
                     58: DWORD   PutCounterDW
                     59:                (HWND            hWnd,
                     60:                 DWORD           dwItemID,
                     61:                 PPERF_INSTANCE  pInst,
                     62:                 PPERF_OBJECT    pObj,
                     63:                 DWORD           dwCounterIdx);
                     64: 
                     65: void    PaintAddressSpace
                     66:                (HWND            hMemDlg,
                     67:                 PPERF_INSTANCE  pInst,
                     68:                 PPERF_OBJECT    pObj,
                     69:                 DWORD           TotalID,
                     70:                 DWORD           NoAccessID,
                     71:                 DWORD           NoAccessIndex,
                     72:                 DWORD           ReadOnlyID,
                     73:                 DWORD           ReadOnlyIndex,
                     74:                 DWORD           ReadWriteID,
                     75:                 DWORD           ReadWriteIndex,
                     76:                 DWORD           WriteCopyID,
                     77:                 DWORD           WriteCopyIndex,
                     78:                 DWORD           ExecuteID,
                     79:                 DWORD           ExecuteIndex1,
                     80:                 DWORD           ExecuteIndex2,
                     81:                 DWORD           ExecuteIndex3,
                     82:                 DWORD           ExecuteIndex4);
                     83: 
                     84: void    PaintMemDlgAddrData
                     85:                (HWND            hMemDlg,
                     86:                 PPERF_INSTANCE  pInst,
                     87:                 PPERF_OBJECT    pObj);
                     88: 
                     89: void    PaintMemDlgVMData
                     90:                (HWND            hMemDlg,
                     91:                 PPERF_INSTANCE  pInst,
                     92:                 PPERF_OBJECT    pObj);
                     93: 
                     94: void    PaintPviewDlgMemoryData
                     95:                (HWND            hPviewDlg,
                     96:                 PPERF_INSTANCE  pInst,
                     97:                 PPERF_OBJECT    pObj);
                     98: 
                     99: void    RefreshMemoryDlgImageList
                    100:                (HWND            hImageList,
                    101:                 DWORD           ParentIndex,
                    102:                 PPERF_OBJECT    pImageObj);
                    103: 
                    104: void    SetProcessListText
                    105:                (PPERF_INSTANCE pInst,
                    106:                 PPERF_COUNTER  pCPU,
                    107:                 PPERF_COUNTER  pPRIV,
                    108:                 PPERF_COUNTER  pProcID,
                    109:                 double         fTime,
                    110:                 LPTSTR         str);
                    111: 
                    112: void    SetThreadListText
                    113:                (PPERF_INSTANCE  pInst,
                    114:                 PPERF_COUNTER   pCPU,
                    115:                 PPERF_COUNTER   pPRIV,
                    116:                 double          fTime,
                    117:                 LPTSTR          str);
                    118: 
                    119: 
                    120: 
                    121: 
                    122: //*********************************************************************
                    123: //
                    124: //      FormatTimeFields
                    125: //
                    126: //  Formats a double value to time fields.
                    127: //
                    128: void FormatTimeFields   (double      fTime,
                    129:                          PTIME_FIELD pTimeFld)
                    130: {
                    131: INT     i;
                    132: double   f;
                    133: 
                    134:     f = fTime/3600;
                    135: 
                    136:     pTimeFld->Hours = i = (int)f;
                    137: 
                    138:     f = f - i;
                    139:     pTimeFld->Mins = i = (int)(f = f * 60);
                    140: 
                    141:     f = f - i;
                    142:     pTimeFld->Secs = i = (int)(f = f * 60);
                    143: 
                    144:     f = f - i;
                    145:     pTimeFld->mSecs = (int)(f * 1000);
                    146: }
                    147: 
                    148: 
                    149: 
                    150: 
                    151: //*********************************************************************
                    152: //
                    153: //      PutCounterDWKB
                    154: //
                    155: //  Display a DWORD counter's data in KB units.
                    156: //
                    157: DWORD   PutCounterDWKB (HWND            hWnd,
                    158:                         DWORD           dwItemID,
                    159:                         PPERF_INSTANCE  pInst,
                    160:                         PPERF_OBJECT    pObj,
                    161:                         DWORD           dwCounterIdx)
                    162: {
                    163: PPERF_COUNTER   pCounter;
                    164: DWORD           *pdwData;
                    165: TCHAR           szTemp[20];
                    166: 
                    167:     if (pCounter = FindCounter (pObj, dwCounterIdx))
                    168:         {
                    169:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    170:         wsprintf (szTemp, TEXT("%ld KB"), *pdwData/1024);
                    171:         SetDlgItemText (hWnd, dwItemID, szTemp);
                    172: 
                    173:         return *pdwData;
                    174:         }
                    175:     else
                    176:         {
                    177:         SetDlgItemText (hWnd, dwItemID, NODATA);
                    178:         return 0;
                    179:         }
                    180: 
                    181: }
                    182: 
                    183: 
                    184: 
                    185: 
                    186: //*********************************************************************
                    187: //
                    188: //      PutCounterHEX
                    189: //
                    190: //  Display a DWORD counter's data in hex.
                    191: //
                    192: DWORD   PutCounterHEX  (HWND            hWnd,
                    193:                         DWORD           dwItemID,
                    194:                         PPERF_INSTANCE  pInst,
                    195:                         PPERF_OBJECT    pObj,
                    196:                         DWORD           dwCounterIdx)
                    197: {
                    198: PPERF_COUNTER   pCounter;
                    199: DWORD           *pdwData;
                    200: TCHAR           szTemp[20];
                    201: 
                    202:     if (pCounter = FindCounter (pObj, dwCounterIdx))
                    203:         {
                    204:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    205:         wsprintf (szTemp, TEXT("0x%08x"), *pdwData);
                    206:         SetDlgItemText (hWnd, dwItemID, szTemp);
                    207: 
                    208:         return *pdwData;
                    209:         }
                    210:     else
                    211:         {
                    212:         SetDlgItemText (hWnd, dwItemID, NODATA);
                    213:         return 0;
                    214:         }
                    215: 
                    216: }
                    217: 
                    218: 
                    219: 
                    220: 
                    221: //*********************************************************************
                    222: //
                    223: //      PutCounterDWKB
                    224: //
                    225: //  Display a DWORD counter's data.
                    226: //
                    227: DWORD   PutCounterDW   (HWND            hWnd,
                    228:                         DWORD           dwItemID,
                    229:                         PPERF_INSTANCE  pInst,
                    230:                         PPERF_OBJECT    pObj,
                    231:                         DWORD           dwCounterIdx)
                    232: {
                    233: PPERF_COUNTER   pCounter;
                    234: DWORD           *pdwData;
                    235: 
                    236:     if (pCounter = FindCounter (pObj, dwCounterIdx))
                    237:         {
                    238:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    239:         SetDlgItemInt (hWnd, dwItemID, *pdwData, FALSE);
                    240: 
                    241:         return *pdwData;
                    242:         }
                    243:     else
                    244:         {
                    245:         SetDlgItemText (hWnd, dwItemID, NODATA);
                    246:         return 0;
                    247:         }
                    248: 
                    249: }
                    250: 
                    251: 
                    252: 
                    253: 
                    254: //*********************************************************************
                    255: //
                    256: //      PaintAddressSpace
                    257: //
                    258: //
                    259: void    PaintAddressSpace  (HWND            hMemDlg,
                    260:                             PPERF_INSTANCE  pInst,
                    261:                             PPERF_OBJECT    pObj,
                    262:                             DWORD           TotalID,
                    263:                             DWORD           NoAccessID,
                    264:                             DWORD           NoAccessIndex,
                    265:                             DWORD           ReadOnlyID,
                    266:                             DWORD           ReadOnlyIndex,
                    267:                             DWORD           ReadWriteID,
                    268:                             DWORD           ReadWriteIndex,
                    269:                             DWORD           WriteCopyID,
                    270:                             DWORD           WriteCopyIndex,
                    271:                             DWORD           ExecuteID,
                    272:                             DWORD           ExecuteIndex1,
                    273:                             DWORD           ExecuteIndex2,
                    274:                             DWORD           ExecuteIndex3,
                    275:                             DWORD           ExecuteIndex4)
                    276: {
                    277: PPERF_COUNTER   pCounter;
                    278: DWORD           *pdwData;
                    279: TCHAR           szTemp[20];
                    280: 
                    281: DWORD           dwTotal = 0;
                    282: DWORD           dwExecute = 0;
                    283: BOOL            bCounter = FALSE;
                    284: 
                    285: 
                    286:     dwTotal += PutCounterDWKB (hMemDlg, NoAccessID,  pInst, pObj, NoAccessIndex);
                    287:     dwTotal += PutCounterDWKB (hMemDlg, ReadOnlyID,  pInst, pObj, ReadOnlyIndex);
                    288:     dwTotal += PutCounterDWKB (hMemDlg, ReadWriteID, pInst, pObj, ReadWriteIndex);
                    289:     dwTotal += PutCounterDWKB (hMemDlg, WriteCopyID, pInst, pObj, WriteCopyIndex);
                    290: 
                    291: 
                    292:     // execute is the sum of the following
                    293:     //
                    294:     if (pCounter = FindCounter (pObj, ExecuteIndex1))
                    295:         {
                    296:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    297:         dwTotal += *pdwData;
                    298:         dwExecute += *pdwData;
                    299:         bCounter = TRUE;
                    300:         }
                    301: 
                    302:     if (pCounter = FindCounter (pObj, ExecuteIndex2))
                    303:         {
                    304:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    305:         dwTotal += *pdwData;
                    306:         dwExecute += *pdwData;
                    307:         bCounter = TRUE;
                    308:         }
                    309: 
                    310:     if (pCounter = FindCounter (pObj, ExecuteIndex3))
                    311:         {
                    312:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    313:         dwTotal += *pdwData;
                    314:         dwExecute += *pdwData;
                    315:         bCounter = TRUE;
                    316:         }
                    317: 
                    318:     if (pCounter = FindCounter (pObj, ExecuteIndex4))
                    319:         {
                    320:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    321:         dwTotal += *pdwData;
                    322:         dwExecute += *pdwData;
                    323:         bCounter = TRUE;
                    324:         }
                    325: 
                    326:     if (bCounter)
                    327:         {
                    328:         wsprintf (szTemp, TEXT("%ld KB"), dwExecute/1024);
                    329:         SetDlgItemText (hMemDlg, ExecuteID, szTemp);
                    330:         }
                    331:     else
                    332:         SetDlgItemText (hMemDlg, ExecuteID, NODATA);
                    333: 
                    334:     wsprintf (szTemp, TEXT("%ld KB"), dwTotal/1024);
                    335:     SetDlgItemText (hMemDlg, TotalID, szTemp);
                    336: 
                    337: }
                    338: 
                    339: 
                    340: 
                    341: 
                    342: //*********************************************************************
                    343: //
                    344: //      PaintMemDlgAddrData
                    345: //
                    346: //  Paint the memory dialog address space data.
                    347: //
                    348: void    PaintMemDlgAddrData(HWND            hMemDlg,
                    349:                             PPERF_INSTANCE  pInst,
                    350:                             PPERF_OBJECT    pObj)
                    351: {
                    352:     PaintAddressSpace (hMemDlg, pInst, pObj,
                    353:                        MEMORY_TOTALPRIVATE_COMMIT,
                    354:                        MEMORY_PRIVATE_NOACCESS,  PX_PROCESS_PRIVATE_NOACCESS,
                    355:                        MEMORY_PRIVATE_READONLY,  PX_PROCESS_PRIVATE_READONLY,
                    356:                        MEMORY_PRIVATE_READWRITE, PX_PROCESS_PRIVATE_READWRITE,
                    357:                        MEMORY_PRIVATE_WRITECOPY, PX_PROCESS_PRIVATE_WRITECOPY,
                    358:                        MEMORY_PRIVATE_EXECUTE,   PX_PROCESS_PRIVATE_EXECUTABLE,
                    359:                                                  PX_PROCESS_PRIVATE_EXE_READONLY,
                    360:                                                  PX_PROCESS_PRIVATE_EXE_READWRITE,
                    361:                                                  PX_PROCESS_PRIVATE_EXE_WRITECOPY);
                    362: 
                    363:     PaintAddressSpace (hMemDlg, pInst, pObj,
                    364:                        MEMORY_TOTALMAPPED_COMMIT,
                    365:                        MEMORY_MAPPED_NOACCESS,  PX_PROCESS_MAPPED_NOACCESS,
                    366:                        MEMORY_MAPPED_READONLY,  PX_PROCESS_MAPPED_READONLY,
                    367:                        MEMORY_MAPPED_READWRITE, PX_PROCESS_MAPPED_READWRITE,
                    368:                        MEMORY_MAPPED_WRITECOPY, PX_PROCESS_MAPPED_WRITECOPY,
                    369:                        MEMORY_MAPPED_EXECUTE,   PX_PROCESS_MAPPED_EXECUTABLE,
                    370:                                                 PX_PROCESS_MAPPED_EXE_READONLY,
                    371:                                                 PX_PROCESS_MAPPED_EXE_READWRITE,
                    372:                                                 PX_PROCESS_MAPPED_EXE_WRITECOPY);
                    373: 
                    374:     PaintAddressSpace (hMemDlg, pInst, pObj,
                    375:                        MEMORY_TOTALIMAGE_COMMIT,
                    376:                        MEMORY_IMAGE_NOACCESS,   PX_PROCESS_IMAGE_NOACCESS,
                    377:                        MEMORY_IMAGE_READONLY,   PX_PROCESS_IMAGE_READONLY,
                    378:                        MEMORY_IMAGE_READWRITE,  PX_PROCESS_IMAGE_READWRITE,
                    379:                        MEMORY_IMAGE_WRITECOPY,  PX_PROCESS_IMAGE_WRITECOPY,
                    380:                        MEMORY_IMAGE_EXECUTE,    PX_PROCESS_IMAGE_EXECUTABLE,
                    381:                                                 PX_PROCESS_IMAGE_EXE_READONLY,
                    382:                                                 PX_PROCESS_IMAGE_EXE_READWRITE,
                    383:                                                 PX_PROCESS_IMAGE_EXE_WRITECOPY);
                    384: }
                    385: 
                    386: 
                    387: 
                    388: 
                    389: //*********************************************************************
                    390: //
                    391: //      PaintMemDlgVMData
                    392: //
                    393: //  Paint the memory dialog Virtual Memory data.
                    394: //
                    395: void    PaintMemDlgVMData  (HWND            hMemDlg,
                    396:                             PPERF_INSTANCE  pInst,
                    397:                             PPERF_OBJECT    pObj)
                    398: {
                    399: 
                    400:     PutCounterDWKB (hMemDlg, MEMORY_WS,           pInst, pObj, PX_PROCESS_WORKING_SET);
                    401:     PutCounterDWKB (hMemDlg, MEMORY_PEAK_WS,      pInst, pObj, PX_PROCESS_PEAK_WS);
                    402:     PutCounterDWKB (hMemDlg, MEMORY_PRIVATE_PAGE, pInst, pObj, PX_PROCESS_PRIVATE_PAGE);
                    403:     PutCounterDWKB (hMemDlg, MEMORY_VSIZE,        pInst, pObj, PX_PROCESS_VIRTUAL_SIZE);
                    404:     PutCounterDWKB (hMemDlg, MEMORY_PEAK_VSIZE,   pInst, pObj, PX_PROCESS_PEAK_VS);
                    405:     PutCounterDWKB (hMemDlg, MEMORY_PFCOUNT,      pInst, pObj, PX_PROCESS_FAULT_COUNT);
                    406: 
                    407: }
                    408: 
                    409: 
                    410: 
                    411: 
                    412: //*********************************************************************
                    413: //
                    414: //      PaintPviewDlgMemoryData
                    415: //
                    416: //  Paint the memory data for pview dialog.
                    417: //
                    418: void    PaintPviewDlgMemoryData    (HWND            hPviewDlg,
                    419:                                     PPERF_INSTANCE  pInst,
                    420:                                     PPERF_OBJECT    pObj)
                    421: {
                    422: PPERF_COUNTER   pCounter;
                    423: TCHAR           str[20];
                    424: DWORD           *pdwData;
                    425: DWORD           dwData = 0;
                    426: BOOL            bCounter = FALSE;
                    427: 
                    428: 
                    429:     if (pCounter = FindCounter (pObj, PX_PROCESS_PRIVATE_NOACCESS))
                    430:         {
                    431:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    432:         dwData += *pdwData;
                    433:         bCounter = TRUE;
                    434:         }
                    435: 
                    436:     if (pCounter = FindCounter (pObj, PX_PROCESS_PRIVATE_READONLY))
                    437:         {
                    438:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    439:         dwData += *pdwData;
                    440:         bCounter = TRUE;
                    441:         }
                    442: 
                    443:     if (pCounter = FindCounter (pObj, PX_PROCESS_PRIVATE_READWRITE))
                    444:         {
                    445:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    446:         dwData += *pdwData;
                    447:         bCounter = TRUE;
                    448:         }
                    449: 
                    450:     if (pCounter = FindCounter (pObj, PX_PROCESS_PRIVATE_WRITECOPY))
                    451:         {
                    452:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    453:         dwData += *pdwData;
                    454:         bCounter = TRUE;
                    455:         }
                    456: 
                    457:     if (pCounter = FindCounter (pObj, PX_PROCESS_PRIVATE_EXECUTABLE))
                    458:         {
                    459:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    460:         dwData += *pdwData;
                    461:         bCounter = TRUE;
                    462:         }
                    463: 
                    464:     if (pCounter = FindCounter (pObj, PX_PROCESS_PRIVATE_EXE_READONLY))
                    465:         {
                    466:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    467:         dwData += *pdwData;
                    468:         bCounter = TRUE;
                    469:         }
                    470: 
                    471:     if (pCounter = FindCounter (pObj, PX_PROCESS_PRIVATE_EXE_READWRITE))
                    472:         {
                    473:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    474:         dwData += *pdwData;
                    475:         bCounter = TRUE;
                    476:         }
                    477: 
                    478:     if (pCounter = FindCounter (pObj, PX_PROCESS_PRIVATE_EXE_WRITECOPY))
                    479:         {
                    480:         pdwData = (DWORD *) CounterData (pInst, pCounter);
                    481:         dwData += *pdwData;
                    482:         bCounter = TRUE;
                    483:         }
                    484: 
                    485:     if (bCounter)
                    486:         {
                    487:         wsprintf (str, TEXT("%ld KB"), dwData/1024);
                    488:         SetDlgItemText (hPviewDlg, PVIEW_TOTALPRIVATE_COMMIT, str);
                    489:         }
                    490:     else
                    491:         SetDlgItemText (hPviewDlg, PVIEW_TOTALPRIVATE_COMMIT, NODATA);
                    492: 
                    493: }
                    494: 
                    495: 
                    496: 
                    497: 
                    498: //*********************************************************************
                    499: //
                    500: //      RefreshMemoryDlg
                    501: //
                    502: //  Refresh the memory detail dialog.
                    503: //
                    504: BOOL    RefreshMemoryDlg   (HWND            hMemDlg,
                    505:                             PPERF_INSTANCE  pProcessInstance,
                    506:                             PPERF_OBJECT    pProcessObject,
                    507:                             PPERF_OBJECT    pAddressObject,
                    508:                             PPERF_OBJECT    pImageObject)
                    509: {
                    510: DWORD           *pProcessID1;
                    511: DWORD           *pProcessID2;
                    512: PPERF_COUNTER   pCounter1;
                    513: PPERF_COUNTER   pCounter2;
                    514: PPERF_INSTANCE  pAddressInstance;
                    515: HWND            hImageList;
                    516: TCHAR           szTemp[40];
                    517: BOOL            bStat = FALSE;
                    518: INT             InstIndex = 0;
                    519: 
                    520: 
                    521:     if ((pCounter1 = FindCounter (pProcessObject, PX_PROCESS_ID)) &&
                    522:         (pCounter2 = FindCounter (pAddressObject, PX_PROCESS_ID)))
                    523:         {
                    524:         pProcessID1 = (DWORD *) CounterData (pProcessInstance, pCounter1);
                    525: 
                    526:         wsprintf (szTemp, TEXT("%s (%#x)"), InstanceName (pProcessInstance), *pProcessID1);
                    527:         SetDlgItemText (hMemDlg, MEMORY_PROCESS_ID, szTemp);
                    528: 
                    529:         pAddressInstance = FirstInstance (pAddressObject);
                    530: 
                    531:         while (InstIndex < pAddressObject->NumInstances)
                    532:             {
                    533:             pProcessID2 = (DWORD *) CounterData (pAddressInstance, pCounter2);
                    534: 
                    535:             if (*pProcessID1 == *pProcessID2)
                    536:                 {
                    537:                 PaintMemDlgAddrData (hMemDlg, pAddressInstance, pAddressObject);
                    538:                 PaintMemDlgVMData (hMemDlg, pProcessInstance, pProcessObject);
                    539: 
                    540:                 hImageList = GetDlgItem (hMemDlg, MEMORY_IMAGE);
                    541:                 RefreshMemoryDlgImageList (hImageList, InstIndex, pImageObject);
                    542: 
                    543:                 bStat = TRUE;
                    544:                 break;
                    545:                 }
                    546: 
                    547:             pAddressInstance = NextInstance (pAddressInstance);
                    548:             InstIndex++;
                    549:             }
                    550:         }
                    551: 
                    552:     return bStat;
                    553: 
                    554: }
                    555: 
                    556: 
                    557: 
                    558: 
                    559: //*********************************************************************
                    560: //
                    561: //      RefreshMemoryDlgImageList
                    562: //
                    563: //  Refresh the image list for memory dialog.
                    564: //
                    565: void    RefreshMemoryDlgImageList  (HWND            hImageList,
                    566:                                     DWORD           ParentIndex,
                    567:                                     PPERF_OBJECT    pImageObj)
                    568: {
                    569: PPERF_INSTANCE  pImageInst;
                    570: INT             ListIndex;
                    571: INT             InstIndex = 0;
                    572: 
                    573: 
                    574:     ListIndex = SendMessage (hImageList, CB_ADDSTRING, 0, (DWORD)TEXT(" Total Commit"));
                    575:     SendMessage (hImageList, CB_SETITEMDATA, ListIndex, 0xFFFFFFFF);
                    576: 
                    577:     if (pImageObj)
                    578:         {
                    579:         if (pImageInst = FirstInstance (pImageObj))
                    580:             while (InstIndex < pImageObj->NumInstances)
                    581:                 {
                    582:                 if (ParentIndex == pImageInst->ParentObjectInstance)
                    583:                     {
                    584:                     ListIndex = SendMessage (hImageList,
                    585:                                              CB_ADDSTRING,
                    586:                                              0,
                    587:                                              (DWORD)InstanceName(pImageInst));
                    588:                     SendMessage (hImageList, CB_SETITEMDATA, ListIndex, InstIndex);
                    589:                     }
                    590: 
                    591:                 pImageInst = NextInstance (pImageInst);
                    592:                 InstIndex++;
                    593:                 }
                    594:         }
                    595: }
                    596: 
                    597: 
                    598: 
                    599: 
                    600: //*********************************************************************
                    601: //
                    602: //      RefreshMemoryDlgImage
                    603: //
                    604: //
                    605: void RefreshMemoryDlgImage (HWND            hMemDlg,
                    606:                             DWORD           dwIndex,
                    607:                             PPERF_OBJECT    pImageObject)
                    608: {
                    609: PPERF_INSTANCE  pInst;
                    610: 
                    611:     pInst = FindInstanceN (pImageObject, dwIndex);
                    612: 
                    613:     PaintAddressSpace (hMemDlg, pInst, pImageObject,
                    614:                        MEMORY_TOTALIMAGE_COMMIT,
                    615:                        MEMORY_IMAGE_NOACCESS,   PX_IMAGE_NOACCESS,
                    616:                        MEMORY_IMAGE_READONLY,   PX_IMAGE_READONLY,
                    617:                        MEMORY_IMAGE_READWRITE,  PX_IMAGE_READWRITE,
                    618:                        MEMORY_IMAGE_WRITECOPY,  PX_IMAGE_WRITECOPY,
                    619:                        MEMORY_IMAGE_EXECUTE,    PX_IMAGE_EXECUTABLE,
                    620:                                                 PX_IMAGE_EXE_READONLY,
                    621:                                                 PX_IMAGE_EXE_READWRITE,
                    622:                                                 PX_IMAGE_EXE_WRITECOPY);
                    623: }
                    624: 
                    625: 
                    626: //*********************************************************************
                    627: //
                    628: //      RefreshPviewDlgMemoryData
                    629: //
                    630: //  Update the memory data for pview dialog.  This should be done
                    631: //  after the ghCostlyData is collected and is not refreshing.
                    632: //
                    633: void RefreshPviewDlgMemoryData (HWND            hPviewDlg,
                    634:                                 PPERF_INSTANCE  pProcessInstance,
                    635:                                 PPERF_OBJECT    pProcessObject,
                    636:                                 PPERF_OBJECT    pAddressObject)
                    637: {
                    638: DWORD           *pProcessID1;
                    639: DWORD           *pProcessID2;
                    640: PPERF_COUNTER   pCounter1;
                    641: PPERF_COUNTER   pCounter2;
                    642: PPERF_INSTANCE  pAddressInstance;
                    643: INT             i = 0;
                    644: 
                    645: 
                    646:     if ((pCounter1 = FindCounter (pProcessObject, PX_PROCESS_ID)) &&
                    647:         (pCounter2 = FindCounter (pAddressObject, PX_PROCESS_ID)))
                    648:         {
                    649:         pProcessID1 = (DWORD *) CounterData (pProcessInstance, pCounter1);
                    650: 
                    651:         pAddressInstance = FirstInstance (pAddressObject);
                    652: 
                    653:         while (i < pAddressObject->NumInstances)
                    654:             {
                    655:             pProcessID2 = (DWORD *) CounterData (pAddressInstance, pCounter2);
                    656: 
                    657:             if (*pProcessID1 == *pProcessID2)
                    658:                 {
                    659:                 PaintPviewDlgMemoryData (hPviewDlg, pAddressInstance, pAddressObject);
                    660:                 break;
                    661:                 }
                    662: 
                    663:             pAddressInstance = NextInstance (pAddressInstance);
                    664:             i++;
                    665:             }
                    666:         }
                    667: }
                    668: 
                    669: 
                    670: 
                    671: 
                    672: //*********************************************************************
                    673: //
                    674: //      RefreshPviewDlgThreadPC
                    675: //
                    676: //  Update the thread PC value.  This should be done after the ghCostlyData
                    677: //  is collected and is no refreshing.
                    678: //
                    679: void RefreshPviewDlgThreadPC   (HWND            hPviewDlg,
                    680:                                 LPTSTR          szProcessName,
                    681:                                 LPTSTR          szThreadName,
                    682:                                 PPERF_OBJECT    pThreadDetailsObject,
                    683:                                 PPERF_DATA      pCostlyData)
                    684: {
                    685: PPERF_COUNTER   pCounter;
                    686: PPERF_INSTANCE  pInstance;
                    687: PPERF_INSTANCE  pParent;
                    688: LPTSTR          szInstanceName;
                    689: LPTSTR          szParentName;
                    690: TCHAR           str[20];
                    691: DWORD           *pdwData;
                    692: INT             i = 0;
                    693: 
                    694: 
                    695:     if (pCounter = FindCounter (pThreadDetailsObject, PX_THREAD_PC))
                    696:         {
                    697:         pInstance = FirstInstance (pThreadDetailsObject);
                    698: 
                    699:         while (i < pThreadDetailsObject->NumInstances)
                    700:             {
                    701:             if (!(szInstanceName = InstanceName (pInstance)))
                    702:                 // can't find name
                    703:                 ;
                    704:             else if (lstrcmp (szThreadName, szInstanceName))
                    705:                 // the thread name is different
                    706:                 ;
                    707:             else if (!(pParent = FindInstanceParent (pInstance, pCostlyData)))
                    708:                 // can't find parent
                    709:                 ;
                    710:             else if (!(szParentName = InstanceName (pParent)))
                    711:                 // can't find parent's name
                    712:                 ;
                    713:             else if (!lstrcmp (szProcessName, szParentName))
                    714:                 {
                    715:                 // Parent's name matches, this is the right one.
                    716:                 //
                    717: 
                    718:                 pdwData = CounterData (pInstance, pCounter);
                    719:                 wsprintf (str, TEXT("0x%08x"), *pdwData);
                    720:                 SetDlgItemText (hPviewDlg, PVIEW_THREAD_PC, str);
                    721: 
                    722:                 return;
                    723:                 }
                    724: 
                    725:             pInstance = NextInstance (pInstance);
                    726:             i++;
                    727:             }
                    728:         }
                    729: 
                    730: 
                    731:     // We are here only because we can't find the data to display.
                    732:     //
                    733: 
                    734:     SetDlgItemText (hPviewDlg, PVIEW_THREAD_PC, NODATA);
                    735: 
                    736: }
                    737: 
                    738: 
                    739: 
                    740: 
                    741: //*********************************************************************
                    742: //
                    743: //      ProcessPriority
                    744: //
                    745: //  Returns the process priority dialog item id.
                    746: //
                    747: WORD    ProcessPriority    (PPERF_OBJECT    pObject,
                    748:                             PPERF_INSTANCE  pInstance)
                    749: {
                    750: PPERF_COUNTER   pCounter;
                    751: DWORD           *pdwData;
                    752: 
                    753: 
                    754:     if (pCounter = FindCounter (pObject, PX_PROCESS_PRIO))
                    755:         {
                    756:         pdwData = (DWORD *) CounterData (pInstance, pCounter);
                    757: 
                    758:         if (*pdwData < 7)
                    759:             return PVIEW_PRIORITY_IDL;
                    760:         else if (*pdwData < 10)
                    761:             return PVIEW_PRIORITY_NORMAL;
                    762:         else
                    763:             return PVIEW_PRIORITY_HIGH;
                    764:         }
                    765:     else
                    766:         return PVIEW_PRIORITY_NORMAL;
                    767: 
                    768: }
                    769: 
                    770: 
                    771: 
                    772: 
                    773: //*********************************************************************
                    774: //
                    775: //      RefreshPerfData
                    776: //
                    777: //  Get a new set of performance data.  pData should be NULL initially.
                    778: //
                    779: PPERF_DATA RefreshPerfData (HKEY        hPerfKey,
                    780:                             LPTSTR      szObjectIndex,
                    781:                             PPERF_DATA  pData,
                    782:                             DWORD       *pDataSize)
                    783: {
                    784:     if (GetPerfData (hPerfKey, szObjectIndex, &pData, pDataSize) == ERROR_SUCCESS)
                    785:         return pData;
                    786:     else
                    787:         return NULL;
                    788: }
                    789: 
                    790: 
                    791: 
                    792: 
                    793: //*********************************************************************
                    794: //
                    795: //      SetProcessListText
                    796: //
                    797: //  Format the process list text.
                    798: //
                    799: void SetProcessListText (PPERF_INSTANCE pInst,
                    800:                          PPERF_COUNTER  pCPU,
                    801:                          PPERF_COUNTER  pPRIV,
                    802:                          PPERF_COUNTER  pProcID,
                    803:                          double         fTime,
                    804:                          LPTSTR         str)
                    805: {
                    806: DWORD           *pdwProcID;
                    807: LARGE_INTEGER   *liCPU;
                    808: LARGE_INTEGER   *liPRIV;
                    809: double          fCPU = 0;
                    810: double          fPRIV = 0;
                    811: INT             PcntPRIV = 0;
                    812: INT             PcntUSER = 0;
                    813: TIME_FIELD      TimeFld;
                    814: TCHAR           szTemp[100];
                    815: 
                    816: 
                    817:     if (pCPU)
                    818:         {
                    819:         liCPU = (LARGE_INTEGER *) CounterData (pInst, pCPU);
                    820:         fCPU  = Li2Double (*liCPU);
                    821:         }
                    822: 
                    823:     if (pPRIV)
                    824:         {
                    825:         liPRIV = (LARGE_INTEGER *) CounterData (pInst, pPRIV);
                    826:         fPRIV  = Li2Double (*liPRIV);
                    827:         }
                    828: 
                    829:     if (fCPU > 0)
                    830:         {
                    831:         PcntPRIV = (INT)(fPRIV / fCPU * 100 + 0.5);
                    832:         PcntUSER = 100 - PcntPRIV;
                    833:         }
                    834: 
                    835: 
                    836: 
                    837:     if (pProcID)
                    838:         {
                    839:         pdwProcID = (DWORD *) CounterData (pInst, pProcID);
                    840:         wsprintf (szTemp, TEXT("%ls (%#x)"), InstanceName(pInst), *pdwProcID);
                    841:         }
                    842:     else
                    843:         wsprintf (szTemp, TEXT("%ls"), InstanceName(pInst));
                    844: 
                    845: 
                    846: 
                    847:     FormatTimeFields (fCPU/1.0e7, &TimeFld);
                    848: 
                    849:     wsprintf (str,
                    850:               TEXT("%s\t%3ld:%02ld:%02ld.%03ld\t%3ld%%\t%3ld%%"),
                    851:               szTemp,
                    852:               TimeFld.Hours,
                    853:               TimeFld.Mins,
                    854:               TimeFld.Secs,
                    855:               TimeFld.mSecs,
                    856:               PcntPRIV,
                    857:               PcntUSER);
                    858: }
                    859: 
                    860: 
                    861: 
                    862: 
                    863: //*********************************************************************
                    864: //
                    865: //      RefreshProcessList
                    866: //
                    867: //  Find all process and update the process list.
                    868: //
                    869: void RefreshProcessList (HWND           hProcessList,
                    870:                          PPERF_OBJECT   pObject)
                    871: {
                    872: PPERF_INSTANCE  pInstance;
                    873: TCHAR           szListText[256];
                    874: INT             ListIndex;
                    875: 
                    876: PPERF_COUNTER   pCounterCPU;
                    877: PPERF_COUNTER   pCounterPRIV;
                    878: PPERF_COUNTER   pCounterProcID;
                    879: double          fObjectFreq;
                    880: double          fObjectTime;
                    881: double          fTime;
                    882: 
                    883: INT             InstanceIndex = 0;
                    884: INT             err;
                    885: 
                    886: 
                    887:     if (pObject)
                    888:         {
                    889:         pCounterCPU    = FindCounter (pObject, PX_PROCESS_CPU);
                    890:         pCounterPRIV   = FindCounter (pObject, PX_PROCESS_PRIV);
                    891:         pCounterProcID = FindCounter (pObject, PX_PROCESS_ID);
                    892: 
                    893:         fObjectFreq = Li2Double (pObject->PerfFreq);
                    894:         fObjectTime = Li2Double (pObject->PerfTime);
                    895:         fTime = fObjectTime / fObjectFreq;
                    896: 
                    897:         pInstance = FirstInstance (pObject);
                    898: 
                    899:         while (InstanceIndex < pObject->NumInstances)
                    900:             {
                    901:             SetProcessListText (pInstance,
                    902:                                 pCounterCPU,
                    903:                                 pCounterPRIV,
                    904:                                 pCounterProcID,
                    905:                                 fTime,
                    906:                                 szListText);
                    907: 
                    908:             ListIndex = SendMessage (hProcessList, LB_ADDSTRING, 0, (DWORD)szListText);
                    909:             err = SendMessage (hProcessList, LB_SETITEMDATA, ListIndex, InstanceIndex);
                    910: 
                    911:             pInstance = NextInstance (pInstance);
                    912:             InstanceIndex++;
                    913:             }
                    914:         }
                    915: }
                    916: 
                    917: 
                    918: //*********************************************************************
                    919: //
                    920: //      RefreshProcessData
                    921: //
                    922: //  Find data for a given process and update.
                    923: //
                    924: void RefreshProcessData    (HWND            hWnd,
                    925:                             PPERF_OBJECT    pObject,
                    926:                             DWORD           ProcessIndex)
                    927: {
                    928: PPERF_INSTANCE  pInstance;
                    929: 
                    930: 
                    931:     pInstance = FindInstanceN (pObject, ProcessIndex);
                    932: 
                    933:     PutCounterDWKB (hWnd, PVIEW_WS, pInstance, pObject, PX_PROCESS_WORKING_SET);
                    934: 
                    935: 
                    936:     SetDlgItemText (hWnd, PVIEW_TOTALPRIVATE_COMMIT, NODATA);
                    937: 
                    938:     // set priority
                    939:     //
                    940:     CheckRadioButton (hWnd,
                    941:                       PVIEW_PRIORITY_HIGH,
                    942:                       PVIEW_PRIORITY_IDL,
                    943:                       ProcessPriority (pObject, pInstance));
                    944: }
                    945: 
                    946: 
                    947: 
                    948: 
                    949: //*********************************************************************
                    950: //
                    951: //      SetThreadListText
                    952: //
                    953: //  Format the thread list text.
                    954: //
                    955: void SetThreadListText (PPERF_INSTANCE  pInst,
                    956:                         PPERF_COUNTER   pCPU,
                    957:                         PPERF_COUNTER   pPRIV,
                    958:                         double          fTime,
                    959:                         LPTSTR          str)
                    960: {
                    961: LARGE_INTEGER   *liCPU;
                    962: LARGE_INTEGER   *liPRIV;
                    963: double          fCPU = 0;
                    964: double          fPRIV = 0;
                    965: INT             PcntPRIV = 0;
                    966: INT             PcntUSER = 0;
                    967: TIME_FIELD      TimeFld;
                    968: TCHAR           szTemp[100];
                    969: 
                    970: 
                    971:     if (pCPU)
                    972:         {
                    973:         liCPU = (LARGE_INTEGER *) CounterData (pInst, pCPU);
                    974:         fCPU  = Li2Double (*liCPU);
                    975:         }
                    976: 
                    977:     if (pPRIV)
                    978:         {
                    979:         liPRIV = (LARGE_INTEGER *) CounterData (pInst, pPRIV);
                    980:         fPRIV  = Li2Double (*liPRIV);
                    981:         }
                    982: 
                    983:     if (fCPU > 0)
                    984:         {
                    985:         PcntPRIV = (INT)(fPRIV / fCPU * 100 + 0.5);
                    986:         PcntUSER = 100 - PcntPRIV;
                    987:         }
                    988: 
                    989: 
                    990: 
                    991:     if (pInst->UniqueID != PERF_NO_UNIQUE_ID)
                    992:         wsprintf (szTemp, TEXT("%ls (%#x)"), InstanceName(pInst), pInst->UniqueID);
                    993:     else
                    994:         wsprintf (szTemp, TEXT("%ls"), InstanceName(pInst));
                    995: 
                    996: 
                    997: 
                    998: 
                    999:     FormatTimeFields (fCPU/1.0e7, &TimeFld);
                   1000: 
                   1001:     wsprintf (str,
                   1002:               TEXT("%s\t%3ld:%02ld:%02ld.%03ld\t%3ld%%\t%3ld %%"),
                   1003:               szTemp,
                   1004:               TimeFld.Hours,
                   1005:               TimeFld.Mins,
                   1006:               TimeFld.Secs,
                   1007:               TimeFld.mSecs,
                   1008:               PcntPRIV,
                   1009:               PcntUSER);
                   1010: 
                   1011: }
                   1012: 
                   1013: 
                   1014: 
                   1015: 
                   1016: //*********************************************************************
                   1017: //
                   1018: //      RefreshThreadList
                   1019: //
                   1020: //  Find all threads for a given process and update the thread list.
                   1021: //
                   1022: void RefreshThreadList (HWND            hThreadList,
                   1023:                         PPERF_OBJECT    pObject,
                   1024:                         DWORD           ParentIndex)
                   1025: {
                   1026: PPERF_INSTANCE  pInstance;
                   1027: TCHAR           szListText[256];
                   1028: INT             ListIndex;
                   1029: 
                   1030: PPERF_COUNTER   pCounterCPU;
                   1031: PPERF_COUNTER   pCounterPRIV;
                   1032: double          fObjectFreq;
                   1033: double          fObjectTime;
                   1034: double          fTime;
                   1035: 
                   1036: INT             InstanceIndex = 0;
                   1037: INT             err;
                   1038: 
                   1039: 
                   1040:     if (pObject)
                   1041:         {
                   1042:         pCounterCPU    = FindCounter (pObject, PX_THREAD_CPU);
                   1043:         pCounterPRIV   = FindCounter (pObject, PX_THREAD_PRIV);
                   1044: 
                   1045:         fObjectFreq = Li2Double (pObject->PerfFreq);
                   1046:         fObjectTime = Li2Double (pObject->PerfTime);
                   1047:         fTime = fObjectTime / fObjectFreq;
                   1048: 
                   1049: 
                   1050:         pInstance = FirstInstance (pObject);
                   1051: 
                   1052:         while (InstanceIndex < pObject->NumInstances)
                   1053:             {
                   1054:             if (ParentIndex == pInstance->ParentObjectInstance)
                   1055:                 {
                   1056:                 SetThreadListText (pInstance,
                   1057:                                    pCounterCPU,
                   1058:                                    pCounterPRIV,
                   1059:                                    fTime,
                   1060:                                    szListText);
                   1061: 
                   1062:                 ListIndex = SendMessage (hThreadList, LB_ADDSTRING, 0, (DWORD)szListText);
                   1063:                 err = SendMessage (hThreadList, LB_SETITEMDATA, ListIndex, InstanceIndex);
                   1064:                 }
                   1065: 
                   1066:             pInstance = NextInstance (pInstance);
                   1067:             InstanceIndex++;
                   1068:             }
                   1069:         }
                   1070: 
                   1071: }
                   1072: 
                   1073: 
                   1074: 
                   1075: 
                   1076: //*********************************************************************
                   1077: //
                   1078: //      RefreshThreadData
                   1079: //
                   1080: //  Find data for a given thread and update.
                   1081: //
                   1082: void RefreshThreadData (HWND              hWnd,
                   1083:                         PPERF_OBJECT      pThreadObj,
                   1084:                         DWORD             ThreadIndex,
                   1085:                         PPERF_OBJECT      pProcessObj,
                   1086:                         PPERF_INSTANCE    pProcessInst)
                   1087: {
                   1088: PPERF_INSTANCE  pInstance;
                   1089: PPERF_COUNTER   pCounter;
                   1090: DWORD           *pdwData;
                   1091: DWORD           *pdwProcPrio;
                   1092: BOOL            bPrioCounter;
                   1093: 
                   1094: 
                   1095:     pInstance = FindInstanceN (pThreadObj, ThreadIndex);
                   1096: 
                   1097: 
                   1098:     SetDlgItemText (hWnd, PVIEW_THREAD_PC, NODATA);
                   1099:     PutCounterHEX (hWnd, PVIEW_THREAD_START,    pInstance, pThreadObj, PX_THREAD_START);
                   1100:     PutCounterDW  (hWnd, PVIEW_THREAD_SWITCHES, pInstance, pThreadObj, PX_THREAD_SWITCHES);
                   1101:     PutCounterDW  (hWnd, PVIEW_THREAD_DYNAMIC,  pInstance, pThreadObj, PX_THREAD_PRIO);
                   1102: 
                   1103: 
                   1104: 
                   1105:     // set thread base priority
                   1106:     //
                   1107:     bPrioCounter = TRUE;
                   1108: 
                   1109:     if (pCounter = FindCounter (pProcessObj, PX_THREAD_BASE_PRIO))
                   1110:         pdwData = CounterData (pProcessInst, pCounter);
                   1111:     else
                   1112:         bPrioCounter = FALSE;
                   1113: 
                   1114: 
                   1115:     if (pCounter = FindCounter (pProcessObj, PX_PROCESS_PRIO))
                   1116:         pdwProcPrio = CounterData (pProcessInst, pCounter);
                   1117:     else
                   1118:         bPrioCounter = FALSE;
                   1119: 
                   1120:     if (!bPrioCounter)
                   1121:         CheckRadioButton (hWnd,
                   1122:                           PVIEW_THREAD_HIGHEST,
                   1123:                           PVIEW_THREAD_LOWEST,
                   1124:                           PVIEW_THREAD_NORMAL);
                   1125:     else
                   1126:         {
                   1127:         switch (*pdwData - *pdwProcPrio)
                   1128:             {
                   1129:             case 2:
                   1130:                 CheckRadioButton (hWnd,
                   1131:                                   PVIEW_THREAD_HIGHEST,
                   1132:                                   PVIEW_THREAD_LOWEST,
                   1133:                                   PVIEW_THREAD_HIGHEST);
                   1134:                 break;
                   1135: 
                   1136:             case 1:
                   1137:                 CheckRadioButton (hWnd,
                   1138:                                   PVIEW_THREAD_HIGHEST,
                   1139:                                   PVIEW_THREAD_LOWEST,
                   1140:                                   PVIEW_THREAD_ABOVE);
                   1141:                 break;
                   1142: 
1.1.1.2 ! root     1143:             case (DWORD) -1:
1.1       root     1144:                 CheckRadioButton (hWnd,
                   1145:                                   PVIEW_THREAD_HIGHEST,
                   1146:                                   PVIEW_THREAD_LOWEST,
                   1147:                                   PVIEW_THREAD_BELOW);
                   1148:                 break;
                   1149: 
1.1.1.2 ! root     1150:             case (DWORD) -2:
1.1       root     1151:                 CheckRadioButton (hWnd,
                   1152:                                   PVIEW_THREAD_HIGHEST,
                   1153:                                   PVIEW_THREAD_LOWEST,
                   1154:                                   PVIEW_THREAD_LOWEST);
                   1155:                 break;
                   1156: 
                   1157:             case 0:
                   1158:             default:
                   1159:                 CheckRadioButton (hWnd,
                   1160:                                   PVIEW_THREAD_HIGHEST,
                   1161:                                   PVIEW_THREAD_LOWEST,
                   1162:                                   PVIEW_THREAD_NORMAL);
                   1163:                 break;
                   1164:             }
                   1165:         }
                   1166: }

unix.superglobalmegacorp.com

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