Annotation of mstools/samples/sdktools/pviewer/perfdata.c, revision 1.1

1.1     ! root        1: 
        !             2: /******************************************************************************\
        !             3: *       This is a part of the Microsoft Source Code Samples. 
        !             4: *       Copyright (C) 1993 Microsoft Corporation.
        !             5: *       All rights reserved. 
        !             6: *       This source code is only intended as a supplement to 
        !             7: *       Microsoft Development Tools and/or WinHelp documentation.
        !             8: *       See these sources for detailed information regarding the 
        !             9: *       Microsoft samples programs.
        !            10: \******************************************************************************/
        !            11: 
        !            12: 
        !            13: /******************************************************************************
        !            14: 
        !            15:                         P E R F O R M A N C E   D A T A
        !            16: 
        !            17:     Name:       perfdata.c
        !            18: 
        !            19:     Description:
        !            20:         This module together with objdata.c, instdata.c, and cntrdata.c
        !            21:         access the performance data.
        !            22: 
        !            23: ******************************************************************************/
        !            24: 
        !            25: #include <windows.h>
        !            26: #include <winperf.h>
        !            27: #include "perfdata.h"
        !            28: #include <stdlib.h>
        !            29: 
        !            30: 
        !            31: 
        !            32: 
        !            33: LPTSTR      *gPerfTitleSz;
        !            34: LPTSTR      TitleData;
        !            35: 
        !            36: 
        !            37: 
        !            38: 
        !            39: //*********************************************************************
        !            40: //
        !            41: //  GetPerfData
        !            42: //
        !            43: //      Get a new set of performance data.
        !            44: //
        !            45: //      *ppData should be NULL initially.
        !            46: //      This function will allocate a buffer big enough to hold the
        !            47: //      data requested by szObjectIndex.
        !            48: //
        !            49: //      *pDataSize specifies the initial buffer size.  If the size is
        !            50: //      too small, the function will increase it until it is big enough
        !            51: //      then return the size through *pDataSize.  Caller should
        !            52: //      deallocate *ppData if it is no longer being used.
        !            53: //
        !            54: //      Returns ERROR_SUCCESS if no error occurs.
        !            55: //
        !            56: //      Note: the trial and error loop is quite different from the normal
        !            57: //            registry operation.  Normally if the buffer is too small,
        !            58: //            RegQueryValueEx returns the required size.  In this case,
        !            59: //            the perflib, since the data is dynamic, a buffer big enough
        !            60: //            for the moment may not be enough for the next. Therefor,
        !            61: //            the required size is not returned.
        !            62: //
        !            63: //            One should start with a resonable size to avoid the overhead
        !            64: //            of reallocation of memory.
        !            65: //
        !            66: DWORD   GetPerfData    (HKEY        hPerfKey,
        !            67:                         LPTSTR      szObjectIndex,
        !            68:                         PPERF_DATA  *ppData,
        !            69:                         DWORD       *pDataSize)
        !            70: {
        !            71: DWORD   DataSize;
        !            72: DWORD   dwR;
        !            73: DWORD   Type;
        !            74: 
        !            75: 
        !            76:     if (!*ppData)
        !            77:         *ppData = (PPERF_DATA) LocalAlloc (LMEM_FIXED, *pDataSize);
        !            78: 
        !            79: 
        !            80:     do  {
        !            81:         DataSize = *pDataSize;
        !            82:         dwR = RegQueryValueEx (hPerfKey,
        !            83:                                szObjectIndex,
        !            84:                                NULL,
        !            85:                                &Type,
        !            86:                                (BYTE *)*ppData,
        !            87:                                &DataSize);
        !            88: 
        !            89:         if (dwR == ERROR_MORE_DATA)
        !            90:             {
        !            91:             LocalFree (*ppData);
        !            92:             *pDataSize += 1024;
        !            93:             *ppData = (PPERF_DATA) LocalAlloc (LMEM_FIXED, *pDataSize);
        !            94:             }
        !            95: 
        !            96:         if (!*ppData)
        !            97:             {
        !            98:             LocalFree (*ppData);
        !            99:             return ERROR_NOT_ENOUGH_MEMORY;
        !           100:             }
        !           101: 
        !           102:         } while (dwR == ERROR_MORE_DATA);
        !           103: 
        !           104:     return dwR;
        !           105: }
        !           106: 
        !           107: 
        !           108: 
        !           109: 
        !           110: #ifdef UNICODE
        !           111: 
        !           112: #define atoi    atoiW
        !           113: 
        !           114: 
        !           115: //*********************************************************************
        !           116: //
        !           117: //  atoiW
        !           118: //
        !           119: //      Unicode version of atoi.
        !           120: //
        !           121: INT atoiW (LPTSTR s)
        !           122: {
        !           123: INT i = 0;
        !           124: 
        !           125:     while (isdigit (*s))
        !           126:         {
        !           127:         i = i*10 + (BYTE)*s - TEXT('0');
        !           128:         s++;
        !           129:         }
        !           130: 
        !           131:     return i;
        !           132: }
        !           133: 
        !           134: #endif
        !           135: 
        !           136: 
        !           137: 
        !           138: 
        !           139: //*********************************************************************
        !           140: //
        !           141: //  GetPerfTitleSz
        !           142: //
        !           143: //      Retrieves the performance data title strings.
        !           144: //
        !           145: //      This call retrieves english version of the title strings.  For
        !           146: //      other locale the registry key should be changed to ..."perflib\\NNN"
        !           147: //
        !           148: //      Caller should provide two pointers, one for buffering the title
        !           149: //      strings the other for indexing the title strings.  This function will
        !           150: //      allocate memory for the TitleBuffer and TitleSz.  To get the title
        !           151: //      string for a particular title index one would just index the TitleSz.
        !           152: //      *TitleCount returns the highest index can be used.  If TitleSz[N] is
        !           153: //      NULL then there is no Title for index N.
        !           154: //
        !           155: //      Example:  TitleSz[20] points to titile string for title index 20.
        !           156: //
        !           157: //      When done with the TitleSz, caller should LocalFree(*TitleBuffer).
        !           158: //
        !           159: //      This function returns ERROR_SUCCESS if no error.
        !           160: //
        !           161: DWORD   GetPerfTitleSz (HKEY    hKeyMachine,
        !           162:                         LPTSTR  *TitleBuffer,
        !           163:                         LPTSTR  *TitleSz[],
        !           164:                         DWORD   *TitleCount)
        !           165: {
        !           166: HKEY    hKey;
        !           167: DWORD   Type;
        !           168: DWORD   DataSize;
        !           169: DWORD   dwR;
        !           170: DWORD   Len;
        !           171: DWORD   Index;
        !           172: LPTSTR  szTitle;
        !           173: 
        !           174: 
        !           175: 
        !           176: 
        !           177:     // Get the last counter's index so we know how much memory to allocate for TitleSz
        !           178:     dwR = RegOpenKeyEx (hKeyMachine,
        !           179:                         TEXT("software\\microsoft\\windows nt\\currentversion\\perflib"),
        !           180:                         0,
        !           181:                         KEY_READ,
        !           182:                         &hKey);
        !           183: 
        !           184:     if (dwR != ERROR_SUCCESS)
        !           185:         return dwR;
        !           186: 
        !           187: 
        !           188:     DataSize = sizeof (DWORD);
        !           189:     dwR = RegQueryValueEx (hKey, TEXT("Last Counter"), 0, &Type, (LPBYTE)TitleCount, &DataSize);
        !           190: 
        !           191:     if (dwR != ERROR_SUCCESS)
        !           192:         return dwR;
        !           193: 
        !           194: 
        !           195: 
        !           196: 
        !           197: 
        !           198:     // Now get the counter names and indexes.
        !           199:     dwR = RegOpenKeyEx (hKeyMachine,
        !           200:                         TEXT("software\\microsoft\\windows nt\\currentversion\\perflib\\009"),
        !           201:                         0,
        !           202:                         KEY_READ,
        !           203:                         &hKey);
        !           204: 
        !           205:     if (dwR != ERROR_SUCCESS)
        !           206:         return dwR;
        !           207: 
        !           208: 
        !           209:     // Find out the size of the data.
        !           210:     dwR = RegQueryValueEx (hKey, TEXT("Counters"), 0, &Type, 0, &DataSize);
        !           211: 
        !           212: 
        !           213: 
        !           214:     // Allocate memory
        !           215:     *TitleBuffer = (LPTSTR)LocalAlloc (LMEM_FIXED, DataSize);
        !           216:     if (!*TitleBuffer)
        !           217:         return ERROR_NOT_ENOUGH_MEMORY;
        !           218: 
        !           219:     *TitleSz = (LPTSTR *)LocalAlloc (LPTR, (*TitleCount) * sizeof (LPTSTR));
        !           220:     if (!*TitleSz)
        !           221:         {
        !           222:         LocalFree (*TitleBuffer);
        !           223:         return ERROR_NOT_ENOUGH_MEMORY;
        !           224:         }
        !           225: 
        !           226: 
        !           227: 
        !           228: 
        !           229: 
        !           230:     // Query the data
        !           231:     dwR = RegQueryValueEx (hKey, TEXT("Counters"), 0, &Type, (BYTE *)*TitleBuffer, &DataSize);
        !           232: 
        !           233:     if (dwR != ERROR_SUCCESS)
        !           234:         {
        !           235:         LocalFree (*TitleBuffer);
        !           236:         LocalFree (*TitleSz);
        !           237:         return dwR;
        !           238:         }
        !           239: 
        !           240: 
        !           241: 
        !           242: 
        !           243:     // Setup the TitleSz array of pointers to point to beginning of each title string.
        !           244:     // TitleBuffer is type REG_MULTI_SZ.
        !           245: 
        !           246:     szTitle = *TitleBuffer;
        !           247: 
        !           248:     while (Len = lstrlen (szTitle))
        !           249:         {
        !           250:         Index = atoi (szTitle);
        !           251: 
        !           252:         szTitle = szTitle + Len +1;
        !           253: 
        !           254:         (*TitleSz)[Index] = szTitle;
        !           255: 
        !           256:         szTitle = szTitle + lstrlen (szTitle) +1;
        !           257:         }
        !           258: 
        !           259: 
        !           260:     return dwR;
        !           261: 
        !           262: }

unix.superglobalmegacorp.com

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