windows-nt/Source/XPSP1/NT/public/sdk/inc/wbemglue.h
2020-09-26 16:20:57 +08:00

528 lines
19 KiB
C++

//***************************************************************************
//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
// WBEMGLUE.H
//
// Purpose: Implementation of WBEM Glue classes
//
//***************************************************************************
#if _MSC_VER > 1000
#pragma once
#endif
#ifndef _WbemGlue_H_Included
#define _WbemGlue_H_Included
#undef PURE
#define PURE {return (ULONG)E_NOTIMPL;}
typedef LPVOID *PPVOID;
#include <wbemidl.h>
#include <map>
#include <set>
#include <provider.h>
#define DEFAULT_NAMESPACE L"Root\\CimV2"
typedef std::map<CHString, LPVOID> STRING2LPVOID;
typedef std::map<LPCVOID, PLONG> PTR2PLONG;
typedef std::set<LPVOID> PROVIDERPTRS;
class CWbemGlueFactory;
class CWbemGlueImpersonation;
class POLARITY CWbemProviderGlue : public IWbemServices, public IWbemProviderInit
{
friend class CWbemGlueImpersonation;
public:
// Public Static functions
// these are for use by implementors of Framework based providers
static HRESULT WINAPI GetAllInstances( LPCWSTR pszClassName,
TRefPointerCollection<CInstance> *pList,
LPCWSTR pszNamespace,
MethodContext *pMethodContext );
static HRESULT WINAPI GetAllInstancesAsynch( LPCWSTR pszClassName,
Provider *pRequester,
LPProviderInstanceCallback pCallback,
LPCWSTR pszNamespace,
MethodContext *pMethodContext,
void *pUserData );
static HRESULT WINAPI GetAllDerivedInstancesAsynch( LPCWSTR pszBaseClassName,
Provider *pRequester,
LPProviderInstanceCallback pCallback,
LPCWSTR pszNamespace,
MethodContext *pMethodContext,
void *pUserData );
static HRESULT WINAPI GetAllDerivedInstances( LPCWSTR pszBaseClassName,
TRefPointerCollection<CInstance> *pList,
MethodContext *pMethodContext,
#ifdef FRAMEWORK_ALLOW_DEPRECATED
LPCWSTR pszNamespace = NULL);
#else
LPCWSTR pszNamespace);
#endif
static HRESULT WINAPI GetInstanceByPath( LPCWSTR pszObjectPath,
CInstance **ppInstance,
#ifdef FRAMEWORK_ALLOW_DEPRECATED
MethodContext *pMethodContext = NULL );
#else
MethodContext *pMethodContext);
#endif
static HRESULT WINAPI GetInstanceKeysByPath( LPCWSTR pszInstancePath,
CInstance **ppInstance,
MethodContext *pMethodContext);
static HRESULT WINAPI GetInstancePropertiesByPath( LPCWSTR pszInstancePath,
CInstance **ppInstance,
MethodContext *pMethodContext,
CHStringArray &csaProperties);
static HRESULT WINAPI GetInstancesByQuery( LPCWSTR query,
TRefPointerCollection<CInstance> *pList,
MethodContext *pMethodContext,
#ifdef FRAMEWORK_ALLOW_DEPRECATED
LPCWSTR pszNamespace = NULL);
#else
LPCWSTR pszNamespace);
#endif
static HRESULT WINAPI GetInstancesByQueryAsynch( LPCWSTR query,
Provider *pRequester,
LPProviderInstanceCallback pCallback,
LPCWSTR pszNamespace,
MethodContext *pMethodContext,
void *pUserData );
#ifdef FRAMEWORK_ALLOW_DEPRECATED
// This version of GetEmptyInstance is deprecated. Use the next one.
static HRESULT WINAPI GetEmptyInstance( LPCWSTR pszClassName,
CInstance **ppInstance,
LPCWSTR pszNamespace = NULL);
#endif
static HRESULT WINAPI GetEmptyInstance( MethodContext *pMethodContext,
LPCWSTR pszClassName,
CInstance **ppInstance,
#ifdef FRAMEWORK_ALLOW_DEPRECATED
LPCWSTR pszNamespace = NULL);
#else
LPCWSTR pszNamespace);
#endif
// Both of these FillInstance calls are deprecated. Use GetInstanceByPath, or the even
// more performant functions GetInstanceKeysByPath or GetInstancePropertiesByPath.
#ifdef FRAMEWORK_ALLOW_DEPRECATED
static HRESULT WINAPI FillInstance( CInstance *pInstance,
LPCWSTR pszNamespace = NULL );
static HRESULT WINAPI FillInstance( MethodContext *pMethodContext,
CInstance *pInstance );
#endif
// determine whether one class is derived from another
static bool WINAPI IsDerivedFrom( LPCWSTR pszBaseClassName,
LPCWSTR pszDerivedClassName,
MethodContext *pMethodContext,
#ifdef FRAMEWORK_ALLOW_DEPRECATED
LPCWSTR pszNamespace = NULL );
#else
LPCWSTR pszNamespace);
#endif
// logging in and out of framework
// each framework based DLL must log in and out with these functions
// Deprecated in favor of the version that takes a PLONG.
#ifdef FRAMEWORK_ALLOW_DEPRECATED
static BOOL WINAPI FrameworkLoginDLL(LPCWSTR name);
static BOOL WINAPI FrameworkLogoffDLL(LPCWSTR name);
#endif
// You must pass the *same* PLONG to all three of FrameworkLoginDLL,
// FrameworkLogoffDLL, and the CWbemGlueFactory constructor.
static BOOL WINAPI FrameworkLoginDLL(LPCWSTR name, PLONG plRefCount);
static BOOL WINAPI FrameworkLogoffDLL(LPCWSTR name, PLONG plRefCount);
static bool WINAPI SetStatusObject(MethodContext *pContext, LPCWSTR pNamespace,
LPCWSTR pDescription, HRESULT hr,
const SAFEARRAY *pPrivilegesNotHeld = NULL,
const SAFEARRAY *pPrivilegesRequired = NULL);
////////////////////////////////////////////////////////////////////////////////////
// note: the following public functions are necessary to allow COM communication //
// with CIMOM. Provider Implementors will not need to call these. //
////////////////////////////////////////////////////////////////////////////////////
#ifndef NO_BASEINTERFACE_FUNCS
/* IUnknown methods */
STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR *ppvObj) ;
STDMETHOD_(ULONG, AddRef)(THIS) ;
STDMETHOD_(ULONG, Release)(THIS) ;
#endif
virtual HRESULT STDMETHODCALLTYPE Initialize(
/* [in] */ LPWSTR pszUser,
/* [in] */ LONG lFlags,
/* [in] */ LPWSTR pszNamespace,
/* [in] */ LPWSTR pszLocale,
/* [in] */ IWbemServices __RPC_FAR *pNamespace,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemProviderInitSink __RPC_FAR *pInitSink
);
STDMETHOD(CreateInstanceEnumAsync)(THIS_
/* [in] */ const BSTR Class,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
);
STDMETHOD(GetObjectAsync)( THIS_
const BSTR ObjectPath,
long lFlags,
IWbemContext __RPC_FAR *pCtx,
IWbemObjectSink __RPC_FAR *pResponseHandler
);
STDMETHOD(ExecQueryAsync)(THIS_
/* [in] */ const BSTR QueryLanguage,
/* [in] */ const BSTR Query,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
);
STDMETHOD(PutInstanceAsync)( THIS_
/* [in] */ IWbemClassObject __RPC_FAR *pInst,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
);
STDMETHOD(DeleteInstanceAsync)(
/* [in] */ const BSTR ObjectPath,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
);
STDMETHOD(ExecMethodAsync)( const BSTR,
const BSTR,
long,
IWbemContext*,
IWbemClassObject*,
IWbemObjectSink*
);
// Unsupported service methods
// ===========================
STDMETHOD(OpenNamespace)(THIS_
const BSTR Namespace,
long lFlags,
IWbemContext __RPC_FAR *pCtx,
IWbemServices __RPC_FAR *__RPC_FAR *ppWorkingNamespace,
IWbemCallResult __RPC_FAR *__RPC_FAR *ppResult
)
{ return E_NOTIMPL; }
STDMETHOD(PutClass)(IWbemClassObject __RPC_FAR *pObject,
long lFlags,
IWbemContext __RPC_FAR *pCtx,
IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult
)
{return E_NOTIMPL;}
STDMETHOD(PutClassAsync)(
/* [in] */ IWbemClassObject __RPC_FAR *pObject,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
)
{return E_NOTIMPL;}
STDMETHOD(DeleteClass)(
/* [in] */ const BSTR Class,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult
)
{return E_NOTIMPL;}
STDMETHOD(DeleteClassAsync)(
/* [in] */ const BSTR Class,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
)
{return E_NOTIMPL;}
STDMETHOD(CreateClassEnum)(
/* [in] */ const BSTR Superclass,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum
)
{return E_NOTIMPL;}
STDMETHOD(CreateClassEnumAsync)(
/* [in] */ const BSTR Superclass,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
)
{return E_NOTIMPL;}
STDMETHOD(PutInstance)(
/* [in] */ IWbemClassObject __RPC_FAR *pInst,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult
)
{return E_NOTIMPL;}
STDMETHOD(DeleteInstance)(
/* [in] */ const BSTR ObjectPath,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult
)
{return E_NOTIMPL;}
STDMETHOD(CancelAsyncRequest)(THIS_ long lAsyncRequestHandle
)
{return E_NOTIMPL;}
STDMETHOD(CancelAsyncCall)(IWbemObjectSink __RPC_FAR *pSink
)
{return E_NOTIMPL;}
STDMETHOD(CreateInstanceEnum)(
/* [in] */ const BSTR Class,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum
)
{return E_NOTIMPL;}
STDMETHOD(ExecQuery)(
/* [in] */ const BSTR QueryLanguage,
/* [in] */ const BSTR Query,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum
)
{return E_NOTIMPL;}
STDMETHOD(QueryObjectSink)(long lFlags,
IWbemObjectSink __RPC_FAR *__RPC_FAR *ppResponseHandler
)
{return E_NOTIMPL;}
STDMETHOD(GetObject)( const BSTR ObjectPath,
long lFlags,
IWbemContext __RPC_FAR *pCtx,
IWbemClassObject __RPC_FAR *__RPC_FAR *ppObject,
IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult
)
{return E_NOTIMPL;}
STDMETHOD(ExecNotificationQuery)(
/* [in] */ const BSTR QueryLanguage,
/* [in] */ const BSTR Query,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum
)
{return E_NOTIMPL;}
STDMETHOD(ExecNotificationQueryAsync)(
/* [in] */ const BSTR QueryLanguage,
/* [in] */ const BSTR Query,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler
)
{return E_NOTIMPL;}
STDMETHOD(ExecMethod)(const BSTR,
const BSTR,
long,
IWbemContext*,
IWbemClassObject*,
IWbemClassObject**,
IWbemCallResult**
)
{return E_NOTIMPL;}
CWbemProviderGlue();
CWbemProviderGlue(PLONG pCount);
~CWbemProviderGlue(); // Destructor
// used by the provider base class - you probably will never need to call this directly
static IWbemServices *WINAPI GetNamespaceConnection( LPCWSTR NameSpace );
static IWbemServices *WINAPI GetNamespaceConnection( LPCWSTR NameSpace, MethodContext *pMethodContext );
// each provider class must log in and out with these in their constructors and destructors
// this is done for you in the Provider base class
static void WINAPI FrameworkLogin( LPCWSTR a_pszName,
Provider *a_pProvider,
LPCWSTR a_pszNameSpace );
static void WINAPI FrameworkLogoff( LPCWSTR a_pszName,
LPCWSTR a_pszNameSpace );
static void WINAPI IncrementObjectCount(void);
static LONG WINAPI DecrementObjectCount(void);
static DWORD WINAPI GetOSMajorVersion() { return s_dwMajorVersion; }
static DWORD WINAPI GetPlatform() { return s_dwPlatform; }
static LPCWSTR WINAPI GetCSDVersion() { return s_wstrCSDVersion; }
private:
IWbemServices *WINAPI InternalGetNamespaceConnection( LPCWSTR NameSpace );
static HRESULT WINAPI GetInstanceFromCIMOM( LPCWSTR pszObjectPath,
LPCWSTR pszNameSpace,
MethodContext *pMethodContext,
CInstance **ppInstance );
void FlushAll(void);
static Provider *WINAPI SearchMapForProvider( LPCWSTR a_pszProviderName,
LPCWSTR a_pszNamespace );
static Provider *WINAPI AddProviderToMap( LPCWSTR a_pszProviderName,
LPCWSTR a_strNamespace,
Provider *a_pProvider );
static void WINAPI LockProviderMap( void );
static void WINAPI UnlockProviderMap( void );
static void WINAPI LockFactoryMap( void );
static void WINAPI UnlockFactoryMap( void );
static IWbemClassObject *WINAPI GetStatusObject( MethodContext *pContext,
LPCWSTR pNamespace);
static void WINAPI Init( void );
static void WINAPI UnInit( void );
static void WINAPI GetComputerName( CHString& strComputerName );
static HRESULT WINAPI CheckImpersonationLevel();
HRESULT PreProcessPutInstanceParms(IWbemClassObject __RPC_FAR *pInstIn,
IWbemClassObject __RPC_FAR **pInstOut,
IWbemContext __RPC_FAR *pCtx);
HRESULT NullOutUnsetProperties(IWbemClassObject __RPC_FAR *pInstIn,
IWbemClassObject __RPC_FAR **pInstOut,
const VARIANT& vValue);
void AddFlushPtr(LPVOID pVoid);
long m_lRefCount;
CHString m_strNamespace;
IWbemServices *m_pServices;
static long s_lObjects; // number of objects out there - class factories & WbemGlues
PLONG m_pCount;
PROVIDERPTRS m_FlushPtrs;
CCritSec m_csFlushPtrs;
static STRING2LPVOID s_providersmap;
static CCritSec s_csProviderMap;
static CCritSec m_csStatusObject;
static BOOL s_bInitted;
static DWORD s_dwPlatform;
static DWORD s_dwMajorVersion;
static WCHAR s_wstrCSDVersion[128];
static IWbemClassObject *m_pStatusObject;
static PTR2PLONG s_factorymap;
static CCritSec s_csFactoryMap;
protected:
friend CWbemGlueFactory;
static LONG IncrementMapCount(const CWbemGlueFactory *pGlue);
static LONG IncrementMapCount(PLONG pCount);
static LONG DecrementMapCount(const CWbemGlueFactory *pGlue);
static LONG DecrementMapCount(PLONG pCount);
static PLONG GetMapCountPtr(const CWbemGlueFactory *pGlue);
static VOID AddToFactoryMap(const CWbemGlueFactory *pGlue, PLONG pdwRefCount);
static VOID RemoveFromFactoryMap(const CWbemGlueFactory *pGlue);
};
inline void CWbemProviderGlue::LockProviderMap( void )
{
EnterCriticalSection( &s_csProviderMap );
}
inline void CWbemProviderGlue::UnlockProviderMap( void )
{
LeaveCriticalSection( &s_csProviderMap );
}
inline void CWbemProviderGlue::LockFactoryMap( void )
{
EnterCriticalSection( &s_csFactoryMap );
}
inline void CWbemProviderGlue::UnlockFactoryMap( void )
{
LeaveCriticalSection( &s_csFactoryMap );
}
class POLARITY CWbemGlueFactory : public IClassFactory
{
protected:
long m_lRefCount;
public:
// Deprecated in favor of the constructor that takes a PLONG. This
// must be the same PLONG that is passed to FrameworkLoginDLL &
// FrameworkLogoffDLL.
#ifdef FRAMEWORK_ALLOW_DEPRECATED
CWbemGlueFactory(void);
#endif
CWbemGlueFactory(PLONG plRefCount);
~CWbemGlueFactory(void);
//IUnknown members
STDMETHODIMP QueryInterface(REFIID, PPVOID);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
//IClassFactory members
STDMETHODIMP CreateInstance(LPUNKNOWN, REFIID, PPVOID);
STDMETHODIMP LockServer(BOOL);
};
typedef CWbemGlueFactory *PCWbemGlueFactory;
#endif