Annotation of ntddk/src/perf/vgactrs/perfvga.c, revision 1.1

1.1     ! root        1: /*++ BUILD Version: 0001    // Increment this if a change has global effects
        !             2: 
        !             3: Copyright (c) 1992  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     perfvga.c
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     This file implements the Extensible Objects for  the Vga object type
        !            12: 
        !            13: Created:    
        !            14: 
        !            15:     Russ Blake  24 Feb 93
        !            16: 
        !            17: Revision History
        !            18: 
        !            19: 
        !            20: --*/
        !            21: 
        !            22: //
        !            23: //  Include Files
        !            24: //
        !            25: 
        !            26: #include <windows.h>
        !            27: #include <string.h>
        !            28: #include <winperf.h>
        !            29: #include "vgactrs.h" // error message definition
        !            30: #include "perfmsg.h"
        !            31: #include "perfutil.h"
        !            32: #include "datavga.h"
        !            33: 
        !            34: //
        !            35: //  References to constants which initialize the Object type definitions
        !            36: //
        !            37: 
        !            38: extern VGA_DATA_DEFINITION VgaDataDefinition;
        !            39:     
        !            40: DWORD   dwOpenCount = 0;        // count of "Open" threads
        !            41: BOOL    bInitOK = FALSE;        // true = DLL initialized OK
        !            42: 
        !            43: //
        !            44: // Vga data structures
        !            45: //
        !            46: 
        !            47: HANDLE hVgaSharedMemory;                // Handle of Vga Shared Memory
        !            48: PPERF_COUNTER_BLOCK pCounterBlock;
        !            49: 
        !            50: //
        !            51: //  Function Prototypes
        !            52: //
        !            53: //      these are used to insure that the data collection functions
        !            54: //      accessed by Perflib will have the correct calling format.
        !            55: //
        !            56: 
        !            57: DWORD APIENTRY   OpenVgaPerformanceData(LPWSTR);
        !            58: DWORD APIENTRY   CollectVgaPerformanceData(LPWSTR, LPVOID *, LPDWORD, LPDWORD);
        !            59: DWORD APIENTRY   CloseVgaPerformanceData(void);
        !            60: 
        !            61: 
        !            62: DWORD APIENTRY
        !            63: OpenVgaPerformanceData(
        !            64:     LPWSTR lpDeviceNames
        !            65:     )
        !            66: 
        !            67: /*++
        !            68: 
        !            69: Routine Description:
        !            70: 
        !            71:     This routine will open and map the memory used by the VGA driver to
        !            72:     pass performance data in. This routine also initializes the data
        !            73:     structures used to pass data back to the registry
        !            74: 
        !            75: Arguments:
        !            76: 
        !            77:     Pointer to object ID of each device to be opened (VGA)
        !            78: 
        !            79: 
        !            80: Return Value:
        !            81: 
        !            82:     None.
        !            83: 
        !            84: --*/
        !            85: 
        !            86: {
        !            87:     LONG status;
        !            88:     TCHAR szMappedObject[] = TEXT("VGA_COUNTER_BLOCK");
        !            89:     HKEY hKeyDriverPerf;
        !            90:     DWORD size;
        !            91:     DWORD type;
        !            92:     DWORD dwFirstCounter;
        !            93:     DWORD dwFirstHelp;
        !            94: 
        !            95:     //
        !            96:     //  Since SCREG is multi-threaded and will call this routine in
        !            97:     //  order to service remote performance queries, this library
        !            98:     //  must keep track of how many times it has been opened (i.e.
        !            99:     //  how many threads have accessed it). the registry routines will
        !           100:     //  limit access to the initialization routine to only one thread 
        !           101:     //  at a time so synchronization (i.e. reentrancy) should not be 
        !           102:     //  a problem
        !           103:     //
        !           104: 
        !           105:     if (!dwOpenCount) {
        !           106:         // open Eventlog interface
        !           107: 
        !           108:         hEventLog = MonOpenEventLog();
        !           109: 
        !           110:         // open shared memory used by device driver to pass performance values
        !           111: 
        !           112:         hVgaSharedMemory = OpenFileMapping(FILE_MAP_READ,
        !           113:                                        FALSE,
        !           114:                                        szMappedObject);
        !           115:         pCounterBlock = NULL;   // initialize pointer to memory
        !           116: 
        !           117:         // log error if unsuccessful
        !           118: 
        !           119:         if (hVgaSharedMemory == NULL) {
        !           120:             REPORT_ERROR (VGAPERF_OPEN_FILE_MAPPING_ERROR, LOG_USER);
        !           121:             // this is fatal, if we can't get data then there's no
        !           122:             // point in continuing.
        !           123:             status = GetLastError(); // return error
        !           124:             goto OpenExitPoint;
        !           125:         } else {
        !           126:             // if opened ok, then map pointer to memory
        !           127:                pCounterBlock = (PPERF_COUNTER_BLOCK) 
        !           128:                                MapViewOfFile(hVgaSharedMemory,
        !           129:                                            FILE_MAP_READ,
        !           130:                                            0,
        !           131:                                            0,
        !           132:                                            0);
        !           133:                if (pCounterBlock == NULL) {
        !           134:                 REPORT_ERROR (VGAPERF_UNABLE_MAP_VIEW_OF_FILE, LOG_USER);
        !           135:                 // this is fatal, if we can't get data then there's no
        !           136:                 // point in continuing.
        !           137:                 status = GetLastError(); // return error
        !           138:                }
        !           139:         }
        !           140: 
        !           141:         // get counter and help index base values from registry
        !           142:         //      Open key to registry entry
        !           143:         //      read First Counter and First Help values
        !           144:         //      update static data strucutures by adding base to 
        !           145:         //          offset value in structure.
        !           146: 
        !           147:         status = RegOpenKeyEx (
        !           148:             HKEY_LOCAL_MACHINE,
        !           149:            "SYSTEM\\CurrentControlSet\\Services\\Vga\\Performance",
        !           150:             0L,
        !           151:                KEY_ALL_ACCESS,
        !           152:             &hKeyDriverPerf);
        !           153: 
        !           154:         if (status != ERROR_SUCCESS) {
        !           155:             REPORT_ERROR_DATA (VGAPERF_UNABLE_OPEN_DRIVER_KEY, LOG_USER,
        !           156:                 &status, sizeof(status));
        !           157:             // this is fatal, if we can't get the base values of the 
        !           158:             // counter or help names, then the names won't be available
        !           159:             // to the requesting application  so there's not much
        !           160:             // point in continuing.
        !           161:             goto OpenExitPoint;
        !           162:         }
        !           163: 
        !           164:         size = sizeof (DWORD);
        !           165:         status = RegQueryValueEx(
        !           166:                     hKeyDriverPerf, 
        !           167:                            "First Counter",
        !           168:                     0L,
        !           169:                     &type,
        !           170:                     (LPBYTE)&dwFirstCounter,
        !           171:                     &size);
        !           172: 
        !           173:         if (status != ERROR_SUCCESS) {
        !           174:             REPORT_ERROR_DATA (VGAPERF_UNABLE_READ_FIRST_COUNTER, LOG_USER,
        !           175:                 &status, sizeof(status));
        !           176:             // this is fatal, if we can't get the base values of the 
        !           177:             // counter or help names, then the names won't be available
        !           178:             // to the requesting application  so there's not much
        !           179:             // point in continuing.
        !           180:             goto OpenExitPoint;
        !           181:         }
        !           182: 
        !           183:         size = sizeof (DWORD);
        !           184:         status = RegQueryValueEx(
        !           185:                     hKeyDriverPerf, 
        !           186:                            "First Help",
        !           187:                     0L,
        !           188:                     &type,
        !           189:                     (LPBYTE)&dwFirstHelp,
        !           190:                    &size);
        !           191: 
        !           192:         if (status != ERROR_SUCCESS) {
        !           193:             REPORT_ERROR_DATA (VGAPERF_UNABLE_READ_FIRST_HELP, LOG_USER,
        !           194:                 &status, sizeof(status));
        !           195:             // this is fatal, if we can't get the base values of the 
        !           196:             // counter or help names, then the names won't be available
        !           197:             // to the requesting application  so there's not much
        !           198:             // point in continuing.
        !           199:             goto OpenExitPoint;
        !           200:         }
        !           201:  
        !           202:         //
        !           203:         //  NOTE: the initialization program could also retrieve
        !           204:         //      LastCounter and LastHelp if they wanted to do 
        !           205:         //      bounds checking on the new number. e.g.
        !           206:         //
        !           207:         //      counter->CounterNameTitleIndex += dwFirstCounter;
        !           208:         //      if (counter->CounterNameTitleIndex > dwLastCounter) {
        !           209:         //          LogErrorToEventLog (INDEX_OUT_OF_BOUNDS);
        !           210:         //      }
        !           211: 
        !           212:         VgaDataDefinition.VgaObjectType.ObjectNameTitleIndex += dwFirstCounter;
        !           213:         VgaDataDefinition.VgaObjectType.ObjectHelpTitleIndex += dwFirstHelp;
        !           214: 
        !           215:         VgaDataDefinition.NumBitBlts.CounterNameTitleIndex += dwFirstCounter;
        !           216:         VgaDataDefinition.NumBitBlts.CounterHelpTitleIndex += dwFirstHelp;
        !           217: 
        !           218:         VgaDataDefinition.NumTextOuts.CounterNameTitleIndex += dwFirstCounter;
        !           219:         VgaDataDefinition.NumTextOuts.CounterHelpTitleIndex += dwFirstHelp;
        !           220: 
        !           221:         RegCloseKey (hKeyDriverPerf); // close key to registry
        !           222: 
        !           223:         bInitOK = TRUE; // ok to use this function
        !           224:     }
        !           225: 
        !           226:     dwOpenCount++;  // increment OPEN counter
        !           227: 
        !           228:     status = ERROR_SUCCESS; // for successful exit
        !           229: 
        !           230: OpenExitPoint:
        !           231: 
        !           232:     return status;
        !           233: }
        !           234: 
        !           235: 
        !           236: DWORD APIENTRY
        !           237: CollectVgaPerformanceData(
        !           238:     IN      LPWSTR  lpValueName,
        !           239:     IN OUT  LPVOID  *lppData,
        !           240:     IN OUT  LPDWORD lpcbTotalBytes,
        !           241:     IN OUT  LPDWORD lpNumObjectTypes
        !           242: )
        !           243: /*++
        !           244: 
        !           245: Routine Description:
        !           246: 
        !           247:     This routine will return the data for the VGA counters.
        !           248: 
        !           249: Arguments:
        !           250: 
        !           251:    IN       LPWSTR   lpValueName
        !           252:          pointer to a wide character string passed by registry.
        !           253: 
        !           254:    IN OUT   LPVOID   *lppData
        !           255:          IN: pointer to the address of the buffer to receive the completed 
        !           256:             PerfDataBlock and subordinate structures. This routine will
        !           257:             append its data to the buffer starting at the point referenced
        !           258:             by *lppData.
        !           259:          OUT: points to the first byte after the data structure added by this
        !           260:             routine. This routine updated the value at lppdata after appending
        !           261:             its data.
        !           262: 
        !           263:    IN OUT   LPDWORD  lpcbTotalBytes
        !           264:          IN: the address of the DWORD that tells the size in bytes of the 
        !           265:             buffer referenced by the lppData argument
        !           266:          OUT: the number of bytes added by this routine is writted to the 
        !           267:             DWORD pointed to by this argument
        !           268: 
        !           269:    IN OUT   LPDWORD  NumObjectTypes
        !           270:          IN: the address of the DWORD to receive the number of objects added 
        !           271:             by this routine 
        !           272:          OUT: the number of objects added by this routine is writted to the 
        !           273:             DWORD pointed to by this argument
        !           274: 
        !           275: Return Value:
        !           276: 
        !           277:       ERROR_MORE_DATA if buffer passed is too small to hold data
        !           278:          any error conditions encountered are reported to the event log if
        !           279:          event logging is enabled.
        !           280: 
        !           281:       ERROR_SUCCESS  if success or any other error. Errors, however are
        !           282:          also reported to the event log.
        !           283: 
        !           284: --*/
        !           285: {
        !           286:     //  Variables for reformating the data
        !           287: 
        !           288:     ULONG SpaceNeeded;
        !           289:     PDWORD pdwCounter;
        !           290:     PERF_COUNTER_BLOCK *pPerfCounterBlock;
        !           291:     VGA_DATA_DEFINITION *pVgaDataDefinition;
        !           292:     DWORD   dwQueryType;
        !           293: 
        !           294:     //
        !           295:     // before doing anything else, see if Open went OK
        !           296:     //
        !           297:     if (!bInitOK) {
        !           298:         // unable to continue because open failed.
        !           299:            *lpcbTotalBytes = (DWORD) 0;
        !           300:            *lpNumObjectTypes = (DWORD) 0;
        !           301:         return ERROR_SUCCESS; // yes, this is a successful exit
        !           302:     }
        !           303:     
        !           304:     // see if this is a foreign (i.e. non-NT) computer data request 
        !           305:     //
        !           306:     dwQueryType = GetQueryType (lpValueName);
        !           307:     
        !           308:     if (dwQueryType == QUERY_FOREIGN) {
        !           309:         // this routine does not service requests for data from
        !           310:         // Non-NT computers
        !           311:            *lpcbTotalBytes = (DWORD) 0;
        !           312:            *lpNumObjectTypes = (DWORD) 0;
        !           313:         return ERROR_SUCCESS;
        !           314:     }
        !           315: 
        !           316:     if (dwQueryType == QUERY_ITEMS){
        !           317:        if ( !(IsNumberInUnicodeList (VgaDataDefinition.VgaObjectType.ObjectNameTitleIndex, lpValueName))) {
        !           318:              
        !           319:             // request received for data object not provided by this routine
        !           320:             *lpcbTotalBytes = (DWORD) 0;
        !           321:            *lpNumObjectTypes = (DWORD) 0;
        !           322:             return ERROR_SUCCESS;
        !           323:         }
        !           324:     }
        !           325: 
        !           326:     pVgaDataDefinition = (VGA_DATA_DEFINITION *) *lppData;
        !           327: 
        !           328:     SpaceNeeded = sizeof(VGA_DATA_DEFINITION) +
        !           329:                  SIZE_OF_VGA_PERFORMANCE_DATA;
        !           330: 
        !           331:     if ( *lpcbTotalBytes < SpaceNeeded ) {
        !           332:            *lpcbTotalBytes = (DWORD) 0;
        !           333:            *lpNumObjectTypes = (DWORD) 0;
        !           334:         return ERROR_MORE_DATA;
        !           335:     }
        !           336: 
        !           337:     //
        !           338:     // Copy the (constant, initialized) Object Type and counter definitions
        !           339:     //  to the caller's data buffer
        !           340:     //
        !           341: 
        !           342:     memmove(pVgaDataDefinition,
        !           343:           &VgaDataDefinition,
        !           344:           sizeof(VGA_DATA_DEFINITION));
        !           345: 
        !           346:     //
        !           347:     // Format and collect VGA data from shared memory 
        !           348:     //
        !           349: 
        !           350:     pPerfCounterBlock = (PERF_COUNTER_BLOCK *) &pVgaDataDefinition[1];
        !           351: 
        !           352:     pPerfCounterBlock->ByteLength = SIZE_OF_VGA_PERFORMANCE_DATA;
        !           353: 
        !           354:     pdwCounter = (PDWORD) (&pPerfCounterBlock[1]);
        !           355: 
        !           356:     *pdwCounter = *((PDWORD) pCounterBlock);
        !           357:     *++pdwCounter = ((PDWORD) pCounterBlock)[1];
        !           358: 
        !           359:     *lppData = (PVOID) ++pdwCounter;
        !           360: 
        !           361:     // update arguments fore return
        !           362:     
        !           363:     *lpNumObjectTypes = 1;
        !           364: 
        !           365:     *lpcbTotalBytes = (PBYTE) pdwCounter - (PBYTE) pVgaDataDefinition;
        !           366: 
        !           367:     return ERROR_SUCCESS;
        !           368: }
        !           369: 
        !           370: 
        !           371: DWORD APIENTRY
        !           372: CloseVgaPerformanceData(
        !           373: )
        !           374: 
        !           375: /*++
        !           376: 
        !           377: Routine Description:
        !           378: 
        !           379:     This routine closes the open handles to VGA device performance counters
        !           380: 
        !           381: Arguments:
        !           382: 
        !           383:     None.
        !           384: 
        !           385: 
        !           386: Return Value:
        !           387: 
        !           388:     ERROR_SUCCESS
        !           389: 
        !           390: --*/
        !           391: 
        !           392: {
        !           393:     if (!(--dwOpenCount)) { // when this is the last thread...
        !           394: 
        !           395:         CloseHandle(hVgaSharedMemory);
        !           396: 
        !           397:         pCounterBlock = NULL;
        !           398: 
        !           399:         MonCloseEventLog();
        !           400:     }
        !           401: 
        !           402:     return ERROR_SUCCESS;
        !           403: 
        !           404: }
        !           405: 

unix.superglobalmegacorp.com

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