//*************************************************************************** // // INSTPRO.CPP // // Module: WMI Instance provider code for Boot Parameters // // Purpose: Defines the CInstPro class. An object of this class is // created by the class factory for each connection. // // Copyright (c) 1997-1999 Microsoft Corporation // //*************************************************************************** #include #include "bootini.h" #include //*************************************************************************** // // CBootInstPro::CBootInstPro // CBootInstPro::~CInstPro // //*************************************************************************** CBootInstPro::CBootInstPro(BSTR ObjectPath, BSTR User, BSTR Password, IWbemContext * pCtx) { m_pNamespace = NULL; m_cRef=0; InterlockedIncrement(&g_cObj); return; } CBootInstPro::~CBootInstPro(void) { if(m_pNamespace) m_pNamespace->Release(); InterlockedDecrement(&g_cObj); return; } //*************************************************************************** // // CBootInstPro::QueryInterface // CBootInstPro::AddRef // CBootInstPro::Release // // Purpose: IUnknown members for CInstPro object. //*************************************************************************** STDMETHODIMP CBootInstPro::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) CBootInstPro::AddRef(void) { return ++m_cRef; } STDMETHODIMP_(ULONG) CBootInstPro::Release(void) { ULONG nNewCount = InterlockedDecrement((long *)&m_cRef); if (0L == nNewCount) delete this; return nNewCount; } /*********************************************************************** * * * CBootInstPro::Initialize * * * * Purpose: This is the implementation of IWbemProviderInit. The method * * is need to initialize with CIMOM. * * * ***********************************************************************/ STDMETHODIMP CBootInstPro::Initialize(LPWSTR pszUser, LONG lFlags, LPWSTR pszNamespace, LPWSTR pszLocale, IWbemServices *pNamespace, IWbemContext *pCtx, IWbemProviderInitSink *pInitSink ) { if(pNamespace) pNamespace->AddRef(); m_pNamespace = pNamespace; //Let CIMOM know you are initialized //================================== pInitSink->SetStatus(WBEM_S_INITIALIZED,0); return WBEM_S_NO_ERROR; } //*************************************************************************** // // CBootInstPro::GetObjectByPath // CBootInstPro::GetObjectByPathAsync // // Purpose: Creates an instance given a particular path value. // //*************************************************************************** SCODE CBootInstPro::GetObjectAsync(const BSTR ObjectPath, long lFlags, IWbemContext *pCtx, IWbemObjectSink FAR* pHandler ) { SCODE sc; int iCnt; IWbemClassObject FAR* pNewInst; IWbemClassObject FAR* pNewOSInst; IWbemClassObject *pClass; // Do a check of arguments and make sure we have pointer to Namespace if(pHandler == NULL || m_pNamespace == NULL) return WBEM_E_INVALID_PARAMETER; if(wcscmp(ObjectPath,L"BootLoaderParameters=@") == 0){ // fill in the loader parameters and return sc = m_pNamespace->GetObject(L"BootLoaderParameters", 0, pCtx, &pClass, NULL); if(sc != S_OK){ return WBEM_E_FAILED; } sc = pClass->SpawnInstance(0,&pNewInst); if(FAILED(sc)){ return sc; } pClass->Release(); sc = GetBootLoaderParameters(m_pNamespace, pNewInst, pCtx); if(sc != S_OK){ pNewInst->Release(); return sc; } pHandler->Indicate(1,&pNewInst); pNewInst->Release(); pHandler->SetStatus(0,sc,NULL, NULL); return S_OK; } return WBEM_E_INVALID_PARAMETER; } SCODE CBootInstPro::PutInstanceAsync(IWbemClassObject *pInst, long lFlags, IWbemContext *pCtx, IWbemObjectSink FAR* pHandler ) { IWbemClassObject *pClass; IWbemClassObject *pOldInst; SCODE sc; if(pHandler == NULL || m_pNamespace == NULL) return WBEM_E_INVALID_PARAMETER; sc = m_pNamespace->GetObject(L"OSParameters", 0, pCtx, &pClass, NULL); if(sc != S_OK){ return WBEM_E_FAILED; } LONG ret = SaveBootFile(pInst,pClass); pClass->Release(); if (ret) { return WBEM_E_FAILED; } pHandler->SetStatus(0,sc,NULL, NULL); return WBEM_S_NO_ERROR; }