|
|
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.