diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fuhtark_test/include/winapi/wmiatlprov.h	Wed Nov 26 21:36:48 2025 +0700
@@ -0,0 +1,350 @@
+#ifndef __ATLWMIPROV_H__
+#define __ATLWMIPROV_H__
+
+#ifndef __cplusplus
+#error Requires C++ compilation (use a .cpp suffix)
+#endif
+
+#include <wbemprov.h>
+#include <wmiutils.h>
+
+namespace ATL {
+  class ATL_NO_VTABLE IWbemInstProviderImpl : public IWbemServices,public IWbemProviderInit {
+  public:
+    HRESULT WINAPI OpenNamespace(const BSTR Namespace,long lFlags,IWbemContext *pCtx,IWbemServices **ppWorkingNamespace,IWbemCallResult **ppResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI CancelAsyncCall(IWbemObjectSink *pSink) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI QueryObjectSink(long lFlags,IWbemObjectSink **ppResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI GetObject(const BSTR ObjectPath,long lFlags,IWbemContext *pCtx,IWbemClassObject **ppObject,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI PutClass(IWbemClassObject *pObject,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI PutClassAsync(IWbemClassObject *pObject,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI DeleteClass(const BSTR Class,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI DeleteClassAsync(const BSTR Class,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI CreateClassEnum(const BSTR Superclass,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI CreateClassEnumAsync(const BSTR Superclass,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI PutInstance(IWbemClassObject *pInst,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI DeleteInstance(const BSTR ObjectPath,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI CreateInstanceEnum(const BSTR Class,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI ExecQuery(const BSTR QueryLanguage,const BSTR Query,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI ExecNotificationQuery(const BSTR QueryLanguage,const BSTR Query,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI ExecNotificationQueryAsync(const BSTR QueryLanguage,const BSTR Query,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI ExecMethod(const BSTR strObjectPath,const BSTR strMethodName,long lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemClassObject **ppOutParams,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    HRESULT WINAPI ExecMethodAsync(const BSTR strObjectPath,const BSTR strMethodName,long lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+  };
+
+  class CProviderHelper {
+  private:
+    CComPtr<IWbemClassObject> m_pErrorObject;
+    HRESULT m_hr;
+  public:
+    CProviderHelper(IWbemServices *pNamespace,IWbemContext *pCtx) {
+      m_hr = WBEM_E_FAILED;
+      m_pErrorObject = NULL;
+      if(!pNamespace) {
+	m_hr = WBEM_E_INVALID_PARAMETER;
+	ATLASSERT (0);
+	return;
+      }
+      BSTR bstrString = SysAllocString(L"__ExtendedStatus");
+      if(!bstrString) {
+	m_hr = WBEM_E_OUT_OF_MEMORY;
+	return;
+      }
+      m_hr = pNamespace->GetObject(bstrString,0,pCtx,&m_pErrorObject,NULL);
+      SysFreeString(bstrString);
+      return;
+    }
+    virtual ~CProviderHelper() { }
+    HRESULT WINAPI ConstructErrorObject (const ULONG ulStatusCode,const BSTR bstrDescription,const BSTR bstrOperation,const BSTR bstrParameter,const BSTR bstrProviderName,IWbemClassObject **ppErrorObject) {
+      static const LPWSTR lpwstrDescription = L"Description";
+      static const LPWSTR lpwstrOperation = L"Operation";
+      static const LPWSTR lpwstrStatusCode = L"StatusCode";
+      static const LPWSTR lpwstrParameterInfo = L"ParameterInfo";
+      static const LPWSTR lpwstrProviderName = L"ProviderName";
+
+      if(FAILED (m_hr)) {
+	ATLASSERT (0);
+	return m_hr;
+      }
+      if(!ppErrorObject) {
+	ATLASSERT (0);
+	return WBEM_E_INVALID_PARAMETER;
+      }
+      HRESULT hr = m_pErrorObject->SpawnInstance(0,ppErrorObject);
+      if(FAILED(hr)) return hr;
+      VARIANT var;
+      VariantInit(&var);
+      var.vt = VT_I4;
+      var.lVal = ulStatusCode;
+      hr = (*ppErrorObject)->Put(lpwstrStatusCode,0,&var,0);
+      if(FAILED(hr)) return hr;
+      var.vt = VT_BSTR;
+      if(bstrDescription!=NULL) {
+	var.bstrVal = bstrDescription;
+	hr = (*ppErrorObject)->Put(lpwstrDescription,0,&var,0);
+	if(FAILED(hr)) return hr;
+      }
+      if(bstrOperation!=NULL) {
+	var.bstrVal = bstrOperation;
+	hr = (*ppErrorObject)->Put(lpwstrOperation,0,&var,0);
+	if(FAILED(hr)) return hr;
+      }
+      if(bstrParameter!=NULL) {
+	var.bstrVal = bstrParameter;
+	hr = (*ppErrorObject)->Put(lpwstrParameterInfo,0,&var,0);
+	if(FAILED(hr)) return hr;
+      }
+      if(bstrProviderName!=NULL) {
+	var.bstrVal = bstrProviderName;
+	hr = (*ppErrorObject)->Put(lpwstrProviderName,0,&var,0);
+	if(FAILED(hr)) return hr;
+      }
+      return hr;
+    }
+  };
+
+  class CIntrinsicEventProviderHelper : public CProviderHelper {
+  private:
+    CComPtr<IWbemClassObject> m_pCreationEventClass;
+    CComPtr<IWbemClassObject> m_pDeletionEventClass;
+    CComPtr<IWbemClassObject> m_pModificationEventClass;
+    HRESULT m_hr;
+  public:
+    CIntrinsicEventProviderHelper(IWbemServices *pNamespace,IWbemContext *pCtx) : CProviderHelper (pNamespace,pCtx) {
+      m_hr = WBEM_E_FAILED;
+      if(!pNamespace || !pCtx) {
+	m_hr = WBEM_E_INVALID_PARAMETER;
+	ATLASSERT (0);
+	return;
+      }
+      m_pCreationEventClass = NULL;
+      m_pModificationEventClass = NULL;
+      m_pDeletionEventClass = NULL;
+      BSTR bstrString = SysAllocString(L"__InstanceCreationEvent");
+      if(!bstrString) {
+	m_hr = WBEM_E_OUT_OF_MEMORY;
+	return;
+      }
+      m_hr = pNamespace->GetObject(bstrString,0,pCtx,&m_pCreationEventClass,NULL);
+      SysFreeString(bstrString);
+      bstrString=NULL;
+      if(FAILED(m_hr)) return;
+      bstrString = SysAllocString(L"__InstanceModificationEvent");
+      if(!bstrString) {
+	m_hr = WBEM_E_OUT_OF_MEMORY;
+	return;
+      }
+      m_hr = pNamespace->GetObject(bstrString,0,pCtx,&m_pModificationEventClass,NULL);
+      SysFreeString(bstrString);
+      bstrString=NULL;
+      if(FAILED(m_hr)) return;
+      bstrString = SysAllocString(L"__InstanceDeletionEvent");
+      if(!bstrString) {
+	m_hr = WBEM_E_OUT_OF_MEMORY;
+	return;
+      }
+      m_hr = pNamespace->GetObject(bstrString,0,pCtx,&m_pDeletionEventClass,NULL);
+      SysFreeString(bstrString);
+      bstrString=NULL;
+      if(FAILED(m_hr)) return;
+      return;
+    }
+    virtual ~CIntrinsicEventProviderHelper() { }
+    HRESULT WINAPI FireCreationEvent(IWbemClassObject *pNewInstance,IWbemObjectSink *pSink) {
+      if(FAILED(m_hr)) {
+	ATLASSERT (0);
+	return m_hr;
+      }
+      if(!pNewInstance || !pSink) {
+	ATLASSERT (0);
+	return WBEM_E_INVALID_PARAMETER;
+      }
+      CComPtr<IWbemClassObject> pEvtInstance;
+      HRESULT hr = m_pCreationEventClass->SpawnInstance(0,&pEvtInstance);
+      if(FAILED(hr)) return hr;
+      VARIANT var;
+      VariantInit(&var);
+      var.vt = VT_UNKNOWN;
+      CComQIPtr<IUnknown,&IID_IUnknown>pTemp(pNewInstance);
+      var.punkVal = pTemp;
+      hr = pEvtInstance->Put(L"TargetInstance",0,&var,0);
+      if(FAILED(hr)) return hr;
+      IWbemClassObject *_pEvtInstance = (IWbemClassObject*)pEvtInstance;
+      return pSink->Indicate(1,&_pEvtInstance);
+    }
+    HRESULT WINAPI FireDeletionEvent(IWbemClassObject *pInstanceToDelete,IWbemObjectSink *pSink) {
+      if(FAILED (m_hr)) {
+	ATLASSERT (0);
+	return m_hr;
+      }
+      if(!pInstanceToDelete || !pSink) {
+	ATLASSERT (0);
+	return WBEM_E_INVALID_PARAMETER;
+      }
+      CComPtr<IWbemClassObject> pEvtInstance;
+      HRESULT hr = m_pDeletionEventClass->SpawnInstance(0,&pEvtInstance);
+      if(FAILED(hr)) return hr;
+      VARIANT var;
+      VariantInit(&var);
+      var.vt = VT_UNKNOWN;
+      CComQIPtr<IUnknown,&IID_IUnknown>pTemp(pInstanceToDelete);
+      var.punkVal = pTemp;
+      hr = pEvtInstance->Put(L"TargetInstance",0,&var,0);
+      if(FAILED(hr)) return hr;
+      IWbemClassObject *_pEvtInstance = (IWbemClassObject*)pEvtInstance;
+      return pSink->Indicate(1,&_pEvtInstance);
+    }
+    HRESULT WINAPI FireModificationEvent(IWbemClassObject *pOldInstance,IWbemClassObject *pNewInstance,IWbemObjectSink *pSink) {
+      if(FAILED (m_hr)) {
+	ATLASSERT (0);
+	return m_hr;
+      }
+      if(!pOldInstance || !pNewInstance || !pSink) {
+	ATLASSERT (0);
+	return WBEM_E_INVALID_PARAMETER;
+      }
+      CComPtr<IWbemClassObject> pEvtInstance;
+      HRESULT hr = m_pModificationEventClass->SpawnInstance(0,&pEvtInstance);
+      if(FAILED(hr)) return hr;
+      VARIANT var;
+      VariantInit(&var);
+      var.vt = VT_UNKNOWN;
+      CComQIPtr<IUnknown,&IID_IUnknown>pTempNew(pNewInstance);
+      var.punkVal = pTempNew;
+      hr = pEvtInstance->Put(L"TargetInstance",0,&var,0);
+      if(FAILED(hr)) return hr;
+      CComQIPtr<IUnknown,&IID_IUnknown>pTempOld(pOldInstance);
+      var.punkVal = pTempOld;
+      hr = pEvtInstance->Put(L"PreviousInstance",0,&var,0);
+      if(FAILED(hr)) return hr;
+      IWbemClassObject *_pEvtInstance = (IWbemClassObject*)pEvtInstance;
+      return pSink->Indicate(1,&_pEvtInstance);
+    }
+  };
+
+  class CInstanceProviderHelper : public CProviderHelper {
+  public:
+    CInstanceProviderHelper (IWbemServices *pNamespace,IWbemContext *pCtx) : CProviderHelper (pNamespace,pCtx) { }
+    virtual ~CInstanceProviderHelper() { }
+    HRESULT WINAPI CheckInstancePath(IClassFactory *pParserFactory,const BSTR ObjectPath,const BSTR ClassName,ULONGLONG ullTest) {
+      if(!pParserFactory) {
+	ATLASSERT (0);
+	return WBEM_E_INVALID_PARAMETER;
+      }
+      CComPtr<IWbemPath>pPath;
+      HRESULT hr = pParserFactory->CreateInstance(NULL,IID_IWbemPath,(void **) &pPath);
+      if(FAILED(hr)) return WBEM_E_INVALID_PARAMETER;
+      hr = pPath->SetText(WBEMPATH_CREATE_ACCEPT_ALL,ObjectPath);
+      if(FAILED(hr)) return hr;
+      unsigned int nPathLen = SysStringLen(ObjectPath);
+      if(nPathLen >= (unsigned long)(-1)) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW);
+      unsigned long ulBufLen = (unsigned long)(nPathLen + 1);
+      WCHAR *wClass = new WCHAR[ulBufLen];
+      if(!wClass) return WBEM_E_OUT_OF_MEMORY;
+      hr = pPath->GetClassName(&ulBufLen,wClass);
+      if(FAILED(hr)) {
+	delete[] wClass;
+	return hr;
+      }
+      DWORD lcid = MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT);
+      if(CSTR_EQUAL!=CompareStringW(lcid,NORM_IGNORECASE,ClassName,-1,wClass,-1)) {
+	delete[] wClass;
+	return WBEM_E_NOT_FOUND;
+      }
+      delete[] wClass;
+      __MINGW_EXTENSION unsigned __int64 ullPathInfo;
+      hr = pPath->GetInfo(0L,&ullPathInfo);
+      if(FAILED(hr)) return hr;
+      if(!(ullPathInfo & ullTest)) return WBEM_E_INVALID_OBJECT_PATH;
+      return WBEM_S_NO_ERROR;
+    }
+  };
+
+  template <class T> class ATL_NO_VTABLE IWbemPullClassProviderImpl : public IWbemServices,public IWbemProviderInit {
+  public:
+    virtual HRESULT WINAPI OpenNamespace(const BSTR strNamespace,long lFlags,IWbemContext *pCtx,IWbemServices **ppWorkingNamespace,IWbemCallResult **ppResult){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI CancelAsyncCall(IWbemObjectSink *pSink){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI QueryObjectSink(long lFlags,IWbemObjectSink **ppResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI GetObject(const BSTR strObjectPath,long lFlags,IWbemContext *pCtx,IWbemClassObject **ppObject,IWbemCallResult **ppCallResult) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI PutClass(IWbemClassObject *pObject,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI DeleteClass(const BSTR strClass,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI CreateClassEnum(const BSTR strSuperclass,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI PutInstance(IWbemClassObject *pInst,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI PutInstanceAsync(IWbemClassObject *pInst,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI DeleteInstance(const BSTR strObjectPath,long lFlags,IWbemContext *pCtx,IWbemCallResult **ppCallResult){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI DeleteInstanceAsync(const BSTR strObjectPath,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler){return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI CreateInstanceEnum(const BSTR strClass,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI CreateInstanceEnumAsync(const BSTR strClass,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI ExecQuery(const BSTR strQueryLanguage,const BSTR strQuery,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI ExecNotificationQuery(const BSTR strQueryLanguage,const BSTR strQuery,long lFlags,IWbemContext *pCtx,IEnumWbemClassObject **ppEnum) {return WBEM_E_NOT_SUPPORTED;};
+    virtual HRESULT WINAPI ExecNotificationQueryAsync(const BSTR strQueryLanguage,const BSTR strQuery,long lFlags,IWbemContext *pCtx,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+    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;};
+    virtual HRESULT WINAPI ExecMethodAsync(const BSTR strObjectPath,const BSTR strMethodName,long lFlags,IWbemContext *pCtx,IWbemClassObject *pInParams,IWbemObjectSink *pResponseHandler) {return WBEM_E_NOT_SUPPORTED;};
+  };
+
+  class CImpersonateClientHelper {
+  private:
+    WINBOOL m_bImpersonate;
+  public:
+    CImpersonateClientHelper() { m_bImpersonate = FALSE; }
+    ~CImpersonateClientHelper() {
+      if(m_bImpersonate)
+	CoRevertToSelf();
+    }
+    HRESULT ImpersonateClient() {
+      HRESULT hr = S_OK;
+      if(SUCCEEDED(hr = CoImpersonateClient())) m_bImpersonate = TRUE;
+      return hr;
+    }
+    HRESULT GetCurrentImpersonationLevel (DWORD & a_Level) {
+      DWORD t_ImpersonationLevel = RPC_C_IMP_LEVEL_ANONYMOUS;
+      HANDLE t_ThreadToken = NULL;
+      HRESULT t_Result = S_OK;
+      if(SUCCEEDED(t_Result = CoImpersonateClient())) {
+	WINBOOL t_Status = OpenThreadToken (GetCurrentThread() ,TOKEN_QUERY,TRUE,&t_ThreadToken);
+	if(t_Status) {
+	  SECURITY_IMPERSONATION_LEVEL t_Level = SecurityAnonymous;
+	  DWORD t_Returned = 0;
+	  t_Status = GetTokenInformation (t_ThreadToken ,TokenImpersonationLevel ,&t_Level ,sizeof(SECURITY_IMPERSONATION_LEVEL),&t_Returned);
+	  CloseHandle (t_ThreadToken);
+	  if(t_Status==FALSE) {
+	    t_Result = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_WIN32,GetLastError());
+	  } else {
+	    switch(t_Level) {
+	    case SecurityAnonymous:
+	      {
+		t_ImpersonationLevel = RPC_C_IMP_LEVEL_ANONYMOUS;
+	      }
+	      break;
+	    case SecurityIdentification:
+	      {
+		t_ImpersonationLevel = RPC_C_IMP_LEVEL_IDENTIFY;
+	      }
+	      break;
+	    case SecurityImpersonation:
+	      {
+		t_ImpersonationLevel = RPC_C_IMP_LEVEL_IMPERSONATE;
+	      }
+	      break;
+	    case SecurityDelegation:
+	      {
+		t_ImpersonationLevel = RPC_C_IMP_LEVEL_DELEGATE;
+	      }
+	      break;
+	    default:
+	      {
+		t_Result = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_WIN32,E_UNEXPECTED);
+	      }
+	      break;
+	    }
+	  }
+	} else {
+	  t_Result = MAKE_HRESULT(SEVERITY_ERROR,FACILITY_WIN32,GetLastError());
+	}
+	CoRevertToSelf();
+      }
+      a_Level = t_ImpersonationLevel;
+      return t_Result;
+    }
+  };
+}
+#endif