327 lines
8.6 KiB
C++
327 lines
8.6 KiB
C++
// Copyright (c) Microsoft. All rights reserved.
|
|
//
|
|
// This is unpublished source code of Microsoft.
|
|
// The copyright notice above does not evidence any
|
|
// actual or intended publication of such source code.
|
|
|
|
// OneLiner : Implementation of MWmiInstance
|
|
// DevUnit : wlbstest
|
|
// Author : Murtaza Hakim
|
|
|
|
// include files
|
|
#include "MWmiInstance.h"
|
|
#include "MTrace.h"
|
|
#include "MWmiError.h"
|
|
#include "WTokens.h"
|
|
|
|
#include <iostream>
|
|
|
|
using namespace std;
|
|
|
|
// default constructor is purposely left undefined. No one should use it.
|
|
|
|
// constructor
|
|
//
|
|
MWmiInstance::MWmiInstance(
|
|
const _bstr_t& objectName,
|
|
const _bstr_t& path,
|
|
IWbemLocatorPtr pwl,
|
|
IWbemServicesPtr pws )
|
|
:
|
|
_objectName( objectName ),
|
|
_path( path ),
|
|
_pwl( pwl ),
|
|
_pws( pws )
|
|
{
|
|
TRACE(MTrace::INFO, L"mwmiinstance constructor\n" );
|
|
}
|
|
|
|
|
|
// copy constructor
|
|
//
|
|
MWmiInstance::MWmiInstance( const MWmiInstance& obj)
|
|
:
|
|
_path( obj._path ),
|
|
_pwl( obj._pwl ),
|
|
_pws( obj._pws ),
|
|
_objectName( obj._objectName )
|
|
|
|
{
|
|
TRACE(MTrace::INFO, L"mwmiinstance copy constructor\n" );
|
|
}
|
|
|
|
|
|
// assignment operator
|
|
//
|
|
MWmiInstance&
|
|
MWmiInstance::operator=( const MWmiInstance& rhs )
|
|
{
|
|
_path = rhs._path;
|
|
_pwl = rhs._pwl;
|
|
_pws = rhs._pws;
|
|
_objectName = rhs._objectName;
|
|
|
|
TRACE(MTrace::INFO, L"mwmiinstance assignment operator\n" );
|
|
return *this;
|
|
}
|
|
|
|
|
|
// destructor
|
|
MWmiInstance::~MWmiInstance()
|
|
{
|
|
TRACE(MTrace::INFO, L"mwmiinstance destructor\n" );
|
|
}
|
|
|
|
|
|
// runMethod
|
|
MWmiInstance::MWmiInstance_Error
|
|
MWmiInstance::runMethod(
|
|
const _bstr_t& methodToRun,
|
|
const vector<MWmiParameter *>& inputParameters,
|
|
vector<MWmiParameter *>& outputParameters
|
|
)
|
|
{
|
|
HRESULT hr;
|
|
|
|
_variant_t v_retVal;
|
|
|
|
|
|
IWbemClassObjectPtr pwcoClass;
|
|
IWbemClassObjectPtr pwcoOutput;
|
|
IWbemClassObjectPtr pwcoInput;
|
|
IWbemClassObjectPtr pwcoInputInstance;
|
|
|
|
hr = _pws->GetObject( _objectName,
|
|
0,
|
|
NULL,
|
|
&pwcoClass,
|
|
NULL );
|
|
if( FAILED(hr) )
|
|
{
|
|
TRACE(MTrace::SEVERE_ERROR, L"IWbemServices::GetObject failure\n");
|
|
throw _com_error( hr );
|
|
}
|
|
|
|
// check if any input parameters specified.
|
|
if( inputParameters.size() != 0 )
|
|
{
|
|
|
|
hr = pwcoClass->GetMethod( methodToRun,
|
|
0,
|
|
&pwcoInput,
|
|
NULL );
|
|
if( FAILED( hr) )
|
|
{
|
|
TRACE(MTrace::SEVERE_ERROR, L"IWbemClassObject::GetMethod failure\n");
|
|
throw _com_error( hr );
|
|
}
|
|
|
|
hr = pwcoInput->SpawnInstance( 0, &pwcoInputInstance );
|
|
if( FAILED( hr) )
|
|
{
|
|
TRACE( MTrace::SEVERE_ERROR, "IWbemClassObject::SpawnInstance failure. Unable to spawn instance.\n" );
|
|
throw _com_error( hr );
|
|
}
|
|
|
|
for( int i = 0; i < inputParameters.size(); ++i )
|
|
{
|
|
hr = pwcoInputInstance->Put( inputParameters[i]->getName(),
|
|
0,
|
|
&(inputParameters[i]->getValue() ),
|
|
0 );
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
TRACE(MTrace::SEVERE_ERROR, L"IWbemClassObject::Put failure\n");
|
|
throw _com_error( hr );
|
|
}
|
|
}
|
|
}
|
|
|
|
// execute method.
|
|
hr = _pws->ExecMethod( _path,
|
|
methodToRun,
|
|
0,
|
|
NULL,
|
|
pwcoInputInstance,
|
|
&pwcoOutput,
|
|
NULL);
|
|
if( FAILED( hr) )
|
|
{
|
|
TRACE(MTrace::SEVERE_ERROR, L"IWbemServices::ExecMethod failure\n");
|
|
throw _com_error( hr );
|
|
}
|
|
|
|
// get output parameters
|
|
for( int i = 0; i < outputParameters.size(); ++i )
|
|
{
|
|
hr = pwcoOutput->Get( outputParameters[i]->getName(),
|
|
0,
|
|
&v_retVal,
|
|
NULL,
|
|
NULL );
|
|
if( FAILED( hr) )
|
|
{
|
|
TRACE(MTrace::SEVERE_ERROR, L"IWbemClassObject::Get failure\n");
|
|
throw _com_error( hr );
|
|
}
|
|
|
|
outputParameters[i]->setValue( v_retVal );
|
|
|
|
v_retVal.Clear();
|
|
}
|
|
|
|
return MWmiInstance_SUCCESS;
|
|
}
|
|
|
|
// getParameters
|
|
//
|
|
MWmiInstance::MWmiInstance_Error
|
|
MWmiInstance::getParameters( vector<MWmiParameter *>& parametersToGet )
|
|
{
|
|
HRESULT hr;
|
|
|
|
IEnumWbemClassObjectPtr pewco;
|
|
IWbemClassObjectPtr pwco;
|
|
|
|
unsigned long count;
|
|
|
|
_variant_t v_path;
|
|
|
|
bool found;
|
|
|
|
CIMTYPE vtype;
|
|
|
|
_variant_t v_value;
|
|
|
|
// get object corresponding to this path.
|
|
hr = _pws->GetObject( _path,
|
|
WBEM_FLAG_RETURN_WBEM_COMPLETE,
|
|
NULL,
|
|
&pwco,
|
|
NULL );
|
|
if( hr == 0x8004100c || hr == 0x8004100a )
|
|
{
|
|
TRACE(MTrace::INFO, L"as this is not supported, trying different mechanism\n");
|
|
|
|
hr = _pws->CreateInstanceEnum( _objectName,
|
|
WBEM_FLAG_RETURN_IMMEDIATELY,
|
|
NULL,
|
|
&pewco );
|
|
if ( FAILED(hr))
|
|
{
|
|
TRACE(MTrace::SEVERE_ERROR, L"IWbemServices::CreateInstanceEnum failure\n");
|
|
throw _com_error( hr );
|
|
}
|
|
|
|
// there may be multiple instances.
|
|
count = 1;
|
|
while ( (hr = pewco->Next( INFINITE,
|
|
1,
|
|
&pwco,
|
|
&count ) ) == S_OK )
|
|
{
|
|
hr = pwco->Get( _bstr_t(L"__RELPATH"), 0, &v_path, NULL, NULL );
|
|
if( FAILED(hr) )
|
|
{
|
|
TRACE(MTrace::SEVERE_ERROR, L"IWbemServices::CreateInstanceEnum failure\n");
|
|
throw _com_error( hr );
|
|
}
|
|
|
|
if( _bstr_t( v_path ) == _path )
|
|
{
|
|
// required instance found
|
|
found = true;
|
|
v_path.Clear();
|
|
break;
|
|
}
|
|
|
|
count = 1;
|
|
|
|
v_path.Clear();
|
|
}
|
|
|
|
if( found == false )
|
|
{
|
|
TRACE( MTrace::SEVERE_ERROR, "unable to find instance with path specified\n");
|
|
throw _com_error( WBEM_E_NOT_FOUND );
|
|
}
|
|
}
|
|
else if ( FAILED(hr) )
|
|
{
|
|
TRACE( MTrace::SEVERE_ERROR, L"IWbemServices::GetObject failure\n");
|
|
throw _com_error( hr );
|
|
}
|
|
|
|
for( int i = 0; i < parametersToGet.size(); ++i )
|
|
{
|
|
hr = pwco->Get( parametersToGet[i]->getName(),
|
|
0,
|
|
&v_value,
|
|
&vtype,
|
|
NULL );
|
|
if( FAILED( hr ) )
|
|
{
|
|
TRACE( MTrace::SEVERE_ERROR, "IWbemClassObject::Get failure\n");
|
|
throw _com_error(hr);
|
|
}
|
|
|
|
parametersToGet[i]->setValue( v_value );
|
|
v_value.Clear();
|
|
}
|
|
|
|
return MWmiInstance_SUCCESS;
|
|
}
|
|
|
|
// setParameters
|
|
//
|
|
MWmiInstance::MWmiInstance_Error
|
|
MWmiInstance::setParameters( const vector<MWmiParameter *>& parametersToSet )
|
|
{
|
|
HRESULT hr;
|
|
IWbemClassObjectPtr pwco = NULL;
|
|
|
|
_variant_t v_value;
|
|
|
|
// get object corresponding to this path.
|
|
hr = _pws->GetObject( _path,
|
|
WBEM_FLAG_RETURN_WBEM_COMPLETE,
|
|
NULL,
|
|
&pwco,
|
|
NULL );
|
|
if( FAILED( hr ) )
|
|
{
|
|
TRACE( MTrace::SEVERE_ERROR, "IWbemServices::GetObject failure\n");
|
|
throw _com_error( hr );
|
|
}
|
|
|
|
for( int i = 0; i < parametersToSet.size(); ++i )
|
|
{
|
|
v_value = parametersToSet[i]->getValue();
|
|
|
|
hr = pwco->Put( parametersToSet[i]->getName(),
|
|
0,
|
|
&v_value,
|
|
NULL );
|
|
if( FAILED( hr ) )
|
|
{
|
|
TRACE( MTrace::SEVERE_ERROR, "IWbemClassObject::Get failure\n");
|
|
throw _com_error( hr );
|
|
}
|
|
|
|
v_value.Clear();
|
|
}
|
|
|
|
hr = _pws->PutInstance( pwco,
|
|
WBEM_FLAG_UPDATE_ONLY,
|
|
NULL,
|
|
NULL );
|
|
if( FAILED(hr) )
|
|
{
|
|
TRACE( MTrace::SEVERE_ERROR, "IWbemServices::PutInstance failure\n");
|
|
throw _com_error( hr );
|
|
}
|
|
|
|
return MWmiInstance_SUCCESS;
|
|
}
|