201 lines
5.6 KiB
C++
201 lines
5.6 KiB
C++
//***************************************************************************
|
|
//
|
|
// 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 <objbase.h>
|
|
#include "bootini.h"
|
|
#include <process.h>
|
|
|
|
|
|
//***************************************************************************
|
|
//
|
|
// 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;
|
|
|
|
}
|