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.
 
 
 
 
 
 

485 lines
10 KiB

#include <objbase.h>
#include <ntrkcomm.h>
//
// Most of the functions in this module need to call CoImpersonateClient.
// This macro wraps the call and a check on the return code.
#define DNS_IMPERSONATE_CLIENT(); \
{ \
HRESULT scimpcli = CoImpersonateClient(); \
if ( FAILED( scimpcli ) ) \
{ \
throw scimpcli; \
} \
}
CWbemServices::CWbemServices(
IWbemServices* pNamespace)
:m_pWbemServices(NULL)
{
m_pWbemServices = pNamespace;
if(m_pWbemServices != NULL)
m_pWbemServices->AddRef();
}
CWbemServices::~CWbemServices()
{
if(m_pWbemServices != NULL)
m_pWbemServices->Release();
}
HRESULT
CWbemServices::CreateClassEnum(
/* [in] */ BSTR Superclass,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum
)
{
SCODE sc = m_pWbemServices->CreateClassEnum(
Superclass,
lFlags,
pCtx,
ppEnum);
DNS_IMPERSONATE_CLIENT();
return sc;
}
HRESULT
CWbemServices::CreateInstanceEnum(
/* [in] */ BSTR Class,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum)
{
HRESULT hr = m_pWbemServices->CreateInstanceEnum(
Class,
lFlags,
pCtx,
ppEnum);
DNS_IMPERSONATE_CLIENT();
return hr;
}
HRESULT
CWbemServices::DeleteClass(
/* [in] */ BSTR Class,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult)
{
HRESULT hr = m_pWbemServices->DeleteClass(
Class,
lFlags,
pCtx,
ppCallResult);
DNS_IMPERSONATE_CLIENT();
return hr;
}
HRESULT
CWbemServices::DeleteInstance(
/* [in] */ BSTR ObjectPath,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult)
{
HRESULT hr = m_pWbemServices->DeleteInstance(
ObjectPath,
lFlags,
pCtx,
ppCallResult);
DNS_IMPERSONATE_CLIENT();
return hr;
}
HRESULT
CWbemServices::ExecMethod(
BSTR strObjectPath,
BSTR MethodName,
long lFlags,
IWbemContext* pCtx,
IWbemClassObject* pInParams,
IWbemClassObject** ppOurParams,
IWbemCallResult** ppCallResult)
{
HRESULT hr = m_pWbemServices->ExecMethod(
strObjectPath,
MethodName,
lFlags,
pCtx,
pInParams,
ppOurParams,
ppCallResult) ;
DNS_IMPERSONATE_CLIENT();
return hr;
}
HRESULT
CWbemServices::ExecNotificationQuery(
/* [in] */ BSTR QueryLanguage,
/* [in] */ BSTR Query,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum)
{
HRESULT hr = m_pWbemServices->ExecNotificationQuery(
QueryLanguage,
Query,
lFlags,
pCtx,
ppEnum);
DNS_IMPERSONATE_CLIENT();
return hr;
}
HRESULT
CWbemServices::ExecQuery(
/* [in] */ BSTR QueryLanguage,
/* [in] */ BSTR Query,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [out] */ IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum)
{
HRESULT hr = m_pWbemServices->ExecQuery(
QueryLanguage,
Query,
lFlags,
pCtx,
ppEnum);
DNS_IMPERSONATE_CLIENT();
return hr;
}
HRESULT
CWbemServices::GetObject(
/* [in] */ BSTR ObjectPath,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [unique][in][out] */ IWbemClassObject __RPC_FAR *__RPC_FAR *ppObject,
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult)
{
HRESULT hr = m_pWbemServices->GetObject(
ObjectPath,
lFlags,
pCtx,
ppObject,
ppCallResult);
DNS_IMPERSONATE_CLIENT();
return hr;
}
HRESULT
CWbemServices::PutClass(
/* [in] */ IWbemClassObject __RPC_FAR *pObject,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult)
{
HRESULT hr = m_pWbemServices->PutClass(
pObject,
lFlags,
pCtx,
ppCallResult);
DNS_IMPERSONATE_CLIENT();
return hr;
}
HRESULT
CWbemServices::PutInstance(
/* [in] */ IWbemClassObject __RPC_FAR *pInst,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [unique][in][out] */ IWbemCallResult __RPC_FAR *__RPC_FAR *ppCallResult)
{
HRESULT hr = m_pWbemServices->PutInstance(
pInst,
lFlags,
pCtx,
ppCallResult);
DNS_IMPERSONATE_CLIENT();
return hr;
}
/*CImpersonatedProvider
* Purpose: provide a general solution for impersonate client for
* Wbem providers.
* USAGE:
* Inherit from this class, and implement abstact virtual functions.
* child class should implement function prefixed with "Do".
* ******************************************/
CImpersonatedProvider::CImpersonatedProvider(
BSTR ObjectPath,
BSTR User,
BSTR Password,
IWbemContext * pCtx)
:m_cRef(0), m_pNamespace(NULL)
{
}
CImpersonatedProvider::~CImpersonatedProvider()
{
if(m_pNamespace)
delete m_pNamespace;
}
STDMETHODIMP_(ULONG)
CImpersonatedProvider::AddRef(void)
{
return InterlockedIncrement((long *)&m_cRef);
}
STDMETHODIMP_(ULONG)
CImpersonatedProvider::Release(void)
{
ULONG nNewCount = InterlockedDecrement((long *)&m_cRef);
if (0L == nNewCount)
delete this;
return nNewCount;
}
STDMETHODIMP
CImpersonatedProvider::QueryInterface(
REFIID riid,
PPVOID ppv)
{
*ppv=NULL;
// Since we have dual inheritance, it is necessary to cast the return type
if(riid== IID_IWbemServices)
*ppv=(IWbemServices*)this;
if(IID_IUnknown==riid || riid== IID_IWbemProviderInit)
*ppv=(IWbemProviderInit*)this;
if (NULL!=*ppv) {
AddRef();
return NOERROR;
}
else
return E_NOINTERFACE;
}
STDMETHODIMP
CImpersonatedProvider::Initialize(
LPWSTR pszUser, LONG lFlags,
LPWSTR pszNamespace, LPWSTR pszLocale,
IWbemServices *pNamespace,
IWbemContext *pCtx,
IWbemProviderInitSink *pInitSink)
{
HRESULT hr = WBEM_S_NO_ERROR;
LONG lStatus = WBEM_S_INITIALIZED;
m_pNamespace = new CWbemServices(pNamespace);
if(m_pNamespace == NULL)
{
hr = WBEM_E_OUT_OF_MEMORY;
lStatus = WBEM_E_FAILED;
}
//Let CIMOM know you are initialized
//==================================
pInitSink->SetStatus(lStatus,0);
return hr;
}
HRESULT
CImpersonatedProvider::CreateInstanceEnumAsync(
/* [in] */ const BSTR Class,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler)
{
DNS_IMPERSONATE_CLIENT();
return DoCreateInstanceEnumAsync(
Class,
lFlags,
pCtx,
pResponseHandler);
}
HRESULT
CImpersonatedProvider::DeleteInstanceAsync(
/* [in] */ const BSTR ObjectPath,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler)
{
DNS_IMPERSONATE_CLIENT();
return DoDeleteInstanceAsync(
ObjectPath,
lFlags,
pCtx,
pResponseHandler);
}
HRESULT
CImpersonatedProvider::ExecMethodAsync(
const BSTR strObjectPath,
const BSTR MethodName,
long lFlags,
IWbemContext* pCtx,
IWbemClassObject* pInParams,
IWbemObjectSink* pResponseHandler)
{
DNS_IMPERSONATE_CLIENT();
return DoExecMethodAsync(
strObjectPath,
MethodName,
lFlags,
pCtx,
pInParams,
pResponseHandler);
}
HRESULT
CImpersonatedProvider::ExecQueryAsync(
/* [in] */ const BSTR QueryLanguage,
/* [in] */ const BSTR Query,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler)
{
DNS_IMPERSONATE_CLIENT();
return DoExecQueryAsync(
QueryLanguage,
Query,
lFlags,
pCtx,
pResponseHandler);
}
HRESULT
CImpersonatedProvider::GetObjectAsync(
/* [in] */ const BSTR ObjectPath,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler)
{
DNS_IMPERSONATE_CLIENT();
return DoGetObjectAsync(
ObjectPath,
lFlags,
pCtx,
pResponseHandler);
}
HRESULT
CImpersonatedProvider::PutInstanceAsync(
/* [in] */ IWbemClassObject __RPC_FAR *pInst,
/* [in] */ long lFlags,
/* [in] */ IWbemContext __RPC_FAR *pCtx,
/* [in] */ IWbemObjectSink __RPC_FAR *pResponseHandler)
{
DNS_IMPERSONATE_CLIENT();
return DoPutInstanceAsync(
pInst,
lFlags,
pCtx,
pResponseHandler);
}
// CWbemInstanceMgr
CWbemInstanceMgr::CWbemInstanceMgr(
IWbemObjectSink* pHandler,
DWORD dwSize)
:m_pSink(NULL), m_ppInst(NULL), m_dwIndex(0)
{
m_pSink = pHandler;
if(m_pSink != NULL)
m_pSink->AddRef();
m_dwThreshHold = dwSize;
m_ppInst = new IWbemClassObject*[dwSize];
for(DWORD i = 0; i < dwSize; i++)
m_ppInst[i] = NULL;
}
CWbemInstanceMgr::~CWbemInstanceMgr()
{
if(m_ppInst != NULL)
{
if(m_dwIndex >0)
{
m_pSink->Indicate(
m_dwIndex,
m_ppInst);
}
for(DWORD i =0; i<m_dwIndex; i++)
{
if(m_ppInst[i] != NULL)
(m_ppInst[i])->Release();
}
delete [] m_ppInst;
}
if(m_pSink != NULL)
m_pSink->Release();
}
void
CWbemInstanceMgr::Indicate(IWbemClassObject* pInst)
{
if(pInst == NULL)
throw WBEM_E_INVALID_PARAMETER;
m_ppInst[m_dwIndex++] = pInst;
pInst->AddRef();
if(m_dwIndex == m_dwThreshHold)
{
SCODE sc = m_pSink->Indicate(
m_dwIndex,
m_ppInst);
if(sc != S_OK)
throw sc;
// reset state
for(DWORD i=0; i< m_dwThreshHold; i++)
{
if(m_ppInst[i] != NULL)
(m_ppInst[i])->Release();
m_ppInst[i] = NULL;
}
m_dwIndex = 0;
}
return;
}
void
CWbemInstanceMgr::SetStatus(
LONG lFlags,
HRESULT hr,
BSTR strParam,
IWbemClassObject* pObjParam)
{
m_pSink->SetStatus(
lFlags,
hr,
strParam,
pObjParam);
}