mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1614 lines
39 KiB
1614 lines
39 KiB
//***************************************************************************
|
|
//
|
|
// Copyright (c) 1998-2000 Microsoft Corporation
|
|
//
|
|
// SERVICES.CPP
|
|
//
|
|
// alanbos 15-Aug-96 Created.
|
|
//
|
|
// Defines the implementation of ISWbemServicesEx
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include "precomp.h"
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSWbemServices::CSWbemServices
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Constructor.
|
|
//
|
|
//***************************************************************************
|
|
|
|
CSWbemServices::CSWbemServices(
|
|
IWbemServices *pService,
|
|
BSTR bsNamespacePath,
|
|
BSTR bsAuthority,
|
|
BSTR bsUser,
|
|
BSTR bsPassword,
|
|
CWbemLocatorSecurity *pSecurityInfo,
|
|
BSTR bsLocale)
|
|
: m_SecurityInfo (NULL),
|
|
m_pUnsecuredApartment(NULL),
|
|
m_bsLocale (NULL),
|
|
m_cRef (0),
|
|
m_pIServiceProvider (NULL)
|
|
{
|
|
InterlockedIncrement(&g_cObj);
|
|
|
|
m_Dispatch.SetObj ((ISWbemServicesEx *)this, IID_ISWbemServicesEx,
|
|
CLSID_SWbemServicesEx, L"SWbemServicesEx");
|
|
|
|
m_SecurityInfo = new CSWbemSecurity (pService,
|
|
bsAuthority, bsUser, bsPassword, pSecurityInfo);
|
|
|
|
if (bsLocale)
|
|
m_bsLocale = SysAllocString (bsLocale);
|
|
|
|
if (bsNamespacePath)
|
|
m_bsNamespacePath = bsNamespacePath;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSWbemServices::CSWbemServices
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Constructor.
|
|
//
|
|
//***************************************************************************
|
|
|
|
CSWbemServices::CSWbemServices(
|
|
IWbemServices *pService,
|
|
BSTR bsNamespacePath,
|
|
COAUTHIDENTITY *pCoAuthIdentity,
|
|
BSTR bsPrincipal,
|
|
BSTR bsAuthority)
|
|
: m_SecurityInfo (NULL),
|
|
m_pUnsecuredApartment(NULL),
|
|
m_bsLocale (NULL),
|
|
m_cRef (0),
|
|
m_pIServiceProvider (NULL)
|
|
{
|
|
InterlockedIncrement(&g_cObj);
|
|
|
|
m_Dispatch.SetObj ((ISWbemServicesEx *)this, IID_ISWbemServicesEx,
|
|
CLSID_SWbemServicesEx, L"SWbemServicesEx");
|
|
|
|
m_SecurityInfo = new CSWbemSecurity (pService, pCoAuthIdentity,
|
|
bsPrincipal, bsAuthority);
|
|
|
|
if (bsNamespacePath)
|
|
m_bsNamespacePath = bsNamespacePath;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSWbemServices::CSWbemServices
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Constructor: used to clone a new CSWbemServices from an exisiting
|
|
// instance. The security info object is copied from the original instance
|
|
// (which clones the underlying proxy), and the security settings are modified
|
|
// appropriately if an override security instance is also passed in. This
|
|
// constructor is used when creating a CSWbemObject.
|
|
//
|
|
//***************************************************************************
|
|
|
|
CSWbemServices::CSWbemServices(
|
|
CSWbemServices *pService,
|
|
CSWbemSecurity *pSecurity)
|
|
: m_SecurityInfo (NULL),
|
|
m_pUnsecuredApartment(NULL),
|
|
m_bsLocale (NULL),
|
|
m_cRef (0),
|
|
m_pIServiceProvider (NULL)
|
|
{
|
|
InterlockedIncrement(&g_cObj);
|
|
m_Dispatch.SetObj ((ISWbemServicesEx *)this, IID_ISWbemServicesEx,
|
|
CLSID_SWbemServicesEx, L"SWbemServicesEx");
|
|
|
|
if (pService)
|
|
{
|
|
/*
|
|
* Make a new security object from the one contained in the original
|
|
* CSWbemServices. Note that this will copy the IWbemServices proxy
|
|
* so we have an independently securable proxy for this new object.
|
|
*/
|
|
CSWbemSecurity *pServiceSecurity = pService->GetSecurityInfo ();
|
|
|
|
if (pServiceSecurity)
|
|
{
|
|
m_SecurityInfo = new CSWbemSecurity (pServiceSecurity);
|
|
pServiceSecurity->Release ();
|
|
}
|
|
|
|
/*
|
|
* If an overriding security pointer was passed in, use its' settings to
|
|
* modify our local security pointer.
|
|
*/
|
|
if (pSecurity)
|
|
{
|
|
IUnknown *pUnk = pSecurity->GetProxy ();
|
|
|
|
if (pUnk)
|
|
{
|
|
if (m_SecurityInfo)
|
|
m_SecurityInfo->SecureInterfaceRev (pUnk);
|
|
|
|
pUnk->Release ();
|
|
}
|
|
}
|
|
|
|
// Copy the locale
|
|
m_bsLocale = SysAllocString (pService->GetLocale ());
|
|
|
|
// Copy the path
|
|
m_bsNamespacePath = pService->GetPath ();
|
|
}
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSWbemServices::CSWbemServices
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Constructor: used to clone a new CSWbemServices from an exisiting
|
|
// ISWbemInternalServices interface. The security info object is copied from
|
|
// the original instance (which clones the underlying proxy). This
|
|
// constructor is used when creating a CSWbemRefreshableItem.
|
|
//
|
|
//***************************************************************************
|
|
|
|
CSWbemServices::CSWbemServices (
|
|
ISWbemInternalServices *pISWbemInternalServices)
|
|
: m_SecurityInfo (NULL),
|
|
m_pUnsecuredApartment (NULL),
|
|
m_bsLocale (NULL),
|
|
m_cRef (0),
|
|
m_pIServiceProvider (NULL)
|
|
{
|
|
InterlockedIncrement(&g_cObj);
|
|
m_Dispatch.SetObj ((ISWbemServicesEx *)this, IID_ISWbemServicesEx,
|
|
CLSID_SWbemServicesEx, L"SWbemServicesEx");
|
|
|
|
if (pISWbemInternalServices)
|
|
{
|
|
// Copy the locale
|
|
pISWbemInternalServices->GetLocale (&m_bsLocale);
|
|
|
|
// Copy the path
|
|
pISWbemInternalServices->GetNamespacePath (&m_bsNamespacePath);
|
|
|
|
/*
|
|
* Make a new security object from the one contained in the original
|
|
* ISWbemServices. Note that this will copy the IWbemServices proxy
|
|
* so we have an independently securable proxy for this new object.
|
|
*/
|
|
ISWbemInternalSecurity *pISWbemInternalSecurity = NULL;
|
|
pISWbemInternalServices->GetISWbemInternalSecurity (&pISWbemInternalSecurity);
|
|
|
|
if (pISWbemInternalSecurity)
|
|
{
|
|
CComPtr<IWbemServices> pIWbemServices;
|
|
|
|
if (SUCCEEDED(pISWbemInternalServices->GetIWbemServices (&pIWbemServices)))
|
|
{
|
|
m_SecurityInfo = new CSWbemSecurity (pIWbemServices,
|
|
pISWbemInternalSecurity);
|
|
pISWbemInternalSecurity->Release ();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSWbemServices::CSWbemServices
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Constructor: used to build a new CSWbemServices from an IWbemServices
|
|
// and a existing CSWbemServices
|
|
//
|
|
//***************************************************************************
|
|
|
|
CSWbemServices::CSWbemServices(
|
|
IWbemServices *pIWbemServices,
|
|
CSWbemServices *pCSWbemServices
|
|
) : m_SecurityInfo (NULL),
|
|
m_pUnsecuredApartment(NULL),
|
|
m_bsLocale (NULL),
|
|
m_cRef (0),
|
|
m_pIServiceProvider (NULL)
|
|
{
|
|
InterlockedIncrement(&g_cObj);
|
|
|
|
m_Dispatch.SetObj ((ISWbemServices *)this, IID_ISWbemServices,
|
|
CLSID_SWbemServices, L"SWbemServices");
|
|
|
|
if (pIWbemServices)
|
|
{
|
|
// Make a new security cache based on the proxy passed in, but use the
|
|
// settings from the existing object
|
|
CSWbemSecurity *pSecurity = NULL;
|
|
|
|
if (pCSWbemServices)
|
|
pSecurity = pCSWbemServices->GetSecurityInfo ();
|
|
|
|
m_SecurityInfo = new CSWbemSecurity (pIWbemServices, pSecurity);
|
|
|
|
if (pSecurity)
|
|
pSecurity->Release ();
|
|
|
|
// Copy the locale and path
|
|
if (pCSWbemServices)
|
|
{
|
|
m_bsLocale = SysAllocString (pCSWbemServices->GetLocale ());
|
|
m_bsNamespacePath = pCSWbemServices->GetPath ();
|
|
}
|
|
}
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSWbemServices::~CSWbemServices
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Destructor.
|
|
//
|
|
//***************************************************************************
|
|
|
|
CSWbemServices::~CSWbemServices(void)
|
|
{
|
|
RELEASEANDNULL(m_SecurityInfo)
|
|
FREEANDNULL(m_bsLocale)
|
|
RELEASEANDNULL(m_pUnsecuredApartment)
|
|
|
|
InterlockedDecrement(&g_cObj);
|
|
}
|
|
|
|
IUnsecuredApartment *CSWbemServices::GetCachedUnsecuredApartment()
|
|
{
|
|
// If we have one just return with it. If not create one.
|
|
// This is released in the destructor
|
|
if (!m_pUnsecuredApartment)
|
|
{
|
|
HRESULT hr;
|
|
hr = CoCreateInstance(CLSID_UnsecuredApartment, 0, CLSCTX_ALL,
|
|
IID_IUnsecuredApartment, (LPVOID *) &m_pUnsecuredApartment);
|
|
if (FAILED(hr))
|
|
m_pUnsecuredApartment = NULL;
|
|
}
|
|
|
|
// AddRef so caller must release
|
|
if (m_pUnsecuredApartment)
|
|
m_pUnsecuredApartment->AddRef ();
|
|
|
|
return m_pUnsecuredApartment;
|
|
}
|
|
|
|
//***************************************************************************
|
|
// HRESULT CSWbemServices::QueryInterface
|
|
// long CSWbemServices::AddRef
|
|
// long CSWbemServices::Release
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Standard Com IUNKNOWN functions.
|
|
//
|
|
//***************************************************************************
|
|
|
|
STDMETHODIMP CSWbemServices::QueryInterface (
|
|
|
|
IN REFIID riid,
|
|
OUT LPVOID *ppv
|
|
)
|
|
{
|
|
*ppv = NULL;
|
|
|
|
if (IID_IUnknown==riid)
|
|
*ppv = reinterpret_cast<IUnknown*>(this);
|
|
else if (IID_ISWbemServices==riid)
|
|
*ppv = (ISWbemServices *)this;
|
|
else if (IID_ISWbemServicesEx==riid)
|
|
*ppv = (ISWbemServicesEx *)this;
|
|
else if (IID_IDispatch==riid)
|
|
*ppv = (IDispatch *)((ISWbemServicesEx *)this);
|
|
else if (IID_IDispatchEx==riid)
|
|
*ppv = (IDispatchEx *)this;
|
|
else if (IID_ISupportErrorInfo==riid)
|
|
*ppv = (ISupportErrorInfo *)this;
|
|
else if (IID_ISWbemInternalServices==riid)
|
|
*ppv = (ISWbemInternalServices *)this;
|
|
else if (IID_IProvideClassInfo==riid)
|
|
*ppv = (IProvideClassInfo *)this;
|
|
|
|
if (NULL!=*ppv)
|
|
{
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CSWbemServices::AddRef(void)
|
|
{
|
|
InterlockedIncrement(&m_cRef);
|
|
return m_cRef;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CSWbemServices::Release(void)
|
|
{
|
|
InterlockedDecrement(&m_cRef);
|
|
if (0L!=m_cRef)
|
|
return m_cRef;
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
// IDispatch methods should be inline
|
|
|
|
STDMETHODIMP CSWbemServices::GetTypeInfoCount(UINT* pctinfo)
|
|
{
|
|
_RD(static char *me = "CSWbemServices::GetTypeInfoCount()";)
|
|
_RPrint(me, "Called", 0, "");
|
|
return m_Dispatch.GetTypeInfoCount(pctinfo);}
|
|
STDMETHODIMP CSWbemServices::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
|
|
{
|
|
_RD(static char *me = "CSWbemServices::GetTypeInfo()";)
|
|
_RPrint(me, "Called", 0, "");
|
|
return m_Dispatch.GetTypeInfo(itinfo, lcid, pptinfo);}
|
|
STDMETHODIMP CSWbemServices::GetIDsOfNames(REFIID riid, OLECHAR** rgszNames,
|
|
UINT cNames, LCID lcid, DISPID* rgdispid)
|
|
{
|
|
_RD(static char *me = "CSWbemServices::GetIdsOfNames()";)
|
|
_RPrint(me, "Called", 0, "");
|
|
return m_Dispatch.GetIDsOfNames(riid, rgszNames, cNames,
|
|
lcid,
|
|
rgdispid);}
|
|
STDMETHODIMP CSWbemServices::Invoke(DISPID dispidMember, REFIID riid, LCID lcid,
|
|
WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
|
|
EXCEPINFO* pexcepinfo, UINT* puArgErr)
|
|
{
|
|
_RD(static char *me = "CSWbemServices::Invoke()";)
|
|
_RPrint(me, "Called", 0, "");
|
|
return m_Dispatch.Invoke(dispidMember, riid, lcid, wFlags,
|
|
pdispparams, pvarResult, pexcepinfo, puArgErr);}
|
|
|
|
// IDispatchEx methods should be inline
|
|
HRESULT STDMETHODCALLTYPE CSWbemServices::GetDispID(
|
|
/* [in] */ BSTR bstrName,
|
|
/* [in] */ DWORD grfdex,
|
|
/* [out] */ DISPID __RPC_FAR *pid)
|
|
{
|
|
_RD(static char *me = "CSWbemServices::GetDispID()";)
|
|
_RPrint(me, "Called", 0, "");
|
|
return m_Dispatch.GetDispID(bstrName, grfdex, pid);
|
|
}
|
|
|
|
/* [local] */ HRESULT STDMETHODCALLTYPE CSWbemServices::InvokeEx(
|
|
/* [in] */ DISPID id,
|
|
/* [in] */ LCID lcid,
|
|
/* [in] */ WORD wFlags,
|
|
/* [in] */ DISPPARAMS __RPC_FAR *pdp,
|
|
/* [out] */ VARIANT __RPC_FAR *pvarRes,
|
|
/* [out] */ EXCEPINFO __RPC_FAR *pei,
|
|
/* [unique][in] */ IServiceProvider __RPC_FAR *pspCaller)
|
|
{
|
|
HRESULT hr;
|
|
_RD(static char *me = "CSWbemServices::InvokeEx()";)
|
|
_RPrint(me, "Called", (long)id, "id");
|
|
_RPrint(me, "Called", (long)wFlags, "wFlags");
|
|
|
|
|
|
m_pIServiceProvider = pspCaller;
|
|
|
|
hr = m_Dispatch.InvokeEx(id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
|
|
|
|
m_pIServiceProvider = NULL;
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CSWbemServices::DeleteMemberByName(
|
|
/* [in] */ BSTR bstr,
|
|
/* [in] */ DWORD grfdex)
|
|
{
|
|
_RD(static char *me = "CSWbemServices::DeleteMemberByName()";)
|
|
_RPrint(me, "Called", 0, "");
|
|
return m_Dispatch.DeleteMemberByName(bstr, grfdex);
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CSWbemServices::DeleteMemberByDispID(
|
|
/* [in] */ DISPID id)
|
|
{
|
|
_RD(static char *me = "CSWbemServices::DeletememberByDispId()";)
|
|
_RPrint(me, "Called", 0, "");
|
|
return m_Dispatch.DeleteMemberByDispID(id);
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CSWbemServices::GetMemberProperties(
|
|
/* [in] */ DISPID id,
|
|
/* [in] */ DWORD grfdexFetch,
|
|
/* [out] */ DWORD __RPC_FAR *pgrfdex)
|
|
{
|
|
_RD(static char *me = "CSWbemServices::GetMemberProperties()";)
|
|
_RPrint(me, "Called", 0, "");
|
|
return m_Dispatch.GetMemberProperties(id, grfdexFetch, pgrfdex);
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CSWbemServices::GetMemberName(
|
|
/* [in] */ DISPID id,
|
|
/* [out] */ BSTR __RPC_FAR *pbstrName)
|
|
{
|
|
_RD(static char *me = "CSWbemServices::GetMemberName()";)
|
|
_RPrint(me, "Called", 0, "");
|
|
return m_Dispatch.GetMemberName(id, pbstrName);
|
|
}
|
|
|
|
|
|
/*
|
|
* I don't think this needs implementing
|
|
*/
|
|
HRESULT STDMETHODCALLTYPE CSWbemServices::GetNextDispID(
|
|
/* [in] */ DWORD grfdex,
|
|
/* [in] */ DISPID id,
|
|
/* [out] */ DISPID __RPC_FAR *pid)
|
|
{
|
|
_RD(static char *me = "CSWbemServices::GetNextDispID()";)
|
|
_RPrint(me, "Called", 0, "");
|
|
|
|
return m_Dispatch.GetNextDispID(grfdex, id, pid);
|
|
|
|
}
|
|
|
|
HRESULT STDMETHODCALLTYPE CSWbemServices::GetNameSpaceParent(
|
|
/* [out] */ IUnknown __RPC_FAR *__RPC_FAR *ppunk)
|
|
{
|
|
_RD(static char *me = "CSWbemServices::GetNamespaceParent()";)
|
|
_RPrint(me, "Called", 0, "");
|
|
return m_Dispatch.GetNameSpaceParent(ppunk);
|
|
}
|
|
|
|
|
|
//***************************************************************************
|
|
// HRESULT CSWbemServices::InterfaceSupportsErrorInfo
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Standard Com ISupportErrorInfo functions.
|
|
//
|
|
//***************************************************************************
|
|
|
|
STDMETHODIMP CSWbemServices::InterfaceSupportsErrorInfo (IN REFIID riid)
|
|
{
|
|
return ((IID_ISWbemServices == riid) ||
|
|
(IID_ISWbemServicesEx == riid)) ? S_OK : S_FALSE;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemServices::Get
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Get an instance or class from a namespace
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// bsObjectPath Relative object path to class or instance
|
|
// lFlags Flags
|
|
// pContext If specified, additional context
|
|
// ppObject On successful return addresses an
|
|
// ISWbemObject
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemServices::Get (
|
|
BSTR objectPath,
|
|
long lFlags,
|
|
/*ISWbemNamedValueSet*/ IDispatch *pContext,
|
|
ISWbemObject **ppObject
|
|
)
|
|
{
|
|
_RD(static char *me = "CSWbemServices::Get";)
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == ppObject)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else if (m_SecurityInfo)
|
|
{
|
|
IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy ();
|
|
|
|
if (pIWbemServices)
|
|
{
|
|
IWbemClassObject *pIWbemClassObject = NULL;
|
|
|
|
// Get the context
|
|
IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (pContext, m_pIServiceProvider);
|
|
|
|
bool needToResetSecurity = false;
|
|
HANDLE hThreadToken = NULL;
|
|
|
|
_RPrint(me, "Called - context: ", (long)pIContext, "");
|
|
if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken))
|
|
hr = pIWbemServices->GetObject (
|
|
(objectPath && (0 < wcslen(objectPath))) ? objectPath : NULL,
|
|
lFlags,
|
|
pIContext,
|
|
&pIWbemClassObject,
|
|
NULL);
|
|
|
|
if (needToResetSecurity)
|
|
m_SecurityInfo->ResetSecurity (hThreadToken);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// Create a new CSWbemObject using the IWbemClassObject interface
|
|
// just returned.
|
|
|
|
CSWbemObject *pObject = new CSWbemObject (this, pIWbemClassObject);
|
|
|
|
if (!pObject)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else if (FAILED(hr = pObject->QueryInterface (IID_ISWbemObject,
|
|
(PPVOID) ppObject)))
|
|
delete pObject;
|
|
|
|
pIWbemClassObject->Release ();
|
|
}
|
|
|
|
SetWbemError (this);
|
|
|
|
if (pIContext)
|
|
pIContext->Release ();
|
|
|
|
pIWbemServices->Release ();
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemServices::Delete
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Delete an instance or class from a namespace
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// bsObjectPath Relative path of class or instance
|
|
// pKeyValue Single key value
|
|
// lFlags Flags
|
|
// pContext Any context info
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemServices::Delete (
|
|
BSTR bsObjectPath,
|
|
long lFlags,
|
|
/*ISWbemValueBag*/ IDispatch *pContext
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
ResetLastErrors ();
|
|
|
|
if (m_SecurityInfo)
|
|
{
|
|
CWbemPathCracker pathCracker (bsObjectPath);
|
|
|
|
if ((CWbemPathCracker::WbemPathType::wbemPathTypeError != pathCracker.GetType ()) &&
|
|
pathCracker.IsClassOrInstance ())
|
|
{
|
|
CComPtr<IWbemServices> pIWbemServices = GetIWbemServices ();
|
|
|
|
if (pIWbemServices)
|
|
{
|
|
// Get the context
|
|
IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (pContext, m_pIServiceProvider);
|
|
|
|
bool needToResetSecurity = false;
|
|
HANDLE hThreadToken = NULL;
|
|
|
|
if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken))
|
|
{
|
|
if (pathCracker.IsInstance ())
|
|
hr = pIWbemServices->DeleteInstance (bsObjectPath, lFlags, pIContext, NULL);
|
|
else
|
|
hr = pIWbemServices->DeleteClass (bsObjectPath, lFlags, pIContext, NULL);
|
|
}
|
|
|
|
if (needToResetSecurity)
|
|
m_SecurityInfo->ResetSecurity (hThreadToken);
|
|
|
|
SetWbemError (this);
|
|
|
|
if (pIContext)
|
|
pIContext->Release ();
|
|
}
|
|
}
|
|
else
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemServices::InstancesOf
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Create an enumerator for instances
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// bsClass Underlying class basis for enumeration
|
|
// lFlags Flags
|
|
// pContext Any context info
|
|
// ppEnum On successful return holds the enumerator
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemServices::InstancesOf (
|
|
BSTR bsClass,
|
|
long lFlags,
|
|
/*ISWbemValueBag*/ IDispatch *pContext,
|
|
ISWbemObjectSet **ppEnum
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == ppEnum)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else if (m_SecurityInfo)
|
|
{
|
|
IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy ();
|
|
|
|
if (pIWbemServices)
|
|
{
|
|
IEnumWbemClassObject *pIEnum = NULL;
|
|
|
|
// Get the context
|
|
IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (pContext, m_pIServiceProvider);
|
|
|
|
bool needToResetSecurity = false;
|
|
HANDLE hThreadToken = NULL;
|
|
|
|
if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken))
|
|
hr = pIWbemServices->CreateInstanceEnum (bsClass, lFlags, pIContext, &pIEnum);
|
|
|
|
if (needToResetSecurity)
|
|
m_SecurityInfo->ResetSecurity (hThreadToken);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CSWbemObjectSet *pEnum = new CSWbemObjectSet (this, pIEnum);
|
|
|
|
if (!pEnum)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else if (FAILED(hr = pEnum->QueryInterface (IID_ISWbemObjectSet, (PPVOID) ppEnum)))
|
|
delete pEnum;
|
|
|
|
pIEnum->Release ();
|
|
}
|
|
|
|
SetWbemError (this);
|
|
|
|
if (pIContext)
|
|
pIContext->Release ();
|
|
|
|
pIWbemServices->Release ();
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemServices::ExecQuery
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Execute a query
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// bsQuery The query strimg
|
|
// bsQueryLanguage The query language descriptor (e.g."WQL")
|
|
// lFlags Flags
|
|
// pContext Any context information
|
|
// ppEnum Returns the enumerator
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemServices::ExecQuery (
|
|
BSTR bsQuery,
|
|
BSTR bsQueryLanguage,
|
|
long lFlags,
|
|
/*ISWbemValueBag*/ IDispatch *pContext,
|
|
ISWbemObjectSet **ppEnum)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
#ifdef __RTEST_RPC_FAILURE
|
|
extern int __Rx;
|
|
extern bool __Rdone;
|
|
|
|
__Rx = 0;
|
|
__Rdone = false;
|
|
#endif
|
|
|
|
if (NULL == ppEnum)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else if (m_SecurityInfo)
|
|
{
|
|
IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy ();
|
|
|
|
if (pIWbemServices)
|
|
{
|
|
IEnumWbemClassObject *pIEnum = NULL;
|
|
|
|
// 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->ExecQuery
|
|
(bsQueryLanguage, bsQuery,
|
|
lFlags | WBEM_FLAG_ENSURE_LOCATABLE,
|
|
pIContext,
|
|
&pIEnum);
|
|
|
|
if (needToResetSecurity)
|
|
m_SecurityInfo->ResetSecurity (hThreadToken);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CSWbemObjectSet *pEnum = new CSWbemObjectSet (this, pIEnum);
|
|
|
|
if (!pEnum)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else if (FAILED(hr = pEnum->QueryInterface (IID_ISWbemObjectSet, (PPVOID) ppEnum)))
|
|
delete pEnum;
|
|
|
|
pIEnum->Release ();
|
|
}
|
|
|
|
SetWbemError (this);
|
|
|
|
if (pIContext)
|
|
pIContext->Release ();
|
|
|
|
pIWbemServices->Release ();
|
|
}
|
|
}
|
|
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemServices::AssociatorsOf
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Return the associators of a class or instance
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// bsQuery The query strimg
|
|
// bsQueryLanguage The query language descriptor (e.g."WQL")
|
|
// lFlags Flags
|
|
// pContext Any context information
|
|
// ppEnum Returns the enumerator
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemServices::AssociatorsOf (
|
|
BSTR strObjectPath,
|
|
BSTR strAssocClass,
|
|
BSTR strResultClass,
|
|
BSTR strResultRole,
|
|
BSTR strRole,
|
|
VARIANT_BOOL bClassesOnly,
|
|
VARIANT_BOOL bSchemaOnly,
|
|
BSTR strRequiredAssocQualifier,
|
|
BSTR strRequiredQualifier,
|
|
long lFlags,
|
|
/*ISWbemNamedValueSet*/ IDispatch *pContext,
|
|
ISWbemObjectSet **ppEnum
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if ((NULL == ppEnum) || (NULL == strObjectPath))
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else if (m_SecurityInfo)
|
|
{
|
|
IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy ();
|
|
|
|
if (pIWbemServices)
|
|
{
|
|
IEnumWbemClassObject *pIEnum = NULL;
|
|
|
|
// Get the context
|
|
IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (pContext, 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->ExecQuery
|
|
(bsQueryLanguage, bsQuery,
|
|
lFlags | WBEM_FLAG_ENSURE_LOCATABLE,
|
|
pIContext,
|
|
&pIEnum);
|
|
|
|
// Restore original privileges on this thread
|
|
if (needToResetSecurity)
|
|
m_SecurityInfo->ResetSecurity (hThreadToken);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CSWbemObjectSet *pEnum = new CSWbemObjectSet (this, pIEnum);
|
|
|
|
if (!pEnum)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else if (FAILED(hr = pEnum->QueryInterface (IID_ISWbemObjectSet, (PPVOID) ppEnum)))
|
|
delete pEnum;
|
|
|
|
pIEnum->Release ();
|
|
}
|
|
|
|
|
|
SetWbemError (this);
|
|
|
|
SysFreeString (bsQuery);
|
|
SysFreeString (bsQueryLanguage);
|
|
|
|
if (pIContext)
|
|
pIContext->Release ();
|
|
|
|
pIWbemServices->Release ();
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemServices::ReferencesTo
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Return the references to a class or instance
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// bsQuery The query strimg
|
|
// bsQueryLanguage The query language descriptor (e.g."WQL")
|
|
// lFlags Flags
|
|
// pContext Any context information
|
|
// ppEnum Returns the enumerator
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemServices::ReferencesTo (
|
|
BSTR strObjectPath,
|
|
BSTR strResultClass,
|
|
BSTR strRole,
|
|
VARIANT_BOOL bClassesOnly,
|
|
VARIANT_BOOL bSchemaOnly,
|
|
BSTR strRequiredQualifier,
|
|
long lFlags,
|
|
/*ISWbemNamedValueSet*/ IDispatch *pContext,
|
|
ISWbemObjectSet **ppEnum
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if ((NULL == ppEnum) || (NULL == strObjectPath))
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else if (m_SecurityInfo)
|
|
{
|
|
IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy ();
|
|
|
|
if (pIWbemServices)
|
|
{
|
|
IEnumWbemClassObject *pIEnum = NULL;
|
|
|
|
// Get the context
|
|
IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (pContext, m_pIServiceProvider);
|
|
|
|
// Format the query string
|
|
BSTR bsQueryLanguage = SysAllocString (OLESTR("WQL"));
|
|
BSTR 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->ExecQuery
|
|
(bsQueryLanguage, bsQuery,
|
|
lFlags | WBEM_FLAG_ENSURE_LOCATABLE,
|
|
pIContext,
|
|
&pIEnum);
|
|
|
|
// Restore original privileges on this thread
|
|
if (needToResetSecurity)
|
|
m_SecurityInfo->ResetSecurity (hThreadToken);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CSWbemObjectSet *pEnum = new CSWbemObjectSet (this, pIEnum);
|
|
|
|
if (!pEnum)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else if (FAILED(hr = pEnum->QueryInterface (IID_ISWbemObjectSet, (PPVOID) ppEnum)))
|
|
delete pEnum;
|
|
|
|
pIEnum->Release ();
|
|
}
|
|
|
|
SetWbemError (this);
|
|
|
|
SysFreeString (bsQuery);
|
|
SysFreeString (bsQueryLanguage);
|
|
|
|
if (pIContext)
|
|
pIContext->Release ();
|
|
|
|
pIWbemServices->Release ();
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemServices::ExecNotificationQuery
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Execute a notification query
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// bsQuery The query strimg
|
|
// bsQueryLanguage The query language descriptor (e.g."WQL")
|
|
// lFlags Flags
|
|
// pContext Any context information
|
|
// ppEvents Returns the events iterator
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemServices::ExecNotificationQuery (
|
|
BSTR bsQuery,
|
|
BSTR bsQueryLanguage,
|
|
long lFlags,
|
|
/*ISWbemValueBag*/ IDispatch *pContext,
|
|
ISWbemEventSource **ppEvents)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == ppEvents)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else if (m_SecurityInfo)
|
|
{
|
|
IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy ();
|
|
|
|
if (pIWbemServices)
|
|
{
|
|
IEnumWbemClassObject *pIEnum = NULL;
|
|
|
|
// Get the context
|
|
IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (pContext, m_pIServiceProvider);
|
|
|
|
bool needToResetSecurity = false;
|
|
HANDLE hThreadToken = NULL;
|
|
|
|
if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken))
|
|
hr = pIWbemServices->ExecNotificationQuery
|
|
(bsQueryLanguage, bsQuery, lFlags, pIContext, &pIEnum);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CSWbemEventSource *pEvents = new CSWbemEventSource (this, pIEnum);
|
|
|
|
if (!pEvents)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else if (FAILED(hr = pEvents->QueryInterface (IID_ISWbemEventSource, (PPVOID) ppEvents)))
|
|
delete pEvents;
|
|
|
|
pIEnum->Release ();
|
|
}
|
|
|
|
// Restore original privileges on this thread
|
|
if (needToResetSecurity)
|
|
m_SecurityInfo->ResetSecurity (hThreadToken);
|
|
|
|
SetWbemError (this);
|
|
|
|
if (pIContext)
|
|
pIContext->Release ();
|
|
|
|
pIWbemServices->Release ();
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemServices::ExecMethod
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Execute a method
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// bsObjectPath Relative path to object
|
|
// bsMethod The name of the method to call
|
|
// pInParams The in-parameters
|
|
// lFlags Flags
|
|
// pContext Any context information
|
|
// ppOutParams The out-parameters
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemServices::ExecMethod (
|
|
BSTR bsObjectPath,
|
|
BSTR bsMethod,
|
|
/*ISWbemObject*/ IDispatch *pInParams,
|
|
long lFlags,
|
|
/*ISWbemValueBag*/ IDispatch *pContext,
|
|
ISWbemObject **ppOutParams
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (m_SecurityInfo)
|
|
{
|
|
IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy ();
|
|
|
|
if (pIWbemServices)
|
|
{
|
|
IWbemClassObject *pIInParams = CSWbemObject::GetIWbemClassObject (pInParams);
|
|
IWbemClassObject *pIOutParams = NULL;
|
|
|
|
// Get the context
|
|
IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (pContext, m_pIServiceProvider);
|
|
|
|
bool needToResetSecurity = false;
|
|
HANDLE hThreadToken = NULL;
|
|
|
|
if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken))
|
|
hr = pIWbemServices->ExecMethod
|
|
(bsObjectPath, bsMethod, lFlags, pIContext, pIInParams, &pIOutParams, NULL);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (pIOutParams)
|
|
{
|
|
if (ppOutParams)
|
|
{
|
|
CSWbemObject *pObject = new CSWbemObject (this, pIOutParams);
|
|
|
|
if (!pObject)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else if (FAILED(hr = pObject->QueryInterface (IID_ISWbemObject,
|
|
(PPVOID) ppOutParams)))
|
|
delete pObject;
|
|
|
|
}
|
|
|
|
pIOutParams->Release ();
|
|
}
|
|
}
|
|
|
|
// Restore original privileges on this thread
|
|
if (needToResetSecurity)
|
|
m_SecurityInfo->ResetSecurity (hThreadToken);
|
|
|
|
SetWbemError (this);
|
|
|
|
if (pIContext)
|
|
pIContext->Release ();
|
|
|
|
if (pIInParams)
|
|
pIInParams->Release ();
|
|
|
|
pIWbemServices->Release ();
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemServices::SubclassesOf
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Create an enumerator for classes
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// bsSuperClass Underlying class basis for enumeration
|
|
// lFlags Flags
|
|
// pContext Any context info
|
|
// ppEnum On successful return holds the enumerator
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemServices::SubclassesOf (
|
|
BSTR bsSuperClass,
|
|
long lFlags,
|
|
/*ISWbemValueBag*/ IDispatch *pContext,
|
|
ISWbemObjectSet **ppEnum
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == ppEnum)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else if (m_SecurityInfo)
|
|
{
|
|
IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy ();
|
|
|
|
if (pIWbemServices)
|
|
{
|
|
IEnumWbemClassObject *pIEnum = NULL;
|
|
|
|
// Get the context
|
|
IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (pContext, m_pIServiceProvider);
|
|
|
|
bool needToResetSecurity = false;
|
|
HANDLE hThreadToken = NULL;
|
|
|
|
if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken))
|
|
hr = pIWbemServices->CreateClassEnum
|
|
(bsSuperClass, lFlags, pIContext, &pIEnum);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
CSWbemObjectSet *pEnum = new CSWbemObjectSet (this, pIEnum);
|
|
|
|
if (!pEnum)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else if (FAILED(hr = pEnum->QueryInterface (IID_ISWbemObjectSet, (PPVOID) ppEnum)))
|
|
delete pEnum;
|
|
|
|
pIEnum->Release ();
|
|
}
|
|
|
|
// Restore original privileges on this thread
|
|
if (needToResetSecurity)
|
|
m_SecurityInfo->ResetSecurity (hThreadToken);
|
|
|
|
SetWbemError (this);
|
|
|
|
if (pIContext)
|
|
pIContext->Release ();
|
|
|
|
pIWbemServices->Release ();
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemServices::get_Security_
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Return the security configurator
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemServices::get_Security_ (
|
|
ISWbemSecurity **ppSecurity
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == ppSecurity)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
{
|
|
*ppSecurity = NULL;
|
|
|
|
if (m_SecurityInfo)
|
|
{
|
|
*ppSecurity = m_SecurityInfo;
|
|
(*ppSecurity)->AddRef ();
|
|
hr = WBEM_S_NO_ERROR;
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// SCODE CSWbemServices::Put
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Save/commit a class or instance into this namespace
|
|
//
|
|
// PARAMETERS:
|
|
//
|
|
// objWbemObject Class/Instance to be saved
|
|
// lFlags Flags
|
|
// pContext Context
|
|
// ppObjectPath Object Path
|
|
//
|
|
// RETURN VALUES:
|
|
//
|
|
// WBEM_S_NO_ERROR success
|
|
// WBEM_E_INVALID_PARAMETER bad input parameters
|
|
// WBEM_E_FAILED otherwise
|
|
//
|
|
//***************************************************************************
|
|
|
|
HRESULT CSWbemServices::Put (
|
|
ISWbemObjectEx *objWbemObject,
|
|
long lFlags,
|
|
/*ISWbemNamedValueSet*/ IDispatch *pContext,
|
|
ISWbemObjectPath **ppObjectPath
|
|
)
|
|
{
|
|
HRESULT hr = WBEM_E_FAILED;
|
|
|
|
ResetLastErrors ();
|
|
|
|
if (NULL == objWbemObject)
|
|
hr = WBEM_E_INVALID_PARAMETER;
|
|
else if (m_SecurityInfo)
|
|
{
|
|
IWbemServices *pIWbemServices = (IWbemServices *) m_SecurityInfo->GetProxy ();
|
|
|
|
if (pIWbemServices)
|
|
{
|
|
IWbemClassObject *pObject = CSWbemObject::GetIWbemClassObject (objWbemObject);
|
|
IWbemContext *pIContext = CSWbemNamedValueSet::GetIWbemContext (pContext, m_pIServiceProvider);
|
|
|
|
if (NULL != pObject)
|
|
{
|
|
// Figure out whether this is a class or instance
|
|
VARIANT var;
|
|
VariantInit (&var);
|
|
|
|
if (WBEM_S_NO_ERROR == pObject->Get (WBEMS_SP_GENUS, 0, &var, NULL, NULL))
|
|
{
|
|
IWbemCallResult *pResult = NULL;
|
|
HRESULT hrCallResult = WBEM_E_FAILED;
|
|
|
|
bool needToResetSecurity = false;
|
|
HANDLE hThreadToken = NULL;
|
|
|
|
if (m_SecurityInfo->SetSecurity (needToResetSecurity, hThreadToken))
|
|
{
|
|
if (WBEM_GENUS_CLASS == var.lVal)
|
|
hrCallResult = pIWbemServices->PutClass
|
|
(pObject, lFlags | WBEM_FLAG_RETURN_IMMEDIATELY, pIContext, &pResult);
|
|
else
|
|
hrCallResult = pIWbemServices->PutInstance
|
|
(pObject, lFlags | WBEM_FLAG_RETURN_IMMEDIATELY, pIContext, &pResult);
|
|
if (needToResetSecurity)
|
|
m_SecurityInfo->ResetSecurity (hThreadToken);
|
|
}
|
|
|
|
if (WBEM_S_NO_ERROR == hrCallResult)
|
|
{
|
|
//Secure the IWbemCallResult interface
|
|
m_SecurityInfo->SecureInterface (pResult);
|
|
|
|
if ((WBEM_S_NO_ERROR == (hrCallResult = pResult->GetCallStatus (INFINITE, &hr))) &&
|
|
(WBEM_S_NO_ERROR == hr))
|
|
{
|
|
if (ppObjectPath)
|
|
{
|
|
ISWbemObjectPath *pObjectPath = new CSWbemObjectPath (m_SecurityInfo, GetLocale());
|
|
|
|
if (!pObjectPath)
|
|
hr = WBEM_E_OUT_OF_MEMORY;
|
|
else
|
|
{
|
|
pObjectPath->AddRef ();
|
|
pObjectPath->put_Path (GetPath ());
|
|
|
|
if (WBEM_GENUS_CLASS == var.lVal)
|
|
{
|
|
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 == pObject->Get (WBEMS_SP_CLASS, 0, &nameVar, NULL, NULL))
|
|
&& (VT_BSTR == V_VT(&nameVar)))
|
|
{
|
|
pObjectPath->put_Class (nameVar.bstrVal);
|
|
*ppObjectPath = pObjectPath;
|
|
}
|
|
|
|
VariantClear (&nameVar);
|
|
}
|
|
else
|
|
{
|
|
// Now get the relpath string from the call result
|
|
BSTR resultString = NULL;
|
|
|
|
if (WBEM_S_NO_ERROR == pResult->GetResultString (INFINITE, &resultString))
|
|
{
|
|
pObjectPath->put_RelPath (resultString);
|
|
*ppObjectPath = pObjectPath;
|
|
SysFreeString (resultString);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
hr = hrCallResult;
|
|
|
|
if (pResult)
|
|
pResult->Release ();
|
|
}
|
|
|
|
if (pIContext)
|
|
pIContext->Release ();
|
|
|
|
pObject->Release ();
|
|
|
|
VariantClear (&var);
|
|
}
|
|
|
|
SetWbemError (this);
|
|
pIWbemServices->Release ();
|
|
}
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
m_Dispatch.RaiseException (hr);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSWbemServices::GetIWbemServices
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Return the IWbemServices interface corresponding to this
|
|
// scriptable wrapper.
|
|
//
|
|
// PARAMETERS:
|
|
// ppServices holds the IWbemServices pointer on return
|
|
//
|
|
// RETURN VALUES:
|
|
// S_OK success
|
|
// E_FAIL otherwise
|
|
//
|
|
// NOTES:
|
|
// If successful, the returned interface is AddRef'd; the caller is
|
|
// responsible for release.
|
|
//
|
|
//***************************************************************************
|
|
|
|
STDMETHODIMP CSWbemServices::GetIWbemServices (IWbemServices **ppServices)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
|
|
if (ppServices)
|
|
{
|
|
*ppServices = GetIWbemServices ();
|
|
hr = S_OK;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//***************************************************************************
|
|
//
|
|
// CSWbemServices::GetIWbemServices
|
|
//
|
|
// DESCRIPTION:
|
|
//
|
|
// Given an IDispatch interface which we hope is also an ISWbemServicesEx
|
|
// interface, return the underlying IWbemServices interface.
|
|
//
|
|
// PARAMETERS:
|
|
// pDispatch the IDispatch in question
|
|
//
|
|
// RETURN VALUES:
|
|
// The underlying IWbemServices interface, or NULL.
|
|
//
|
|
// NOTES:
|
|
// If successful, the returned interface is AddRef'd; the caller is
|
|
// responsible for release.
|
|
//
|
|
//***************************************************************************
|
|
|
|
IWbemServices *CSWbemServices::GetIWbemServices (
|
|
IDispatch *pDispatch
|
|
)
|
|
{
|
|
IWbemServices *pServices = NULL;
|
|
ISWbemInternalServices *pIServices = NULL;
|
|
|
|
if (pDispatch)
|
|
{
|
|
if (SUCCEEDED (pDispatch->QueryInterface
|
|
(IID_ISWbemInternalServices, (PPVOID) &pIServices)))
|
|
{
|
|
pIServices->GetIWbemServices (&pServices);
|
|
pIServices->Release ();
|
|
}
|
|
}
|
|
|
|
return pServices;
|
|
}
|
|
|