mirror of https://github.com/tongzx/nt5src
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.
380 lines
9.1 KiB
380 lines
9.1 KiB
/*++
|
|
|
|
Copyright (C) 1999-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ADAPCLS.H
|
|
|
|
Abstract:
|
|
|
|
History:
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef __ADAPCLS_H__
|
|
#define __ADAPCLS_H__
|
|
|
|
#include <windows.h>
|
|
#include <wbemcomn.h>
|
|
#include <wbemcli.h>
|
|
#include <wbemint.h>
|
|
#include <winperf.h>
|
|
#include <wstlallc.h>
|
|
#include "adapelem.h"
|
|
#include "perfndb.h"
|
|
|
|
#include <comdef.h>
|
|
#include <map>
|
|
|
|
// Global constants
|
|
// ================
|
|
|
|
#define ADAP_DEFAULT_OBJECT 238L
|
|
#define ADAP_DEFAULT_NDB L"009"
|
|
#define ADAP_DEFAULT_LANGID 0x0409L
|
|
#define ADAP_ROOT_NAMESPACE L"\\\\.\\root\\cimv2"
|
|
|
|
#define ADAP_PERF_CIM_STAT_INFO L"CIM_StatisticalInformation"
|
|
#define ADAP_PERF_BASE_CLASS L"Win32_Perf"
|
|
#define ADAP_PERF_RAW_BASE_CLASS L"Win32_PerfRawData"
|
|
#define ADAP_PERF_COOKED_BASE_CLASS L"Win32_PerfFormattedData"
|
|
|
|
enum ClassTypes
|
|
{
|
|
WMI_ADAP_RAW_CLASS,
|
|
WMI_ADAP_COOKED_CLASS,
|
|
WMI_ADAP_NUM_TYPES
|
|
};
|
|
|
|
// Class list element states
|
|
// =========================
|
|
|
|
#define ADAP_OBJECT_IS_REGISTERED 0x0001L // Object is in WMI
|
|
#define ADAP_OBJECT_IS_DELETED 0x0002L // Object is marked for deletion
|
|
#define ADAP_OBJECT_IS_INACTIVE 0x0004L // Perflib did not respond
|
|
#define ADAP_OBJECT_IS_NOT_IN_PERFLIB 0x0008L // Object is from an unloaded perflib
|
|
#define ADAP_OBJECT_IS_TO_BE_CLEARED 0x0010L // Need to clear registry
|
|
|
|
|
|
class CLocaleDefn : public CAdapElement
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Contains all of the locale information
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
{
|
|
protected:
|
|
|
|
// Localization values
|
|
// ===================
|
|
|
|
WString m_wstrLangId; // "009"
|
|
WString m_wstrLocaleId; // "0x0409"
|
|
WString m_wstrSubNameSpace; // "MS_409"
|
|
LANGID m_LangId; // 0x0409
|
|
LCID m_LocaleId; // 0x0409
|
|
|
|
// WMI Locale data members
|
|
// =======================
|
|
|
|
IWbemServices* m_pNamespace;
|
|
IWbemClassObject* m_apBaseClass[WMI_ADAP_NUM_TYPES];
|
|
|
|
|
|
// Localized Names' Database
|
|
// =========================
|
|
|
|
CPerfNameDb* m_pNameDb;
|
|
|
|
// Operational members
|
|
// ===================
|
|
|
|
BOOL m_bOK;
|
|
HRESULT m_hRes;
|
|
|
|
// Protected Methods
|
|
// =================
|
|
|
|
HRESULT Initialize();
|
|
HRESULT InitializeWMI();
|
|
HRESULT InitializeLID();
|
|
|
|
public:
|
|
CLocaleDefn( WCHAR* pwcsLangId,
|
|
HKEY hKey );
|
|
virtual ~CLocaleDefn();
|
|
|
|
HRESULT GetLID( int* pnLID );
|
|
HRESULT GetNamespaceName( WString & wstrNamespaceName );
|
|
HRESULT GetNamespace( IWbemServices** ppNamespace );
|
|
HRESULT GetNameDb( CPerfNameDb** ppNameDb );
|
|
HRESULT GetBaseClass( DWORD dwType, IWbemClassObject** pObject );
|
|
HRESULT GetCookedBaseClass( IWbemClassObject** pObject );
|
|
|
|
BOOL IsOK(){ return m_bOK; }
|
|
HRESULT GetHRESULT(){ return m_hRes; };
|
|
};
|
|
|
|
|
|
class CLocaleCache : public CAdapElement
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// The cache used to manage locale definitions
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
{
|
|
protected:
|
|
|
|
// The enumeration index
|
|
// =====================
|
|
int m_nEnumIndex;
|
|
|
|
// The array of locale definition structures
|
|
// =========================================
|
|
CRefedPointerArray<CLocaleDefn> m_apLocaleDefn;
|
|
|
|
public:
|
|
CLocaleCache( );
|
|
virtual ~CLocaleCache();
|
|
|
|
HRESULT Initialize();
|
|
HRESULT Reset();
|
|
|
|
HRESULT GetDefaultDefn( CLocaleDefn** ppDefn );
|
|
|
|
HRESULT BeginEnum();
|
|
HRESULT Next( CLocaleDefn** ppLocaleDefn );
|
|
HRESULT EndEnum();
|
|
};
|
|
|
|
// forward
|
|
class CKnownSvcs;
|
|
|
|
class CClassElem : public CAdapElement
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CClassElem
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
{
|
|
protected:
|
|
|
|
// Class properties
|
|
// ================
|
|
|
|
WString m_wstrClassName; // The class name
|
|
|
|
DWORD m_dwIndex; // The class perf index
|
|
WString m_wstrServiceName; // The service name for which the class is a member
|
|
BOOL m_bCostly; // The performance type
|
|
BOOL m_bReportEventCalled; // did we log something about this in the past
|
|
|
|
// WMI related
|
|
// ===========
|
|
|
|
IWbemClassObject* m_pDefaultObject; // The WMI class definition
|
|
|
|
// Operational members
|
|
// ===================
|
|
|
|
CLocaleCache* m_pLocaleCache; // Pointer to the list of locales
|
|
|
|
DWORD m_dwStatus; // The state of the element
|
|
BOOL m_bOk; // The initialization state of this object
|
|
CKnownSvcs * m_pKnownSvcs;
|
|
|
|
// Methods
|
|
// =======
|
|
|
|
HRESULT VerifyLocales();
|
|
|
|
HRESULT InitializeMembers();
|
|
BOOL IsPerfLibUnloaded();
|
|
|
|
HRESULT Remove(BOOL CleanRegistry);
|
|
HRESULT Insert();
|
|
HRESULT InsertLocale( CLocaleDefn* pLocaleDefn );
|
|
HRESULT CompareLocale( CLocaleDefn* pLocaleDefn, IWbemClassObject* pObj );
|
|
|
|
public:
|
|
CClassElem(IWbemClassObject* pObj,
|
|
CLocaleCache* pLocaleCache,
|
|
CKnownSvcs * pKnownSvcs = NULL );
|
|
|
|
CClassElem(PERF_OBJECT_TYPE* pPerfObj,
|
|
DWORD dwType, BOOL bCostly,
|
|
WString wstrServiceName,
|
|
CLocaleCache* pLocaleCache,
|
|
CKnownSvcs * pKnownSvcs = NULL );
|
|
|
|
virtual ~CClassElem();
|
|
|
|
HRESULT UpdateObj( CClassElem* pEl );
|
|
|
|
HRESULT Commit();
|
|
|
|
HRESULT GetClassName( WString& wstr );
|
|
HRESULT GetClassName( BSTR* pbStr );
|
|
HRESULT GetObject( IWbemClassObject** ppObj );
|
|
HRESULT GetServiceName( WString & wstrServiceName );
|
|
|
|
BOOL SameName( CClassElem* pEl );
|
|
BOOL SameObject( CClassElem* pEl );
|
|
|
|
DWORD GetStatus(void){ return m_dwStatus; };
|
|
HRESULT SetStatus( DWORD dwStatus );
|
|
HRESULT ClearStatus( DWORD dwStatus );
|
|
BOOL CheckStatus( DWORD dwStatus );
|
|
|
|
BOOL IsOk( void ) { return m_bOk; }
|
|
VOID SetKnownSvcs(CKnownSvcs * pKnownSvcs);
|
|
};
|
|
|
|
class CClassList : public CAdapElement
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// The base class for caches which manage either the Master class list
|
|
// currently in WMI, or the classes found within a given perflib. The
|
|
// classes are managed as class information elements.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
{
|
|
protected:
|
|
|
|
// The array of class elements
|
|
// ===========================
|
|
|
|
CRefedPointerArray<CClassElem> m_array;
|
|
|
|
// Pointer to the list of locales
|
|
// ==============================
|
|
|
|
CLocaleCache* m_pLocaleCache;
|
|
|
|
// Operational members
|
|
// ===================
|
|
|
|
int m_nEnumIndex;
|
|
BOOL m_fOK;
|
|
|
|
HRESULT AddElement( CClassElem* pEl );
|
|
HRESULT RemoveAt( int nIndex );
|
|
|
|
long GetSize( void ) { return m_array.GetSize(); }
|
|
|
|
public:
|
|
CClassList( CLocaleCache* pLocaleCache );
|
|
virtual ~CClassList();
|
|
|
|
BOOL IsOK(){ return m_fOK; }
|
|
|
|
HRESULT BeginEnum();
|
|
HRESULT Next( CClassElem** ppEl );
|
|
HRESULT EndEnum();
|
|
};
|
|
|
|
|
|
class CPerfClassList : public CClassList
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// The class cache for classes found in performance libraries
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
{
|
|
protected:
|
|
|
|
// The service name for which this list belongs
|
|
// ============================================
|
|
|
|
WString m_wstrServiceName;
|
|
|
|
HRESULT AddElement( CClassElem *pEl );
|
|
|
|
public:
|
|
CPerfClassList( CLocaleCache* pLocaleCache, WCHAR* pwcsServiceName );
|
|
HRESULT AddPerfObject( PERF_OBJECT_TYPE* pObj, DWORD dwType, BOOL bCostly );
|
|
};
|
|
|
|
|
|
class ServiceRec
|
|
{
|
|
friend class CKnownSvcs;
|
|
|
|
private:
|
|
bool m_IsServiceThere;
|
|
bool m_bReportEventCalled;
|
|
public:
|
|
ServiceRec(bool IsThere = false,bool EventCalled = false):m_IsServiceThere(IsThere),m_bReportEventCalled(false){};
|
|
bool IsThere(){ return m_IsServiceThere; };
|
|
bool IsELCalled(){ return m_bReportEventCalled; };
|
|
void SetELCalled(){ m_bReportEventCalled = true;};
|
|
};
|
|
|
|
typedef wbem_allocator<bool> BoolAlloc;
|
|
|
|
class WCmp{
|
|
public:
|
|
bool operator()(WString pFirst,WString pSec) const;
|
|
};
|
|
|
|
typedef std::map<WString,ServiceRec,WCmp, BoolAlloc > MapSvc;
|
|
|
|
class CKnownSvcs
|
|
{
|
|
public:
|
|
CKnownSvcs();
|
|
~CKnownSvcs();
|
|
DWORD Load();
|
|
DWORD Save();
|
|
DWORD Add(WCHAR * pService);
|
|
DWORD Remove(WCHAR * pService);
|
|
DWORD Get(WCHAR * pService,ServiceRec ** ppServiceRec);
|
|
|
|
LONG AddRef(){
|
|
return InterlockedIncrement(&m_cRef);
|
|
};
|
|
LONG Release(){
|
|
LONG lRet = InterlockedDecrement(&m_cRef);
|
|
if (0 == lRet){
|
|
delete this;
|
|
}
|
|
return lRet;
|
|
}
|
|
private:
|
|
LONG m_cRef;
|
|
MapSvc m_SetServices;
|
|
};
|
|
|
|
|
|
class CMasterClassList : public CClassList
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// The class cache for classes found in the WMI repository
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
{
|
|
protected:
|
|
|
|
CKnownSvcs * m_pKnownSvcs;
|
|
|
|
HRESULT AddElement( CClassElem *pEl, BOOL bDelta );
|
|
HRESULT AddClassObject( IWbemClassObject* pObj, BOOL bSourceWMI, BOOL bDelta );
|
|
|
|
public:
|
|
CMasterClassList( CLocaleCache* pLocaleCache, CKnownSvcs * pCKnownSvcs );
|
|
~CMasterClassList();
|
|
|
|
HRESULT BuildList( WCHAR* wszBaseClass, BOOL bDelta, BOOL bThrottle );
|
|
HRESULT Merge( CClassList* pClassList, BOOL bDelta );
|
|
HRESULT Commit(BOOL bThrottle);
|
|
HRESULT ForceStatus(WCHAR* pServiceName,BOOL bSet,DWORD dwStatus);
|
|
|
|
#ifdef _DUMP_LIST
|
|
HRESULT Dump();
|
|
#endif
|
|
|
|
};
|
|
|
|
#endif
|