• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * This file has no copyright assigned and is placed in the Public Domain.
3  * This file is part of the mingw-w64 runtime package.
4  * No warranty is given; refer to the file DISCLAIMER.PD within this package.
5  */
6 #ifndef __ATLWMIPROV_H__
7 #define __ATLWMIPROV_H__
8 
9 #ifndef __cplusplus
10 #error Requires C++ compilation (use a .cpp suffix)
11 #endif
12 
13 #include <wbemprov.h>
14 #include <wmiutils.h>
15 
16 namespace ATL {
17   class ATL_NO_VTABLE IWbemInstProviderImpl : public IWbemServices,public IWbemProviderInit {
18   public:
OpenNamespace(const BSTR Namespace,__LONG32 lFlags,IWbemContext * pCtx,IWbemServices ** ppWorkingNamespace,IWbemCallResult ** ppResult)19     HRESULT WINAPI OpenNamespace(const BSTR Namespace,__LONG32 lFlags,IWbemContext *pCtx,IWbemServices **ppWorkingNamespace,IWbemCallResult **ppResult) {return WBEM_E_NOT_SUPPORTED;};
CancelAsyncCall(IWbemObjectSink * pSink)20     HRESULT WINAPI CancelAsyncCall(IWbemObjectSink *pSink) {return WBEM_E_NOT_SUPPORTED;};
QueryObjectSink(__LONG32 lFlags,IWbemObjectSink ** ppResponseHandler)21     HRESULT WINAPI QueryObjectSink(__LONG32 lFlags,IWbemObjectSink **ppResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
GetObject(const BSTR ObjectPath,__LONG32 lFlags,IWbemContext * pCtx,IWbemClassObject ** ppObject,IWbemCallResult ** ppCallResult)22     HRESULT WINAPI GetObject(const BSTR ObjectPath,__LONG32 lFlags,IWbemContext *pCtx,IWbemClassObject **ppObject,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
PutClass(IWbemClassObject * pObject,__LONG32 lFlags,IWbemContext * pCtx,IWbemCallResult ** ppCallResult)23     HRESULT WINAPI PutClass(IWbemClassObject *pObject,__LONG32 lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
PutClassAsync(IWbemClassObject * pObject,__LONG32 lFlags,IWbemContext * pCtx,IWbemObjectSink * pResponseHandler)24     HRESULT WINAPI PutClassAsync(IWbemClassObject *pObject,__LONG32 lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
DeleteClass(const BSTR Class,__LONG32 lFlags,IWbemContext * pCtx,IWbemCallResult ** ppCallResult)25     HRESULT WINAPI DeleteClass(const BSTR Class,__LONG32 lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
DeleteClassAsync(const BSTR Class,__LONG32 lFlags,IWbemContext * pCtx,IWbemObjectSink * pResponseHandler)26     HRESULT WINAPI DeleteClassAsync(const BSTR Class,__LONG32 lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
CreateClassEnum(const BSTR Superclass,__LONG32 lFlags,IWbemContext * pCtx,IEnumWbemClassObject ** ppEnum)27     HRESULT WINAPI CreateClassEnum(const BSTR Superclass,__LONG32 lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
CreateClassEnumAsync(const BSTR Superclass,__LONG32 lFlags,IWbemContext * pCtx,IWbemObjectSink * pResponseHandler)28     HRESULT WINAPI CreateClassEnumAsync(const BSTR Superclass,__LONG32 lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
PutInstance(IWbemClassObject * pInst,__LONG32 lFlags,IWbemContext * pCtx,IWbemCallResult ** ppCallResult)29     HRESULT WINAPI PutInstance(IWbemClassObject *pInst,__LONG32 lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
DeleteInstance(const BSTR ObjectPath,__LONG32 lFlags,IWbemContext * pCtx,IWbemCallResult ** ppCallResult)30     HRESULT WINAPI DeleteInstance(const BSTR ObjectPath,__LONG32 lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
CreateInstanceEnum(const BSTR Class,__LONG32 lFlags,IWbemContext * pCtx,IEnumWbemClassObject ** ppEnum)31     HRESULT WINAPI CreateInstanceEnum(const BSTR Class,__LONG32 lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
ExecQuery(const BSTR QueryLanguage,const BSTR Query,__LONG32 lFlags,IWbemContext * pCtx,IEnumWbemClassObject ** ppEnum)32     HRESULT WINAPI ExecQuery(const BSTR QueryLanguage,const BSTR Query,__LONG32 lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
ExecNotificationQuery(const BSTR QueryLanguage,const BSTR Query,__LONG32 lFlags,IWbemContext * pCtx,IEnumWbemClassObject ** ppEnum)33     HRESULT WINAPI ExecNotificationQuery(const BSTR QueryLanguage,const BSTR Query,__LONG32 lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
ExecNotificationQueryAsync(const BSTR QueryLanguage,const BSTR Query,__LONG32 lFlags,IWbemContext * pCtx,IWbemObjectSink * pResponseHandler)34     HRESULT WINAPI ExecNotificationQueryAsync(const BSTR QueryLanguage,const BSTR Query,__LONG32 lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
ExecMethod(const BSTR strObjectPath,const BSTR strMethodName,__LONG32 lFlags,IWbemContext * pCtx,IWbemClassObject * pInParams,IWbemClassObject ** ppOutParams,IWbemCallResult ** ppCallResult)35     HRESULT WINAPI ExecMethod(const BSTR strObjectPath,const BSTR strMethodName,__LONG32 lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemClassObject **ppOutParams,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
ExecMethodAsync(const BSTR strObjectPath,const BSTR strMethodName,__LONG32 lFlags,IWbemContext * pCtx,IWbemClassObject * pInParams,IWbemObjectSink * pResponseHandler)36     HRESULT WINAPI ExecMethodAsync(const BSTR strObjectPath,const BSTR strMethodName,__LONG32 lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
37   };
38 
39   class CProviderHelper {
40   private:
41     CComPtr<IWbemClassObject> m_pErrorObject;
42     HRESULT m_hr;
43   public:
CProviderHelper(IWbemServices * pNamespace,IWbemContext * pCtx)44     CProviderHelper(IWbemServices *pNamespace,IWbemContext *pCtx) {
45       m_hr = WBEM_E_FAILED;
46       m_pErrorObject = NULL;
47       if(!pNamespace) {
48 	m_hr = WBEM_E_INVALID_PARAMETER;
49 	ATLASSERT (0);
50 	return;
51       }
52       BSTR bstrString = SysAllocString(L"__ExtendedStatus");
53       if(!bstrString) {
54 	m_hr = WBEM_E_OUT_OF_MEMORY;
55 	return;
56       }
57       m_hr = pNamespace->GetObject(bstrString,0,pCtx,&m_pErrorObject,NULL);
58       SysFreeString(bstrString);
59       return;
60     }
~CProviderHelper()61     virtual ~CProviderHelper() { }
ConstructErrorObject(const ULONG ulStatusCode,const BSTR bstrDescription,const BSTR bstrOperation,const BSTR bstrParameter,const BSTR bstrProviderName,IWbemClassObject ** ppErrorObject)62     HRESULT WINAPI ConstructErrorObject (const ULONG ulStatusCode,const BSTR bstrDescription,const BSTR bstrOperation,const BSTR bstrParameter,const BSTR bstrProviderName,IWbemClassObject **ppErrorObject) {
63       static const LPWSTR lpwstrDescription = L"Description";
64       static const LPWSTR lpwstrOperation = L"Operation";
65       static const LPWSTR lpwstrStatusCode = L"StatusCode";
66       static const LPWSTR lpwstrParameterInfo = L"ParameterInfo";
67       static const LPWSTR lpwstrProviderName = L"ProviderName";
68 
69       if(FAILED (m_hr)) {
70 	ATLASSERT (0);
71 	return m_hr;
72       }
73       if(!ppErrorObject) {
74 	ATLASSERT (0);
75 	return WBEM_E_INVALID_PARAMETER;
76       }
77       HRESULT hr = m_pErrorObject->SpawnInstance(0,ppErrorObject);
78       if(FAILED(hr)) return hr;
79       VARIANT var;
80       VariantInit(&var);
81       var.vt = VT_I4;
82       var.lVal = ulStatusCode;
83       hr = (*ppErrorObject)->Put(lpwstrStatusCode,0,&var,0);
84       if(FAILED(hr)) return hr;
85       var.vt = VT_BSTR;
86       if(bstrDescription!=NULL) {
87 	var.bstrVal = bstrDescription;
88 	hr = (*ppErrorObject)->Put(lpwstrDescription,0,&var,0);
89 	if(FAILED(hr)) return hr;
90       }
91       if(bstrOperation!=NULL) {
92 	var.bstrVal = bstrOperation;
93 	hr = (*ppErrorObject)->Put(lpwstrOperation,0,&var,0);
94 	if(FAILED(hr)) return hr;
95       }
96       if(bstrParameter!=NULL) {
97 	var.bstrVal = bstrParameter;
98 	hr = (*ppErrorObject)->Put(lpwstrParameterInfo,0,&var,0);
99 	if(FAILED(hr)) return hr;
100       }
101       if(bstrProviderName!=NULL) {
102 	var.bstrVal = bstrProviderName;
103 	hr = (*ppErrorObject)->Put(lpwstrProviderName,0,&var,0);
104 	if(FAILED(hr)) return hr;
105       }
106       return hr;
107     }
108   };
109 
110   class CIntrinsicEventProviderHelper : public CProviderHelper {
111   private:
112     CComPtr<IWbemClassObject> m_pCreationEventClass;
113     CComPtr<IWbemClassObject> m_pDeletionEventClass;
114     CComPtr<IWbemClassObject> m_pModificationEventClass;
115     HRESULT m_hr;
116   public:
CIntrinsicEventProviderHelper(IWbemServices * pNamespace,IWbemContext * pCtx)117     CIntrinsicEventProviderHelper(IWbemServices *pNamespace,IWbemContext *pCtx) : CProviderHelper (pNamespace,pCtx) {
118       m_hr = WBEM_E_FAILED;
119       if(!pNamespace || !pCtx) {
120 	m_hr = WBEM_E_INVALID_PARAMETER;
121 	ATLASSERT (0);
122 	return;
123       }
124       m_pCreationEventClass = NULL;
125       m_pModificationEventClass = NULL;
126       m_pDeletionEventClass = NULL;
127       BSTR bstrString = SysAllocString(L"__InstanceCreationEvent");
128       if(!bstrString) {
129 	m_hr = WBEM_E_OUT_OF_MEMORY;
130 	return;
131       }
132       m_hr = pNamespace->GetObject(bstrString,0,pCtx,&m_pCreationEventClass,NULL);
133       SysFreeString(bstrString);
134       bstrString=NULL;
135       if(FAILED(m_hr)) return;
136       bstrString = SysAllocString(L"__InstanceModificationEvent");
137       if(!bstrString) {
138 	m_hr = WBEM_E_OUT_OF_MEMORY;
139 	return;
140       }
141       m_hr = pNamespace->GetObject(bstrString,0,pCtx,&m_pModificationEventClass,NULL);
142       SysFreeString(bstrString);
143       bstrString=NULL;
144       if(FAILED(m_hr)) return;
145       bstrString = SysAllocString(L"__InstanceDeletionEvent");
146       if(!bstrString) {
147 	m_hr = WBEM_E_OUT_OF_MEMORY;
148 	return;
149       }
150       m_hr = pNamespace->GetObject(bstrString,0,pCtx,&m_pDeletionEventClass,NULL);
151       SysFreeString(bstrString);
152       bstrString=NULL;
153       if(FAILED(m_hr)) return;
154       return;
155     }
~CIntrinsicEventProviderHelper()156     virtual ~CIntrinsicEventProviderHelper() { }
FireCreationEvent(IWbemClassObject * pNewInstance,IWbemObjectSink * pSink)157     HRESULT WINAPI FireCreationEvent(IWbemClassObject *pNewInstance,IWbemObjectSink *pSink) {
158       if(FAILED(m_hr)) {
159 	ATLASSERT (0);
160 	return m_hr;
161       }
162       if(!pNewInstance || !pSink) {
163 	ATLASSERT (0);
164 	return WBEM_E_INVALID_PARAMETER;
165       }
166       CComPtr<IWbemClassObject> pEvtInstance;
167       HRESULT hr = m_pCreationEventClass->SpawnInstance(0,&pEvtInstance);
168       if(FAILED(hr)) return hr;
169       VARIANT var;
170       VariantInit(&var);
171       var.vt = VT_UNKNOWN;
172       CComQIPtr<IUnknown,&IID_IUnknown>pTemp(pNewInstance);
173       var.punkVal = pTemp;
174       hr = pEvtInstance->Put(L"TargetInstance",0,&var,0);
175       if(FAILED(hr)) return hr;
176       IWbemClassObject *_pEvtInstance = (IWbemClassObject*)pEvtInstance;
177       return pSink->Indicate(1,&_pEvtInstance);
178     }
FireDeletionEvent(IWbemClassObject * pInstanceToDelete,IWbemObjectSink * pSink)179     HRESULT WINAPI FireDeletionEvent(IWbemClassObject *pInstanceToDelete,IWbemObjectSink *pSink) {
180       if(FAILED (m_hr)) {
181 	ATLASSERT (0);
182 	return m_hr;
183       }
184       if(!pInstanceToDelete || !pSink) {
185 	ATLASSERT (0);
186 	return WBEM_E_INVALID_PARAMETER;
187       }
188       CComPtr<IWbemClassObject> pEvtInstance;
189       HRESULT hr = m_pDeletionEventClass->SpawnInstance(0,&pEvtInstance);
190       if(FAILED(hr)) return hr;
191       VARIANT var;
192       VariantInit(&var);
193       var.vt = VT_UNKNOWN;
194       CComQIPtr<IUnknown,&IID_IUnknown>pTemp(pInstanceToDelete);
195       var.punkVal = pTemp;
196       hr = pEvtInstance->Put(L"TargetInstance",0,&var,0);
197       if(FAILED(hr)) return hr;
198       IWbemClassObject *_pEvtInstance = (IWbemClassObject*)pEvtInstance;
199       return pSink->Indicate(1,&_pEvtInstance);
200     }
FireModificationEvent(IWbemClassObject * pOldInstance,IWbemClassObject * pNewInstance,IWbemObjectSink * pSink)201     HRESULT WINAPI FireModificationEvent(IWbemClassObject *pOldInstance,IWbemClassObject *pNewInstance,IWbemObjectSink *pSink) {
202       if(FAILED (m_hr)) {
203 	ATLASSERT (0);
204 	return m_hr;
205       }
206       if(!pOldInstance || !pNewInstance || !pSink) {
207 	ATLASSERT (0);
208 	return WBEM_E_INVALID_PARAMETER;
209       }
210       CComPtr<IWbemClassObject> pEvtInstance;
211       HRESULT hr = m_pModificationEventClass->SpawnInstance(0,&pEvtInstance);
212       if(FAILED(hr)) return hr;
213       VARIANT var;
214       VariantInit(&var);
215       var.vt = VT_UNKNOWN;
216       CComQIPtr<IUnknown,&IID_IUnknown>pTempNew(pNewInstance);
217       var.punkVal = pTempNew;
218       hr = pEvtInstance->Put(L"TargetInstance",0,&var,0);
219       if(FAILED(hr)) return hr;
220       CComQIPtr<IUnknown,&IID_IUnknown>pTempOld(pOldInstance);
221       var.punkVal = pTempOld;
222       hr = pEvtInstance->Put(L"PreviousInstance",0,&var,0);
223       if(FAILED(hr)) return hr;
224       IWbemClassObject *_pEvtInstance = (IWbemClassObject*)pEvtInstance;
225       return pSink->Indicate(1,&_pEvtInstance);
226     }
227   };
228 
229   class CInstanceProviderHelper : public CProviderHelper {
230   public:
CInstanceProviderHelper(IWbemServices * pNamespace,IWbemContext * pCtx)231     CInstanceProviderHelper (IWbemServices *pNamespace,IWbemContext *pCtx) : CProviderHelper (pNamespace,pCtx) { }
~CInstanceProviderHelper()232     virtual ~CInstanceProviderHelper() { }
CheckInstancePath(IClassFactory * pParserFactory,const BSTR ObjectPath,const BSTR ClassName,ULONGLONG ullTest)233     HRESULT WINAPI CheckInstancePath(IClassFactory *pParserFactory,const BSTR ObjectPath,const BSTR ClassName,ULONGLONG ullTest) {
234       if(!pParserFactory) {
235 	ATLASSERT (0);
236 	return WBEM_E_INVALID_PARAMETER;
237       }
238       CComPtr<IWbemPath>pPath;
239       HRESULT hr = pParserFactory->CreateInstance(NULL,IID_IWbemPath,(void **) &pPath);
240       if(FAILED(hr)) return WBEM_E_INVALID_PARAMETER;
241       hr = pPath->SetText(WBEMPATH_CREATE_ACCEPT_ALL,ObjectPath);
242       if(FAILED(hr)) return hr;
243       unsigned int nPathLen = SysStringLen(ObjectPath);
244       if(nPathLen >= (unsigned __LONG32)(-1)) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
245       unsigned __LONG32 ulBufLen = (unsigned __LONG32)(nPathLen + 1);
246       WCHAR *wClass = new WCHAR[ulBufLen];
247       if(!wClass) return WBEM_E_OUT_OF_MEMORY;
248       hr = pPath->GetClassName(&ulBufLen,wClass);
249       if(FAILED(hr)) {
250 	delete[] wClass;
251 	return hr;
252       }
253       DWORD lcid = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
254       if(CSTR_EQUAL!=CompareStringW(lcid,NORM_IGNORECASE,ClassName,-1,wClass,-1)) {
255 	delete[] wClass;
256 	return WBEM_E_NOT_FOUND;
257       }
258       delete[] wClass;
259       __MINGW_EXTENSION unsigned __int64 ullPathInfo;
260       hr = pPath->GetInfo((ULONG)0,&ullPathInfo);
261       if(FAILED(hr)) return hr;
262       if(!(ullPathInfo & ullTest)) return WBEM_E_INVALID_OBJECT_PATH;
263       return WBEM_S_NO_ERROR;
264     }
265   };
266 
267   template <class T> class ATL_NO_VTABLE IWbemPullClassProviderImpl : public IWbemServices,public IWbemProviderInit {
268   public:
OpenNamespace(const BSTR strNamespace,__LONG32 lFlags,IWbemContext * pCtx,IWbemServices ** ppWorkingNamespace,IWbemCallResult ** ppResult)269     virtual HRESULT WINAPI OpenNamespace(const BSTR strNamespace,__LONG32 lFlags,IWbemContext *pCtx,IWbemServices **ppWorkingNamespace,IWbemCallResult **ppResult){return WBEM_E_NOT_SUPPORTED;};
CancelAsyncCall(IWbemObjectSink * pSink)270     virtual HRESULT WINAPI CancelAsyncCall(IWbemObjectSink *pSink){return WBEM_E_NOT_SUPPORTED;};
QueryObjectSink(__LONG32 lFlags,IWbemObjectSink ** ppResponseHandler)271     virtual HRESULT WINAPI QueryObjectSink(__LONG32 lFlags,IWbemObjectSink **ppResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
GetObject(const BSTR strObjectPath,__LONG32 lFlags,IWbemContext * pCtx,IWbemClassObject ** ppObject,IWbemCallResult ** ppCallResult)272     virtual HRESULT WINAPI GetObject(const BSTR strObjectPath,__LONG32 lFlags,IWbemContext *pCtx,IWbemClassObject **ppObject,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
PutClass(IWbemClassObject * pObject,__LONG32 lFlags,IWbemContext * pCtx,IWbemCallResult ** ppCallResult)273     virtual HRESULT WINAPI PutClass(IWbemClassObject *pObject,__LONG32 lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult){return WBEM_E_NOT_SUPPORTED;};
DeleteClass(const BSTR strClass,__LONG32 lFlags,IWbemContext * pCtx,IWbemCallResult ** ppCallResult)274     virtual HRESULT WINAPI DeleteClass(const BSTR strClass,__LONG32 lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult){return WBEM_E_NOT_SUPPORTED;};
CreateClassEnum(const BSTR strSuperclass,__LONG32 lFlags,IWbemContext * pCtx,IEnumWbemClassObject ** ppEnum)275     virtual HRESULT WINAPI CreateClassEnum(const BSTR strSuperclass,__LONG32 lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
PutInstance(IWbemClassObject * pInst,__LONG32 lFlags,IWbemContext * pCtx,IWbemCallResult ** ppCallResult)276     virtual HRESULT WINAPI PutInstance(IWbemClassObject *pInst,__LONG32 lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult){return WBEM_E_NOT_SUPPORTED;};
PutInstanceAsync(IWbemClassObject * pInst,__LONG32 lFlags,IWbemContext * pCtx,IWbemObjectSink * pResponseHandler)277     virtual HRESULT WINAPI PutInstanceAsync(IWbemClassObject *pInst,__LONG32 lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
DeleteInstance(const BSTR strObjectPath,__LONG32 lFlags,IWbemContext * pCtx,IWbemCallResult ** ppCallResult)278     virtual HRESULT WINAPI DeleteInstance(const BSTR strObjectPath,__LONG32 lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult){return WBEM_E_NOT_SUPPORTED;};
DeleteInstanceAsync(const BSTR strObjectPath,__LONG32 lFlags,IWbemContext * pCtx,IWbemObjectSink * pResponseHandler)279     virtual HRESULT WINAPI DeleteInstanceAsync(const BSTR strObjectPath,__LONG32 lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler){return WBEM_E_NOT_SUPPORTED;};
CreateInstanceEnum(const BSTR strClass,__LONG32 lFlags,IWbemContext * pCtx,IEnumWbemClassObject ** ppEnum)280     virtual HRESULT WINAPI CreateInstanceEnum(const BSTR strClass,__LONG32 lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
CreateInstanceEnumAsync(const BSTR strClass,__LONG32 lFlags,IWbemContext * pCtx,IWbemObjectSink * pResponseHandler)281     virtual HRESULT WINAPI CreateInstanceEnumAsync(const BSTR strClass,__LONG32 lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
ExecQuery(const BSTR strQueryLanguage,const BSTR strQuery,__LONG32 lFlags,IWbemContext * pCtx,IEnumWbemClassObject ** ppEnum)282     virtual HRESULT WINAPI ExecQuery(const BSTR strQueryLanguage,const BSTR strQuery,__LONG32 lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
ExecNotificationQuery(const BSTR strQueryLanguage,const BSTR strQuery,__LONG32 lFlags,IWbemContext * pCtx,IEnumWbemClassObject ** ppEnum)283     virtual HRESULT WINAPI ExecNotificationQuery(const BSTR strQueryLanguage,const BSTR strQuery,__LONG32 lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
ExecNotificationQueryAsync(const BSTR strQueryLanguage,const BSTR strQuery,__LONG32 lFlags,IWbemContext * pCtx,IWbemObjectSink * pResponseHandler)284     virtual HRESULT WINAPI ExecNotificationQueryAsync(const BSTR strQueryLanguage,const BSTR strQuery,__LONG32 lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
ExecMethod(const BSTR strObjectPath,const BSTR strMethodName,__LONG32 lFlags,IWbemContext * pCtx,IWbemClassObject * pInParams,IWbemClassObject ** ppOutParams,IWbemCallResult ** ppCallResult)285     virtual HRESULT WINAPI ExecMethod(const BSTR strObjectPath,const BSTR strMethodName,__LONG32 lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemClassObject **ppOutParams,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
ExecMethodAsync(const BSTR strObjectPath,const BSTR strMethodName,__LONG32 lFlags,IWbemContext * pCtx,IWbemClassObject * pInParams,IWbemObjectSink * pResponseHandler)286     virtual HRESULT WINAPI ExecMethodAsync(const BSTR strObjectPath,const BSTR strMethodName,__LONG32 lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
287   };
288 
289   class CImpersonateClientHelper {
290   private:
291     WINBOOL m_bImpersonate;
292   public:
CImpersonateClientHelper()293     CImpersonateClientHelper() { m_bImpersonate = FALSE; }
~CImpersonateClientHelper()294     ~CImpersonateClientHelper() {
295       if(m_bImpersonate)
296 	CoRevertToSelf();
297     }
ImpersonateClient()298     HRESULT ImpersonateClient() {
299       HRESULT hr = S_OK;
300       if(SUCCEEDED(hr = CoImpersonateClient())) m_bImpersonate = TRUE;
301       return hr;
302     }
GetCurrentImpersonationLevel(DWORD & a_Level)303     HRESULT GetCurrentImpersonationLevel (DWORD & a_Level) {
304       DWORD t_ImpersonationLevel = RPC_C_IMP_LEVEL_ANONYMOUS;
305       HANDLE t_ThreadToken = NULL;
306       HRESULT t_Result = S_OK;
307       if(SUCCEEDED(t_Result = CoImpersonateClient())) {
308 	WINBOOL t_Status = OpenThreadToken (GetCurrentThread() ,TOKEN_QUERY,TRUE,&t_ThreadToken);
309 	if(t_Status) {
310 	  SECURITY_IMPERSONATION_LEVEL t_Level = SecurityAnonymous;
311 	  DWORD t_Returned = 0;
312 	  t_Status = GetTokenInformation (t_ThreadToken ,TokenImpersonationLevel ,&t_Level ,sizeof(SECURITY_IMPERSONATION_LEVEL),&t_Returned);
313 	  CloseHandle (t_ThreadToken);
314 	  if(t_Status==FALSE) {
315 	    t_Result = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_WIN32,GetLastError());
316 	  } else {
317 	    switch(t_Level) {
318 	    case SecurityAnonymous:
319 	      {
320 		t_ImpersonationLevel = RPC_C_IMP_LEVEL_ANONYMOUS;
321 	      }
322 	      break;
323 	    case SecurityIdentification:
324 	      {
325 		t_ImpersonationLevel = RPC_C_IMP_LEVEL_IDENTIFY;
326 	      }
327 	      break;
328 	    case SecurityImpersonation:
329 	      {
330 		t_ImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
331 	      }
332 	      break;
333 	    case SecurityDelegation:
334 	      {
335 		t_ImpersonationLevel = RPC_C_IMP_LEVEL_DELEGATE;
336 	      }
337 	      break;
338 	    default:
339 	      {
340 		t_Result = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_WIN32,E_UNEXPECTED);
341 	      }
342 	      break;
343 	    }
344 	  }
345 	} else {
346 	  t_Result = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_WIN32,GetLastError());
347 	}
348 	CoRevertToSelf();
349       }
350       a_Level = t_ImpersonationLevel;
351       return t_Result;
352     }
353   };
354 }
355 #endif
356