//*************************************************************************** // // VPSERV.CPP // // Module: WBEM VIEW PROVIDER // // Purpose: Contains the WBEM services interfaces // // Copyright (c) 1998-2001 Microsoft Corporation, All Rights Reserved // //*************************************************************************** //need the following three lines //to get the security stuff to work #include "precomp.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern CRITICAL_SECTION g_CriticalSection; extern HRESULT SetSecurityLevelAndCloaking(IUnknown* pInterface, const wchar_t* prncpl); #ifdef UNICODE #if 0 extern HRESULT GetCurrentSecuritySettings(DWORD *pdwAuthnSvc, DWORD *pdwAuthzSvc, DWORD *pdwAuthLevel, DWORD *pdwImpLevel, DWORD *pdwCapabilities); void VPGetUserName() { DWORD dwBuffSz = 1024; wchar_t strBuff[1024]; GetUserName(strBuff, &dwBuffSz); //first get current security info then set it on the proxy... DWORD dwAuthnSvc = 0; DWORD dwAuthzSvc = 0; DWORD dwAuthLevel = 0; DWORD dwImpLevel = 0; DWORD dwCapabilities = 0; HRESULT hr = GetCurrentSecuritySettings(&dwAuthnSvc, &dwAuthzSvc, &dwAuthLevel, &dwImpLevel, &dwCapabilities); HANDLE hThreadTok = NULL; if (OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, TRUE, &hThreadTok) ) { DWORD dwBytesReturned = 0; UCHAR tokBuff [1024]; PTOKEN_USER ptokUser = (PTOKEN_USER)tokBuff; if (GetTokenInformation(hThreadTok, TokenUser, ptokUser, sizeof(tokBuff), &dwBytesReturned)) { wchar_t buffN[1024]; DWORD buffNlen = 1024; wchar_t buffD[1024]; DWORD buffDlen = 1024; SID_NAME_USE snu; if (!LookupAccountSid(NULL, ptokUser->User.Sid, buffN, &buffNlen, buffD, &buffDlen, &snu)) { DWORD dwErr = GetLastError(); } } CloseHandle(hThreadTok); } } #endif #endif wchar_t *UnicodeStringDuplicate ( const wchar_t *string ) { if ( string ) { int textLength = wcslen ( string ) ; wchar_t *textBuffer = new wchar_t [ textLength + 1 ] ; wcscpy ( textBuffer , string ) ; return textBuffer ; } else { return NULL ; } } wchar_t *UnicodeStringAppend ( const wchar_t *prefix , const wchar_t *suffix ) { int prefixTextLength = 0 ; if ( prefix ) { prefixTextLength = wcstombs ( NULL , prefix , 0 ) ; } int suffixTextLength = 0 ; if ( suffix ) { suffixTextLength = wcstombs ( NULL , suffix , 0 ) ; } if ( prefix || suffix ) { int textLength = prefixTextLength + suffixTextLength ; wchar_t *textBuffer = new wchar_t [ textLength + 1 ] ; if ( prefix ) { wcscpy ( textBuffer , prefix ) ; } if ( suffix ) { wcscpy ( & textBuffer [ prefixTextLength ] , suffix ) ; } return textBuffer ; } else return NULL ; } CWbemServerWrap::CWbemServerWrap(IWbemServices *pServ, const wchar_t* prncpl, const wchar_t* path) : m_Principal(NULL), m_Path(NULL) { m_ref = 0; m_MainServ = pServ; if (prncpl != NULL) { m_Principal = UnicodeStringDuplicate(prncpl); } if (path != NULL) { m_Path = SysAllocString(path); } if (m_MainServ) { m_MainServ->AddRef(); } } CWbemServerWrap::~CWbemServerWrap() { if (m_MainServ) { m_MainServ->Release(); } #ifdef UNICODE if (m_Lock.Lock()) { m_ProxyPool.RemoveAll(); m_Lock.Unlock(); } #endif if (m_Principal != NULL) { delete [] m_Principal; } if (m_Path != NULL) { SysFreeString(m_Path); } } IWbemServices* CWbemServerWrap::GetServerOrProxy() { IWbemServices * retVal = NULL; #ifdef UNICODE if (m_MainServ == NULL) { return m_MainServ; } //if (IsRemote()) { if (m_Lock.Lock()) { POSITION t_pos = m_ProxyPool.GetHeadPosition(); while (t_pos) { CWbemProxyServerWrap &t_srvRef = m_ProxyPool.GetNext(t_pos); if (!t_srvRef.m_InUse) { t_srvRef.m_InUse = TRUE; retVal = t_srvRef.m_Proxy; break; } } //calling back into COM so must unlock //addref MainServ then release it afterward; IWbemServices *t_MainCopy = m_MainServ; t_MainCopy->AddRef(); m_Lock.Unlock(); if (retVal == NULL) { IClientSecurity *pcs = NULL; if ( SUCCEEDED (t_MainCopy->QueryInterface(IID_IClientSecurity, (void**)&pcs)) ) { if (FAILED(pcs->CopyProxy(t_MainCopy, (IUnknown **)(&retVal)))) { retVal = NULL; } else { CWbemProxyServerWrap t_srv(retVal); t_srv.m_InUse = TRUE; if (m_Lock.Lock()) { //only store and use if m_MainServ is unchanged if (t_MainCopy == m_MainServ) { m_ProxyPool.AddTail(t_srv); } else { //pathological case, mainserv was bad and has changed //could recurse at this point but is it worth it? //not thought so at this time. retVal->Release(); retVal = NULL; } m_Lock.Unlock(); } else { //can't use this proxy if I can't store it retVal->Release(); retVal = NULL; } } pcs->Release(); } } t_MainCopy->Release(); if (retVal && FAILED(SetSecurityLevelAndCloaking(retVal, IsRemote() ? m_Principal : COLE_DEFAULT_PRINCIPAL))) { retVal->AddRef(); //addref for the release that Returning the proxy will do ReturnServerOrProxy(retVal); retVal = NULL; } } } //else //{ // retVal = m_MainServ; //} #else retVal = m_MainServ; #endif if (retVal) { retVal->AddRef(); } return retVal; } void CWbemServerWrap::ReturnServerOrProxy(IWbemServices* a_pServ) { #ifdef UNICODE //if (IsRemote()) { if (m_Lock.Lock()) { POSITION t_pos = m_ProxyPool.GetHeadPosition(); while (t_pos) { CWbemProxyServerWrap &t_proxyRef = m_ProxyPool.GetNext(t_pos); if (t_proxyRef.m_Proxy == a_pServ) { t_proxyRef.m_InUse = FALSE; break; } } m_Lock.Unlock(); } } #endif a_pServ->Release(); } BOOL CWbemServerWrap::ProxyBelongsTo(IWbemServices *a_proxy) { BOOL retVal = FALSE; #ifdef UNICODE if (IsRemote()) { if (m_Lock.Lock()) { POSITION t_pos = m_ProxyPool.GetHeadPosition(); while (t_pos) { CWbemProxyServerWrap &t_proxyRef = m_ProxyPool.GetNext(t_pos); if (t_proxyRef.m_Proxy == a_proxy) { retVal = TRUE; break; } } m_Lock.Unlock(); } } #endif return retVal; } void CWbemServerWrap::SetMainServer(IWbemServices *a_pServ) { #ifdef UNICODE if (m_Lock.Lock()) { if (m_MainServ) { m_MainServ->Release(); } m_MainServ = a_pServ; if (m_MainServ) { m_MainServ->AddRef(); } m_ProxyPool.RemoveAll(); m_Lock.Unlock(); } #endif } ULONG CWbemServerWrap::AddRef() { return (ULONG)(InterlockedIncrement(&m_ref)); } ULONG CWbemServerWrap::Release() { ULONG i = (ULONG)(InterlockedDecrement(&m_ref)); if (i == 0) { delete this; } return i; } void CIWbemServMap::EmptyMap() { if (Lock()) { RemoveAll(); Unlock(); } } ///////////////////////////////////////////////////////////////////////////// // Functions constructor, destructor and IUnknown //*************************************************************************** // // CViewProvServ ::CViewProvServ // CViewProvServ ::~CViewProvServ // //*************************************************************************** CViewProvServ ::CViewProvServ () : sm_Locator (NULL), sm_ConnectionMade (NULL), m_UserName (NULL), m_Initialised (FALSE), m_Server (NULL), m_Namespace (NULL), m_NotificationClassObject (NULL), m_ExtendedNotificationClassObject (NULL), m_GetNotifyCalled (FALSE), m_GetExtendedNotifyCalled (FALSE ), m_localeId (NULL) { EnterCriticalSection(&g_CriticalSection); CViewProvClassFactory :: objectsInProgress++ ; LeaveCriticalSection(&g_CriticalSection); m_ReferenceCount = 0 ; /* * Implementation */ sm_ConnectionMade = CreateEvent(NULL, TRUE, FALSE, NULL); } CViewProvServ ::~CViewProvServ(void) { delete [] m_localeId ; delete [] m_Namespace ; if ( m_Server ) m_Server->Release () ; if ( m_NotificationClassObject ) m_NotificationClassObject->Release () ; if ( m_ExtendedNotificationClassObject ) m_ExtendedNotificationClassObject->Release () ; if (sm_Locator != NULL) { sm_Locator->Release(); } if (NULL != sm_ConnectionMade) { CloseHandle(sm_ConnectionMade); } sm_ServerMap.EmptyMap(); if (sm_ServerMap.Lock()) { sm_OutStandingConnections.RemoveAll(); sm_ServerMap.Unlock(); } if (m_UserName != NULL) { SysFreeString(m_UserName); } EnterCriticalSection(&g_CriticalSection); CViewProvClassFactory :: objectsInProgress--; LeaveCriticalSection(&g_CriticalSection); } HRESULT CViewProvServ::GetUnsecApp(IUnsecuredApartment** ppLoc) { if (NULL == ppLoc) { return WBEM_E_INVALID_PARAMETER; } EnterCriticalSection(&g_CriticalSection); HRESULT hr = WBEM_NO_ERROR; if (NULL == sm_UnsecApp) { hr = CoCreateInstance(CLSID_UnsecuredApartment, NULL, CLSCTX_LOCAL_SERVER, IID_IUnsecuredApartment, ( void ** )&sm_UnsecApp); if (FAILED(hr)) { sm_UnsecApp = NULL; } else { sm_UnsecApp->AddRef(); } } else { sm_UnsecApp->AddRef(); } *ppLoc = sm_UnsecApp; LeaveCriticalSection(&g_CriticalSection); return hr; } #if 0 typedef HRESULT (__stdcall *VP_PROC_DllGetClassObject)(REFCLSID rclsid , REFIID riid, void **ppv); #endif HRESULT CViewProvServ::GetLocator(IWbemLocator **ppLoc) { if (NULL == ppLoc) { return WBEM_E_INVALID_PARAMETER; } else { *ppLoc = NULL; } HRESULT hr = WBEM_E_FAILED; if (m_criticalSection.Lock()) { if (NULL == sm_Locator) { m_criticalSection.Unlock(); #ifdef UNICODE hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, ( void ** )ppLoc); #else hr = CoCreateInstance(CLSID_WbemUnauthenticatedLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, ( void ** )ppLoc); #endif if (m_criticalSection.Lock()) { //another thread may have connected for us... if (NULL == sm_Locator) { if (SUCCEEDED(hr)) { sm_Locator = *ppLoc; sm_Locator->AddRef(); } } else { if (FAILED(hr)) { hr = WBEM_NO_ERROR; sm_Locator->AddRef(); *ppLoc = sm_Locator; } } } else { return hr; } } else { hr = WBEM_NO_ERROR; sm_Locator->AddRef(); *ppLoc = sm_Locator; } m_criticalSection.Unlock(); } return hr; } //*************************************************************************** // // CViewProvServ ::QueryInterface // CViewProvServ ::AddRef // CViewProvServ ::Release // // Purpose: IUnknown members for CViewProvServ object. //*************************************************************************** STDMETHODIMP CViewProvServ ::QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { SetStructuredExceptionHandler seh; try { if (iplpv == NULL) { return E_INVALIDARG; } *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( IWbemServices* ) this ; } else if ( iid == IID_IWbemServices ) { *iplpv = ( IWbemServices* ) this ; } else if ( iid == IID_IWbemProviderInit ) { *iplpv = ( IWbemProviderInit* ) this ; } if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ; return S_OK ; } else { return E_NOINTERFACE ; } } catch(Structured_Exception e_SE) { return E_UNEXPECTED; } catch(Heap_Exception e_HE) { return E_OUTOFMEMORY; } catch(...) { return E_UNEXPECTED; } } STDMETHODIMP_(ULONG) CViewProvServ ::AddRef(void) { SetStructuredExceptionHandler seh; try { return InterlockedIncrement ( & m_ReferenceCount ) ; } catch(Structured_Exception e_SE) { return 0; } catch(Heap_Exception e_HE) { return 0; } catch(...) { return 0; } } STDMETHODIMP_(ULONG) CViewProvServ ::Release(void) { SetStructuredExceptionHandler seh; try { LONG t_Ref ; if ( ( t_Ref = InterlockedDecrement ( & m_ReferenceCount ) ) == 0 ) { delete this ; return 0 ; } else { return t_Ref ; } } catch(Structured_Exception e_SE) { return 0; } catch(Heap_Exception e_HE) { return 0; } catch(...) { return 0; } } IWbemServices *CViewProvServ :: GetServer () { if ( m_Server ) m_Server->AddRef () ; return m_Server ; } void CViewProvServ :: SetLocaleId ( wchar_t *localeId ) { m_localeId = UnicodeStringDuplicate ( localeId ) ; } wchar_t *CViewProvServ :: GetNamespace () { return m_Namespace ; } void CViewProvServ :: SetNamespace ( wchar_t *a_Namespace ) { m_Namespace = UnicodeStringDuplicate ( a_Namespace ) ; } IWbemClassObject *CViewProvServ :: GetNotificationObject ( WbemProvErrorObject &a_errorObject, IWbemContext *pCtx ) { if ( m_NotificationClassObject ) { m_NotificationClassObject->AddRef () ; } else { BOOL t_Status = CreateNotificationObject ( a_errorObject, pCtx ) ; if ( t_Status ) { /* * Keep around until we close */ m_NotificationClassObject->AddRef () ; } } return m_NotificationClassObject ; } IWbemClassObject *CViewProvServ :: GetExtendedNotificationObject ( WbemProvErrorObject &a_errorObject, IWbemContext *pCtx ) { if ( m_ExtendedNotificationClassObject ) { m_ExtendedNotificationClassObject->AddRef () ; } else { BOOL t_Status = CreateExtendedNotificationObject ( a_errorObject, pCtx ) ; if ( t_Status ) { /* * Keep around until we close */ m_ExtendedNotificationClassObject->AddRef () ; } } return m_ExtendedNotificationClassObject ; } BOOL CViewProvServ :: CreateExtendedNotificationObject ( WbemProvErrorObject &a_errorObject, IWbemContext *pCtx ) { if ( m_GetExtendedNotifyCalled ) { if ( m_ExtendedNotificationClassObject ) return TRUE ; else return FALSE ; } else m_GetExtendedNotifyCalled = TRUE ; BOOL t_Status = TRUE ; BSTR t_bstrTemp = SysAllocString(WBEM_CLASS_EXTENDEDSTATUS); HRESULT t_Result = m_Server->GetObject ( t_bstrTemp , 0 , pCtx, & m_ExtendedNotificationClassObject , NULL ) ; SysFreeString(t_bstrTemp); if ( ! SUCCEEDED ( t_Result ) ) { t_Status = FALSE ; a_errorObject.SetStatus ( WBEM_PROV_E_INVALID_OBJECT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Failed to get __ExtendedStatus" ) ; m_ExtendedNotificationClassObject = NULL ; } return t_Status ; } BOOL CViewProvServ :: CreateNotificationObject ( WbemProvErrorObject &a_errorObject, IWbemContext *pCtx ) { if ( m_GetNotifyCalled ) { if ( m_NotificationClassObject ) return TRUE ; else return FALSE ; } else m_GetNotifyCalled = TRUE ; BOOL t_Status = TRUE ; BSTR t_bstrTemp = SysAllocString(WBEM_CLASS_EXTENDEDSTATUS); HRESULT t_Result = m_Server->GetObject ( t_bstrTemp , 0 , pCtx, & m_NotificationClassObject , NULL ) ; SysFreeString(t_bstrTemp); if ( ! SUCCEEDED ( t_Result ) ) { t_Status = FALSE ; a_errorObject.SetStatus ( WBEM_PROV_E_INVALID_OBJECT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Failed to get __ExtendedStatus" ) ; m_NotificationClassObject = NULL; } return t_Status ; } ///////////////////////////////////////////////////////////////////////////// // Functions for the IWbemServices interface that are handled here HRESULT CViewProvServ :: CancelAsyncCall ( IWbemObjectSink __RPC_FAR *pSink ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: QueryObjectSink ( long lFlags, IWbemObjectSink __RPC_FAR* __RPC_FAR* ppHandler ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: GetObject ( const BSTR ObjectPath, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemClassObject __RPC_FAR* __RPC_FAR *ppObject, IWbemCallResult __RPC_FAR* __RPC_FAR *ppCallResult ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: GetObjectAsync ( const BSTR ObjectPath, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR* pHandler ) { HRESULT hr = S_OK; SetStructuredExceptionHandler seh; GetObjectTaskObject *t_AsyncEvent = NULL; try { if (pHandler == NULL) { hr = WBEM_E_INVALID_PARAMETER; } else { hr = WbemCoImpersonateClient(); #ifdef UNICODE #if 0 DWORD dwBuffSz = 1024; wchar_t strBuff[1024]; GetUserName(strBuff, &dwBuffSz); VPGetUserName(); #endif #endif DebugOut1( CViewProvServ::sm_debugLog->Write ( _T("\r\n") ) ; CViewProvServ::sm_debugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, _T("CViewProvServ::GetObjectAsync ()") ) ; ) if (SUCCEEDED(hr)) { /* * Create Asynchronous GetObjectByPath object */ t_AsyncEvent = new GetObjectTaskObject ( this , ObjectPath , lFlags , pHandler , pCtx, NULL, NULL ) ; t_AsyncEvent->GetObject(); t_AsyncEvent->Release(); t_AsyncEvent = NULL; WbemCoRevertToSelf(); } else { hr = WBEM_E_ACCESS_DENIED; } DebugOut1( CViewProvServ::sm_debugLog->WriteW ( L"Returning from CViewProvServ::GetObjectAsync ( (%s) ) with Result = (%lx)" , ObjectPath , hr ) ; ) } } catch(Structured_Exception e_SE) { hr = WBEM_E_UNEXPECTED; } catch(Heap_Exception e_HE) { hr = WBEM_E_OUT_OF_MEMORY; } catch(...) { hr = WBEM_E_UNEXPECTED; } try { if (t_AsyncEvent != NULL) { t_AsyncEvent->CleanUpObjSinks(TRUE); t_AsyncEvent->Release(); } } catch(Structured_Exception e_SE) { hr = WBEM_E_UNEXPECTED; } catch(Heap_Exception e_HE) { hr = WBEM_E_OUT_OF_MEMORY; } catch(...) { hr = WBEM_E_UNEXPECTED; } return hr ; } HRESULT CViewProvServ :: PutClass ( IWbemClassObject __RPC_FAR* pClass , long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemCallResult __RPC_FAR* __RPC_FAR* ppCallResult ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: PutClassAsync ( IWbemClassObject __RPC_FAR* pClass, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR* pHandler ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: DeleteClass ( const BSTR Class, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemCallResult __RPC_FAR* __RPC_FAR* ppCallResult ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: DeleteClassAsync ( const BSTR Class, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR* pHandler ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: CreateClassEnum ( const BSTR Superclass, long lFlags, IWbemContext __RPC_FAR *pCtx, IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum ) { return WBEM_E_NOT_AVAILABLE ; } SCODE CViewProvServ :: CreateClassEnumAsync ( const BSTR Superclass, long lFlags, IWbemContext __RPC_FAR* pCtx, IWbemObjectSink __RPC_FAR* pHandler ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: PutInstance ( IWbemClassObject __RPC_FAR *pInstance, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: PutInstanceAsync ( IWbemClassObject __RPC_FAR* pInstance, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR* pHandler ) { HRESULT t_Result = S_OK ; SetStructuredExceptionHandler seh; PutInstanceTaskObject *t_AsyncEvent = NULL; try { if (pHandler == NULL) { t_Result = WBEM_E_INVALID_PARAMETER; } else { t_Result = WbemCoImpersonateClient(); #ifdef UNICODE #if 0 DWORD dwBuffSz = 1024; wchar_t strBuff[1024]; GetUserName(strBuff, &dwBuffSz); VPGetUserName(); #endif #endif DebugOut1( CViewProvServ::sm_debugLog->Write ( _T("\r\n") ) ; CViewProvServ::sm_debugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, _T("CViewProvServ::PutInstanceAsync ()") ) ; ) if (SUCCEEDED(t_Result)) { /* * Create Asynchronous GetObjectByPath object */ t_AsyncEvent = new PutInstanceTaskObject ( this , pInstance , lFlags , pHandler , pCtx ) ; t_AsyncEvent->PutInstance(); t_AsyncEvent->Release(); t_AsyncEvent = NULL; WbemCoRevertToSelf(); } else { t_Result = WBEM_E_ACCESS_DENIED; } DebugOut1( CViewProvServ::sm_debugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, _T("Returning from CViewProvServ::PutInstanceAsync with Result = (%lx)"), t_Result ) ; ) } } catch(Structured_Exception e_SE) { t_Result = WBEM_E_UNEXPECTED; } catch(Heap_Exception e_HE) { t_Result = WBEM_E_OUT_OF_MEMORY; } catch(...) { t_Result = WBEM_E_UNEXPECTED; } try { if (t_AsyncEvent != NULL) { t_AsyncEvent->Release(); } } catch(Structured_Exception e_SE) { t_Result = WBEM_E_UNEXPECTED; } catch(Heap_Exception e_HE) { t_Result = WBEM_E_OUT_OF_MEMORY; } catch(...) { t_Result = WBEM_E_UNEXPECTED; } return t_Result ; } HRESULT CViewProvServ :: DeleteInstance ( const BSTR ObjectPath, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: DeleteInstanceAsync ( const BSTR ObjectPath, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR *pHandler ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: CreateInstanceEnum ( const BSTR Class, long lFlags, IWbemContext __RPC_FAR *pCtx, IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: CreateInstanceEnumAsync ( const BSTR Class, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR* pHandler ) { HRESULT t_Result = S_OK ; SetStructuredExceptionHandler seh; ExecQueryTaskObject *t_AsyncEvent = NULL; BSTR Query = NULL; try { if (pHandler == NULL) { t_Result = WBEM_E_INVALID_PARAMETER; } else { t_Result = WbemCoImpersonateClient(); #ifdef UNICODE #if 0 DWORD dwBuffSz = 1024; wchar_t strBuff[1024]; GetUserName(strBuff, &dwBuffSz); VPGetUserName(); #endif #endif DebugOut1( CViewProvServ::sm_debugLog->Write ( _T("\r\n") ) ; CViewProvServ::sm_debugLog->WriteW ( L"CViewProvServ::CreateInstanceEnumAsync ( (%s) )" , Class ) ; ) if (SUCCEEDED(t_Result)) { /* * Create Synchronous Enum Instance object */ Query = SysAllocStringLen(NULL, 33 + (wcslen(Class) * 2)); if (Query == NULL) { throw Heap_Exception(Heap_Exception::HEAP_ERROR::E_ALLOCATION_ERROR); } wcscpy(Query, ENUM_INST_QUERY_START); wcscat(Query, Class); wcscat(Query, ENUM_INST_QUERY_MID); wcscat(Query, Class); wcscat(Query, END_QUOTE); t_AsyncEvent = new ExecQueryTaskObject ( this , WBEM_QUERY_LANGUAGE_SQL1 , Query , lFlags , pHandler , pCtx ) ; t_AsyncEvent->ExecQuery(); t_AsyncEvent->Release(); t_AsyncEvent = NULL; SysFreeString(Query); WbemCoRevertToSelf(); } else { t_Result = WBEM_E_ACCESS_DENIED; } DebugOut1( CViewProvServ::sm_debugLog->WriteW ( L"Returning from CViewProvServ::CreateInstanceEnumAsync ( (%s),(%s) ) with Result = (%lx)" , Class, Query, t_Result ) ; ) } } catch(Structured_Exception e_SE) { t_Result = WBEM_E_UNEXPECTED; } catch(Heap_Exception e_HE) { t_Result = WBEM_E_OUT_OF_MEMORY; } catch(...) { t_Result = WBEM_E_UNEXPECTED; } try { if (t_AsyncEvent != NULL) { t_AsyncEvent->CleanUpObjSinks(TRUE); t_AsyncEvent->Release(); SysFreeString(Query); } } catch(Structured_Exception e_SE) { t_Result = WBEM_E_UNEXPECTED; } catch(Heap_Exception e_HE) { t_Result = WBEM_E_OUT_OF_MEMORY; } catch(...) { t_Result = WBEM_E_UNEXPECTED; } return t_Result ; } HRESULT CViewProvServ :: ExecQuery ( const BSTR QueryLanguage, const BSTR Query, long lFlags, IWbemContext __RPC_FAR *pCtx, IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: ExecQueryAsync ( const BSTR QueryFormat, const BSTR Query, long lFlags, IWbemContext __RPC_FAR* pCtx, IWbemObjectSink __RPC_FAR* pHandler ) { HRESULT t_Result = S_OK ; SetStructuredExceptionHandler seh; ExecQueryTaskObject *t_AsyncEvent = NULL; try { if (pHandler == NULL) { t_Result = WBEM_E_INVALID_PARAMETER; } else { t_Result = WbemCoImpersonateClient(); #ifdef UNICODE #if 0 DWORD dwBuffSz = 1024; wchar_t strBuff[1024]; GetUserName(strBuff, &dwBuffSz); VPGetUserName(); #endif #endif DebugOut1( CViewProvServ::sm_debugLog->Write ( _T("\r\n") ) ; CViewProvServ::sm_debugLog->WriteW ( L"CViewProvServ::ExecQueryAsync ( (%s),(%s) )" , QueryFormat , Query ) ; ) if (SUCCEEDED(t_Result)) { /* * Create Synchronous Enum Instance object */ pHandler->SetStatus(WBEM_STATUS_REQUIREMENTS, S_OK, NULL, NULL); t_AsyncEvent = new ExecQueryTaskObject ( this , QueryFormat , Query , lFlags , pHandler , pCtx ) ; t_AsyncEvent->ExecQuery(); t_AsyncEvent->Release(); t_AsyncEvent = NULL; WbemCoRevertToSelf(); } else { t_Result = WBEM_E_ACCESS_DENIED; } DebugOut1( CViewProvServ::sm_debugLog->WriteW ( L"Returning from CViewProvServ::ExecqQueryAsync ( (%s),(%s) ) with Result = (%lx)" , QueryFormat , Query , t_Result ) ; ) } } catch(Structured_Exception e_SE) { t_Result = WBEM_E_UNEXPECTED; } catch(Heap_Exception e_HE) { t_Result = WBEM_E_OUT_OF_MEMORY; } catch(...) { t_Result = WBEM_E_UNEXPECTED; } try { if (t_AsyncEvent != NULL) { t_AsyncEvent->CleanUpObjSinks(TRUE); t_AsyncEvent->Release(); } } catch(Structured_Exception e_SE) { t_Result = WBEM_E_UNEXPECTED; } catch(Heap_Exception e_HE) { t_Result = WBEM_E_OUT_OF_MEMORY; } catch(...) { t_Result = WBEM_E_UNEXPECTED; } return t_Result ; } HRESULT CViewProvServ :: ExecNotificationQuery ( const BSTR QueryLanguage, const BSTR Query, long lFlags, IWbemContext __RPC_FAR *pCtx, IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CViewProvServ :: ExecNotificationQueryAsync ( const BSTR QueryLanguage, const BSTR Query, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR *pHandler ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT STDMETHODCALLTYPE CViewProvServ :: ExecMethod( const BSTR ObjectPath, const BSTR MethodName, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemClassObject __RPC_FAR *pInParams, IWbemClassObject __RPC_FAR *__RPC_FAR *ppOutParams, IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT STDMETHODCALLTYPE CViewProvServ :: ExecMethodAsync ( const BSTR ObjectPath, const BSTR MethodName, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemClassObject __RPC_FAR *pInParams, IWbemObjectSink __RPC_FAR *pResponseHandler ) { HRESULT t_Result = S_OK ; SetStructuredExceptionHandler seh; ExecMethodTaskObject *t_AsyncEvent = NULL; try { if (pResponseHandler == NULL) { t_Result = WBEM_E_INVALID_PARAMETER; } else { t_Result = WbemCoImpersonateClient(); #ifdef UNICODE #if 0 DWORD dwBuffSz = 1024; wchar_t strBuff[1024]; GetUserName(strBuff, &dwBuffSz); VPGetUserName(); #endif #endif DebugOut1( CViewProvServ::sm_debugLog->Write ( _T("\r\n") ) ; CViewProvServ::sm_debugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, _T("CViewProvServ::ExecMethodAsync ()") ) ; ) if (SUCCEEDED(t_Result)) { /* * Create Asynchronous GetObjectByPath object */ t_AsyncEvent = new ExecMethodTaskObject ( this , ObjectPath , MethodName , lFlags , pInParams , pResponseHandler , pCtx ) ; t_AsyncEvent->ExecMethod(); t_AsyncEvent->Release(); t_AsyncEvent = NULL; WbemCoRevertToSelf(); } else { t_Result = WBEM_E_ACCESS_DENIED; } DebugOut1( CViewProvServ::sm_debugLog->WriteW ( L"Returning from CViewProvServ::ExecMethodAsync ( (%s) ) with Result = (%lx)" , ObjectPath , t_Result ) ; ) } } catch(Structured_Exception e_SE) { t_Result = WBEM_E_UNEXPECTED; } catch(Heap_Exception e_HE) { t_Result = WBEM_E_OUT_OF_MEMORY; } catch(...) { t_Result = WBEM_E_UNEXPECTED; } try { if (t_AsyncEvent != NULL) { t_AsyncEvent->Release(); } } catch(Structured_Exception e_SE) { t_Result = WBEM_E_UNEXPECTED; } catch(Heap_Exception e_HE) { t_Result = WBEM_E_OUT_OF_MEMORY; } catch(...) { t_Result = WBEM_E_UNEXPECTED; } return t_Result ; } HRESULT CViewProvServ :: Initialize( LPWSTR pszUser, LONG lFlags, LPWSTR pszNamespace, LPWSTR pszLocale, IWbemServices *pCIMOM, // For anybody IWbemContext *pCtx, IWbemProviderInitSink *pInitSink // For init signals ) { SetStructuredExceptionHandler seh; try { DebugOut1( CViewProvServ::sm_debugLog->Write ( _T("\r\n") ) ; CViewProvServ::sm_debugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, _T("CViewProvServ::Initialize ") ) ; ) if ((pCIMOM == NULL) || (pInitSink == NULL) || (pszNamespace == NULL)) { return WBEM_E_INVALID_PARAMETER; } #ifndef UNICODE if (pszUser == NULL) { return WBEM_E_INVALID_PARAMETER; } m_UserName = SysAllocString(pszUser); #endif m_Server = pCIMOM ; m_Server->AddRef () ; m_NamespacePath.SetNamespacePath ( pszNamespace ) ; pInitSink->SetStatus ( WBEM_S_INITIALIZED , 0 ) ; DebugOut1( CViewProvServ::sm_debugLog->WriteFileAndLine ( _T(__FILE__),__LINE__, _T("Returning From CImpPropProv::Initialize () ") ) ; ) } catch(Structured_Exception e_SE) { return WBEM_E_UNEXPECTED; } catch(Heap_Exception e_HE) { return WBEM_E_OUT_OF_MEMORY; } catch(...) { return WBEM_E_UNEXPECTED; } return WBEM_NO_ERROR ; } HRESULT STDMETHODCALLTYPE CViewProvServ::OpenNamespace ( const BSTR ObjectPath, long lFlags, IWbemContext FAR* pCtx, IWbemServices FAR* FAR* pNewContext, IWbemCallResult FAR* FAR* ppErrorObject ) { return WBEM_E_NOT_AVAILABLE ; }