comparison fuhtark_test/include/winapi/wmiatlprov.h @ 1500:91c8c3b7cbf0

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