|
|
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: ! 1143: case -1: ! 1144: CheckRadioButton (hWnd, ! 1145: PVIEW_THREAD_HIGHEST, ! 1146: PVIEW_THREAD_LOWEST, ! 1147: PVIEW_THREAD_BELOW); ! 1148: break; ! 1149: ! 1150: case -2: ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.