| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 |
- /** BEGIN COPYRIGHT BLOCK
- * This Program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License as published by the Free Software
- * Foundation; version 2 of the License.
- *
- * This Program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
- * Place, Suite 330, Boston, MA 02111-1307 USA.
- *
- * In addition, as a special exception, Red Hat, Inc. gives You the additional
- * right to link the code of this Program with code not covered under the GNU
- * General Public License ("Non-GPL Code") and to distribute linked combinations
- * including the two, subject to the limitations in this paragraph. Non-GPL Code
- * permitted under this exception must only link to the code of this Program
- * through those well defined interfaces identified in the file named EXCEPTION
- * found in the source code files (the "Approved Interfaces"). The files of
- * Non-GPL Code may instantiate templates or use macros or inline functions from
- * the Approved Interfaces without causing the resulting work to be covered by
- * the GNU General Public License. Only Red Hat, Inc. may make changes or
- * additions to the list of Approved Interfaces. You must obey the GNU General
- * Public License in all respects for all of the Program code and other code used
- * in conjunction with the Program except the Non-GPL Code covered by this
- * exception. If you modify this file, you may extend this exception to your
- * version of the file, but you are not obligated to do so. If you do not wish to
- * provide this exception without modification, you must delete this exception
- * statement from your version and license this file solely under the GPL without
- * exception.
- *
- *
- * Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
- * Copyright (C) 2005 Red Hat, Inc.
- * All rights reserved.
- * END COPYRIGHT BLOCK **/
- #ifdef HAVE_CONFIG_H
- # include <config.h>
- #endif
- /*
- nsctrutil.c
- Performance Monitor utility functions
- This file implements the utility routines used to construct the
- common parts of a PERF_INSTANCE_DEFINITION (see winperf.h) and
- perform event logging functions.
-
- */
- #include <windows.h>
- #include <string.h>
- #include <winperf.h>
- #include "nsldapctrmc.h"
- #include "nsldapctrmsg.h"
- #include "nsldapctrutil.h"
- #define INITIAL_SIZE 1024L
- #define EXTEND_SIZE 1024L
- //
- // Global data definitions.
- //
- ULONG ulInfoBufferSize = 0;
- HANDLE hEventLog; // handle to event log
- DWORD dwLogUsers = 0; // count of functions using event log
- DWORD MESSAGE_LEVEL = 0;
- WCHAR GLOBAL_STRING[] = L"Global";
- WCHAR FOREIGN_STRING[] = L"Foreign";
- WCHAR COSTLY_STRING[] = L"Costly";
- WCHAR NULL_STRING[] = L"\0"; // pointer to null string
- // test for delimiter, end of line and non-digit characters
- // used by IsNumberInUnicodeList routine
- //
- #define DIGIT 1
- #define DELIMITER 2
- #define INVALID 3
- #define EvalThisChar(c,d) ( \
- (c == d) ? DELIMITER : \
- (c == 0) ? DELIMITER : \
- (c < (WCHAR)'0') ? INVALID : \
- (c > (WCHAR)'9') ? INVALID : \
- DIGIT)
- HANDLE
- MonOpenEventLog (
- )
- /*++
- Routine Description:
- Reads the level of event logging from the registry and opens the
- channel to the event logger for subsequent event log entries.
- Arguments:
- None
- Return Value:
- Handle to the event log for reporting events.
- NULL if open not successful.
- --*/
-
-
- {
-
-
- HKEY hAppKey;
-
-
- TCHAR LogLevelKeyName[] = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib";
-
-
- TCHAR LogLevelValueName[] = "EventLogLevel";
- LONG lStatus;
- DWORD dwLogLevel;
- DWORD dwValueType;
- DWORD dwValueSize;
-
- // if global value of the logging level not initialized or is disabled,
- // check the registry to see if it should be updated.
- if (!MESSAGE_LEVEL) {
- lStatus = RegOpenKeyEx (HKEY_LOCAL_MACHINE,
- LogLevelKeyName,
- 0,
- KEY_READ,
- &hAppKey);
- dwValueSize = sizeof (dwLogLevel);
- if (lStatus == ERROR_SUCCESS) {
- lStatus = RegQueryValueEx (hAppKey,
- LogLevelValueName,
- (LPDWORD)NULL,
- &dwValueType,
- (LPBYTE)&dwLogLevel,
- &dwValueSize);
- if (lStatus == ERROR_SUCCESS) {
- MESSAGE_LEVEL = dwLogLevel;
- } else {
- MESSAGE_LEVEL = MESSAGE_LEVEL_DEFAULT;
- }
- RegCloseKey (hAppKey);
- } else {
-
-
- MESSAGE_LEVEL = MESSAGE_LEVEL_DEFAULT;
- }
- }
-
- if (hEventLog == NULL){
- hEventLog = RegisterEventSource (
- (LPTSTR)NULL, // Use Local Machine
- APP_NAME); // event log app name to find in registry
- }
-
- if (hEventLog != NULL) {
- dwLogUsers++; // increment count of perfctr log users
- }
- return (hEventLog);
- }
- VOID
- MonCloseEventLog (
- )
- /*++
- Routine Description:
- Closes the handle to the event logger if this is the last caller
-
- Arguments:
- None
- Return Value:
- None
- --*/
- {
- if (hEventLog != NULL) {
- dwLogUsers--; // decrement usage
- if (dwLogUsers <= 0) { // and if we're the last, then close up log
- DeregisterEventSource (hEventLog);
- }
- }
- }
- DWORD
- GetQueryType (
- IN LPWSTR lpValue
- )
- /*++
- GetQueryType
- returns the type of query described in the lpValue string so that
- the appropriate processing method may be used
- Arguments
- IN lpValue
- string passed to PerfRegQuery Value for processing
- Return Value
- QUERY_GLOBAL
- if lpValue == 0 (null pointer)
- lpValue == pointer to Null string
- lpValue == pointer to "Global" string
- QUERY_FOREIGN
- if lpValue == pointer to "Foreign" string
- QUERY_COSTLY
- if lpValue == pointer to "Costly" string
- otherwise:
- QUERY_ITEMS
- --*/
- {
- WCHAR *pwcArgChar, *pwcTypeChar;
- BOOL bFound;
- if (lpValue == 0) {
- return QUERY_GLOBAL;
- } else if (*lpValue == 0) {
- return QUERY_GLOBAL;
- }
- // check for "Global" request
- pwcArgChar = lpValue;
- pwcTypeChar = GLOBAL_STRING;
- bFound = TRUE; // assume found until contradicted
- // check to the length of the shortest string
-
- while ((*pwcArgChar != 0) && (*pwcTypeChar != 0)) {
- if (*pwcArgChar++ != *pwcTypeChar++) {
- bFound = FALSE; // no match
- break; // bail out now
- }
- }
- if (bFound) return QUERY_GLOBAL;
- // check for "Foreign" request
-
- pwcArgChar = lpValue;
- pwcTypeChar = FOREIGN_STRING;
- bFound = TRUE; // assume found until contradicted
- // check to the length of the shortest string
-
- while ((*pwcArgChar != 0) && (*pwcTypeChar != 0)) {
- if (*pwcArgChar++ != *pwcTypeChar++) {
- bFound = FALSE; // no match
- break; // bail out now
- }
- }
- if (bFound) return QUERY_FOREIGN;
- // check for "Costly" request
-
- pwcArgChar = lpValue;
- pwcTypeChar = COSTLY_STRING;
- bFound = TRUE; // assume found until contradicted
- // check to the length of the shortest string
-
- while ((*pwcArgChar != 0) && (*pwcTypeChar != 0)) {
- if (*pwcArgChar++ != *pwcTypeChar++) {
- bFound = FALSE; // no match
- break; // bail out now
- }
- }
- if (bFound) return QUERY_COSTLY;
- // if not Global and not Foreign and not Costly,
- // then it must be an item list
-
- return QUERY_ITEMS;
- }
- BOOL
- IsNumberInUnicodeList (
- IN DWORD dwNumber,
- IN LPWSTR lpwszUnicodeList
- )
- /*++
- IsNumberInUnicodeList
- Arguments:
-
- IN dwNumber
- DWORD number to find in list
- IN lpwszUnicodeList
- Null terminated, Space delimited list of decimal numbers
- Return Value:
- TRUE:
- dwNumber was found in the list of unicode number strings
- FALSE:
- dwNumber was not found in the list.
- --*/
- {
- DWORD dwThisNumber;
- WCHAR *pwcThisChar;
- BOOL bValidNumber;
- BOOL bNewItem;
- //BOOL bReturnValue;
- WCHAR wcDelimiter; // could be an argument to be more flexible
- if (lpwszUnicodeList == 0) return FALSE; // null pointer, # not found
- pwcThisChar = lpwszUnicodeList;
- dwThisNumber = 0;
- wcDelimiter = (WCHAR)' ';
- bValidNumber = FALSE;
- bNewItem = TRUE;
-
- while (TRUE) {
- switch (EvalThisChar (*pwcThisChar, wcDelimiter)) {
- case DIGIT:
- // if this is the first digit after a delimiter, then
- // set flags to start computing the new number
- if (bNewItem) {
- bNewItem = FALSE;
- bValidNumber = TRUE;
- }
- if (bValidNumber) {
- dwThisNumber *= 10;
- dwThisNumber += (*pwcThisChar - (WCHAR)'0');
- }
- break;
-
- case DELIMITER:
- // a delimiter is either the delimiter character or the
- // end of the string ('\0') if when the delimiter has been
- // reached a valid number was found, then compare it to the
- // number from the argument list. if this is the end of the
- // string and no match was found, then return.
- //
- if (bValidNumber) {
- if (dwThisNumber == dwNumber) return TRUE;
- bValidNumber = FALSE;
- }
- if (*pwcThisChar == 0) {
- return FALSE;
- } else {
- bNewItem = TRUE;
- dwThisNumber = 0;
- }
- break;
- case INVALID:
- // if an invalid character was encountered, ignore all
- // characters up to the next delimiter and then start fresh.
- // the invalid number is not compared.
- bValidNumber = FALSE;
- break;
- default:
- break;
- }
- pwcThisChar++;
- }
- } // IsNumberInUnicodeList
|