windows-nt/Source/XPSP1/NT/base/headless/bootprov/bootinstprov.cpp
2020-09-26 16:20:57 +08:00

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;
}