Leaked source code of windows server 2003
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.
 
 
 
 
 
 

301 lines
6.6 KiB

/*++
Copyright (c) 2000-2001 Microsoft Corporation
Module Name:
ProviderBase.cpp
Abstract:
Implementation of:
CProviderBase
Author:
???
Revision History:
Mohit Srivastava 10-Nov-2000
--*/
#include "ProviderBase.h"
#include <dbgutil.h>
extern long g_cObj;
//
// CProviderBase (Implements IWbemServices, IWbemProviderInit, IWbemShutdown)
//
CProviderBase::CProviderBase(
const BSTR ObjectPath,
const BSTR User,
const BSTR Password,
IWbemContext * pCtx)
:m_cRef(0), m_pNamespace(NULL)
{
}
CProviderBase::~CProviderBase()
{
if(m_pNamespace)
delete m_pNamespace;
}
STDMETHODIMP_(ULONG)
CProviderBase::AddRef(void)
{
InterlockedIncrement(&g_cObj);
return InterlockedIncrement((long *)&m_cRef);
}
STDMETHODIMP_(ULONG)
CProviderBase::Release(void)
{
InterlockedDecrement(&g_cObj);
long lNewCount = InterlockedDecrement((long *)&m_cRef);
if (0L == lNewCount)
delete this;
return (lNewCount > 0) ? lNewCount : 0;
}
STDMETHODIMP
CProviderBase::QueryInterface(
REFIID riid,
PPVOID ppv)
{
*ppv=NULL;
//
// Since we have dual inheritance, it is necessary to cast the return type
//
if(riid == IID_IWbemShutdown)
{
*ppv = (IWbemShutdown*)this;
}
if(riid == IID_IWbemServices)
{
*ppv = (IWbemServices*)this;
}
if(IID_IUnknown == riid || riid == IID_IWbemProviderInit)
{
*ppv = (IWbemProviderInit*)this;
}
if (NULL != *ppv)
{
AddRef();
return S_OK;
}
else
{
return E_NOINTERFACE;
}
}
HRESULT
CProviderBase::Shutdown(
LONG uReason,
ULONG uMaxMilliseconds,
IWbemContext *pCtx)
{
HRESULT hr = S_OK;
return hr;
}
HRESULT
CProviderBase::Initialize(
LPWSTR wszUser,
LONG lFlags,
LPWSTR wszNamespace,
LPWSTR wszLocale,
IWbemServices* pNamespace,
IWbemContext* pCtx,
IWbemProviderInitSink* pInitSink)
/*++
Synopsis:
According to stevm from WMI, calls to Initialize are guaranteed to be
synchronized - so long as all providers are in the same namespace.
Arguments: [wszUser] -
[lFlags] -
[wszNamespace] -
[wszLocale] -
[pNamespace] -
[pCtx] -
[pInitSink] -
Return Value:
--*/
{
HRESULT hr = CoImpersonateClient();
if(FAILED(hr))
{
pInitSink->SetStatus(WBEM_E_FAILED, 0);
DBGPRINTF((DBG_CONTEXT, "CoImpersonateClient failed\n"));
return WBEM_E_FAILED;
}
return DoInitialize(
wszUser,
lFlags,
wszNamespace,
wszLocale,
pNamespace,
pCtx,
pInitSink);
}
HRESULT
CProviderBase::CreateInstanceEnumAsync(
/* [in] */ const BSTR Class,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler)
{
HRESULT hr = CoImpersonateClient();
if(FAILED(hr))
{
pResponseHandler->SetStatus(WBEM_STATUS_COMPLETE, hr, NULL, NULL);
DBGPRINTF((DBG_CONTEXT, "CoImpersonateClient failed\n"));
return WBEM_E_FAILED;
}
return DoCreateInstanceEnumAsync(
Class,
lFlags,
pCtx,
pResponseHandler);
}
HRESULT
CProviderBase::DeleteInstanceAsync(
/* [in] */ const BSTR ObjectPath,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler)
{
HRESULT hr = CoImpersonateClient();
if(FAILED(hr))
{
pResponseHandler->SetStatus(WBEM_STATUS_COMPLETE, hr, NULL, NULL);
DBGPRINTF((DBG_CONTEXT, "CoImpersonateClient failed\n"));
return WBEM_E_FAILED;
}
return DoDeleteInstanceAsync(
ObjectPath,
lFlags,
pCtx,
pResponseHandler);
}
HRESULT
CProviderBase::ExecMethodAsync(
/* [in] */ const BSTR strObjectPath,
/* [in] */ const BSTR MethodName,
/* [in] */ long lFlags,
/* [in] */ IWbemContext* pCtx,
/* [in] */ IWbemClassObject* pInParams,
/* [in] */ IWbemObjectSink* pResponseHandler)
{
HRESULT hr = CoImpersonateClient();
if(FAILED(hr))
{
pResponseHandler->SetStatus(WBEM_STATUS_COMPLETE, hr, NULL, NULL);
DBGPRINTF((DBG_CONTEXT, "CoImpersonateClient failed\n"));
return WBEM_E_FAILED;
}
return DoExecMethodAsync(
strObjectPath,
MethodName,
lFlags,
pCtx,
pInParams,
pResponseHandler);
}
HRESULT
CProviderBase::ExecQueryAsync(
/* [in] */ const BSTR QueryLanguage,
/* [in] */ const BSTR Query,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler)
{
HRESULT hr = CoImpersonateClient();
if(FAILED(hr))
{
pResponseHandler->SetStatus(WBEM_STATUS_COMPLETE, hr, NULL, NULL);
DBGPRINTF((DBG_CONTEXT, "CoImpersonateClient failed\n"));
return WBEM_E_FAILED;
}
return DoExecQueryAsync(
QueryLanguage,
Query,
lFlags,
pCtx,
pResponseHandler);
}
HRESULT
CProviderBase::GetObjectAsync(
/* [in] */ const BSTR ObjectPath,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler)
{
HRESULT hr = CoImpersonateClient();
if(FAILED(hr))
{
pResponseHandler->SetStatus(WBEM_STATUS_COMPLETE, hr, NULL, NULL);
DBGPRINTF((DBG_CONTEXT, "CoImpersonateClient failed\n"));
return WBEM_E_FAILED;
}
return DoGetObjectAsync(
ObjectPath,
lFlags,
pCtx,
pResponseHandler);
}
HRESULT
CProviderBase::PutInstanceAsync(
/* [in] */ IWbemClassObject __RPC_FAR *pInst,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler)
{
HRESULT hr = CoImpersonateClient();
if(FAILED(hr))
{
pResponseHandler->SetStatus(WBEM_STATUS_COMPLETE, hr, NULL, NULL);
DBGPRINTF((DBG_CONTEXT, "CoImpersonateClient failed\n"));
return WBEM_E_FAILED;
}
return DoPutInstanceAsync(
pInst,
lFlags,
pCtx,
pResponseHandler);
}