Annotation of mstools/samples/sdktools/perfmon/system.c, revision 1.1

1.1     ! root        1: //
        !             2: //  Foreign computer support needs more work (a-robw)
        !             3: //
        !             4: #ifdef FOREIGN_COMPUTER_SUPPORT
        !             5: #undef FOREIGN_COMPUTER_SUPPORT
        !             6: #endif
        !             7: 
        !             8: #include "perfmon.h"
        !             9: #include "system.h"     // external declarations for this file
        !            10: 
        !            11: #include "perfdata.h"
        !            12: #include "perfmops.h"
        !            13: #include "playback.h"   // for PlayingBackLog
        !            14: #include "pmemory.h"
        !            15: #include "utils.h"      // for strsame, et al
        !            16: #include "sizes.h"
        !            17: 
        !            18: DWORD
        !            19: SystemCount(
        !            20:     PPERFSYSTEM pSystemFirst
        !            21: )
        !            22: {
        !            23:     PPERFSYSTEM       pSystem ;
        !            24:     DWORD           iNumSystems ;
        !            25: 
        !            26:     iNumSystems = 0 ;
        !            27: 
        !            28:     for (pSystem = pSystemFirst ;
        !            29:          pSystem ;
        !            30:          pSystem = pSystem->pSystemNext) {
        !            31:         iNumSystems++ ;
        !            32:     }
        !            33: 
        !            34:     return iNumSystems ;
        !            35: }
        !            36: 
        !            37: PPERFSYSTEM
        !            38: SystemCreate (
        !            39:     LPCTSTR lpszSystemName
        !            40: )
        !            41: {
        !            42:     PPERFSYSTEM     pSystem ;
        !            43:     PPERFDATA       pLocalPerfData;
        !            44:     DWORD           Status ;
        !            45:     DWORD           dwMemSize;
        !            46:     TCHAR           GlobalValueBuffer[] = L"Global" ;
        !            47:     TCHAR           ForeignValueBuffer[8+MAX_COMPUTERNAME_LENGTH+1] =
        !            48:                     L"Foreign " ;
        !            49: 
        !            50:     // attempt to allocate system data structure
        !            51: 
        !            52:     pSystem = MemoryAllocate (sizeof (PERFSYSTEM)) ;
        !            53:     if (!pSystem) {
        !            54:         SetLastError (ERROR_OUTOFMEMORY);
        !            55:         return (NULL) ;
        !            56:     }
        !            57: 
        !            58:     // initialize name and help table pointers
        !            59: 
        !            60:     pSystem->CounterInfo.pNextTable = NULL;
        !            61:     pSystem->CounterInfo.dwLangId = 0;
        !            62:     pSystem->CounterInfo.dwLastId = 0;
        !            63:     pSystem->CounterInfo.TextString = NULL;
        !            64: 
        !            65:     lstrcpy (pSystem->sysName, lpszSystemName) ;
        !            66:    
        !            67:     // try to open key to registry, error code is in GetLastError()
        !            68: 
        !            69:     pSystem->sysDataKey = OpenSystemPerfData(lpszSystemName);
        !            70: 
        !            71:     // if a Null Key was returned then:
        !            72:     //  a) there's no such computer
        !            73:     //  b) the system is a foreign computer
        !            74:     //
        !            75:     //  before giving up, then see if it's a foreign computer
        !            76: 
        !            77:     if (!pSystem->sysDataKey) {
        !            78:         
        !            79:         // build foreign computer string
        !            80: 
        !            81:         lstrcat(ForeignValueBuffer, lpszSystemName) ;
        !            82:         
        !            83:         // assign System value name pointer to the local variable for trial
        !            84: 
        !            85:         pSystem->lpszValue = ForeignValueBuffer;
        !            86: 
        !            87:         // try to get data from the computer to see if it's for real
        !            88:         // otherwise, give up and return NULL
        !            89: 
        !            90:         pLocalPerfData = MemoryAllocate (STARTING_SYSINFO_SIZE);
        !            91:         if (pLocalPerfData == NULL) { // no mem so give up
        !            92:             SetLastError (ERROR_OUTOFMEMORY);
        !            93:             SystemFree (pSystem, TRUE);
        !            94:             return (NULL);
        !            95:         } else {
        !            96:             pSystem->sysDataKey = HKEY_PERFORMANCE_DATA; // local machine
        !            97: 
        !            98:             dwMemSize = STARTING_SYSINFO_SIZE;
        !            99:             Status = GetSystemPerfData (
        !           100:                     pSystem->sysDataKey,
        !           101:                     pSystem->lpszValue,
        !           102:                     pLocalPerfData,
        !           103:                     &dwMemSize);
        !           104: 
        !           105:             // success means a valid buffer came back
        !           106:             // more data means someone tried (so it's probably good (?)
        !           107: 
        !           108:             if (!((Status == ERROR_MORE_DATA) || (Status == ERROR_SUCCESS)) ||
        !           109:                 !((pLocalPerfData->Signature[0] == (WCHAR)'P') &&
        !           110:                   (pLocalPerfData->Signature[1] == (WCHAR)'E') &&
        !           111:                   (pLocalPerfData->Signature[2] == (WCHAR)'R') &&
        !           112:                   (pLocalPerfData->Signature[3] == (WCHAR)'F'))) {
        !           113:                 SetLastError (ERROR_BAD_NET_NAME); // unable to find name
        !           114:                 SystemFree (pSystem, TRUE);
        !           115:                 MemoryFree (pLocalPerfData);    // don't really need anything from it
        !           116:                 return NULL;
        !           117:             }
        !           118: 
        !           119:             MemoryFree (pLocalPerfData);    // don't really need anything from it
        !           120:     
        !           121:             // ok, so we've established that a foreign data provider
        !           122:             // exists, now to finish the initialization.
        !           123: 
        !           124:             // change system name in structure to get counter names
        !           125: 
        !           126:             lstrcpy (pSystem->sysName, LocalComputerName);
        !           127: 
        !           128:             Status = GetSystemNames(pSystem);   // get counter names & explain text
        !           129:             if (Status != ERROR_SUCCESS) {
        !           130:                 // unable to get names so bail out
        !           131:                 SetLastError (Status);
        !           132:                 SystemFree (pSystem, TRUE);
        !           133:                 return (NULL) ;
        !           134:             }
        !           135: 
        !           136:             // restore computer name for displays, etc.
        !           137: 
        !           138:             lstrcpy (pSystem->sysName, lpszSystemName);
        !           139:     
        !           140:             // allocate value string buffer
        !           141:             pSystem->lpszValue = MemoryAllocate (TEMP_BUF_LEN*sizeof(WCHAR));
        !           142:             if (!pSystem->lpszValue) {
        !           143:                 // unable to allocate memory
        !           144:                 SetLastError (ERROR_OUTOFMEMORY);
        !           145:                 SystemFree (pSystem, TRUE);
        !           146:                 return (NULL) ;
        !           147:             } else {
        !           148:                 lstrcpy (pSystem->lpszValue, ForeignValueBuffer);
        !           149:             }
        !           150:         }
        !           151:     } else {
        !           152:         // if here, then a connection to the system's registry was established
        !           153:         // so continue with the system data structure initialization
        !           154: 
        !           155:         // get counter names & explain text from local computer
        !           156: 
        !           157:         Status = GetSystemNames(pSystem);   
        !           158:         if (Status != ERROR_SUCCESS) {
        !           159:             // unable to get names so bail out
        !           160:             SetLastError (Status);
        !           161:             SystemFree (pSystem, TRUE);
        !           162:             return (NULL) ;
        !           163:         }
        !           164: 
        !           165:         // allocate value string buffer
        !           166:         pSystem->lpszValue = MemoryAllocate(TEMP_BUF_LEN*sizeof(WCHAR));
        !           167: 
        !           168:         if (!pSystem->lpszValue) {
        !           169:             // unable to allocate memory
        !           170:             SetLastError (ERROR_OUTOFMEMORY);
        !           171:             SystemFree (pSystem, TRUE);
        !           172:             return (NULL) ;
        !           173:         } else {
        !           174:             SetSystemValueNameToGlobal (pSystem);
        !           175:         }
        !           176:     }
        !           177: 
        !           178:     // initialize remaining system pointers
        !           179: 
        !           180:     pSystem->pSystemNext = NULL ;
        !           181:     pSystem->FailureTime = 0;
        !           182: 
        !           183:     SetLastError (ERROR_SUCCESS);
        !           184: 
        !           185:     return (pSystem) ;
        !           186: }  // SystemCreate
        !           187: 
        !           188: PPERFSYSTEM
        !           189: SystemGet (
        !           190:     PPERFSYSTEM pSystemFirst,
        !           191:     LPCTSTR lpszSystemName
        !           192: )
        !           193: {
        !           194:     PPERFSYSTEM       pSystem ;
        !           195: 
        !           196:     if (!pSystemFirst) {
        !           197:         return (NULL) ;
        !           198:     }
        !           199:     
        !           200:     for (pSystem = pSystemFirst ;
        !           201:          pSystem ;
        !           202:          pSystem = pSystem->pSystemNext) {
        !           203:         if (strsamei (pSystem->sysName, lpszSystemName)) {
        !           204:             return (pSystem) ;
        !           205:         }
        !           206:     }  // for
        !           207: 
        !           208:     return (NULL) ;
        !           209: }
        !           210: 
        !           211: PPERFSYSTEM
        !           212: SystemAdd (
        !           213:     PPPERFSYSTEM ppSystemFirst,
        !           214:     LPCTSTR lpszSystemName
        !           215: )
        !           216: {
        !           217:     PPERFSYSTEM       pSystem ;
        !           218:     PPERFSYSTEM       pSystemPrev ;
        !           219: 
        !           220: 
        !           221:     if (!*ppSystemFirst) {
        !           222:         *ppSystemFirst = SystemCreate (lpszSystemName) ;
        !           223:         return (*ppSystemFirst) ;
        !           224:     }
        !           225: 
        !           226:     for (pSystem = *ppSystemFirst ;
        !           227:          pSystem ;
        !           228:          pSystem = pSystem->pSystemNext) {
        !           229:         pSystemPrev = pSystem ;
        !           230:         if (strsamei (pSystem->sysName, lpszSystemName)) {
        !           231:             return (pSystem) ;
        !           232:         }
        !           233:     }  // for
        !           234: 
        !           235:     pSystemPrev->pSystemNext = SystemCreate (lpszSystemName) ;
        !           236:     return (pSystemPrev->pSystemNext) ;
        !           237: }
        !           238: 
        !           239: void
        !           240: SystemFree (
        !           241:     PPERFSYSTEM pSystem,
        !           242:     BOOL        bDeleteTheSystem
        !           243: )
        !           244: {  // SystemFree
        !           245: 
        !           246:     PCOUNTERTEXT pCounter, pNextCounter;
        !           247: 
        !           248:     if (!pSystem) {
        !           249:         // can't proceed
        !           250:         return ;
        !           251:     }
        !           252: 
        !           253:     if (pSystem->sysDataKey && pSystem->sysDataKey != HKEY_PERFORMANCE_DATA) {
        !           254:         // close the remote computer key
        !           255:         RegCloseKey (pSystem->sysDataKey);
        !           256:         pSystem->sysDataKey = 0 ;
        !           257:     }
        !           258: 
        !           259:     for (pCounter = pSystem->CounterInfo.pNextTable, pNextCounter = NULL;
        !           260:          pCounter;
        !           261:          pCounter = pNextCounter) {
        !           262:         pNextCounter = pCounter->pNextTable;
        !           263:         MemoryFree (pCounter);
        !           264:     }
        !           265:     pSystem->CounterInfo.pNextTable = NULL ;
        !           266: 
        !           267:     if (pSystem->CounterInfo.TextString) {
        !           268:         MemoryFree (pSystem->CounterInfo.TextString);
        !           269:         pSystem->CounterInfo.TextString = NULL ;
        !           270:     }
        !           271: 
        !           272:     if (pSystem->CounterInfo.HelpTextString) {
        !           273:         MemoryFree (pSystem->CounterInfo.HelpTextString);
        !           274:         pSystem->CounterInfo.HelpTextString = NULL ;
        !           275:     }
        !           276:     pSystem->CounterInfo.dwLastId = 0 ;
        !           277:     pSystem->CounterInfo.dwHelpSize = 0 ;
        !           278:     pSystem->CounterInfo.dwCounterSize = 0 ;
        !           279: 
        !           280:     if (bDeleteTheSystem) {
        !           281:         if (pSystem->lpszValue) {
        !           282:             MemoryFree (pSystem->lpszValue);
        !           283:             pSystem->lpszValue = NULL ;
        !           284:         }
        !           285:         MemoryFree (pSystem) ;
        !           286:     }
        !           287: }
        !           288: 
        !           289: void
        !           290: DeleteUnusedSystems (
        !           291:     PPPERFSYSTEM  ppSystemFirst ,
        !           292:     int           iNoUseSystems
        !           293: )
        !           294: {
        !           295:     PPERFSYSTEM   pPrevSys, pCurrentSys, pNextSys ;
        !           296: 
        !           297:     // delete all the marked system from the list header until
        !           298:     // we hit one that is not marked
        !           299:     while ((*ppSystemFirst)->bSystemNoLongerNeeded) {
        !           300:        // delect from the list header
        !           301:        pCurrentSys = *ppSystemFirst ;
        !           302:        *ppSystemFirst = pCurrentSys->pSystemNext ;
        !           303:        SystemFree (pCurrentSys, TRUE) ;
        !           304:        iNoUseSystems-- ;
        !           305:        if (iNoUseSystems <= 0 || !(*ppSystemFirst)) {
        !           306:           // done
        !           307:           break ;
        !           308:        }
        !           309:     }
        !           310: 
        !           311:     if (iNoUseSystems <= 0 || !(*ppSystemFirst)) {
        !           312:        return ;
        !           313:     }
        !           314: 
        !           315:     // now walk the list and delete each marked system
        !           316:     for (pPrevSys = *ppSystemFirst, pCurrentSys = pPrevSys->pSystemNext ;
        !           317:          pCurrentSys && iNoUseSystems > 0 ;
        !           318:          pCurrentSys = pNextSys, iNoUseSystems--) {
        !           319: 
        !           320:        if (pCurrentSys->bSystemNoLongerNeeded) {
        !           321:           // the current system is marked, updated the list and free
        !           322:           // this system.  No need to change pPrevSys here
        !           323:           pNextSys = pPrevSys->pSystemNext = pCurrentSys->pSystemNext ;
        !           324:           SystemFree (pCurrentSys, TRUE) ;
        !           325:        } else {
        !           326:           // pCurrentSys is OK, update the 2 list pointers and 
        !           327:           // carry on looping
        !           328:           pPrevSys = pCurrentSys ;
        !           329:           pNextSys = pCurrentSys->pSystemNext ;
        !           330:        }
        !           331:     }
        !           332: }
        !           333: 
        !           334: void
        !           335: FreeSystems (
        !           336:     PPERFSYSTEM pSystemFirst
        !           337: )
        !           338: {
        !           339:     PPERFSYSTEM    pSystem, pSystemNext ;
        !           340: 
        !           341: 
        !           342:     for (pSystem = pSystemFirst; 
        !           343:          pSystem; 
        !           344:          pSystem = pSystemNext) {
        !           345:         pSystemNext = pSystem->pSystemNext ;
        !           346:         SystemFree (pSystem, TRUE) ;
        !           347:     }
        !           348: }  // FreeSystems
        !           349: 
        !           350: PPERFSYSTEM
        !           351: GetComputer (
        !           352:     HDLG hDlg,
        !           353:     WORD wControlID,
        !           354:     BOOL bWarn,
        !           355:     PPERFDATA *ppPerfData,
        !           356:     PPERFSYSTEM *ppSystemFirst
        !           357: )
        !           358: /*
        !           359:    Effect:        Attempt to set the current computer to the one in the
        !           360:                   hWndComputers dialog edit box. If this computer system
        !           361:                   can be found, load the objects, etc. for the computer
        !           362:                   and set pSystem and ppPerfdata to the values for this
        !           363:                   system.
        !           364: */
        !           365: {  // GetComputer
        !           366:     TCHAR          szComputer [MAX_SYSTEM_NAME_LENGTH + 1] ;
        !           367:     PPERFSYSTEM    pSystem;
        !           368:     TCHAR          tempBuffer [LongTextLen] ;
        !           369:     DWORD          dwBufferSize ;
        !           370:     LPTSTR         pBuffer = NULL ;
        !           371: 
        !           372:     DialogText (hDlg, wControlID, szComputer) ;
        !           373: 
        !           374:     // If necessary, add the system to the lists for this view.
        !           375:     pSystem = SystemGet (*ppSystemFirst, szComputer) ;
        !           376:     if (!pSystem) {
        !           377:         pSystem = SystemAdd (ppSystemFirst, szComputer) ;
        !           378:     }
        !           379: 
        !           380:     if (!pSystem && bWarn) {
        !           381:         DialogSetString (hDlg, wControlID, LocalComputerName) ;
        !           382: 
        !           383:         // Note: this will succeed since the local computer is always
        !           384:         // available
        !           385:         EditSetModified (GetDlgItem(hDlg, wControlID), FALSE) ;
        !           386:     
        !           387:         pSystem = SystemGet (*ppSystemFirst, LocalComputerName) ;
        !           388:         if (!pSystem) {
        !           389:             pSystem = SystemAdd (ppSystemFirst, LocalComputerName) ;
        !           390:         }
        !           391: 
        !           392: //        MessageBoxResource (hDlg, IDS_COMPUTERNOTFOUND, IDS_APPNAME, MB_OK) ;
        !           393:         DlgErrorBox (hDlg, ERR_COMPUTERNOTFOUND) ;
        !           394: 
        !           395:         SetFocus (DialogControl(hDlg, wControlID)) ;
        !           396:     }
        !           397: 
        !           398:     if (pSystem) {
        !           399:         if (PlayingBackLog ()) {
        !           400:             *ppPerfData =
        !           401:             LogDataFromPosition (pSystem, &(PlaybackLog.StartIndexPos)) ;
        !           402:         } else {
        !           403: 
        !           404:             if (pSystem->lpszValue) {
        !           405:                // save the previous lpszValue string before 
        !           406:                // SetSystemValueNameToGlobal screw it up
        !           407:                dwBufferSize = MemorySize (pSystem->lpszValue) ;
        !           408:                if (dwBufferSize <= sizeof(tempBuffer)) {
        !           409:                   pBuffer = tempBuffer ;
        !           410:                } else {
        !           411:                   pBuffer = MemoryAllocate (dwBufferSize) ;
        !           412:                }
        !           413:                memcpy (pBuffer, pSystem->lpszValue, dwBufferSize) ;
        !           414:             }
        !           415: 
        !           416:             SetSystemValueNameToGlobal (pSystem);
        !           417:             UpdateSystemData (pSystem, ppPerfData) ;
        !           418: 
        !           419:             if (pSystem->lpszValue) {
        !           420:                // retore the previous lpszValue string
        !           421:                memcpy (pSystem->lpszValue, pBuffer, dwBufferSize) ;
        !           422:                if (pBuffer != tempBuffer) {
        !           423:                   MemoryFree (pBuffer) ;
        !           424:                }
        !           425:             }
        !           426:         }
        !           427:     }
        !           428:     return (pSystem) ;
        !           429: 
        !           430: }  // GetComputer

unix.superglobalmegacorp.com

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