|
|
1.1 ! root 1: ! 2: ! 3: //==========================================================================// ! 4: // Includes // ! 5: //==========================================================================// ! 6: ! 7: ! 8: #include "perfmon.h" // included by all source files ! 9: #include "line.h" // external declarations for this file ! 10: //#include <tchar.h> // for _tcsncpy ! 11: ! 12: #include "fileutil.h" // for FileRead, FileWrite ! 13: #include "pmemory.h" // for MemoryXXX (mallloc-type) routines ! 14: #include "perfdata.h" // for UpdateSystemData, et al ! 15: #include "perfmops.h" // for InsertLine ! 16: #include "system.h" // for SystemAdd ! 17: #include "utils.h" ! 18: #include "playback.h" // for PlayingBackLog ! 19: #include "counters.h" // CounterEntry ! 20: ! 21: #include <string.h> // for strncpy ! 22: #ifdef UNICODE ! 23: #define _tcsncpy wcsncpy ! 24: #else ! 25: #define _tcsncpy strncpy ! 26: #endif ! 27: ! 28: TCHAR LOCAL_SYS_CODE_NAME[] = TEXT("....") ; ! 29: #define sizeofCodeName sizeof(LOCAL_SYS_CODE_NAME) / sizeof(TCHAR) - 1 ! 30: ! 31: // Local Function prototype ! 32: PLINE ReadLine (PPERFSYSTEM *ppSystem, ! 33: PPPERFSYSTEM ppSystemFirst, ! 34: PPERFDATA *ppPerfData, ! 35: HANDLE hFile, ! 36: int LineType, ! 37: PDISKLINE *ppDiskLine, ! 38: DWORD *pSizeofDiskLine) ; ! 39: ! 40: ! 41: ! 42: //==========================================================================// ! 43: // Exported Functions // ! 44: //==========================================================================// ! 45: ! 46: ! 47: PLINE LineAllocate (void) ! 48: /* ! 49: Effect: Allocate and initialize a Line data structure. Lines ! 50: are used as the primary elements of both charts and ! 51: alerts. ! 52: ! 53: Establish any representation invariants for the Line ! 54: type. ! 55: ! 56: Also alllocate another structure, an array of data ! 57: elements, iNumDataValues long. ! 58: */ ! 59: { // LineAllocate ! 60: PLINE pLine ; ! 61: ! 62: pLine = MemoryAllocate (sizeof (LINESTRUCT)) ; ! 63: ! 64: if (pLine) ! 65: { ! 66: // don't need to zero these again since MemoryAllocate is using ! 67: // GMEM_ZEROPOINT ! 68: // pLine->pLineNext = NULL ; ! 69: // pLine->pLineCounterNext = NULL ; ! 70: ! 71: // do want to do this since (FLOAT)0.0 is not 0 ! 72: pLine->lnMinValue = ! 73: pLine->lnMaxValue = ! 74: pLine->lnAveValue = (FLOAT) 0.0 ; ! 75: ! 76: if (PlayingBackLog()) ! 77: { ! 78: pLine->bFirstTime = FALSE ; ! 79: } ! 80: else ! 81: { ! 82: // pLine->bFirstTime = TRUE ; ! 83: // we want to take 2 samples before plotting the first data ! 84: pLine->bFirstTime = 2 ; ! 85: } ! 86: } // if ! 87: ! 88: return (pLine) ; ! 89: } // LineAllocate ! 90: ! 91: ! 92: void LineFree (PLINE pLine) ! 93: { // LineFree ! 94: // free any memory allocated by this line ! 95: if (pLine->lnSystemName) ! 96: MemoryFree (pLine->lnSystemName) ; ! 97: ! 98: if (pLine->lnObjectName) ! 99: MemoryFree (pLine->lnObjectName) ; ! 100: ! 101: if (pLine->lnCounterName) ! 102: MemoryFree (pLine->lnCounterName) ; ! 103: ! 104: if (pLine->lnInstanceName) ! 105: MemoryFree (pLine->lnInstanceName) ; ! 106: ! 107: if (pLine->lnParentObjName) ! 108: MemoryFree (pLine->lnParentObjName) ; ! 109: ! 110: if (pLine->lnPINName) ! 111: MemoryFree (pLine->lnPINName) ; ! 112: ! 113: if (pLine->lpszAlertProgram) ! 114: MemoryFree (pLine->lpszAlertProgram) ; ! 115: ! 116: if (pLine->hPen) ! 117: DeletePen(pLine->hPen); ! 118: ! 119: if (pLine->hBrush) ! 120: DeletePen(pLine->hBrush); ! 121: ! 122: if (pLine->lnValues) ! 123: MemoryFree (pLine->lnValues) ; ! 124: ! 125: if (pLine->aiLogIndexes) ! 126: MemoryFree (pLine->aiLogIndexes) ; ! 127: ! 128: MemoryFree (pLine) ; ! 129: } // LineFree ! 130: ! 131: ! 132: ! 133: void LineAppend (PPLINE ppLineFirst, ! 134: PLINE pLineNew) ! 135: { ! 136: PLINE pLine ; ! 137: ! 138: if (!*ppLineFirst) ! 139: *ppLineFirst = pLineNew ; ! 140: else ! 141: { // else ! 142: for (pLine = *ppLineFirst ; ! 143: pLine->pLineNext ; ! 144: pLine = pLine->pLineNext) ! 145: /* nothing */ ; ! 146: pLine->pLineNext = pLineNew ; ! 147: } // else ! 148: } ! 149: ! 150: ! 151: ! 152: BOOL LineRemove (PPLINE ppLineFirst, ! 153: PLINE pLineRemove) ! 154: { ! 155: PLINE pLine ; ! 156: ! 157: if (*ppLineFirst == pLineRemove) ! 158: { ! 159: *ppLineFirst = (*ppLineFirst)->pLineNext ; ! 160: return (TRUE) ; ! 161: } ! 162: ! 163: for (pLine = *ppLineFirst ; ! 164: pLine->pLineNext ; ! 165: pLine = pLine->pLineNext) ! 166: { // for ! 167: if (pLine->pLineNext == pLineRemove) ! 168: { ! 169: pLine->pLineNext = pLineRemove->pLineNext ; ! 170: return (TRUE) ; ! 171: } // if ! 172: } // for ! 173: ! 174: return (FALSE) ; ! 175: } // LineRemove ! 176: ! 177: ! 178: ! 179: int NumLines (PLINE pLineFirst) ! 180: { // NumLines ! 181: PLINE pLine ; ! 182: int iNumLines ; ! 183: ! 184: if (!pLineFirst) ! 185: return (0) ; ! 186: ! 187: ! 188: iNumLines = 0 ; ! 189: for (pLine = pLineFirst ; ! 190: pLine ; ! 191: pLine = pLine->pLineNext) ! 192: { // for ! 193: iNumLines++ ; ! 194: } // for ! 195: ! 196: ! 197: return (iNumLines) ; ! 198: } // NumLines ! 199: ! 200: ! 201: ! 202: LPTSTR LineInstanceName (PLINE pLine) ! 203: { ! 204: if (pLine->lnObject.NumInstances <= 0) ! 205: return (NULL) ; ! 206: else ! 207: return (pLine->lnInstanceName) ; ! 208: } ! 209: ! 210: ! 211: LPTSTR LineParentName (PLINE pLine) ! 212: { ! 213: if (pLine->lnObject.NumInstances <= 0) ! 214: return (NULL) ; ! 215: else if (pLine->lnInstanceDef.ParentObjectTitleIndex) ! 216: return (pLine->lnPINName) ; ! 217: else ! 218: return (NULL) ; ! 219: } ! 220: ! 221: ! 222: ! 223: void LineCounterAppend (PPLINE ppLineFirst, ! 224: PLINE pLineNew) ! 225: { ! 226: PLINE pLine ; ! 227: ! 228: if (!*ppLineFirst) ! 229: *ppLineFirst = pLineNew ; ! 230: else ! 231: { // else ! 232: for (pLine = *ppLineFirst ; ! 233: pLine->pLineCounterNext ; ! 234: pLine = pLine->pLineCounterNext) ! 235: /* nothing */ ; ! 236: pLine->pLineCounterNext = pLineNew ; ! 237: } // else ! 238: } ! 239: ! 240: ! 241: ! 242: BOOL EquivalentLine (PLINE pLine1, ! 243: PLINE pLine2) ! 244: { // LineEquivalent ! 245: return (pstrsame (pLine1->lnCounterName, pLine2->lnCounterName) && ! 246: pstrsame (pLine1->lnInstanceName, pLine2->lnInstanceName) && ! 247: pstrsame (pLine1->lnPINName, pLine2->lnPINName) && ! 248: pstrsame (pLine1->lnObjectName, pLine2->lnObjectName) && ! 249: pstrsamei (pLine1->lnSystemName, pLine2->lnSystemName)) ; ! 250: } // LineEquivalent ! 251: ! 252: ! 253: PLINE FindEquivalentLine (PLINE pLineToFind, ! 254: PLINE pLineFirst) ! 255: { ! 256: PLINE pLine ; ! 257: ! 258: for (pLine = pLineFirst ; ! 259: pLine ; ! 260: pLine = pLine->pLineNext) ! 261: { // for ! 262: if (EquivalentLine (pLine, pLineToFind)) ! 263: return (pLine) ; ! 264: } // for ! 265: ! 266: return (NULL) ; ! 267: } // FindEquivalentLine ! 268: ! 269: // This routine is used only to read the system name from a disk string ! 270: // It is mainly for performance improvement. ! 271: LPTSTR DiskStringReadSys (PDISKSTRING pDS) ! 272: { // DiskStringReadSys ! 273: LPTSTR lpszText ; ! 274: LPTSTR pDiskSysName ; ! 275: int iIndex ; ! 276: BOOL bLocalSysName = FALSE ; ! 277: ! 278: if (pDS->dwLength == 0) ! 279: { ! 280: return (NULL) ; ! 281: } ! 282: ! 283: if (pDS->dwLength == sizeofCodeName) ! 284: { ! 285: // check for LOCAL_SYS_CODE_NAME ! 286: bLocalSysName = TRUE ; ! 287: pDiskSysName = (LPTSTR)((PBYTE) pDS + pDS->dwOffset) ; ! 288: for (iIndex = 0 ; iIndex < sizeofCodeName; iIndex++, pDiskSysName++) ! 289: { ! 290: if (*pDiskSysName != LOCAL_SYS_CODE_NAME[iIndex]) ! 291: { ! 292: bLocalSysName = FALSE ; ! 293: break ; ! 294: } ! 295: } ! 296: } ! 297: ! 298: if (bLocalSysName) ! 299: { ! 300: lpszText = ! 301: MemoryAllocate ((lstrlen(LocalComputerName)+1) * sizeof(TCHAR)) ; ! 302: if (lpszText) ! 303: { ! 304: lstrcpy (lpszText, LocalComputerName) ; ! 305: } ! 306: } ! 307: else ! 308: { ! 309: lpszText = MemoryAllocate (sizeof (TCHAR) * (pDS->dwLength + 1)) ; ! 310: if (lpszText) ! 311: { ! 312: _tcsncpy ((WCHAR *)lpszText, (WCHAR *)((PBYTE) pDS + pDS->dwOffset), ! 313: pDS->dwLength) ; ! 314: } ! 315: } ! 316: ! 317: return (lpszText) ; ! 318: } // DiskStringReadSys ! 319: ! 320: ! 321: ! 322: LPTSTR DiskStringRead (PDISKSTRING pDS) ! 323: { // DiskStringRead ! 324: LPTSTR lpszText ; ! 325: ! 326: if (pDS->dwLength == 0) ! 327: { ! 328: return (NULL) ; ! 329: } ! 330: ! 331: lpszText = MemoryAllocate (sizeof (TCHAR) * (pDS->dwLength + 1)) ; ! 332: if (!lpszText) ! 333: { ! 334: return (NULL) ; ! 335: } ! 336: ! 337: _tcsncpy ((WCHAR *)lpszText, (WCHAR *)((PBYTE) pDS + pDS->dwOffset), ! 338: pDS->dwLength) ; ! 339: ! 340: return (lpszText) ; ! 341: } // DiskStringRead ! 342: ! 343: ! 344: int DiskStringLength (LPTSTR lpszText) ! 345: { ! 346: if (!lpszText) ! 347: return (0) ; ! 348: else ! 349: return (lstrlen (lpszText)) ; ! 350: } ! 351: ! 352: PBYTE DiskStringCopy (PDISKSTRING pDS, LPTSTR lpszText, PBYTE pNextFree) ! 353: { ! 354: if (!lpszText) ! 355: { ! 356: pDS->dwOffset = 0 ; ! 357: pDS->dwLength = 0 ; ! 358: return (pNextFree) ; ! 359: } ! 360: else ! 361: { ! 362: pDS->dwOffset = pNextFree - (PBYTE) pDS ; ! 363: pDS->dwLength = DiskStringLength (lpszText) ; ! 364: _tcsncpy ((WCHAR *)pNextFree, (WCHAR *)lpszText, pDS->dwLength) ; ! 365: return (pNextFree + pDS->dwLength * sizeof(TCHAR)) ; ! 366: } ! 367: } // DiskStringCopy ! 368: ! 369: ! 370: void CounterName (PPERFSYSTEM pSystem, ! 371: PPERFCOUNTERDEF pCounter, ! 372: LPTSTR lpszCounter) ! 373: { // CounterName ! 374: //!! strclr (lpszCounter) ; ! 375: lpszCounter [0] = TEXT('\0') ; ! 376: QueryPerformanceName (pSystem, ! 377: pCounter->CounterNameTitleIndex, ! 378: 0, 256, ! 379: lpszCounter, ! 380: FALSE) ; ! 381: } // CounterName ! 382: ! 383: ! 384: ! 385: PPERFOBJECT LineFindObject (PPERFSYSTEM pSystem, ! 386: PPERFDATA pPerfData, ! 387: PLINE pLine) ! 388: /* ! 389: Effect: Set the lnObject field of pLine to the object with the ! 390: name of lnObjectName, and return TRUE. Return FALSE if ! 391: there is no such object. ! 392: */ ! 393: { // LineFindObject ! 394: PPERFOBJECT pObject ; ! 395: ! 396: pObject = GetObjectDefByName (pSystem, pPerfData, pLine->lnObjectName) ; ! 397: ! 398: if (pObject) ! 399: { ! 400: pLine->lnObject = *pObject ; ! 401: return (pObject) ; ! 402: } ! 403: else ! 404: return (NULL) ; ! 405: } // LineFindObject ! 406: ! 407: ! 408: ! 409: PPERFCOUNTERDEF LineFindCounter (PPERFSYSTEM pSystem, ! 410: PPERFOBJECT pObject, ! 411: PPERFDATA pPerfData, ! 412: PLINE pLine) ! 413: { // LineFindCounter ! 414: UINT i ; ! 415: PPERFCOUNTERDEF pCounter ; ! 416: TCHAR szCounter [256] ; ! 417: ! 418: for (i = 0, pCounter = FirstCounter (pObject) ; ! 419: i < pObject->NumCounters ; ! 420: i++, pCounter = NextCounter (pCounter)) ! 421: { // for ! 422: CounterName (pSystem, pCounter, szCounter) ; ! 423: if (strsame (szCounter, pLine->lnCounterName)) ! 424: { ! 425: pLine->lnCounterDef = *pCounter ; ! 426: return (pCounter) ; ! 427: } // if ! 428: } // for ! 429: ! 430: return (NULL) ; ! 431: } // LineFindCounter ! 432: ! 433: ! 434: PPERFINSTANCEDEF LineFindInstance (PPERFDATA pPerfData, ! 435: PPERFOBJECT pObject, ! 436: PLINE pLine) ! 437: { // LineFindInstance ! 438: ! 439: ! 440: PPERFINSTANCEDEF pInstance = NULL ; ! 441: ! 442: if ((pObject->NumInstances > 0) && pLine->lnInstanceName) ! 443: { ! 444: // instances exist, find the right one ! 445: ! 446: if (pLine->lnUniqueID != PERF_NO_UNIQUE_ID) ! 447: { ! 448: pInstance = GetInstanceByUniqueID(pObject, pLine->lnUniqueID) ; ! 449: } ! 450: else ! 451: { ! 452: pInstance = GetInstanceByName(pPerfData, pObject, ! 453: pLine->lnInstanceName, pLine->lnPINName) ; ! 454: } ! 455: } ! 456: ! 457: if (pInstance) ! 458: { ! 459: pLine->lnInstanceDef = *pInstance ; ! 460: } ! 461: ! 462: return (pInstance) ; ! 463: } // LineFindInstance ! 464: ! 465: ! 466: ! 467: ! 468: void ReadLines (HANDLE hFile, ! 469: DWORD dwNumLines, ! 470: PPPERFSYSTEM ppSystemFirst, ! 471: PPLINE ppLineFirst, ! 472: int LineType) ! 473: { ! 474: DWORD i ; ! 475: PPERFDATA pPerfData ; ! 476: PLINE pLine ; ! 477: PPERFSYSTEM pSystem ; ! 478: PDISKLINE pDiskLine = NULL ; ! 479: DWORD SizeofDiskLine = 0 ; // bytes in pDiskLine ! 480: ! 481: ! 482: pPerfData = AllocatePerfData () ; ! 483: pSystem = *ppSystemFirst ; ! 484: ! 485: #if 0 ! 486: if (!pSystem) ! 487: { ! 488: pSystem = SystemAdd (ppSystemFirst, LocalComputerName) ; ! 489: pSystem = *ppSystemFirst ; //!! ! 490: } ! 491: ! 492: UpdateSystemData (pSystem, &pPerfData) ; ! 493: #endif ! 494: pDiskLine = MemoryAllocate (FilePathLen) ; ! 495: if (!pDiskLine) ! 496: { ! 497: // no memory to begin with, forget it ! 498: DlgErrorBox (hWndMain, ERR_NO_MEMORY) ; ! 499: return ; ! 500: } ! 501: SizeofDiskLine = FilePathLen ; ! 502: ! 503: for (i = 0 ; ! 504: i < dwNumLines ; ! 505: i++) ! 506: { ! 507: pLine = ReadLine (&pSystem, ppSystemFirst, &pPerfData, hFile, ! 508: LineType, &pDiskLine, &SizeofDiskLine) ; ! 509: if (pLine) ! 510: InsertLine (pLine) ; ! 511: } ! 512: ! 513: if (pDiskLine) ! 514: { ! 515: MemoryFree (pDiskLine); ! 516: } ! 517: ! 518: BuildValueListForSystems (*ppSystemFirst, *ppLineFirst) ; ! 519: ! 520: MemoryFree (pPerfData) ; ! 521: } // ReadLines ! 522: ! 523: ! 524: ! 525: void LineSetCounter (PLINE pLine, ! 526: PPERFSYSTEM pSystem, ! 527: PPERFCOUNTERDEF pCounter, ! 528: PPERFINSTANCEDEF pInstance) ! 529: /* ! 530: Effect: Set the counter-specific portions of pLine to point to ! 531: the desired counter. ! 532: ! 533: Called By: AddLine, ReadLine. ! 534: */ ! 535: { ! 536: } ! 537: ! 538: ! 539: PLINE ReadLine (PPERFSYSTEM *ppSystem, ! 540: PPPERFSYSTEM ppSystemFirst, ! 541: PPERFDATA *ppPerfData, ! 542: HANDLE hFile, ! 543: int LineType, ! 544: PDISKLINE *ppDiskLine, ! 545: DWORD *pSizeofDiskLine) ! 546: ! 547: ! 548: /* ! 549: Effect: Read in a line from the file hFile, at the current file ! 550: position. ! 551: ! 552: Internals: The very first characters are a line signature, then a ! 553: length integer. If the signature is correct, then allocate ! 554: the length amount, and work with that. ! 555: */ ! 556: { // ReadLine ! 557: PLINE pLine ; ! 558: ! 559: struct ! 560: { ! 561: DWORD dwSignature ; ! 562: DWORD dwLength ; ! 563: } LineHeader ; ! 564: ! 565: PPERFOBJECT pObject ; ! 566: PPERFCOUNTERDEF pCounter ; ! 567: PDISKLINE pDiskLine ; // Local copy of the pointer ! 568: ! 569: #ifdef KEEP_IT ! 570: int i ; ! 571: int iCounterIndex ; ! 572: int j ; ! 573: PERF_COUNTER_BLOCK *pCounterBlock ; ! 574: #endif ! 575: ! 576: PPERFINSTANCEDEF pInstance ; ! 577: // PPERFINSTANCEDEF pInstanceParent ; ! 578: // TCHAR szInstanceParent [256] ; ! 579: // TCHAR szObjectParent [PerfObjectLen] ; ! 580: ! 581: pLine = NULL ; ! 582: ! 583: ! 584: //=============================// ! 585: // read and compare signature // ! 586: //=============================// ! 587: ! 588: if (!FileRead (hFile, &LineHeader, sizeof (LineHeader))) ! 589: return (NULL) ; ! 590: ! 591: ! 592: if (LineHeader.dwSignature != dwLineSignature || ! 593: LineHeader.dwLength == 0) ! 594: { ! 595: SetLastError (ERROR_BAD_FORMAT) ; ! 596: return (NULL) ; ! 597: } ! 598: ! 599: ! 600: //=============================// ! 601: // read and allocate length // ! 602: //=============================// ! 603: ! 604: ! 605: // if (!FileRead (hFile, &dwLength, sizeof (dwLength)) || dwLength == 0) ! 606: // return (NULL) ; ! 607: ! 608: ! 609: // check if we need a bigger buffer, ! 610: // normally, it should be the same except the first time... ! 611: if (LineHeader.dwLength > *pSizeofDiskLine) ! 612: { ! 613: if (*ppDiskLine) ! 614: { ! 615: // free the previous buffer ! 616: MemoryFree (*ppDiskLine); ! 617: *pSizeofDiskLine = 0 ; ! 618: } ! 619: ! 620: // re-allocate a new buffer ! 621: *ppDiskLine = (PDISKLINE) MemoryAllocate (LineHeader.dwLength) ; ! 622: if (!(*ppDiskLine)) ! 623: { ! 624: // no memory, should flag an error... ! 625: return (NULL) ; ! 626: } ! 627: *pSizeofDiskLine = LineHeader.dwLength ; ! 628: } ! 629: ! 630: pDiskLine = *ppDiskLine ; ! 631: ! 632: ! 633: //=============================// ! 634: // copy diskline, alloc line // ! 635: //=============================// ! 636: ! 637: if (!FileRead (hFile, pDiskLine, LineHeader.dwLength)) ! 638: return (NULL) ; ! 639: ! 640: ! 641: pLine = LineAllocate () ; ! 642: if (!pLine) ! 643: { ! 644: return (NULL) ; ! 645: } ! 646: ! 647: pLine->iLineType = pDiskLine->iLineType ; ! 648: ! 649: ! 650: //=============================// ! 651: // convert system information // ! 652: //=============================// ! 653: ! 654: pLine->lnSystemName = DiskStringReadSys (&(pDiskLine->dsSystemName)) ; ! 655: if (!pLine->lnSystemName) ! 656: goto ErrorBadLine ; ! 657: ! 658: if (!*ppSystem || !strsamei (pLine->lnSystemName, (*ppSystem)->sysName)) ! 659: { ! 660: *ppSystem = SystemAdd (ppSystemFirst, pLine->lnSystemName) ; ! 661: if (!*ppSystem) ! 662: { ! 663: SetLastError (ERROR_BAD_FORMAT) ; ! 664: goto ErrorBadLine ; ! 665: } ! 666: ! 667: UpdateSystemData (*ppSystem, ppPerfData) ; ! 668: } // if ! 669: ! 670: //=============================// ! 671: // convert object information // ! 672: //=============================// ! 673: ! 674: pLine->lnObjectName = DiskStringRead (&(pDiskLine->dsObjectName)) ; ! 675: if (!pLine->lnObjectName) ! 676: goto ErrorBadLine ; ! 677: ! 678: pObject = LineFindObject (*ppSystem, *ppPerfData, pLine) ; ! 679: if (!pObject) ! 680: { ! 681: SetLastError (ERROR_BAD_FORMAT) ; ! 682: goto ErrorBadLine ; ! 683: } ! 684: ! 685: //=============================// ! 686: // convert counter information // ! 687: //=============================// ! 688: ! 689: pLine->lnCounterName = DiskStringRead (&(pDiskLine->dsCounterName)) ; ! 690: if (!pLine->lnCounterName) ! 691: goto ErrorBadLine ; ! 692: ! 693: pCounter = LineFindCounter (*ppSystem, pObject, *ppPerfData, pLine) ; ! 694: if (!pCounter) ! 695: { ! 696: SetLastError (ERROR_BAD_FORMAT) ; ! 697: goto ErrorBadLine ; ! 698: } ! 699: ! 700: //=============================// ! 701: // convert instance info // ! 702: //=============================// ! 703: ! 704: pLine->lnUniqueID = pDiskLine->dwUniqueID ; ! 705: pLine->lnInstanceName = DiskStringRead (&(pDiskLine->dsInstanceName)) ; ! 706: pLine->lnPINName = DiskStringRead (&(pDiskLine->dsPINName)) ; ! 707: ! 708: pInstance = LineFindInstance (*ppPerfData, pObject, pLine) ; ! 709: ! 710: if (pInstance) ! 711: { ! 712: pLine->lnParentObjName = DiskStringRead (&(pDiskLine->dsParentObjName)) ; ! 713: } ! 714: ! 715: ! 716: //=============================// ! 717: // convert chart information // ! 718: //=============================// ! 719: ! 720: if (LineType == IDM_VIEWCHART) ! 721: { ! 722: pLine->Visual = pDiskLine->Visual ; ! 723: pLine->hPen = CreatePen (pLine->Visual.iStyle, ! 724: pLine->Visual.iWidth, ! 725: pLine->Visual.crColor) ; ! 726: pLine->iScaleIndex = pDiskLine->iScaleIndex ; ! 727: pLine->eScale = pDiskLine->eScale ; ! 728: } ! 729: ! 730: ! 731: //=============================// ! 732: // convert alert information // ! 733: //=============================// ! 734: ! 735: if (LineType == IDM_VIEWALERT) ! 736: { ! 737: pLine->Visual = pDiskLine->Visual ; ! 738: pLine->hBrush = CreateSolidBrush (pLine->Visual.crColor) ; ! 739: pLine->bAlertOver = pDiskLine->bAlertOver ; ! 740: pLine->eAlertValue = pDiskLine->eAlertValue ; ! 741: pLine->lpszAlertProgram = DiskStringRead (&(pDiskLine->dsAlertProgram)) ; ! 742: pLine->bEveryTime = pDiskLine->bEveryTime ; ! 743: pLine->bAlerted = FALSE ; ! 744: } ! 745: ! 746: ! 747: //=============================// ! 748: // Convert the nasty stuff // ! 749: //=============================// ! 750: ! 751: ! 752: pLine->lnCounterType = pCounter->CounterType; ! 753: pLine->lnCounterLength = pCounter->CounterSize; ! 754: ! 755: ! 756: // we don't need these line info since we will get it ! 757: // from the first couple clock ticks... ! 758: // If we decide to keep these line, just define KEEP_IT ! 759: #ifdef KEEP_IT ! 760: pLine->lnOldTime = (*ppPerfData)->PerfTime ; ! 761: pLine->lnNewTime = (*ppPerfData)->PerfTime ; ! 762: pLine->lnOldTime100Ns = (*ppPerfData)->PerfTime100nSec ; ! 763: pLine->lnNewTime100Ns = (*ppPerfData)->PerfTime100nSec; ! 764: ! 765: pLine->lnPerfFreq = (*ppPerfData)->PerfFreq ; ! 766: ! 767: for (j = 0 ; j < 2 ; j++) ! 768: { ! 769: pLine->lnaCounterValue[j].LowPart = 0 ; ! 770: pLine->lnaCounterValue[j].HighPart = 0 ; ! 771: } ! 772: ! 773: ! 774: if (pObject->NumInstances > 0 && pInstance) ! 775: { ! 776: pCounterBlock = (PERF_COUNTER_BLOCK *) ( (PBYTE) pInstance + ! 777: pInstance->ByteLength); ! 778: } ! 779: else ! 780: { ! 781: pCounterBlock = (PERF_COUNTER_BLOCK *) ( (PBYTE) pObject + ! 782: pObject->DefinitionLength); ! 783: } ! 784: ! 785: if (pLine->lnCounterLength <= 4) ! 786: pLine->lnaOldCounterValue[0].LowPart = ! 787: * ( (DWORD FAR *) ( (PBYTE)pCounterBlock + ! 788: pCounter[0].CounterOffset)); ! 789: else ! 790: { ! 791: pLine->lnaOldCounterValue[0] = ! 792: * ( (LARGE_INTEGER *) ( (PBYTE)pCounterBlock + ! 793: pCounter[0].CounterOffset)); ! 794: } ! 795: ! 796: // Get second counter, only if we are not at ! 797: // the end of the counters; some computations ! 798: // require a second counter ! 799: ! 800: iCounterIndex = CounterIndex (pCounter, pObject) ; ! 801: if ((UINT) iCounterIndex < pObject->NumCounters - 1 && ! 802: iCounterIndex != -1) ! 803: { ! 804: if (pLine->lnCounterLength <= 4) ! 805: pLine->lnaOldCounterValue[1].LowPart = ! 806: * ( (DWORD FAR *) ( (PBYTE)pCounterBlock + ! 807: pCounter[1].CounterOffset)); ! 808: else ! 809: pLine->lnaOldCounterValue[1] = ! 810: * ( (LARGE_INTEGER *) ( (PBYTE)pCounterBlock + ! 811: pCounter[1].CounterOffset)); ! 812: } ! 813: ! 814: // pLine->valNext = CounterFuncEntry ; ! 815: pLine->valNext = CounterEntry ; ! 816: ! 817: pLine->lnaOldCounterValue[0] = pLine->lnaCounterValue[0]; ! 818: pLine->lnaOldCounterValue[1] = pLine->lnaCounterValue[1]; ! 819: #endif // KEEP_IT ! 820: ! 821: ! 822: // pLine->valNext = CounterFuncEntry ; ! 823: pLine->valNext = CounterEntry ; ! 824: ! 825: return (pLine) ; ! 826: ! 827: ! 828: ErrorBadLine: ! 829: if (!pLine) ! 830: { ! 831: LineFree (pLine) ; ! 832: } ! 833: return (NULL) ; ! 834: } // ReadLine ! 835: ! 836: ! 837: ! 838: ! 839: BOOL WriteLine (PLINE pLine, ! 840: HANDLE hFile) ! 841: { // WriteLine ! 842: PDISKLINE pDiskLine ; ! 843: DWORD dwSignature ; ! 844: DWORD dwLength ; ! 845: PBYTE pNextFree ; ! 846: BOOL bConvertName ; ! 847: ! 848: //=============================// ! 849: // write signature // ! 850: //=============================// ! 851: ! 852: dwSignature = dwLineSignature ; ! 853: if (!FileWrite (hFile, &dwSignature, sizeof (dwSignature))) ! 854: return (FALSE) ; ! 855: ! 856: if (IsLocalComputer(pLine->lnSystemName)) ! 857: { ! 858: bConvertName = TRUE ; ! 859: } ! 860: else ! 861: { ! 862: bConvertName = FALSE ; ! 863: } ! 864: ! 865: //=============================// ! 866: // compute and allocate length // ! 867: //=============================// ! 868: ! 869: ! 870: dwLength = sizeof (DISKLINE) ; ! 871: if (bConvertName) ! 872: { ! 873: dwLength += DiskStringLength (LOCAL_SYS_CODE_NAME) * sizeof (TCHAR) ; ! 874: } ! 875: else ! 876: { ! 877: dwLength += DiskStringLength (pLine->lnSystemName) * sizeof (TCHAR) ; ! 878: } ! 879: dwLength += DiskStringLength (pLine->lnObjectName) * sizeof (TCHAR) ; ! 880: dwLength += DiskStringLength (pLine->lnCounterName) * sizeof (TCHAR) ; ! 881: dwLength += DiskStringLength (pLine->lnInstanceName) * sizeof (TCHAR) ; ! 882: dwLength += DiskStringLength (pLine->lnPINName) * sizeof (TCHAR) ; ! 883: dwLength += DiskStringLength (pLine->lnParentObjName) * sizeof (TCHAR) ; ! 884: dwLength += DiskStringLength (pLine->lpszAlertProgram) * sizeof (TCHAR) ; ! 885: ! 886: ! 887: if (!FileWrite (hFile, &dwLength, sizeof (dwLength))) ! 888: return (FALSE) ; ! 889: ! 890: pDiskLine = (PDISKLINE) MemoryAllocate (dwLength) ; ! 891: if (!pDiskLine) ! 892: return (FALSE) ; ! 893: ! 894: pNextFree = (PBYTE) pDiskLine + sizeof (DISKLINE) ; ! 895: ! 896: ! 897: //=============================// ! 898: // convert fixed size fields // ! 899: //=============================// ! 900: ! 901: pDiskLine->iLineType = pLine->iLineType ; ! 902: pDiskLine->dwUniqueID = pLine->lnUniqueID ; ! 903: pDiskLine->Visual = pLine->Visual ; ! 904: pDiskLine->iScaleIndex = pLine->iScaleIndex ; ! 905: pDiskLine->eScale = pLine->eScale ; ! 906: pDiskLine->bAlertOver = pLine->bAlertOver ; ! 907: pDiskLine->eAlertValue = pLine->eAlertValue ; ! 908: pDiskLine->bEveryTime = pLine->bEveryTime ; ! 909: ! 910: ! 911: //=============================// ! 912: // copy disk string fields // ! 913: //=============================// ! 914: ! 915: if (bConvertName) ! 916: { ! 917: pNextFree = DiskStringCopy (&pDiskLine->dsSystemName, ! 918: LOCAL_SYS_CODE_NAME, ! 919: pNextFree) ; ! 920: } ! 921: else ! 922: { ! 923: pNextFree = DiskStringCopy (&pDiskLine->dsSystemName, ! 924: pLine->lnSystemName, ! 925: pNextFree) ; ! 926: } ! 927: ! 928: pNextFree = DiskStringCopy (&pDiskLine->dsObjectName, ! 929: pLine->lnObjectName, ! 930: pNextFree) ; ! 931: ! 932: pNextFree = DiskStringCopy (&pDiskLine->dsCounterName, ! 933: pLine->lnCounterName, ! 934: pNextFree) ; ! 935: ! 936: pNextFree = DiskStringCopy (&pDiskLine->dsParentObjName, ! 937: pLine->lnParentObjName, ! 938: pNextFree) ; ! 939: ! 940: pNextFree = DiskStringCopy (&pDiskLine->dsInstanceName, ! 941: pLine->lnInstanceName, ! 942: pNextFree) ; ! 943: ! 944: pNextFree = DiskStringCopy (&pDiskLine->dsPINName, ! 945: pLine->lnPINName, ! 946: pNextFree) ; ! 947: ! 948: pNextFree = DiskStringCopy (&pDiskLine->dsAlertProgram, ! 949: pLine->lpszAlertProgram, ! 950: pNextFree) ; ! 951: ! 952: ! 953: ! 954: FileWrite (hFile, pDiskLine, dwLength) ; ! 955: MemoryFree (pDiskLine) ; ! 956: return (TRUE) ; ! 957: ! 958: //ErrorBadLine: ! 959: MemoryFree (pDiskLine) ; ! 960: return (FALSE) ; ! 961: } // WriteLine ! 962: ! 963: ! 964: // we are not doing printing. In case we need this ! 965: // later, then define DO_PRINTING ! 966: #ifdef DO_PRINTING ! 967: int aiPrinterLineStyles [] = ! 968: { ! 969: PS_SOLID, ! 970: PS_DASH, ! 971: PS_DOT, ! 972: PS_DASHDOT, ! 973: PS_DASHDOTDOT ! 974: } ; ! 975: #define NumPrinterLineStyles() \ ! 976: (sizeof (aiPrinterLineStyles) / sizeof (aiPrinterLineStyles [0])) ! 977: ! 978: ! 979: COLORREF acrPrinterLineColors [] = ! 980: { ! 981: RGB (192, 192, 192), ! 982: RGB (128, 128, 128), ! 983: RGB (64, 64, 64), ! 984: RGB (0, 0, 0) ! 985: } ; ! 986: ! 987: ! 988: #define NumPrinterLineColors() \ ! 989: (sizeof (acrPrinterLineColors) / sizeof (acrPrinterLineColors [0])) ! 990: #endif // DO_PRINTING ! 991: ! 992: ! 993: HPEN LineCreatePen (HDC hDC, ! 994: PLINEVISUAL pVisual, ! 995: BOOL bForPrint) ! 996: { // LineCreatePen ! 997: HPEN hPen ; ! 998: #ifdef DO_PRINTING ! 999: LOGBRUSH logBrush ; ! 1000: ! 1001: ! 1002: if (bForPrint) ! 1003: { ! 1004: logBrush.lbStyle = PS_SOLID ; ! 1005: //!! aiPrinterLineStyles [pVisual->iColorIndex % NumPrinterLineStyles ()] ; ! 1006: logBrush.lbColor = ! 1007: acrPrinterLineColors [pVisual->iColorIndex % NumPrinterLineColors ()] ; ! 1008: logBrush.lbHatch = 0 ; ! 1009: ! 1010: hPen = ExtCreatePen (logBrush.lbStyle | ! 1011: PS_GEOMETRIC | ! 1012: PS_ENDCAP_SQUARE | ! 1013: PS_JOIN_BEVEL, ! 1014: VertInchPixels (hDC, pVisual->iWidth, 20), ! 1015: &logBrush, ! 1016: 0, NULL) ; ! 1017: } ! 1018: else ! 1019: #endif ! 1020: hPen = CreatePen (pVisual->iStyle, ! 1021: pVisual->iWidth, ! 1022: pVisual->crColor) ; ! 1023: ! 1024: return (hPen) ; ! 1025: } // LineCreatePen ! 1026: ! 1027: ! 1028: ! 1029: VOID FreeLines (PLINESTRUCT pLineFirst) ! 1030: { // FreeLines ! 1031: PLINESTRUCT pLine,next_line; ! 1032: ! 1033: ! 1034: for (pLine = pLineFirst; pLine; pLine = next_line) ! 1035: { ! 1036: next_line = pLine->pLineNext; ! 1037: LineFree (pLine) ; ! 1038: } ! 1039: } // FreeLines ! 1040: ! 1041:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.