//*************************************************************************** // // Copyright (c) 1998-2000 Microsoft Corporation // // SERVICES.CPP // // rogerbo 26-May-98 Created. // // Defines the implementation of ISWbemServicesEx // //*************************************************************************** #include "precomp.h" #include "objsink.h" //*************************************************************************** // // SCODE CSWbemServices::ExecQueryAsync // // DESCRIPTION: // // Execute an asynchronous query // // PARAMETERS: // // bsQuery The query strimg // pAsyncNotify The notification sink // bsQueryLanguage The query language descriptor (e.g."WQL") // lFlags Flags // pContext Any context information // pAsyncContext asynchronous context information // ppEnum Returns the sink // // RETURN VALUES: // // WBEM_S_NO_ERROR success // WBEM_E_INVALID_PARAMETER bad input parameters // WBEM_E_FAILED otherwise // //*************************************************************************** HRESULT STDMETHODCALLTYPE CSWbemServices::ExecQueryAsync ( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [in] */ BSTR Query, /* [defaultvalue][optional][in] */ BSTR QueryLanguage, /* [defaultvalue][optional][in] */ long lFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_SecurityInfo) { IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy (); if (pIWbemServices) { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, this, pAsyncNotify, pAsyncContext); if (pSink) { // Get the context IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (pContext, m_pIServiceProvider); bool needToResetSecurity = false; HANDLE hThreadToken = NULL; /* * We OR in the WBEM_FLAG_ENSURE_LOCATABLE flag to * guarantee that the returned objects have the __RELPATH * property included. This is in case anyone calls a * method subsequently on such an object, as the "." * notation requires that the __RELPATH property be present. */ if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIWbemServices->ExecQueryAsync (QueryLanguage, Query, lFlags | WBEM_FLAG_ENSURE_LOCATABLE, pIContext, pSink); // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); // Restore original privileges on this thread if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); SetWbemError (this); if (pIContext) pIContext->Release (); } else hr = wbemErrInvalidParameter; pIWbemServices->Release (); } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemServices::GetAsync ( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [defaultvalue][optional][in] */ BSTR strObjectPath, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_SecurityInfo) { IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy (); if (pIWbemServices) { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, this, pAsyncNotify, pAsyncContext); if (pSink) { // Get the context IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (objContext, m_pIServiceProvider); bool needToResetSecurity = false; HANDLE hThreadToken = NULL; if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIWbemServices->GetObjectAsync ( (strObjectPath && (0 < wcslen(strObjectPath))) ? strObjectPath : NULL, iFlags, pIContext, pSink); // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); // Restore original privileges on this thread if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); SetWbemError (this); if (pIContext) pIContext->Release (); } else hr = wbemErrInvalidParameter; pIWbemServices->Release (); } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemServices::DeleteAsync ( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [in] */ BSTR strObjectPath, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_SecurityInfo) { CComPtr pIWbemServices = GetIWbemServices (); if (pIWbemServices) { CWbemPathCracker pathCracker (strObjectPath); if ((pathCracker.GetType () != CWbemPathCracker::WbemPathType::wbemPathTypeError) && pathCracker.IsClassOrInstance ()) { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, this, pAsyncNotify, pAsyncContext); if (pSink) { // Get the context IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (objContext, m_pIServiceProvider); bool needToResetSecurity = false; HANDLE hThreadToken = NULL; if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) { if (pathCracker.IsInstance ()) hr = pIWbemServices->DeleteInstanceAsync (strObjectPath, iFlags, pIContext, pSink); else hr = pIWbemServices->DeleteClassAsync (strObjectPath, iFlags, pIContext, pSink); } // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); // Restore original privileges on this thread if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); SetWbemError (this); if (pIContext) pIContext->Release (); } else hr = wbemErrInvalidParameter; } else hr = wbemErrInvalidParameter; } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemServices::InstancesOfAsync ( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [in] */ BSTR strClass, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_SecurityInfo) { IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy (); if (pIWbemServices) { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, this, pAsyncNotify, pAsyncContext); if (pSink) { // Get the context IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (objContext, m_pIServiceProvider); bool needToResetSecurity = false; HANDLE hThreadToken = NULL; if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIWbemServices->CreateInstanceEnumAsync (strClass, iFlags, pIContext, pSink); // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); // Restore original privileges on this thread if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); SetWbemError (this); if (pIContext) pIContext->Release (); } else hr = wbemErrInvalidParameter; pIWbemServices->Release (); } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemServices::SubclassesOfAsync ( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [defaultvalue][optional][in] */ BSTR strSuperclass, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_SecurityInfo) { IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy (); if (pIWbemServices) { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, this, pAsyncNotify, pAsyncContext); if (pSink) { // Get the context IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (objContext, m_pIServiceProvider); bool needToResetSecurity = false; HANDLE hThreadToken = NULL; if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIWbemServices->CreateClassEnumAsync (strSuperclass, iFlags, pIContext, pSink); // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); // Restore original privileges on this thread if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); SetWbemError (this); if (pIContext) pIContext->Release (); } else hr = wbemErrInvalidParameter; pIWbemServices->Release (); } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemServices::AssociatorsOfAsync ( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [in] */ BSTR strObjectPath, /* [defaultvalue][optional][in] */ BSTR strAssocClass, /* [defaultvalue][optional][in] */ BSTR strResultClass, /* [defaultvalue][optional][in] */ BSTR strResultRole, /* [defaultvalue][optional][in] */ BSTR strRole, /* [defaultvalue][optional][in] */ VARIANT_BOOL bClassesOnly, /* [defaultvalue][optional][in] */ VARIANT_BOOL bSchemaOnly, /* [defaultvalue][optional][in] */ BSTR strRequiredAssocQualifier, /* [defaultvalue][optional][in] */ BSTR strRequiredQualifier, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (NULL == strObjectPath) hr = WBEM_E_INVALID_PARAMETER; else if (m_SecurityInfo) { IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy (); if (pIWbemServices) { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, this, pAsyncNotify, pAsyncContext); if (pSink) { // Get the context IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (objContext, m_pIServiceProvider); // Format the query string BSTR bsQueryLanguage = SysAllocString (OLESTR("WQL")); BSTR bsQuery = FormatAssociatorsQuery (strObjectPath, strAssocClass, strResultClass, strResultRole, strRole, bClassesOnly, bSchemaOnly, strRequiredAssocQualifier, strRequiredQualifier); bool needToResetSecurity = false; HANDLE hThreadToken = NULL; /* * We OR in the WBEM_FLAG_ENSURE_LOCATABLE flag to * guarantee that the returned objects have the __RELPATH * property included. This is in case anyone calls a * method subsequently on such an object, as the "." * notation requires that the __RELPATH property be present. */ if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIWbemServices->ExecQueryAsync (bsQueryLanguage, bsQuery, iFlags | WBEM_FLAG_ENSURE_LOCATABLE, pIContext, pSink); // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); SetWbemError (this); SysFreeString (bsQuery); SysFreeString (bsQueryLanguage); if (pIContext) pIContext->Release (); } else hr = wbemErrInvalidParameter; pIWbemServices->Release (); } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemServices::ReferencesToAsync ( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [in] */ BSTR strObjectPath, /* [defaultvalue][optional][in] */ BSTR strResultClass, /* [defaultvalue][optional][in] */ BSTR strRole, /* [defaultvalue][optional][in] */ VARIANT_BOOL bClassesOnly, /* [defaultvalue][optional][in] */ VARIANT_BOOL bSchemaOnly, /* [defaultvalue][optional][in] */ BSTR strRequiredQualifier, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (NULL == strObjectPath) hr = WBEM_E_INVALID_PARAMETER; else if (m_SecurityInfo) { IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy (); if (pIWbemServices) { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, this, pAsyncNotify, pAsyncContext); if (pSink) { // Get the context IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (objContext, m_pIServiceProvider); // Format the query string CComBSTR bsQueryLanguage = SysAllocString (OLESTR("WQL")); CComBSTR bsQuery = FormatReferencesQuery (strObjectPath, strResultClass, strRole, bClassesOnly, bSchemaOnly, strRequiredQualifier); bool needToResetSecurity = false; HANDLE hThreadToken = NULL; /* * We OR in the WBEM_FLAG_ENSURE_LOCATABLE flag to * guarantee that the returned objects have the __RELPATH * property included. This is in case anyone calls a * method subsequently on such an object, as the "." * notation requires that the __RELPATH property be present. */ if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIWbemServices->ExecQueryAsync (bsQueryLanguage, bsQuery, iFlags | WBEM_FLAG_ENSURE_LOCATABLE, pIContext, pSink); // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); SetWbemError (this); if (pIContext) pIContext->Release (); } else hr = wbemErrInvalidParameter; pIWbemServices->Release (); } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemServices::ExecNotificationQueryAsync ( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [in] */ BSTR Query, /* [defaultvalue][optional][in] */ BSTR strQueryLanguage, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_SecurityInfo) { IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy (); if (pIWbemServices) { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, this, pAsyncNotify, pAsyncContext); if (pSink) { // Get the context IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (objContext, m_pIServiceProvider); bool needToResetSecurity = false; HANDLE hThreadToken = NULL; if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIWbemServices->ExecNotificationQueryAsync (strQueryLanguage, Query, iFlags, pIContext, pSink); // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); SetWbemError (this); if (pIContext) pIContext->Release (); } else hr = wbemErrInvalidParameter; pIWbemServices->Release (); } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemServices::ExecMethodAsync ( /* [in] */ IDispatch __RPC_FAR *pAsyncNotify, /* [in] */ BSTR strObjectPath, /* [in] */ BSTR strMethodName, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objInParams, /* [defaultvalue][optional][in] */ long iFlags, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *objContext, /* [defaultvalue][optional][in] */ IDispatch __RPC_FAR *pAsyncContext ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_SecurityInfo) { IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy (); if (pIWbemServices) { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, this, pAsyncNotify, pAsyncContext); if (pSink) { IWbemClassObject *pIInParams = CSWbemObject::GetIWbemClassObject (objInParams); // Get the context IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (objContext, m_pIServiceProvider); bool needToResetSecurity = false; HANDLE hThreadToken = NULL; if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIWbemServices->ExecMethodAsync (strObjectPath, strMethodName, iFlags, pIContext, pIInParams, pSink); // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); SetWbemError (this); if (pIContext) pIContext->Release (); if (pIInParams) pIInParams->Release (); } else hr = wbemErrInvalidParameter; pIWbemServices->Release (); } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } HRESULT STDMETHODCALLTYPE CSWbemServices::PutAsync ( /* [in] */ ISWbemSink *pAsyncNotify, /* [in] */ ISWbemObjectEx *objObject, /* [in] */ long iFlags, /* [in] */ /*ISWbemNamedValueSet*/ IDispatch *objContext, /* [in] */ /*ISWbemNamedValueSet*/ IDispatch *pAsyncContext ) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_SecurityInfo) { IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy (); if (pIWbemServices) { if (pAsyncNotify) { IWbemClassObject *pWbemClassObject = CSWbemObject::GetIWbemClassObject (objObject); if (pWbemClassObject) { // Figure out whether this is a class or instance VARIANT var; VariantInit (&var); if (WBEM_S_NO_ERROR == pWbemClassObject->Get (WBEMS_SP_GENUS, 0, &var, NULL, NULL)) { IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (objContext, m_pIServiceProvider); if (WBEM_GENUS_CLASS == var.lVal) { // Save the class name for later VARIANT nameVar; VariantInit (&nameVar); /* * Note we must check that returned value is a BSTR - it could be a VT_NULL if * the __CLASS property has not yet been set. */ if ((WBEM_S_NO_ERROR == pWbemClassObject->Get (WBEMS_SP_CLASS, 0, &nameVar, NULL, NULL)) && (VT_BSTR == V_VT(&nameVar))) { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, this, pAsyncNotify, pAsyncContext, true, nameVar.bstrVal); if (pSink) { bool needToResetSecurity = false; HANDLE hThreadToken = NULL; if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIWbemServices->PutClassAsync (pWbemClassObject, iFlags, pIContext, pSink); // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); } } VariantClear (&nameVar); } else { // Create the sink CWbemObjectSink *pWbemObjectSink; IWbemObjectSink *pSink = CWbemObjectSink::CreateObjectSink(&pWbemObjectSink, this, pAsyncNotify, pAsyncContext, true); if (pSink) { bool needToResetSecurity = false; HANDLE hThreadToken = NULL; if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIWbemServices->PutInstanceAsync (pWbemClassObject, iFlags, pIContext, pSink); // Check to see if we need to release the stub (either we failed locally // or via a re-entrant call to SetStatus pWbemObjectSink->ReleaseTheStubIfNecessary(hr); // Restore original privileges on this thread if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); } } SetWbemError (this); if (pIContext) pIContext->Release (); } pWbemClassObject->Release (); VariantClear (&var); } } else hr = wbemErrInvalidParameter; pIWbemServices->Release (); } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; } HRESULT CSWbemServices::CancelAsyncCall(IWbemObjectSink *pSink) { HRESULT hr = WBEM_E_FAILED; ResetLastErrors (); if (m_SecurityInfo) { IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy (); if (pIWbemServices) { bool needToResetSecurity = false; HANDLE hThreadToken = NULL; if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken)) hr = pIWbemServices->CancelAsyncCall(pSink); pIWbemServices->Release (); // Restore original privileges on this thread if (needToResetSecurity) m_SecurityInfo->ResetSecurity (hThreadToken); } } return hr; }