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.
 
 
 
 
 
 

597 lines
15 KiB

//***************************************************************************
//
// PodProv.CPP
//
// Module: Sample WMIprovider (SCE attachment)
//
// Purpose: Defines the CPodTestProv class. An object of this class is
// created by the class factory for each connection.
//
// Copyright (c) 1997-1999 Microsoft Corporation
//
//***************************************************************************
#include "podprov.h"
#include "requestobject.h"
// #define _MT
#include <process.h>
CHeap_Exception CPodTestProv::m_he(CHeap_Exception::E_ALLOCATION_ERROR);
//***************************************************************************
//
// CPodTestProv::CPodTestProv
// CPodTestProv::~CPodTestProv
//
//***************************************************************************
CPodTestProv::CPodTestProv()
{
m_cRef=0;
m_pNamespace = NULL;
InterlockedIncrement(&g_cObj);
return;
}
CPodTestProv::~CPodTestProv(void)
{
if(m_pNamespace) m_pNamespace->Release();
InterlockedDecrement(&g_cObj);
return;
}
//***************************************************************************
//
// CPodTestProv::QueryInterface
// CPodTestProv::AddRef
// CPodTestProv::Release
//
// Purpose: IUnknown members for CPodTestProv object.
//***************************************************************************
STDMETHODIMP CPodTestProv::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_(ULONG) CPodTestProv::AddRef(void)
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG) CPodTestProv::Release(void)
{
ULONG nNewCount = InterlockedDecrement((long *)&m_cRef);
if (0L == nNewCount)
delete this;
return nNewCount;
}
/***********************************************************************
* *
* CPodTestProv::Initialize *
* *
* Purpose: This is the implementation of IWbemProviderInit. The method *
* is need to initialize with CIMOM. *
* *
***********************************************************************/
STDMETHODIMP CPodTestProv::Initialize(LPWSTR pszUser, LONG lFlags,
LPWSTR pszNamespace, LPWSTR pszLocale,
IWbemServices *pNamespace,
IWbemContext *pCtx,
IWbemProviderInitSink *pInitSink)
{
HRESULT hres;
if(pNamespace){
m_pNamespace = pNamespace;
m_pNamespace->AddRef();
}
//Let CIMOM know you are initialized
//==================================
pInitSink->SetStatus(WBEM_S_INITIALIZED,0);
return WBEM_S_NO_ERROR;
}
//***************************************************************************
//
// CPodTestProv::CreateInstanceEnumAsync
//
// Purpose: Asynchronously enumerates the instances.
//
//***************************************************************************
STDMETHODIMP CPodTestProv::CreateInstanceEnumAsync(const BSTR strClass, long lFlags,
IWbemContext *pCtx, IWbemObjectSink* pSink)
{
//check parameters
//=========================
if(strClass == NULL || pSink == NULL || m_pNamespace == NULL)
return WBEM_E_INVALID_PARAMETER;
// make sure impersonated
//======================================
HRESULT hr=WBEM_S_NO_ERROR;
CRequestObject *pRObj = NULL;
try{
if ( FAILED( CoImpersonateClient() ) ) return WBEM_E_ACCESS_DENIED;
//Create the RequestObject
pRObj = new CRequestObject();
if(!pRObj) throw m_he;
pRObj->Initialize(m_pNamespace);
//Get the requested object(s)
hr = pRObj->CreateObjectEnum(strClass, pSink, pCtx);
pRObj->Cleanup();
delete pRObj;
// Set status
pSink->SetStatus(0, hr, NULL, NULL);
}catch(CHeap_Exception e_HE){
hr = WBEM_E_OUT_OF_MEMORY;
pSink->SetStatus(0 , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}catch(HRESULT e_hr){
hr = e_hr;
pSink->SetStatus(0 , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}catch(...){
hr = WBEM_E_CRITICAL_ERROR;
pSink->SetStatus(0 , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}
return hr;
}
//***************************************************************************
//
// CPodTestProv::GetObjectByPath
// CPodTestProv::GetObjectByPathAsync
//
// Purpose: Creates an instance given a particular path value.
//
//***************************************************************************
SCODE CPodTestProv::GetObjectAsync(const BSTR strObjectPath, long lFlags,
IWbemContext *pCtx, IWbemObjectSink* pSink)
{
//check parameters
//=========================
if(strObjectPath == NULL || pSink == NULL || m_pNamespace == NULL)
return WBEM_E_INVALID_PARAMETER;
HRESULT hr=WBEM_S_NO_ERROR;
CRequestObject *pRObj = NULL;
try{
if ( FAILED( CoImpersonateClient() ) ) return WBEM_E_ACCESS_DENIED;
//Create the RequestObject
pRObj = new CRequestObject();
if(!pRObj) throw m_he;
pRObj->Initialize(m_pNamespace);
//Get the requested object(s)
hr = pRObj->CreateObject(strObjectPath, pSink, pCtx);
pRObj->Cleanup();
delete pRObj;
// Set status
pSink->SetStatus(0, hr, NULL, NULL);
}catch(CHeap_Exception e_HE){
hr = WBEM_E_OUT_OF_MEMORY;
pSink->SetStatus(0 , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}catch(HRESULT e_hr){
hr = e_hr;
pSink->SetStatus(0 , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}catch(...){
hr = WBEM_E_CRITICAL_ERROR;
pSink->SetStatus(0 , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}
return hr;
}
//***************************************************************************
//
// CPodTestProv::PutInstanceAsync
//
// Purpose: Writes an instance.
//
//***************************************************************************
SCODE CPodTestProv::PutInstanceAsync(IWbemClassObject FAR *pInst, long lFlags, IWbemContext *pCtx,
IWbemObjectSink FAR *pSink)
{
HRESULT hr = WBEM_S_NO_ERROR;
CRequestObject *pRObj = NULL;
try{
// Do a check of arguments and make sure we have pointer to Namespace
if(pInst == NULL || pSink == NULL)
return WBEM_E_INVALID_PARAMETER;
if ( FAILED( CoImpersonateClient() ) ) return WBEM_E_ACCESS_DENIED;
//Create the RequestObject
pRObj = new CRequestObject();
if(!pRObj) throw m_he;
pRObj->Initialize(m_pNamespace);
//Put the object
hr = pRObj->PutObject(pInst, pSink, pCtx);
pRObj->Cleanup();
delete pRObj;
// Set Status
pSink->SetStatus(0 ,hr , NULL, NULL);
}catch(CHeap_Exception e_HE){
hr = WBEM_E_OUT_OF_MEMORY;
pSink->SetStatus(0 , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}catch(HRESULT e_hr){
hr = e_hr;
pSink->SetStatus(0 , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}catch(...){
hr = WBEM_E_CRITICAL_ERROR;
pSink->SetStatus(0 , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}
return hr;
}
//***************************************************************************
//
// CPodTestProv::ExecMethodAsync
//
// Purpose: Executes a method on a class
//
//***************************************************************************
SCODE CPodTestProv::ExecMethodAsync(const BSTR ObjectPath, const BSTR Method, long lFlags,
IWbemContext *pCtx, IWbemClassObject *pInParams,
IWbemObjectSink *pResponse)
{
HRESULT hr = WBEM_S_NO_ERROR;
CRequestObject *pRObj = NULL;
try{
// Do a check of arguments and make sure we have pointer to Namespace
if(ObjectPath == NULL || Method == NULL || pResponse == NULL)
return WBEM_E_INVALID_PARAMETER;
if ( FAILED( CoImpersonateClient() ) ) return WBEM_E_ACCESS_DENIED;
//Create the RequestObject
pRObj = new CRequestObject();
if(!pRObj) throw m_he;
pRObj->Initialize(m_pNamespace);
//Execute the method
hr = pRObj->ExecMethod(ObjectPath, Method, pInParams, pResponse, pCtx);
pRObj->Cleanup();
delete pRObj;
// Set Status
pResponse->SetStatus(WBEM_STATUS_COMPLETE ,hr , NULL, NULL);
}catch(CHeap_Exception e_HE){
hr = WBEM_E_OUT_OF_MEMORY;
pResponse->SetStatus(WBEM_STATUS_COMPLETE , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}catch(HRESULT e_hr){
hr = e_hr;
pResponse->SetStatus(WBEM_STATUS_COMPLETE , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}catch(...){
hr = WBEM_E_CRITICAL_ERROR;
pResponse->SetStatus(WBEM_STATUS_COMPLETE , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}
return hr;
}
SCODE CPodTestProv::DeleteInstanceAsync(const BSTR ObjectPath, long lFlags, IWbemContext *pCtx,
IWbemObjectSink *pResponseHandler)
{
HRESULT hr = WBEM_S_NO_ERROR;
CRequestObject *pRObj = NULL;
try{
// Do a check of arguments and make sure we have pointer to Namespace
if(ObjectPath == NULL || pResponseHandler == NULL) return WBEM_E_INVALID_PARAMETER;
if ( FAILED( CoImpersonateClient() ) ) return WBEM_E_ACCESS_DENIED;
//Create the RequestObject
pRObj = new CRequestObject();
if(!pRObj) throw m_he;
pRObj->Initialize(m_pNamespace);
//Delete the requested object
hr = pRObj->DeleteObject(ObjectPath, pResponseHandler, pCtx);
pRObj->Cleanup();
delete pRObj;
// Set Status
pResponseHandler->SetStatus(0 ,hr , NULL, NULL);
}catch(CHeap_Exception e_HE){
hr = WBEM_E_OUT_OF_MEMORY;
pResponseHandler->SetStatus(0 , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}catch(HRESULT e_hr){
hr = e_hr;
pResponseHandler->SetStatus(0 , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}catch(...){
hr = WBEM_E_CRITICAL_ERROR;
pResponseHandler->SetStatus(0 , hr, NULL, NULL);
if(pRObj){
pRObj->Cleanup();
delete pRObj;
}
}
#ifdef _PRIVATE_DEBUG
if(!HeapValidate(GetProcessHeap(),NULL , NULL)) DebugBreak();
#endif
return hr;
}
HRESULT CPodTestProv::ExecQueryAsync(const BSTR QueryLanguage, const BSTR Query, long lFlags,
IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR *pResponseHandler)
{
HRESULT hr;
hr = WBEM_E_NOT_SUPPORTED;
return hr;
}
HRESULT CheckAndExpandPath(BSTR bstrIn,
BSTR *bstrOut
)
{
if ( bstrIn == NULL || bstrOut == NULL ) {
return WBEM_E_INVALID_PARAMETER;
}
DWORD Len = SysStringLen(bstrIn);
HRESULT hr=WBEM_S_NO_ERROR;
//
// expand environment variable
//
if ( wcsstr(bstrIn, L"%") ) {
PWSTR pBuf=NULL;
PWSTR pBuf2=NULL;
DWORD dwSize = ExpandEnvironmentStrings(bstrIn,NULL, 0);
if ( dwSize > 0 ) {
//
// allocate buffer big enough to have two \\s
//
pBuf = (PWSTR)LocalAlloc(LPTR, (dwSize+1)*sizeof(WCHAR));
if ( pBuf ) {
pBuf2 = (PWSTR)LocalAlloc(LPTR, (dwSize+256)*sizeof(WCHAR));
if ( pBuf2 ) {
DWORD dwNewSize = ExpandEnvironmentStrings(bstrIn,pBuf, dwSize);
if ( dwNewSize > 0) {
//
// convert the string from one \ to \\ (for use with WMI)
//
PWSTR pTemp1=pBuf, pTemp2=pBuf2;
while ( *pTemp1 != L'\0') {
if ( *pTemp1 != L'\\') {
*pTemp2++ = *pTemp1;
} else if ( *(pTemp1+1) != L'\\') {
// single back slash, add another one
*pTemp2++ = *pTemp1;
*pTemp2++ = L'\\';
} else {
// double back slashs, just copy
*pTemp2++ = *pTemp1++;
*pTemp2++ = *pTemp1;
}
pTemp1++;
}
*bstrOut = SysAllocString(pBuf2);
if ( *bstrOut == NULL ) {
hr = WBEM_E_OUT_OF_MEMORY;
}
}
LocalFree(pBuf2);
pBuf2 = NULL;
} else {
hr = WBEM_E_OUT_OF_MEMORY;
}
LocalFree(pBuf);
pBuf = NULL;
} else {
hr = WBEM_E_OUT_OF_MEMORY;
}
} else {
hr = WBEM_E_FAILED;
}
} else {
*bstrOut = SysAllocString(bstrIn);
if ( *bstrOut == NULL ) {
return WBEM_E_OUT_OF_MEMORY;
}
}
return hr;
}