Annotation of mstools/samples/sdktools/perfmon/playback.c, revision 1.1.1.1

1.1       root        1: //==========================================================================//
                      2: //                                  Includes                                //
                      3: //==========================================================================//
                      4: 
                      5: 
                      6: #include "perfmon.h"
                      7: #include "playback.h"   // external declarations for this module
                      8: 
                      9: #include "bookmark.h"   // for BookmarkAppend
                     10: #include "grafdata.h"   // for ResetGraph
                     11: #include "perfdata.h"   // for UpdateLinesForSystem
                     12: #include "perfmops.h"   // for SystemTimeDateString
                     13: #include "log.h"
                     14: #include "pmemory.h"    // for MemoryAllocate
                     15: #include "fileutil.h"
                     16: #include "utils.h"
                     17: #include "alert.h"      // for ResetAlert
                     18: #include "report.h"     // for ResetReport
                     19: 
                     20: NTSTATUS  AddNamesToArray (LPTSTR pNames,
                     21:    DWORD    dwLastID,
                     22:    LPWSTR   *lpCounterId) ;
                     23: 
                     24: 
                     25: void  PlaybackAddCounterName (PLOGINDEX pIndex) ;
                     26: 
                     27: //==========================================================================//
                     28: //                                   Macros                                 //
                     29: //==========================================================================//
                     30: 
                     31: 
                     32: 
                     33: #define PointerSeek(pBase, lFileOffset)         \
                     34:    ((PVOID) ((PBYTE) pBase + lFileOffset))
                     35: 
                     36: 
                     37: //==========================================================================//
                     38: //                              Local Functions                             //
                     39: //==========================================================================//
                     40: 
                     41: 
                     42: PVOID PlaybackSeek (long lFileOffset)
                     43:    {  // PlaybackSeek
                     44:    return (PointerSeek (PlaybackLog.pHeader, lFileOffset)) ;
                     45:    }  // PlaybackSeek
                     46: 
                     47: 
                     48: PLOGINDEXBLOCK FirstIndexBlock (PLOGHEADER pLogHeader)
                     49:    {
                     50:    return ((PLOGINDEXBLOCK) PointerSeek (pLogHeader, pLogHeader->iLength)) ;
                     51:    }
                     52: 
                     53: 
                     54: PLOGINDEX IndexFromPosition (PLOGPOSITION pLogPosition)
                     55:    {
                     56:    return (&pLogPosition->pIndexBlock->aIndexes [pLogPosition->iIndex]) ;
                     57:    }
                     58: 
                     59: 
                     60: PPERFDATA DataFromIndex (PLOGINDEX pLogIndex,
                     61:                          LPTSTR lpszSystemName)
                     62:    {
                     63:    PPERFDATA pPerfData;
                     64:    TCHAR     szLoggedComputerName[MAX_COMPUTERNAME_LENGTH + 3] ;
                     65:    int       iNumSystem ;
                     66: 
                     67:    // Note: NULL lpszSystemName means return first logged system name
                     68:    //       at the specified index.
                     69: 
                     70:    pPerfData = PlaybackSeek (pLogIndex->lDataOffset) ;
                     71: 
                     72:    for (iNumSystem = 0;
                     73:         iNumSystem < pLogIndex->iSystemsLogged;
                     74:         iNumSystem++)
                     75:       {
                     76:       if ( pPerfData &&
                     77:            pPerfData->Signature[0] == (WCHAR)'P' &&
                     78:            pPerfData->Signature[1] == (WCHAR)'E' &&
                     79:            pPerfData->Signature[2] == (WCHAR)'R' &&
                     80:            pPerfData->Signature[3] == (WCHAR)'F' )
                     81:           {
                     82:           GetPerfComputerName(pPerfData, szLoggedComputerName) ;
                     83:           if (!lpszSystemName || strsamei(lpszSystemName, szLoggedComputerName))
                     84:               {
                     85:               return pPerfData ;
                     86:               }
                     87:           }
                     88:        pPerfData = (PPERFDATA)((PBYTE) pPerfData +
                     89:                                pPerfData->TotalByteLength) ;
                     90:        }
                     91:    return NULL ;
                     92:    }
                     93: 
                     94: 
                     95: PPERFDATA DataFromIndexPosition (PLOGPOSITION pLogPosition,
                     96:                                  LPTSTR lpszSystemName)
                     97:    {
                     98:    PLOGINDEX      pLogIndex ;
                     99: //   long           lDataFileOffset ;
                    100: 
                    101:    pLogIndex = IndexFromPosition (pLogPosition) ;
                    102:    return (DataFromIndex (pLogIndex, lpszSystemName)) ;
                    103:    }
                    104: 
                    105: 
                    106: BOOL NextLogPosition (IN OUT PLOGPOSITION pLogPosition)
                    107:    {
                    108:    PLOGINDEXBLOCK pIndexBlock ;
                    109: 
                    110:    if (pLogPosition->pIndexBlock->iNumIndexes == 0)
                    111:       {
                    112:       // no data in this index block.  This is most likely
                    113:       // a corrupted log file caused by system failure...
                    114:       return (FALSE) ;
                    115:       }
                    116: 
                    117:    if (pLogPosition->iIndex == pLogPosition->pIndexBlock->iNumIndexes - 1)
                    118:       {
                    119:       if (pLogPosition->pIndexBlock->lNextBlockOffset)
                    120:          {
                    121:          pIndexBlock = 
                    122:             PlaybackSeek (pLogPosition->pIndexBlock->lNextBlockOffset) ;
                    123: 
                    124:          if (pIndexBlock->iNumIndexes == 0)
                    125:             {
                    126:             // no data in the next index block.  This is most likely
                    127:             // a corrupted log file caused by system failure...
                    128:             return (FALSE) ;
                    129:             }
                    130:          else
                    131:             {
                    132:             pLogPosition->pIndexBlock = pIndexBlock ;
                    133:             pLogPosition->iIndex = 0 ;
                    134:             return (TRUE) ;
                    135:             }
                    136:          }
                    137:       else
                    138:          return (FALSE) ;   
                    139:       }
                    140:    else
                    141:       {
                    142:       pLogPosition->iIndex++ ;
                    143:       return (TRUE) ;
                    144:       } 
                    145:    }
                    146: 
                    147: 
                    148: BOOL NextIndexPosition (IN OUT PLOGPOSITION pLogPosition,
                    149:                         BOOL bCheckForNonDataIndexes)
                    150: /*
                    151:    Effect:        Set pLogPosition to the next log position from 
                    152:                   the current position of pLogPosition if there is one.
                    153: 
                    154:    Returns:       Whether there was a next log position.
                    155: */
                    156:    {  // NextIndexPosition
                    157:    LOGPOSITION    LP ;
                    158:    PLOGINDEX      pIndex ;
                    159:    PBOOKMARK      pBookmarkDisk, pBookmark ;
                    160: //   LONG           lFilePosition ;
                    161: 
                    162:    pIndex = IndexFromPosition (pLogPosition) ;
                    163:    
                    164:    LP = *pLogPosition ;
                    165:    pBookmark = NULL ;
                    166: 
                    167:    while (TRUE)
                    168:       {  // while
                    169:       if (!NextLogPosition (&LP))
                    170:          return (FALSE) ;
                    171:       pIndex = IndexFromPosition (&LP) ;
                    172: 
                    173:       if (pIndex && bCheckForNonDataIndexes && IsCounterNameIndex (pIndex))
                    174:          {
                    175:          PlaybackAddCounterName (pIndex) ;
                    176:          }
                    177: 
                    178:       if (pIndex && bCheckForNonDataIndexes && IsBookmarkIndex (pIndex))
                    179:          {
                    180:          if (pBookmark)
                    181:             {
                    182:             // this is the case when several bookmarks are
                    183:             // found before any data index...
                    184:             pBookmark->iTic = PlaybackLog.iTotalTics ;
                    185:             BookmarkAppend (&PlaybackLog.pBookmarkFirst, pBookmark) ;
                    186:             }
                    187: 
                    188:          pBookmarkDisk = PlaybackSeek (pIndex->lDataOffset) ;
                    189:          pBookmark = MemoryAllocate (sizeof (BOOKMARK)) ;
                    190:          *pBookmark = *pBookmarkDisk;
                    191:          pBookmark->pBookmarkNext = NULL ;
                    192:          }
                    193: 
                    194:       if (pIndex && IsDataIndex (pIndex))
                    195:          {
                    196:          LP.iPosition++ ;
                    197:          *pLogPosition = LP ;
                    198:          if (pBookmark)
                    199:             {
                    200:             pBookmark->iTic = PlaybackLog.iTotalTics ;
                    201:             BookmarkAppend (&PlaybackLog.pBookmarkFirst, pBookmark) ;
                    202:             }
                    203:          return (TRUE) ;
                    204:          }
                    205:       }  // while
                    206:    }  // NextIndexPosition
                    207: 
                    208: 
                    209: BOOL NextReLogIndexPosition (IN OUT PLOGPOSITION pLogPosition)
                    210: /*
                    211:    Effect:        Set pLogPosition to the next log position from 
                    212:                   the current position of pLogPosition if there is one.
                    213:                   Will return bookmarks, counternames, or data.
                    214: 
                    215:    Returns:       Whether there was a next relog position.
                    216: */
                    217:    {  // NextReLogIndexPosition
                    218:    LOGPOSITION    LP ;
                    219:    PLOGINDEX      pIndex ;
                    220: //   LONG           lFilePosition ;
                    221: 
                    222:    pIndex = IndexFromPosition (pLogPosition) ;
                    223:    
                    224:    LP = *pLogPosition ;
                    225: 
                    226:    if (!NextLogPosition (&LP))
                    227:       return (FALSE) ;
                    228:    pIndex = IndexFromPosition (&LP) ;
                    229: 
                    230:    if (pIndex && IsDataIndex (pIndex))
                    231:       {
                    232:       LP.iPosition++ ;
                    233:       }
                    234:    *pLogPosition = LP ;
                    235:    return (TRUE) ;
                    236:    }  // NextReLogIndexPosition
                    237: 
                    238: 
                    239: 
                    240: 
                    241:    
                    242: //==========================================================================//
                    243: //                             Exported Functions                           //
                    244: //==========================================================================//
                    245: 
                    246: 
                    247: void PlaybackInitializeInstance (void)
                    248:    {  // PlaybackInitializeInstance
                    249:    PlaybackLog.iStatus = iPMStatusClosed ;
                    250:    PlaybackLog.hFile = NULL ;
                    251: 
                    252:    PlaybackLog.szFilePath  = MemoryAllocate (FilePathLen * sizeof (TCHAR)) ;
                    253:    PlaybackLog.szFileTitle = MemoryAllocate (FilePathLen * sizeof (TCHAR)) ;
                    254:    lstrcpy (PlaybackLog.szFilePath,  szDefaultLogFileName) ;
                    255:    lstrcpy (PlaybackLog.szFileTitle, szDefaultLogFileName) ;
                    256:    }  // PlaybackInitializeInstance
                    257: 
                    258: 
                    259: INT OpenPlayback (LPTSTR lpszFilePath, LPTSTR lpszFileTitle)
                    260:    {  // OpenPlayback
                    261:    BOOL     bFirstTime = TRUE ;
                    262: 
                    263:    lstrcpy  (PlaybackLog.szFilePath, lpszFilePath) ;
                    264:    lstrcpy  (PlaybackLog.szFileTitle, lpszFileTitle) ;
                    265:    PlaybackLog.hFile = FileHandleOpen (lpszFilePath) ;
                    266:    if (!PlaybackLog.hFile || PlaybackLog.hFile == INVALID_HANDLE_VALUE)
                    267:       {
                    268:       return (ERR_CANT_OPEN) ;
                    269:       }
                    270: 
                    271:    PlaybackLog.pHeader = (PLOGHEADER) FileMap (PlaybackLog.hFile,
                    272:       &PlaybackLog.hMapHandle) ;
                    273:    
                    274:    if (!PlaybackLog.pHeader)
                    275:       {
                    276:       if (PlaybackLog.hMapHandle)
                    277:          {
                    278:          CloseHandle (PlaybackLog.hMapHandle) ;
                    279:          }
                    280: 
                    281:       CloseHandle (PlaybackLog.hFile) ;
                    282:       return (ERR_CANT_OPEN) ;
                    283:       }
                    284: 
                    285:    if (!strsame (PlaybackLog.pHeader->szSignature, LogFileSignature))
                    286:       {
                    287:       FileUnMap((LPVOID)PlaybackLog.pHeader, PlaybackLog.hMapHandle) ;
                    288:       CloseHandle (PlaybackLog.hFile) ;
                    289:       return (ERR_BAD_LOG_FILE) ;
                    290:       }
                    291: 
                    292:    PlaybackLog.BeginIndexPos.pIndexBlock = FirstIndexBlock (PlaybackLog.pHeader) ;
                    293:    PlaybackLog.BeginIndexPos.iIndex = 0 ;
                    294:    PlaybackLog.BeginIndexPos.iPosition = 0 ;
                    295:    PlaybackLog.pBookmarkFirst = NULL ;
                    296: 
                    297:    PlaybackLog.iTotalTics = 1 ;
                    298:    PlaybackLog.EndIndexPos = PlaybackLog.BeginIndexPos ;
                    299:    while (NextIndexPosition (&PlaybackLog.EndIndexPos, TRUE))
                    300:       {
                    301:       if (bFirstTime)
                    302:          {
                    303:          // set the begin index to the first data index
                    304:          bFirstTime = FALSE ;
                    305:          PlaybackLog.BeginIndexPos.iIndex =
                    306:             PlaybackLog.EndIndexPos.iIndex ;
                    307:          }
                    308:       else
                    309:          {
                    310:          PlaybackLog.iTotalTics++ ;
                    311:          }
                    312:       }
                    313: 
                    314:    if (PlaybackLog.iTotalTics == 1 )
                    315:       {
                    316:       // no data inside the log file.  It must be a corrupted
                    317:       // log file
                    318:       FileUnMap((LPVOID)PlaybackLog.pHeader, PlaybackLog.hMapHandle) ;
                    319:       CloseHandle (PlaybackLog.hFile) ;
                    320:       return (ERR_CORRUPT_LOG) ;
                    321:       }
                    322: 
                    323: //   PlaybackLog.StartIndexPos = PlaybackLog.BeginIndexPos ;
                    324: 
                    325:    // getthe first data index
                    326:    if (!LogPositionN (1, &(PlaybackLog.StartIndexPos)))
                    327:       {
                    328:       PlaybackLog.StartIndexPos = PlaybackLog.BeginIndexPos ;
                    329:       }
                    330: 
                    331:    PlaybackLog.StopIndexPos = PlaybackLog.EndIndexPos ;
                    332:    PlaybackLog.StopIndexPos.iPosition =
                    333:       min (PlaybackLog.StopIndexPos.iPosition,
                    334:            PlaybackLog.iTotalTics - 1 ) ;
                    335: 
                    336: 
                    337:    PlaybackLog.iSelectedTics = PlaybackLog.iTotalTics ;
                    338: 
                    339:    PlaybackLog.iStatus = iPMStatusPlaying ;
                    340:    return (0) ;   
                    341:    }  // OpenPlayback
                    342: 
                    343: 
                    344: void CloseInputLog (HWND hWndParent)
                    345:    {  // CloseInputLog
                    346:    PBOOKMARK      pBookmark, pNextBookmark ;
                    347:    BOOL           retCode, retCode1 ;
                    348:    PLOGCOUNTERNAME pLogCounterName, pNextCounterName ;
                    349: 
                    350:    UNREFERENCED_PARAMETER (hWndParent) ;
                    351: 
                    352:    // free the bookmark list
                    353:    for (pBookmark = PlaybackLog.pBookmarkFirst ;
                    354:       pBookmark ;
                    355:       pBookmark = pNextBookmark )
                    356:       {
                    357:       // save next bookmark and free current bookmark
                    358:       pNextBookmark = pBookmark->pBookmarkNext ;
                    359:       MemoryFree (pBookmark) ;
                    360:       }
                    361:    PlaybackLog.pBookmarkFirst = NULL ;
                    362: 
                    363:    // free all counter names stuff
                    364:    if (PlaybackLog.pBaseCounterNames)
                    365:       {
                    366:       MemoryFree (PlaybackLog.pBaseCounterNames) ;
                    367:       }
                    368:    PlaybackLog.pBaseCounterNames = NULL ;
                    369:    PlaybackLog.lBaseCounterNameSize = 0 ;
                    370:    PlaybackLog.lBaseCounterNameOffset = 0 ;
                    371: 
                    372:    for (pLogCounterName = PlaybackLog.pLogCounterNameFirst ;
                    373:       pLogCounterName ;
                    374:       pLogCounterName = pNextCounterName)
                    375:       {
                    376:       pNextCounterName = pLogCounterName->pCounterNameNext ;
                    377:       MemoryFree (pLogCounterName->pRemainNames) ;
                    378:       MemoryFree (pLogCounterName) ;
                    379:       }
                    380: 
                    381:    PlaybackLog.pLogCounterNameFirst = NULL ;
                    382: 
                    383:    retCode1 = FileUnMap((LPVOID)PlaybackLog.pHeader, PlaybackLog.hMapHandle) ;
                    384:    retCode = CloseHandle (PlaybackLog.hFile) ;
                    385:    PlaybackLog.iStatus = iPMStatusClosed ;
                    386: 
                    387:    ResetGraphView (hWndGraph) ;
                    388:    ResetAlertView (hWndAlert) ;
                    389:    ResetLogView (hWndLog) ;
                    390:    ResetReportView (hWndReport) ;
                    391:    }
                    392: 
                    393: 
                    394: 
                    395: BOOL LogPositionN (int iIndex, PLOGPOSITION pLP)
                    396:    {  // LogPositionN
                    397:    LOGPOSITION    LP ;
                    398:    int            i ;
                    399: 
                    400:    LP = PlaybackLog.BeginIndexPos ;
                    401:    for (i = 0 ;
                    402:         i < iIndex ;
                    403:         i++)
                    404:       {
                    405:       if (!NextIndexPosition (&LP, FALSE))
                    406:          return (FALSE) ;
                    407:       }
                    408: 
                    409:    *pLP = LP ;
                    410:    return (TRUE) ;
                    411:    }  // LogPositionN
                    412: 
                    413: 
                    414: PLOGINDEX PlaybackIndexN (int iIndex)
                    415:    {
                    416:    LOGPOSITION    LP ;
                    417:    int            i ;
                    418: 
                    419:    LP = PlaybackLog.BeginIndexPos ;
                    420:    for (i = 0 ;
                    421:         i < iIndex ;
                    422:         i++)
                    423:       {
                    424:       if (!NextIndexPosition (&LP, FALSE))
                    425:          return (NULL) ;
                    426:       }
                    427: 
                    428:    return (IndexFromPosition (&LP)) ;
                    429:    }
                    430: 
                    431: 
                    432: BOOL PlaybackLines (PPERFSYSTEM pSystemFirst,
                    433:                     PLINE pLineFirst,
                    434:                     int iLogTic)
                    435:    {  // PlaybackLines
                    436: 
                    437:    PLOGINDEX      pLogIndex ;
                    438:    PPERFDATA      pPerfData ;
                    439:    PPERFSYSTEM       pSystem ;
                    440:    BOOL           bAnyFound ;
                    441: 
                    442:    pLogIndex = PlaybackIndexN (iLogTic) ;
                    443:    if (!pLogIndex)
                    444:       return (FALSE) ;
                    445: 
                    446:    bAnyFound = FALSE ;
                    447:    for (pSystem = pSystemFirst ;
                    448:         pSystem ;
                    449:         pSystem = pSystem->pSystemNext)
                    450:       {  // for
                    451:       pPerfData = DataFromIndex (pLogIndex, pSystem->sysName) ;
                    452:       if (pPerfData)
                    453:          {
                    454:          UpdateLinesForSystem (pSystem->sysName,
                    455:                                pPerfData,
                    456:                                pLineFirst) ;
                    457:          bAnyFound = TRUE ;
                    458:          }
                    459:       else
                    460:          {
                    461:          FailedLinesForSystem (pSystem->sysName,
                    462:                                pPerfData,
                    463:                                pLineFirst) ;
                    464:          }
                    465:       }
                    466:    return (bAnyFound) ;
                    467:    }  // PlaybackLines
                    468: 
                    469: 
                    470: 
                    471: 
                    472: PPERFDATA LogDataFromPosition (PPERFSYSTEM pSystem, 
                    473:                                PLOGPOSITION pLogPosition)
                    474:    {  // LogDataFromPosition
                    475:    PLOGINDEX      pLogIndex ;
                    476:    
                    477: 
                    478:    if (!pLogPosition)
                    479:       return (NULL) ;
                    480: 
                    481:    pLogIndex = IndexFromPosition (pLogPosition) ;
                    482:    if (!pLogIndex)
                    483:       return (NULL) ;
                    484:    
                    485:    return (DataFromIndex (pLogIndex, pSystem->sysName)) ;
                    486:    }  // LogDataFromPosition
                    487: 
                    488: 
                    489: 
                    490: BOOL LogPositionSystemTime (PLOGPOSITION pLP, SYSTEMTIME *pSystemTime)
                    491: /*
                    492:    Effect:        Given a logposition, get the index entry for that position
                    493:                   and return the system time stored therein.
                    494: */
                    495:    {  // LogPositionSystemTime
                    496:    PLOGINDEX      pLogIndex ;
                    497: 
                    498:    pLogIndex = IndexFromPosition (pLP) ;
                    499:    if (!pLogIndex)
                    500:       return (FALSE) ;
                    501: 
                    502:    *pSystemTime = pLogIndex->SystemTime ;
                    503:    }  // LogPositionSystemTime
                    504: 
                    505: 
                    506: int LogPositionIntervalSeconds (PLOGPOSITION pLPStart, 
                    507:                                 PLOGPOSITION pLPStop)
                    508: /*
                    509:    Effect:        Return the time difference (in seconds) between the
                    510:                   system times of the two specified log positions.
                    511: */
                    512:    {  // LogPositionIntervalSeconds
                    513:    SYSTEMTIME     SystemTimeStart ;
                    514:    SYSTEMTIME     SystemTimeStop ;
                    515: 
                    516: 
                    517:    if (LogPositionSystemTime (pLPStart, &SystemTimeStart) &&
                    518:        LogPositionSystemTime (pLPStop, &SystemTimeStop))
                    519:       return (SystemTimeDifference (&SystemTimeStart, &SystemTimeStop)) ;
                    520:    else
                    521:       return (0) ;
                    522:    }  // LogPositionIntervalSeconds
                    523: 
                    524: 
                    525: 
                    526: int PlaybackSelectedSeconds (void)
                    527:    {  // PlaybackSelectedSeconds
                    528:    return (LogPositionIntervalSeconds (&PlaybackLog.StartIndexPos, 
                    529:                                        &PlaybackLog.StopIndexPos)) ;
                    530:    }  // PlaybackSelectedSeconds
                    531: 
                    532: void BuildLogComputerList (HWND hDlg, int DlgID)
                    533:    {
                    534:    PPERFDATA pPerfData;
                    535:    int       iNumSystem ;
                    536:    HWND      hListBox = GetDlgItem (hDlg, DlgID) ;
                    537:    PLOGINDEX pLogIndex ;
                    538:    TCHAR     szLoggedComputerName[MAX_COMPUTERNAME_LENGTH + 3] ;
                    539: 
                    540:    pLogIndex = IndexFromPosition (&(PlaybackLog.StartIndexPos)) ;
                    541:    pPerfData = PlaybackSeek (pLogIndex->lDataOffset) ;
                    542: 
                    543:    for (iNumSystem = 0;
                    544:         iNumSystem < pLogIndex->iSystemsLogged;
                    545:         iNumSystem++)
                    546:       {
                    547:       if ( pPerfData &&
                    548:            pPerfData->Signature[0] == (WCHAR)'P' &&
                    549:            pPerfData->Signature[1] == (WCHAR)'E' &&
                    550:            pPerfData->Signature[2] == (WCHAR)'R' &&
                    551:            pPerfData->Signature[3] == (WCHAR)'F' )
                    552:           {
                    553:           GetPerfComputerName(pPerfData, szLoggedComputerName) ;
                    554:           LBAdd (hListBox, szLoggedComputerName) ;
                    555:           }
                    556:        pPerfData = (PPERFDATA)((PBYTE) pPerfData +
                    557:                                pPerfData->TotalByteLength) ;
                    558:        }
                    559:    }  // BuildLogComputerList
                    560: 
                    561: void  PlaybackAddCounterName (PLOGINDEX pIndex)
                    562: {
                    563:    PLOGCOUNTERNAME      pLogCounterName, pListCounterName ;
                    564:    PLOGFILECOUNTERNAME  pDiskCounterName ;
                    565:    PVOID                pCounterData ;
                    566:    BOOL                 bExist = FALSE ;
                    567: 
                    568:    pDiskCounterName = PlaybackSeek (pIndex->lDataOffset) ;
                    569: 
                    570:    // check we have a record for this system
                    571:    for (pListCounterName = PlaybackLog.pLogCounterNameFirst ;
                    572:         pListCounterName ;
                    573:         pListCounterName = pListCounterName->pCounterNameNext)
                    574:       {
                    575:       if (strsamei(pDiskCounterName->szComputer,
                    576:          pListCounterName->CounterName.szComputer))
                    577:          {
                    578:          // found!
                    579:          pLogCounterName = pListCounterName ;
                    580:          bExist = TRUE ;
                    581:          break ;
                    582:          }
                    583:       }
                    584: 
                    585:    if (!bExist)
                    586:       {
                    587:       // new counter name record
                    588:       if (!(pLogCounterName = MemoryAllocate (sizeof(LOGCOUNTERNAME))))
                    589:          {
                    590:          return ;
                    591:          }
                    592:       }
                    593:    else
                    594:       {
                    595:       // free old memory in previous counter name record.
                    596:       if (pLogCounterName->pRemainNames)
                    597:          {
                    598:          MemoryFree (pLogCounterName->pRemainNames) ;
                    599:          }
                    600:       pLogCounterName->pRemainNames = NULL ;
                    601:       }
                    602: 
                    603:    pLogCounterName->CounterName = *pDiskCounterName ;
                    604: 
                    605:    if (pDiskCounterName->lBaseCounterNameOffset == 0)
                    606:       {
                    607:       // this is the base counter names, 
                    608:       // get the master copy of the counter names
                    609: 
                    610:       if (!(pCounterData =
                    611:             MemoryAllocate (pDiskCounterName->lUnmatchCounterNames)))
                    612:          {
                    613:          MemoryFree (pLogCounterName) ;
                    614:          return ;
                    615:          }
                    616: 
                    617:       // free the old one if it exists.
                    618:       if (PlaybackLog.pBaseCounterNames)
                    619:          {
                    620:          MemoryFree (PlaybackLog.pBaseCounterNames) ;
                    621:          }
                    622:    
                    623:       PlaybackLog.pBaseCounterNames = pCounterData ;
                    624: 
                    625:       pCounterData =
                    626:          PlaybackSeek (pDiskCounterName->lCurrentCounterNameOffset) ;
                    627: 
                    628:       memcpy (PlaybackLog.pBaseCounterNames,
                    629:          pCounterData,
                    630:          pDiskCounterName->lUnmatchCounterNames) ;
                    631: 
                    632:       PlaybackLog.lBaseCounterNameSize =
                    633:          pDiskCounterName->lUnmatchCounterNames ;
                    634: 
                    635:       PlaybackLog.lBaseCounterNameOffset =
                    636:          pDiskCounterName->lBaseCounterNameOffset ;
                    637:       }
                    638:    else if (pDiskCounterName->lUnmatchCounterNames)
                    639:       {
                    640:       // this is not a based system and it has extra counter names
                    641:       // allocate a buffer to hold them
                    642:       pLogCounterName->pRemainNames =
                    643:          MemoryAllocate (pDiskCounterName->lUnmatchCounterNames) ;
                    644: 
                    645:       if (pLogCounterName->pRemainNames)
                    646:          {
                    647:          pCounterData =
                    648:             PlaybackSeek (pDiskCounterName->lCurrentCounterNameOffset) ;
                    649: 
                    650:          memcpy(pLogCounterName->pRemainNames,
                    651:             pCounterData,
                    652:             pDiskCounterName->lUnmatchCounterNames) ;
                    653:          }
                    654:       }
                    655: 
                    656:    if (!bExist)
                    657:       {
                    658:       // now add the new counter name record to the linked list
                    659:       if (!PlaybackLog.pLogCounterNameFirst)
                    660:          {
                    661:          PlaybackLog.pLogCounterNameFirst = pLogCounterName ;
                    662:          }
                    663:       else
                    664:          {
                    665:          for (pListCounterName = PlaybackLog.pLogCounterNameFirst ;
                    666:             pListCounterName->pCounterNameNext ;
                    667:             pListCounterName = pListCounterName->pCounterNameNext)
                    668:             {
                    669:             // do nothing until we get to the end of the list
                    670:             ;
                    671:             }
                    672:          pListCounterName->pCounterNameNext = pLogCounterName ;
                    673:          }
                    674:       }
                    675: 
                    676: }  // PlaybackAddCounterName
                    677: 
                    678: 
                    679: LPWSTR *LogBuildNameTable (PPERFSYSTEM pSysInfo)
                    680: {
                    681: 
                    682:    DWORD             dwArraySize ;
                    683:    PLOGCOUNTERNAME   pCounterName ;
                    684:    LPWSTR            *lpCounterId = NULL ;
                    685:    LPWSTR            lpCounterNames ;
                    686:    NTSTATUS          Status ;
                    687: 
                    688:    for (pCounterName = PlaybackLog.pLogCounterNameFirst ;
                    689:         pCounterName ;
                    690:         pCounterName = pCounterName->pCounterNameNext)
                    691:       {
                    692:       if (strsamei (pSysInfo->sysName, pCounterName->CounterName.szComputer))
                    693:          {
                    694:          // found the right system
                    695:          break ;
                    696:          }
                    697:       }
                    698:    if (!pCounterName)
                    699:       {
                    700:       goto ERROR_EXIT ;
                    701:       }
                    702: 
                    703:    dwArraySize = (pCounterName->CounterName.dwLastCounterId + 1)
                    704:       * sizeof (LPWSTR) ;
                    705: 
                    706:    lpCounterId = MemoryAllocate (dwArraySize +
                    707:       pCounterName->CounterName.lMatchLength +
                    708:       pCounterName->CounterName.lUnmatchCounterNames ) ;
                    709: 
                    710:    if (!lpCounterId)
                    711:       {
                    712:       goto ERROR_EXIT ;
                    713:       }
                    714: 
                    715:    // initialize pointers into buffer
                    716: 
                    717:    lpCounterNames = (LPWSTR)((LPBYTE)lpCounterId + dwArraySize);
                    718:    if (pCounterName->CounterName.lBaseCounterNameOffset == 0)
                    719:       {
                    720:       // this is the base system
                    721:       memcpy(lpCounterNames,
                    722:          PlaybackLog.pBaseCounterNames,
                    723:          PlaybackLog.lBaseCounterNameSize) ;
                    724:       }
                    725:    else
                    726:       {
                    727:       // copy the matched portion from the base system
                    728:       memcpy(lpCounterNames,
                    729:          PlaybackLog.pBaseCounterNames,
                    730:          pCounterName->CounterName.lMatchLength) ;
                    731: 
                    732:       // copy the unmatched portion
                    733:       if (pCounterName->CounterName.lUnmatchCounterNames)
                    734:          {
                    735:          memcpy(((PBYTE)lpCounterNames +
                    736:             pCounterName->CounterName.lMatchLength),
                    737:             pCounterName->pRemainNames,
                    738:             pCounterName->CounterName.lUnmatchCounterNames) ;
                    739:          }
                    740:       }
                    741: 
                    742:    Status = AddNamesToArray (lpCounterNames,
                    743:       pCounterName->CounterName.dwLastCounterId,
                    744:       lpCounterId) ;
                    745: 
                    746:    if (Status != ERROR_SUCCESS)
                    747:       {
                    748:       goto ERROR_EXIT ;
                    749:       }
                    750: 
                    751:    pSysInfo->CounterInfo.dwLastId =
                    752:       pCounterName->CounterName.dwLastCounterId ;
                    753:    pSysInfo->CounterInfo.dwLangId =
                    754:       pCounterName->CounterName.dwLangId ;
                    755:    pSysInfo->CounterInfo.dwHelpSize = 0 ;
                    756:    pSysInfo->CounterInfo.dwCounterSize =
                    757:       pCounterName->CounterName.lMatchLength +
                    758:       pCounterName->CounterName.lUnmatchCounterNames ;
                    759:    
                    760:    return (lpCounterId) ;
                    761: 
                    762: ERROR_EXIT:
                    763:    if (lpCounterId)
                    764:       {
                    765:       MemoryFree (lpCounterId) ;
                    766:       }
                    767:    return (NULL) ;
                    768: } // LogBuildNameTable
                    769: 
                    770:     
                    771: 

unix.superglobalmegacorp.com

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