183 lines
5.7 KiB
C++
183 lines
5.7 KiB
C++
/*++
|
||
|
||
Copyright (C) 1998-1999 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
refreshr.h
|
||
|
||
Abstract:
|
||
|
||
<abstract>
|
||
|
||
--*/
|
||
|
||
#ifndef _REFRESHR_H_
|
||
#define _REFRESHR_H_
|
||
|
||
#include "ntperf.h"
|
||
#include "perfacc.h"
|
||
#include "utils.h"
|
||
|
||
//***************************************************************************
|
||
//
|
||
//***************************************************************************
|
||
|
||
struct CachedInst
|
||
{
|
||
LPWSTR m_pName; // Full Instance name
|
||
IWbemObjectAccess *m_pInst; // Pointer to WBEM object
|
||
LONG m_lId; // ID for this object
|
||
LPWSTR m_szParentName; // parsed parent name from full name
|
||
LPWSTR m_szInstanceName; // parsed instance name from full name
|
||
DWORD m_dwIndex; // index parsed from full instance name
|
||
|
||
CachedInst() { m_pName = 0;
|
||
m_pInst = 0;
|
||
m_lId = 0;
|
||
m_szParentName = 0;
|
||
m_szInstanceName = 0;
|
||
m_dwIndex = 0;
|
||
}
|
||
~CachedInst() { if (m_pInst) m_pInst->Release();
|
||
if (m_pName) delete (m_pName);
|
||
if (m_szParentName) delete (m_szParentName);
|
||
if (m_szInstanceName) delete (m_szInstanceName);
|
||
}
|
||
};
|
||
|
||
typedef CachedInst *PCachedInst;
|
||
|
||
//***************************************************************************
|
||
//
|
||
// RefresherCacheEl
|
||
//
|
||
// Each CNt5Refresher has a cache of <RefresherCacheEl> elements. There
|
||
// is one RefresherCacheEl struct for each class of object in the refresher.
|
||
//
|
||
// As each object is added to the refresher, we locate the corresponding
|
||
// <RefresherCacheEl> for the class of the object. We then add the
|
||
// instance into the instance cache of the <RefresherCacheEl>. If there
|
||
// is no RefresherCacheEl, we create one.
|
||
//
|
||
// For singleton instances, we simply special case by having a dedicated
|
||
// pointer.
|
||
//
|
||
// For multi-instance counters, we use a binary search lookup.
|
||
//
|
||
//***************************************************************************
|
||
// ok
|
||
struct RefresherCacheEl
|
||
{
|
||
DWORD m_dwPerfObjIx; // Perf object index for Class Def
|
||
CClassMapInfo *m_pClassMap; // WBEM Class def stuff
|
||
IWbemObjectAccess *m_pSingleton; // Optional Singleton instance
|
||
LONG m_lSingletonId;
|
||
CFlexArray m_aInstances; // Instance list for non-singleton
|
||
// of CachedInst pointers.
|
||
CFlexArray m_aEnumInstances; // array of IWbemObjectAccess pointers
|
||
LONG *m_plIds; // array of ID's
|
||
LONG m_lEnumArraySize; // size of enum item array in elements
|
||
IWbemHiPerfEnum *m_pHiPerfEnum; // interface for hi perf enumerator
|
||
LONG m_lEnumId; // id of the enumerator
|
||
|
||
RefresherCacheEl();
|
||
~RefresherCacheEl();
|
||
|
||
IWbemObjectAccess *FindInst(LPWSTR pszName); // Already scoped by class
|
||
BOOL RemoveInst(LONG lId);
|
||
BOOL InsertInst(IWbemObjectAccess **pp, LONG lNewId);
|
||
// support for enumerator objects
|
||
BOOL CreateEnum(IWbemHiPerfEnum *p, LONG lNewId);
|
||
BOOL DeleteEnum(LONG lId);
|
||
};
|
||
|
||
typedef RefresherCacheEl *PRefresherCacheEl;
|
||
|
||
|
||
// used by flags arg of AddObject Method
|
||
#define REFRESHER_ADD_OBJECT_ADD_ITEM ((DWORD)0)
|
||
#define REFRESHER_ADD_OBJECT_ADD_ENUM ((DWORD)0x00000001)
|
||
|
||
class CNt5Refresher : public IWbemRefresher
|
||
{
|
||
HANDLE m_hAccessMutex;
|
||
LONG m_lRef;
|
||
LONG m_lProbableId;
|
||
CFlexArray m_aCache;
|
||
CNt5PerfProvider *m_pPerfProvider; // back pointer to provider if used
|
||
|
||
DWORD m_dwGetGetNextClassIndex;
|
||
|
||
CNt5PerfProvider::enumCLSID m_ClsidType;
|
||
|
||
friend PerfHelper;
|
||
public:
|
||
CNt5Refresher(CNt5PerfProvider *pPerfProvider = NULL);
|
||
~CNt5Refresher();
|
||
|
||
CPerfObjectAccess m_PerfObj;
|
||
|
||
// Interface members.
|
||
// ==================
|
||
|
||
ULONG STDMETHODCALLTYPE AddRef();
|
||
ULONG STDMETHODCALLTYPE Release();
|
||
STDMETHODIMP QueryInterface(REFIID riid, void** ppv);
|
||
|
||
// Primary WBEM method for updating.
|
||
// =================================
|
||
virtual HRESULT STDMETHODCALLTYPE Refresh(/* [in] */ long lFlags);
|
||
|
||
// Private members used by NTPERF.CPP
|
||
// ==================================
|
||
|
||
BOOL AddObject(
|
||
IN IWbemObjectAccess **ppObj, // Object to add
|
||
IN CClassMapInfo *pClsMap, // Class of object
|
||
OUT LONG *plId // The id of the object added
|
||
);
|
||
|
||
BOOL RemoveObject(LONG lId);
|
||
|
||
BOOL AddEnum (
|
||
IN IWbemHiPerfEnum *pEnum, // enum interface pointer
|
||
IN CClassMapInfo *pClsMap, // Class of object
|
||
OUT LONG *plId // id for new enum
|
||
);
|
||
|
||
CClassMapInfo * FindClassMap(
|
||
DWORD dwObjectTitleIx
|
||
);
|
||
|
||
BOOL FindSingletonInst(
|
||
IN DWORD dwPerfObjIx,
|
||
OUT IWbemObjectAccess **pInst,
|
||
OUT CClassMapInfo **pClsMap
|
||
);
|
||
|
||
BOOL FindInst(
|
||
IN DWORD dwObjectClassIx,
|
||
IN LPWSTR pszInstName,
|
||
OUT IWbemObjectAccess **pInst,
|
||
OUT CClassMapInfo **pClsMap
|
||
);
|
||
|
||
BOOL GetObjectIds(DWORD *pdwNumIds, DWORD **pdwIdList);
|
||
// Use operator delete on returned <pdwIdList>
|
||
|
||
LONG FindUnusedId();
|
||
// Returns -1 on error or an unused id.
|
||
|
||
PRefresherCacheEl GetCacheEl(CClassMapInfo *pClsMap);
|
||
|
||
|
||
BOOL AddNewCacheEl(
|
||
IN CClassMapInfo *pClsMap,
|
||
PRefresherCacheEl *pOutput
|
||
);
|
||
|
||
};
|
||
|
||
#endif
|