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.
 
 
 
 
 
 

462 lines
16 KiB

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
CFGMGR.H
Abstract:
This file implements the WinMgmt configuration manager class.
See cfgmgr.h for documentation.
Classes implemented:
ConfigMgr configuration manager
History:
09-Jul-96 raymcc Created.
3/10/97 levn Fully documented (ha ha)
--*/
#ifndef _CFGMGR_H_
#define _CFGMGR_H_
class CWbemObject;
class CDynasty;
class CWbemQueue;
class CAsyncServiceQueue;
struct IWbemEventSubsystem_m4;
#define READONLY
#include <wmiutils.h>
#include <ql.h>
#include <reposit.h>
#include "coreq.h"
//******************************************************************************
//******************************************************************************
//
// class ConfigMgr
//
// This completely static class represents global configuration data for WinMgmt.
// The rest of WinMgmt uses this class instead of global data itself.
//
//******************************************************************************
//
// static GetProviderCache
//
// Returns the pointer to the global provider cache object, as defined and
// described in prvcache.h.
//
// Returns:
//
// CProviderCache*: internal pointer not to be modified or deleted!
//
//******************************************************************************
//
// GetDbPtr
//
// Returns the pointer to the WinMgmt static database object. The static database
// is defined and described in objdb.h.
//
// Returns:
//
// CObjectDatabase*: internal pointer not to be modified or deleted!
//
//******************************************************************************
//
// GetUnRefedSvcQueue
//
// Returns the pointer to the global queue handling requests to providers.
// Whenever WinMgmt needs to communicate to a provider, a request us added to
// this queue. This queue is defined and described in provsvcq.h.
//
// Returns:
//
// CAsyncSvcQueue*: internal pointer not to be modified or deleted!
//
//******************************************************************************
//
// GetAsyncSvcQueue
//
// Returns the pointer to the global queue handling asynchrnous requests to
// WinMgmt. Whenever a client makes a call into IWbemServices, WinMgmt adds a request
// to this queue. This queue is defined and described in svcq.h
//
// Returns:
//
// CAsyncServiceQueue*: internal pointer not to be modified or deleted!
//
//******************************************************************************
//
// GetMachineName
//
// Returns the name of the computer we are running on as a UNICODE string,
// even on Win95 where machine names are ASCII.
//
// Returns:
//
// LPWSTR: machine name. internal poitner not to be deleted!
//
//******************************************************************************
//
// GetWorkingDir
//
// Returns the working directory of WinMgmt, that is, where the database is
// located.
//
// Returns:
//
// LPWSTR: internal pointer not to be deleted!
//
//******************************************************************************
//
// static InitSystem
//
// System initialization function invoked from wbemcore.dll entry point.
// Performs the following tasks:
//
// 1) Looks for other copies of WinMgmt already running and stops with a fatal
// error message if found.
// 2) Reads the registry for initialization information.
// 3) Creates the database object (this will in turn create the database file
// if not found. See CObjectDatabase in objdb.h for details).
// 4) Writes appropriate information (like database location) into the
// registry.
//
// NOTE: since this function is invoked from inside the DLL entry point, there
// are many restrictions on what it can do. In particular, it cannot create
// threads and expect them to run. Thus, due to the multi-threaded nature of
// WinMgmt, this function may not attempt to perform any WinMgmt operations at the
// COM layer or the system will hang!
//
//******************************************************************************
//
// static Shutdown
//
// System Shutdown function invoked from wbemcore.dll entry point on PROCESS_
// DETACH. Deletes the CObjectDatabase instance (see objdb.h).
//
//******************************************************************************
//
// static LoggingEnabled
//
// Checks if logging has been enabled. If it is, Trace calls output data to
// a log file. If not, Trace calls are noops.
//
// Returns:
//
// BOOL: TRUE iff logging is enabled.
//
//******************************************************************************
//
// static GetEssSink
//
// Retrieves the pointer to the Event Subsystem. Event subsystem pointer will
// only be available if EnableEvents registry value is set to TRUE. Otherwise,
// this function returns NULL. Note, that the Event Subsystem is loaded only
// by ConfigMgr::SetReady function which is invoked the first time
// DllGetClassObject is called in wbemcore.dll. Thus, ESS is not available
// during WinMgmt initialization (InitSystem).
//
// Returns:
//
// IWbemObjectSink*: the pointer to the ESS. Not to be released or
// deleted by the caller! May be NULL, see above.
//
//******************************************************************************
//
// static SetReady
//
// This function performs initialization, once WinMgmt is ready to go.
// It is invoked the first type DllGetClassObject is called in wbemcore.dll.
// By now, wbemcorwbemcore.dll has exited its entry point and so it is safe to load
// additional DLLs and perform multi-threaded operations (unlike InitSystem).
//
//******************************************************************************
//
// static SetIdentificationObject
//
// This function (invoked from the SetReady function) stores proper information
// in the root and root\defualt __WinMgmtIdentification objects. Namely, it
// creates instances of this class in both namespace if not already there and
// sets the current build of WinMgmt in the appropriate fields.
//
// Parameters:
//
// IN WCHAR* pwcNamespace The namespace to initialize.
//
//******************************************************************************
//
// static GetDllVersion
//
// Retrives a string from a given DLLs resource table. If the string is longer
// that the buffer, it is trucated.
//
// Parameters:
//
// IN char * pDLLName The filename of the DLL. The DLL must be
// located in WinMgmt working directory (See
// GetWorkingDir) and a relative path is
// expected here.
// IN char * pResStringName The resource string to query, e.g.,
// "ProductVersion".
// OUT WCHAR * pRes Destination buffer.
// IN DWORD dwResSize Size of the destination buffer.
//
// Returns:
//
// BOOL: TRUE on success, FALSE if DLL or string was not found.
//
//******************************************************************************
//
// static RaiseClassDeletionEvent
//
// Temporarary: raises a class deletion event. This function is used in the
// object database, since events need to be raised for every deleted class.
//
// Parameters:
//
// LPWSTR wszNamespace The name of the namespace where the class
// is being deleted.
// LPWSTR wszClass The name of the class being deleted.
// IWbemClassObject* pClass The definition of the class being deleted.
//
// Returns:
//
// HRESULT: Whatever error code the ESS returns. Only WBEM_S_NO_ERROR is
// documented.
//
//******************************************************************************
//
// static LoadResourceStr
//
// Loads a string resource from the string table in WBEMCORE.RC.
//
// Parameters:
// DWORD dwId The string id.
//
// Return value:
// A dynamically allocated LPWSTR. This string is loaded in DBCS form
// for compatibility with Win98, but is returned in UNICODE form on both
// Win98 and Windows NT. Deallocate with operator delete.
//
//******************************************************************************
//
// static GetPersistentCfgValue
//
// retrieves a persistent value from the $WINMGMT.cfg file (or from the memory
// cache of it if already loaded).
//
// Parameters:
// DWORD dwOffset Persistent value index
//
// Return Values
// DWORD &dwValue Returned value
// BOOL returns TRUE if successful, FALSE otherwise.
//******************************************************************************
//
// static SetPersistentCfgValue
//
// sets a persistent value in the $WinMgmt.cfg file (and in the memory cache).
//
// Parameters:
// DWORD dwOffset Persistent value index
//
// Return Values
// DWORD &dwValue Returned value
// BOOL returns TRUE if successful, FALSE otherwise.
//******************************************************************************
//
// static SetADAPStatus
//
// This function (invoked from the SetReady function) stores an __ADAPStatus
// instance in the root\default namespace on W2k boxes. Namely, it creates
// the class if it doesn't exist as well as a singleton instance if it is
// not there.
//
// Parameters:
//
// IN WCHAR* pwcNamespace The namespace to initialize.
//
//******************************************************************************
class CAsyncReq;
class ConfigMgr
{
static CStaticCritSec g_csEss;
public:
static READONLY CWbemQueue* GetUnRefedSvcQueue();
static READONLY CAsyncServiceQueue* GetAsyncSvcQueue();
static HRESULT EnqueueRequest(CAsyncReq * pRequest);
static HRESULT EnqueueRequestAndWait(CAsyncReq * pRequest);
static READONLY LPWSTR GetMachineName();
static LPTSTR GetWorkingDir();
static DWORD InitSystem();
static DWORD Shutdown(BOOL bProcessShutdown, BOOL bIsSystemShutDown);
static BOOL ShutdownInProgress();
static IWbemEventSubsystem_m4* GetEssSink();
static HRESULT SetReady();
static HRESULT PrepareForClients(long lFlags);
static void FatalInitializationError(HRESULT hRes);
static HRESULT WaitUntilClientReady();
static HRESULT SetIdentificationObject(IWmiDbHandle *pNs, IWmiDbSession *pSess);
static HRESULT SetAdapStatusObject(IWmiDbHandle *pNs, IWmiDbSession *pSess);
//static void ProcessIdentificationObject(IWmiDbHandle *pNs, IWbemClassObject *pInst);
static BOOL GetDllVersion(TCHAR * pDLLName, TCHAR * pResStringName,
WCHAR * pRes, DWORD dwResSize);
static IWbemContext* GetNewContext();
static LPTSTR GetDbDir();
static class CEventLog* GetEventLog();
static DWORD GetMaxMemoryQuota();
static DWORD GetUncheckedTaskCount();
static DWORD GetMaxTaskCount();
static DWORD GetMaxWaitBeforeDenial();
static DWORD GetNewTaskResistance();
static BOOL GetEnableQueryArbitration( void );
static BOOL GetMergerThrottlingEnabled( void );
static BOOL GetMergerThresholdValues( DWORD* pdwThrottle, DWORD* pdwRelease, DWORD* pdwBatching );
static BOOL GetArbitratorValues( DWORD* pdwEnabled, DWORD* pdwSystemHigh, DWORD* pdwMaxSleep,
double* pdHighThreshold1, long* plMultiplier1, double* pdHighThreshold2,
long* plMultiplier2, double* pdHighThreshold3, long* plMultiplier3 );
static ULONG GetMinimumMemoryRequirements ( ) ;
static BOOL GetEnableArbitratorDiagnosticThread( void );
static DWORD GetProviderDeliveryTimeout( void );
static HRESULT GetDefaultRepDriverClsId(CLSID &);
static IWbemPath *GetNewPath(); // Returns NULL on error, requires Release() if successful.
static BOOL GetPersistentCfgValue(DWORD dwOffset, DWORD &dwValue);
static BOOL SetPersistentCfgValue(DWORD dwOffset, DWORD dwValue);
//Retrieve a list of MOFs which need to be loaded when we have
//have an empty database. User needs to "delete []" the
//returned string. String is in a REG_MULTI_SZ format.
//dwSize is the length of the buffer returned.
static TCHAR* GetAutoRecoverMofs(DWORD &dwSize);
static BOOL GetAutoRecoverDateTimeStamp(LARGE_INTEGER &liDateTimeStamp);
static void ReadMaxQueueSize();
static DWORD GetMaxQueueSize();
static void SetDefaultMofLoadingNeeded();
static HRESULT LoadDefaultMofs();
static void GetSystemLimits();
};
//
//
// The Hook Class for trapping the creation of Win32_PerRawData
//
///////////////////////////////////////////////////////////
extern _IWmiCoreWriteHook * g_pRAHook; // = NULL;
class CRAHooks : public _IWmiCoreWriteHook
{
public:
CRAHooks(_IWmiCoreServices *pSvc);
~CRAHooks();
_IWmiCoreServices * GetSvc(){ return m_pSvc; };
STDMETHOD(QueryInterface)(REFIID riid, void ** ppv);
ULONG STDMETHODCALLTYPE AddRef();
ULONG STDMETHODCALLTYPE Release();
STDMETHOD(PrePut)(long lFlags, long lUserFlags, IWbemContext* pContext,
IWbemPath* pPath, LPCWSTR wszNamespace,
LPCWSTR wszClass, _IWmiObject* pCopy);
STDMETHOD(PostPut)(long lFlags, HRESULT hApiResult,
IWbemContext* pContext,
IWbemPath* pPath, LPCWSTR wszNamespace,
LPCWSTR wszClass, _IWmiObject* pNew,
_IWmiObject* pOld);
STDMETHOD(PreDelete)(long lFlags, long lUserFlags,
IWbemContext* pContext,
IWbemPath* pPath, LPCWSTR wszNamespace,
LPCWSTR wszClass);
STDMETHOD(PostDelete)(long lFlags, HRESULT hApiResult,
IWbemContext* pContext,
IWbemPath* pPath, LPCWSTR wszNamespace,
LPCWSTR wszClass, _IWmiObject* pOld);
private:
LONG m_cRef;
_IWmiCoreServices * m_pSvc;
};
//
//
// Data for the interception
//
#define GUARDED_NAMESPACE L"root\\cimv2"
#define GUARDED_CLASS L"win32_perfrawdata"
#define GUARDED_HIPERF L"hiperf"
#define GUARDED_PERFCTR L"genericperfctr"
#define WMISVC_DLL L"wmisvc.dll"
#define FUNCTION_DREDGERA "DredgeRA"
class ExceptionCounter
{
private:
static LONG s_Count;
public:
ExceptionCounter(){ InterlockedIncrement(&s_Count); };
};
HRESULT InitSubsystems();
HRESULT InitESS(_IWmiCoreServices *pSvc, BOOL bAutoRecoverd);
HRESULT ShutdownESS();
HRESULT ShutdownSubsystems(BOOL bIsSystemShutDown);
HRESULT SecureKey(WCHAR * pKeyName,WCHAR * pSDDLString);
#define ARB_DEFAULT_SYSTEM_MINIMUM 0x1E8480 // minimum is 2mb
// Defaults for arbitrator
#define ARB_DEFAULT_SYSTEM_HIGH 0x4c4b400 // System limits [80megs]
#define ARB_DEFAULT_SYSTEM_HIGH_FACTOR 50 // System limits [80megs] factor
#define ARB_DEFAULT_MAX_SLEEP_TIME 300000 // Default max sleep time for each task
#define ARB_DEFAULT_HIGH_THRESHOLD1 90 // High threshold 1
#define ARB_DEFAULT_HIGH_THRESHOLD1MULT 2 // High threshold 1 multiplier
#define ARB_DEFAULT_HIGH_THRESHOLD2 95 // High threshold 1
#define ARB_DEFAULT_HIGH_THRESHOLD2MULT 3 // High threshold 1 multiplier
#define ARB_DEFAULT_HIGH_THRESHOLD3 98 // High threshold 1
#define ARB_DEFAULT_HIGH_THRESHOLD3MULT 4 // High threshold 1 multiplier
// system limits reg keys
#define MAX_IDENTIFIER_WBEM L"IdentifierLimit"
#define MAX_QUERY_WBEM L"QueryLimit"
#define MAX_PATH_WBEM L"PathLimit"
///////////// system limits adjustment
// an instance of __namespace is put with a __RELAPATH __namespace.name="X"
#define NAMESPACE_ADJUSTMENT (19) // lstrlen of __namespace.name=""
// a class must allow an object to be put
// if it is a singleton, it is '=@' othewise '.P="X"' , the maximum is 6
#define CLASSNAME_ADJUSTMENT (6)
#define MINIMUM_MAX_QUERY 64
#define MINIMUM_MAX_IDENTIFIER 64
#endif