Annotation of mstools/samples/sdktools/perfmon/system.c, revision 1.1.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.