Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

641 lines
18 KiB

/*++ BUILD Version: 0001 // Increment this if a change has global effects
Copyright (c) 2000-2001 Microsoft Corporation
Module Name:
perflib.h
Abstract:
Private functions and data structures used by perflib only
Author:
JeePang 09/27/2000
Revision History:
--*/
#ifndef _PERFLIB_H_
#define _PERFLIB_H_
#define _WMI_SOURCE_
#include <wmistr.h>
#include <evntrace.h>
//
// Private registry function to prevent query within RegQueryValue
// This needs to preceed winperfp.h since it needs this function
//
LONG
PrivateRegQueryValueExT (
HKEY hKey,
LPVOID lpValueName,
LPDWORD lpReserved,
LPDWORD lpType,
LPBYTE lpData,
LPDWORD lpcbData,
BOOL bUnicode
);
#define StartTraceW EtwStartTraceW
#define QueryTraceW EtwQueryTraceW
#define TraceEvent EtwTraceEvent
extern
ULONG
WMIAPI
EtwStartTraceW(
OUT PTRACEHANDLE LoggerHandle,
IN LPCWSTR LoggerName,
IN OUT PEVENT_TRACE_PROPERTIES Properties
);
extern
ULONG
WMIAPI
EtwQueryTraceW(
IN TRACEHANDLE TraceHandle,
IN LPCWSTR InstanceName,
IN OUT PEVENT_TRACE_PROPERTIES Properties
);
extern
ULONG
WMIAPI
EtwTraceEvent(
IN TRACEHANDLE LoggerHandle,
IN PEVENT_TRACE_HEADER EventTrace
);
#include <winperfp.h>
//
// Commonly used macros
//
#define HEAP_PROBE() ; // Not implemented
#define ALLOCMEM(size) RtlAllocateHeap (RtlProcessHeap(), HEAP_ZERO_MEMORY, size)
#define REALLOCMEM(pointer, newsize) \
RtlReAllocateHeap (RtlProcessHeap(), 0, pointer, newsize)
#define FREEMEM(pointer) if ((pointer)) { RtlFreeHeap (RtlProcessHeap(), 0, pointer); }
#define MAX_KEY_NAME_LENGTH 256*sizeof(WCHAR)
#define MAX_VALUE_NAME_LENGTH 256*sizeof(WCHAR)
#define MAX_VALUE_DATA_LENGTH 256*sizeof(WCHAR)
//
// Use this constant to include "\\Performance" and terminator as well
// NOTE: This must be 8-byte multiple, which is 280 here
//
#define MAX_NAME_PATH MAX_VALUE_DATA_LENGTH + 11 * sizeof(WCHAR) + sizeof(UNICODE_NULL)
// flag to determine the "noisiness" of the event logging
// this value is read from the system registry when the extensible
// objects are loaded and used for the subsequent calls.
//
//
// Levels: LOG_UNDEFINED = registry log level not read yet
// LOG_NONE = No event log messages ever
// LOG_USER = User event log messages (e.g. errors)
// LOG_DEBUG = Minimum Debugging (warnings & errors)
// LOG_VERBOSE = Maximum Debugging (informational, success,
// error and warning messages
//
#define LOG_UNDEFINED ((LONG)-1)
#define LOG_NONE 0
#define LOG_USER 1
#define LOG_DEBUG 2
#define LOG_VERBOSE 3
//
// define configurable extensible counter buffer testing
//
// Test Level Event that will prevent data buffer
// from being returne in PerfDataBlock
//
// EXT_TEST_NOMEMALLOC Collect Fn. writes directly to calling fn's buffer
//
// all the following test levels have the collect fn. write to a
// buffer allocated separately from the calling fn's buffer
//
// EXT_TEST_NONE Collect Fn. Returns bad status or generates exception
// EXT_TEST_BASIC Collect Fn. has buffer overflow or violates guard page
// EXT_TEST_ALL Collect Fn. object or instance lengths are not conistent
//
//
#define EXT_TEST_UNDEFINED 0
#define EXT_TEST_ALL 1
#define EXT_TEST_BASIC 2
#define EXT_TEST_NONE 3
#define EXT_TEST_NOMEMALLOC 4
#define PERFLIB_DISABLE_NONE 0
#define PERFLIB_DISABLE_ALL 1
#define PERFLIB_DISABLE_X32 2
#define PERFLIB_DISABLE_IA64 4
// Misc. configuration flags used by lPerflibConfigFlags
//
// PLCF_NO_ALIGN_ERRORS if set inhibit alignment error messages
// PLCF_NO_DISABLE_DLLS if set, auto disable of bad perf DLL's is inhibited
// PLCF_NO_DLL_TESTING disable all DLL testing for ALL dll's (overrides lExtCounterTestLevel)
// PLCF_ENABLE_TIMEOUT_DISABLE if set then disable when timeout errors occur (unless PLCF_NO_DISABLE_DLLS is set)
// PLCF_ENABLE_PERF_SECTION enable the perflib performance data memory section
//
#define PLCF_NO_ALIGN_ERRORS ((DWORD)0x00000001)
#define PLCF_NO_DISABLE_DLLS ((DWORD)0x00000002)
#define PLCF_NO_DLL_TESTING ((DWORD)0x00000004)
#define PLCF_ENABLE_TIMEOUT_DISABLE ((DWORD)0x00000008)
#define PLCF_ENABLE_PERF_SECTION ((DWORD)0x00000010)
// #define PLCF_DEFAULT PLCF_ENABLE_PERF_SECTION
#define PLCF_DEFAULT PLCF_NO_DLL_TESTING
#define COLL_FLAG_USE_SEPARATE_THREAD 1
#define CTD_AF_NO_ACTION ((DWORD)0x00000000)
#define CTD_AF_CLOSE_THREAD ((DWORD)0x00000001)
#define CTD_AF_OPEN_THREAD ((DWORD)0x00000002)
//
// Constants & Flags used for EXT_OBJECT->dwFlags
//
// use query proc
#define PERF_EO_QUERY_FUNC ((DWORD)0x00000001)
// true when DLL ret. error
#define PERF_EO_BAD_DLL ((DWORD)0x00000002)
// true if lib should not be trimmed
#define PERF_EO_KEEP_RESIDENT ((DWORD)0x00000004)
// true when in query list
#define PERF_EO_OBJ_IN_QUERY ((DWORD)0x80000000)
// set if alignment error has been posted to event log
#define PERF_EO_ALIGN_ERR_POSTED ((DWORD)0x00000008)
// set of the "Disable Performance Counters" value is set
#define PERF_EO_DISABLED ((DWORD)0x00000010)
// set when the DLL is deemed trustworthy
#define PERF_EO_TRUSTED ((DWORD)0x00000020)
// set when the DLL has been replaced with a new file
#define PERF_EO_NEW_FILE ((DWORD)0x00000040)
typedef struct _DLL_VALIDATION_DATA {
FILETIME CreationDate;
LONGLONG FileSize;
} DLL_VALIDATION_DATA, *PDLL_VALIDATION_DATA;
#define EXT_OBJ_INFO_NAME_LENGTH 32
typedef struct _PERFDATA_SECTION_HEADER {
DWORD dwEntriesInUse;
DWORD dwMaxEntries;
DWORD dwMissingEntries;
DWORD dwInitSignature;
BYTE reserved[112];
} PERFDATA_SECTION_HEADER, *PPERFDATA_SECTION_HEADER;
#define PDSH_INIT_SIG ((DWORD)0x01234567)
#define PDSR_SERVICE_NAME_LEN 32
typedef struct _PERFDATA_SECTION_RECORD {
WCHAR szServiceName[PDSR_SERVICE_NAME_LEN];
LONGLONG llElapsedTime;
DWORD dwCollectCount; // number of times Collect successfully called
DWORD dwOpenCount; // number of Loads & opens
DWORD dwCloseCount; // number of Unloads & closes
DWORD dwLockoutCount; // count of lock timeouts
DWORD dwErrorCount; // count of errors (other than timeouts)
DWORD dwLastBufferSize; // size of the last buffer returned
DWORD dwMaxBufferSize; // size of MAX buffer returned
DWORD dwMaxBufferRejected; // size of largest buffer returned as too small
BYTE Reserved[24]; // reserved to make structure 128 bytes
} PERFDATA_SECTION_RECORD, *PPERFDATA_SECTION_RECORD;
//
// Default wait times for perf procs
//
#define CLOSE_WAIT_TIME 5000L // wait time for query mutex (in ms)
#define QUERY_WAIT_TIME 2000L // wait time for query mutex (in ms)
#define OPEN_PROC_WAIT_TIME 10000L // default wait time for open proc to finish (in ms)
#define THROTTLE_PERFLIB(X) PerfpThrottleError( (DWORD)(X), NULL, &PerfpErrorLog )
#define THROTTLE_PERFDLL(X,Y) PerfpThrottleError((DWORD)(X), (Y)->hPerfKey, &(Y)->ErrorLog)
typedef struct _ERROR_LOG {
LIST_ENTRY Entry;
ULONG ErrorNumber;
ULONG ErrorCount;
LONG64 LastTime;
} ERROR_LOG, *PERROR_LOG;
typedef struct _EXT_OBJECT {
struct _EXT_OBJECT *pNext; // pointer to next item in list
HANDLE hMutex; // sync mutex for this function
OPENPROC OpenProc; // address of the open routine
LPSTR szOpenProcName; // open procedure name
LPWSTR szLinkageString; // param for open proc
COLLECTPROC CollectProc; // address of the collect routine
QUERYPROC QueryProc; // address of query proc
LPSTR szCollectProcName; // collect procedure name
DWORD dwCollectTimeout; // wait time in MS for collect proc
DWORD dwOpenTimeout; // wait time in MS for open proc
CLOSEPROC CloseProc; // address of the close routine
LPSTR szCloseProcName; // close procedure name
HANDLE hLibrary ; // handle returned by LoadLibraryW
LPWSTR szLibraryName; // full path of library
HKEY hPerfKey; // handle to performance sub key fo this service
DWORD dwNumObjects; // number of supported objects
DWORD dwObjList[MAX_PERF_OBJECTS_IN_QUERY_FUNCTION]; // address of array of supported objects
DWORD dwFlags; // flags
DWORD dwValidationLevel; // collect function validation/test level
LPWSTR szServiceName; // service name
LONGLONG llLastUsedTime; // FILETIME of last access
DLL_VALIDATION_DATA LibData; // validation data
FILETIME ftLastGoodDllFileDate; // creation date of last successfully accessed DLL
// Performance statistics
PPERFDATA_SECTION_RECORD pPerfSectionEntry; // pointer to entry in global section
LONGLONG llElapsedTime; // time spent in call
DWORD dwCollectCount; // number of times Collect successfully called
DWORD dwOpenCount; // number of Loads & opens
DWORD dwCloseCount; // number of Unloads & closes
DWORD dwLockoutCount; // count of lock timeouts
DWORD dwErrorCount; // count of errors (other than timeouts)
DWORD dwLastBufferSize; // size of the last buffer returned
DWORD dwMaxBufferSize; // size of MAX buffer returned
DWORD dwMaxBufferRejected; // size of largest buffer returned as too small
DWORD dwErrorLimit;
DWORD dwOpenFail; // number of open failures
ERROR_LOG ErrorLog;
DWORD ThreadId; // ThreadId of last failed caller
} EXT_OBJECT, *PEXT_OBJECT;
#define PERF_EOL_ITEM_FOUND ((DWORD)0x00000001)
typedef struct _COLLECT_THREAD_DATA {
DWORD dwQueryType;
LPWSTR lpValueName;
LPBYTE lpData;
LPDWORD lpcbData;
LPVOID *lppDataDefinition;
PEXT_OBJECT pCurrentExtObject;
LONG lReturnValue;
DWORD dwActionFlags;
} COLLECT_THREAD_DATA, * PCOLLECT_THREAD_DATA;
// convert mS to relative time
#define MakeTimeOutValue(ms) ((LONGLONG)((LONG)(ms) * -10000L))
extern DWORD dwThreadAndLibraryTimeout;
extern LONG lEventLogLevel;
extern HANDLE hEventLog;
extern LPVOID lpPerflibSectionAddr;
extern DWORD NumExtensibleObjects;
extern LONG lExtCounterTestLevel;
extern PEXT_OBJECT ExtensibleObjects;
extern HKEY ghKeyPerflib;
extern HANDLE hCollectThread;
extern DWORD dwCollectionFlags;
extern DWORD ComputerNameLength;
extern LPWSTR pComputerName;
extern LONG lPerflibConfigFlags;
extern HANDLE hGlobalDataMutex;
extern HANDLE hExtObjListIsNotInUse;
extern DWORD dwExtObjListRefCount;
extern DWORD dwErrorCount;
//
// Inline functions used by all
//
__inline
LONGLONG
GetTimeAsLongLong ()
/*++
Returns time performance timer converted to ms.
-*/
{
LARGE_INTEGER liCount, liFreq;
LONGLONG llReturn;
if (NtQueryPerformanceCounter (&liCount, &liFreq) == STATUS_SUCCESS) {
llReturn = liCount.QuadPart * 1000 / liFreq.QuadPart;
} else {
llReturn = 0;
}
return llReturn;
}
//
// From utils.h
//
#define LAST_BASE_INDEX 1847
// query types
#define QUERY_GLOBAL 1
#define QUERY_ITEMS 2
#define QUERY_FOREIGN 3
#define QUERY_COSTLY 4
#define QUERY_COUNTER 5
#define QUERY_HELP 6
#define QUERY_ADDCOUNTER 7
#define QUERY_ADDHELP 8
// structure for passing to extensible counter open procedure wait thread
typedef struct _OPEN_PROC_WAIT_INFO {
struct _OPEN_PROC_WAIT_INFO *pNext;
LPWSTR szLibraryName;
LPWSTR szServiceName;
DWORD dwWaitTime;
DWORD dwEventMsg;
LPVOID pData;
} OPEN_PROC_WAIT_INFO, FAR * LPOPEN_PROC_WAIT_INFO;
#define PERFLIB_TIMING_THREAD_TIMEOUT 120000 // 2 min (in milliseconds)
// #define PERFLIB_TIMING_THREAD_TIMEOUT 30000 // 30 sec (for debugging)
extern const WCHAR GLOBAL_STRING[];
extern const WCHAR COSTLY_STRING[];
extern const DWORD VALUE_NAME_LENGTH;
extern const WCHAR DisablePerformanceCounters[];
//
// Registry settings/values supported by Perflib
//
extern const WCHAR DLLValue[];
extern const CHAR OpenValue[];
extern const CHAR CloseValue[];
extern const CHAR CollectValue[];
extern const CHAR QueryValue[];
extern const WCHAR ObjListValue[];
extern const WCHAR LinkageKey[];
extern const WCHAR ExportValue[];
extern const WCHAR PerflibKey[];
extern const WCHAR HKLMPerflibKey[];
extern const WCHAR CounterValue[];
extern const WCHAR HelpValue[];
extern const WCHAR PerfSubKey[];
extern const WCHAR ExtPath[];
extern const WCHAR OpenTimeout[];
extern const WCHAR CollectTimeout[];
extern const WCHAR EventLogLevel[];
extern const WCHAR ExtCounterTestLevel[];
extern const WCHAR OpenProcedureWaitTime[];
extern const WCHAR TotalInstanceName[];
extern const WCHAR LibraryUnloadTime[];
extern const WCHAR KeepResident[];
extern const WCHAR NULL_STRING[];
extern const WCHAR UseCollectionThread[];
extern const WCHAR cszLibraryValidationData[];
extern const WCHAR cszSuccessfulFileData[];
extern const WCHAR cszPerflibFlags[];
extern const WCHAR FirstCounter[];
extern const WCHAR LastCounter[];
extern const WCHAR FirstHelp[];
extern const WCHAR LastHelp[];
extern const WCHAR cszFailureCount[];
extern const WCHAR cszFailureLimit[];
//
// From perfsec.h
//
//
// Value to decide if process names should be collected from:
// the SystemProcessInfo structure (fastest)
// -- or --
// the process's image file (slower, but shows Unicode filenames)
//
#define PNCM_NOT_DEFINED ((LONG)-1)
#define PNCM_SYSTEM_INFO 0L
#define PNCM_MODULE_FILE 1L
//
// Value to decide if the SE_PROFILE_SYSTEM_NAME priv should be checked
//
#define CPSR_NOT_DEFINED ((LONG)-1)
#define CPSR_EVERYONE 0L
#define CPSR_CHECK_ENABLED 1L
#define CPSR_CHECK_PRIVS 1L
//
// Common functions
//
VOID
OpenExtensibleObjects(
);
DWORD
OpenExtObjectLibrary (
PEXT_OBJECT pObj
);
DWORD
CloseExtObjectLibrary (
PEXT_OBJECT pObj,
BOOL bCloseNow
);
LONG
QueryExtensibleData (
COLLECT_THREAD_DATA * pArgs
);
#ifdef _WIN64
DWORD
ExtpAlignBuffer(
PCHAR lpLastBuffer,
PCHAR *lpNextBuffer,
DWORD lpBytesLeft
);
#endif
//
// From perfname.c
//
NTSTATUS
PerfGetNames (
DWORD QueryType,
PUNICODE_STRING lpValueName,
LPBYTE lpData,
LPDWORD lpcbData,
LPDWORD lpcbLen,
LPWSTR lpLangId
);
VOID
PerfGetLangId(
WCHAR *FullLangId
);
VOID
PerfGetPrimaryLangId(
DWORD dwLangId,
WCHAR * PrimaryLangId
);
//
// From utils.c
//
NTSTATUS
GetPerflibKeyValue (
IN LPCWSTR szItem,
IN DWORD dwRegType,
IN DWORD dwMaxSize, // ... of pReturnBuffer in bytes
OUT LPVOID pReturnBuffer,
IN DWORD dwDefaultSize, // ... of pDefault in bytes
IN LPVOID pDefault,
IN OUT PHKEY pKey
);
BOOL
MatchString (
IN LPCWSTR lpValueArg,
IN LPCWSTR lpNameArg
);
DWORD
GetQueryType (
IN LPWSTR lpValue
);
DWORD
GetNextNumberFromList (
IN LPWSTR szStartChar,
IN LPWSTR *szNextChar
);
BOOL
IsNumberInUnicodeList (
IN DWORD dwNumber,
IN LPWSTR lpwszUnicodeList
);
BOOL
MonBuildPerfDataBlock(
PERF_DATA_BLOCK *pBuffer,
PVOID *pBufferNext,
DWORD NumObjectTypes,
DWORD DefaultObject
);
//
// Timer functions
//
HANDLE
StartPerflibFunctionTimer (
IN LPOPEN_PROC_WAIT_INFO pInfo
);
DWORD
KillPerflibFunctionTimer (
IN HANDLE hPerflibTimer
);
DWORD
DestroyPerflibFunctionTimer (
);
LONG
GetPerfDllFileInfo (
LPCWSTR szFileName,
PDLL_VALIDATION_DATA pDllData
);
#define PrivateRegQueryValueExW(a,b,c,d,e,f) \
PrivateRegQueryValueExT(a,(LPVOID)b,c,d,e,f,TRUE)
#define PrivateRegQueryValueExA(a,b,c,d,e,f) \
PrivateRegQueryValueExT(a,(LPVOID)b,c,d,e,f,FALSE)
DWORD
PerfpDosError(
IN NTSTATUS Status
);
#ifdef DBG
VOID
PerfpDebug(
ULONG DebugPrintLevel,
PCCHAR DebugMessage,
...
);
#define DebugPrint(x) PerfpDebug x
#else
#define DebugPrint(x)
#endif // DBG
DWORD
DisablePerfLibrary (
PEXT_OBJECT pObj,
DWORD dwValue
);
DWORD
DisableLibrary(
IN HKEY hPerfKey,
IN LPWSTR szServiceName,
IN DWORD dwValue
);
/*
DWORD
PerfCheckRegistry(
IN HKEY hPerfKey,
IN LPCWSTR szServiceName
);
*/
extern RTL_CRITICAL_SECTION PerfpCritSect;
extern ERROR_LOG PerfpErrorLog;
VOID
PerfpDeleteErrorLogs(
IN PERROR_LOG ErrorLog
);
ULONG
PerfpThrottleError(
IN DWORD ErrorNumber,
IN HKEY hKey,
IN PERROR_LOG ErrorLog
);
//
// From perfsec.c
//
BOOL
TestClientForPriv (
BOOL *pbThread,
LPTSTR szPrivName
);
BOOL
TestClientForAccess (
VOID
);
LONG
GetProcessNameColMeth (
VOID
);
LONG
GetPerfDataAccess (
VOID
);
#endif // _PERFLIB_H_