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.
2489 lines
64 KiB
2489 lines
64 KiB
//***************************************************************************
|
|
//
|
|
// Copyright © Microsoft Corporation. All rights reserved.
|
|
//
|
|
// Instance.CPP
|
|
//
|
|
// Purpose: Implementation of CInstance class
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include "precomp.h"
|
|
|
|
#include <BrodCast.h>
|
|
#include <assertbreak.h>
|
|
#include <stopwatch.h>
|
|
#include "FWStrings.h"
|
|
|
|
#define DEPRECATED 1
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: CInstance ctor
|
|
//
|
|
//
|
|
//
|
|
// Inputs: IWbemClassObject* - the class we want to wrap
|
|
// MethodContext* - since the context is shared, this will be addreffed
|
|
// Outputs:
|
|
//
|
|
// Return:
|
|
//
|
|
// Comments: pointers should not be NULL
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
CInstance::CInstance(IWbemClassObject* piClassObject, MethodContext* pMethodContext)
|
|
: m_nRefCount( 1 )
|
|
{
|
|
ASSERT_BREAK(piClassObject != NULL);
|
|
ASSERT_BREAK(pMethodContext != NULL);
|
|
|
|
// Both these values will be released in the destructor, so they both oughta
|
|
// be AddRefed. Note that they are
|
|
|
|
m_piClassObject = piClassObject;
|
|
if ( NULL != piClassObject )
|
|
{ // this, however, is a copy
|
|
m_piClassObject->AddRef();
|
|
}
|
|
|
|
m_pMethodContext = pMethodContext;
|
|
if (pMethodContext)
|
|
{ // this, however, is a copy
|
|
m_pMethodContext->AddRef();
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: CInstance Dtor
|
|
//
|
|
//
|
|
//
|
|
// Inputs:
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return:
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
CInstance::~CInstance()
|
|
{
|
|
|
|
if ( NULL != m_piClassObject )
|
|
{
|
|
m_piClassObject->Release();
|
|
}
|
|
|
|
if ( NULL != m_pMethodContext )
|
|
{
|
|
m_pMethodContext->Release();
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: CInstance::AddRef
|
|
//
|
|
// Increments our reference count.
|
|
//
|
|
// Inputs: None.
|
|
//
|
|
// Outputs: None.
|
|
//
|
|
// Return: New Reference Count.
|
|
//
|
|
// Comments: We may want to go to an Interlocked Inc/Dec model at
|
|
// some point if Thread Safety on these objects becomes
|
|
// an issue.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
LONG CInstance::AddRef( void )
|
|
{
|
|
return InterlockedIncrement(&m_nRefCount);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: CInstance::Release
|
|
//
|
|
// Decrements our reference count.
|
|
//
|
|
// Inputs: None.
|
|
//
|
|
// Outputs: None.
|
|
//
|
|
// Return: New Reference Count.
|
|
//
|
|
// Comments: Deletes the object when the ref count hits 0. We may
|
|
// want to go to an Interlocked Inc/Dec model at some
|
|
// point if Thread Safety on these objects becomes an issue.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
LONG CInstance::Release( void )
|
|
{
|
|
LONG nRet = InterlockedDecrement(&m_nRefCount);
|
|
|
|
ASSERT_BREAK(nRet >= 0);
|
|
|
|
if ( 0 == nRet )
|
|
{
|
|
delete this;
|
|
}
|
|
else if (nRet < 0)
|
|
{
|
|
// Duplicate release. Let's try to dump the stack
|
|
DWORD t_stack[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
|
#ifdef _X86_
|
|
DWORD *dwEBP;
|
|
|
|
_asm {
|
|
mov dwEBP, ebp
|
|
}
|
|
|
|
dwEBP += 1;
|
|
memcpy(&t_stack, dwEBP, sizeof(t_stack));
|
|
#endif
|
|
|
|
CHString sMsg;
|
|
sMsg.Format(L"Duplicate release: %08x %08x %08x %08x %08x %08x %08x %08x "
|
|
L"%08x %08x %08x %08x %08x %08x %08x %08x "
|
|
L"%08x %08x %08x %08x %08x %08x %08x %08x "
|
|
L"%08x %08x %08x %08x %08x %08x %08x %08x ",
|
|
t_stack[0], t_stack[1], t_stack[2], t_stack[3],
|
|
t_stack[4], t_stack[5], t_stack[6], t_stack[7],
|
|
t_stack[8], t_stack[9], t_stack[10], t_stack[11],
|
|
t_stack[12], t_stack[13], t_stack[14], t_stack[15],
|
|
t_stack[16], t_stack[17], t_stack[18], t_stack[19],
|
|
t_stack[20], t_stack[21], t_stack[22], t_stack[23],
|
|
t_stack[24], t_stack[25], t_stack[26], t_stack[27],
|
|
t_stack[28], t_stack[29], t_stack[30], t_stack[31]
|
|
);
|
|
|
|
LogErrorMessage(sMsg);
|
|
}
|
|
|
|
return nRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Commit
|
|
//
|
|
// returns this CInstance to CIMOM
|
|
// will stuff it into the cache someday
|
|
// Inputs:
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return:
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
HRESULT CInstance::Commit(void)
|
|
{
|
|
return m_pMethodContext->Commit( this );
|
|
}
|
|
|
|
IWbemClassObject* CInstance::GetClassObjectInterface()
|
|
{
|
|
m_piClassObject->AddRef();
|
|
|
|
return m_piClassObject;
|
|
}
|
|
|
|
|
|
// reference counting //
|
|
|
|
// string support //
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Set
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to set
|
|
// string to be set
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to set a property that is not a string type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::SetWCHARSplat( LPCWSTR name, LPCWSTR pStr)
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
ASSERT_BREAK(name != NULL);
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v(pStr);
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SETCHSTRING, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SETCHSTRING);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SETCHSTRING);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
|
|
SetLastError(dwLastErr);
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Set
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to set to VT_NULL
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to set a property that is not a string type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::SetNull(LPCWSTR name)
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
ASSERT_BREAK(name != NULL);
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
v.vt = VT_NULL ;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SETCHSTRING, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SETCHSTRING);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SETCHSTRING);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
|
|
SetLastError(dwLastErr);
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: SetStringArray
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to set
|
|
// string to be set
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to set a property that is not a string array type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::SetStringArray(LPCWSTR name, const SAFEARRAY &strArray)
|
|
{
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
ASSERT_BREAK(name != NULL);
|
|
if (m_piClassObject && name)
|
|
{
|
|
SAFEARRAY *t_SafeArray = NULL;
|
|
HRESULT hr = SafeArrayCopy ( ( SAFEARRAY * ) & strArray , &t_SafeArray );
|
|
|
|
if ( SUCCEEDED ( hr ) )
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
v.vt = VT_BSTR | VT_ARRAY ;
|
|
v.parray = t_SafeArray ;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SetStringArray, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SetStringArray);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SetStringArray);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
|
|
SetLastError(dwLastErr);
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Get (CHString)
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to retrieve
|
|
// CHString buffer to receive value
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to get a property that is not a string compatible type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::GetCHString(LPCWSTR name, CHString& str) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
ASSERT_BREAK(name != NULL);
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
// If bSuccess is TRUE, we don't need to log an error. This keeps Gets on
|
|
// null properties from logging an error.
|
|
BOOL bSuccess = SUCCEEDED(hr) && (v.vt == VT_BSTR || v.vt == VT_NULL);
|
|
|
|
ASSERT_BREAK(bSuccess);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if ((v.vt == VT_BSTR) && (v.bstrVal != NULL))
|
|
{
|
|
str = v.bstrVal;
|
|
bRet = true;
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = WBEM_E_TYPE_MISMATCH;
|
|
}
|
|
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GETCHSTRING, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GETCHSTRING);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GETCHSTRING);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
|
|
SetLastError(dwLastErr);
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: GetStringArray
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to retrieve
|
|
// SAFEARRAY *& strArray
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to get a property that is not a string array compatible type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::GetStringArray(LPCWSTR name, SAFEARRAY *& strArray) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
ASSERT_BREAK(name != NULL);
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
// If bSuccess is TRUE, we don't need to log an error. This keeps Gets on
|
|
// null properties from logging an error.
|
|
BOOL bSuccess = SUCCEEDED(hr) && (v.vt == (VT_BSTR|VT_ARRAY) ||
|
|
v.vt == VT_NULL);
|
|
|
|
ASSERT_BREAK(bSuccess);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if ((v.vt == (VT_BSTR|VT_ARRAY)) && (v.parray != NULL ))
|
|
{
|
|
if ( SUCCEEDED ( SafeArrayCopy ( v.parray , ( SAFEARRAY ** ) &strArray ) ) )
|
|
{
|
|
bRet = true ;
|
|
}
|
|
else
|
|
{
|
|
throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = WBEM_E_TYPE_MISMATCH;
|
|
}
|
|
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GetStringArray, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GetStringArray);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GetStringArray);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
|
|
SetLastError(dwLastErr);
|
|
return bRet;
|
|
}
|
|
|
|
bool CInstance::GetWCHAR(LPCWSTR name, WCHAR **pW) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
// If bSuccess is TRUE, we don't need to log an error. This keeps Gets on
|
|
// null properties from logging an error.
|
|
BOOL bSuccess = SUCCEEDED(hr) && (v.vt == VT_BSTR || v.vt == VT_NULL);
|
|
|
|
ASSERT_BREAK(bSuccess);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if ((v.vt == VT_BSTR) && (v.bstrVal != NULL))
|
|
{
|
|
size_t uLength = wcslen(v.bstrVal) + 1;
|
|
|
|
*pW = (WCHAR *)malloc((uLength)*sizeof(WCHAR));
|
|
if (*pW == NULL)
|
|
{
|
|
VariantClear(&v);
|
|
throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ;
|
|
}
|
|
|
|
StringCchCopyW( *pW, uLength, v.bstrVal );
|
|
bRet = true;
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = WBEM_E_TYPE_MISMATCH;
|
|
}
|
|
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GETCHSTRING, name, hr);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GETCHSTRING);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GETCHSTRING);
|
|
}
|
|
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
|
|
SetLastError(dwLastErr);
|
|
return bRet;
|
|
}
|
|
|
|
// WORD support //
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Set (WORD)
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to set
|
|
// WORD to be set
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to set a property that is not a WORD compatible type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::SetWORD(LPCWSTR name, WORD w)
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
ASSERT_BREAK(name);
|
|
if (m_piClassObject && name)
|
|
{
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
v.vt = VT_I4;
|
|
v.lVal = (long)w;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
|
|
VariantClear(&v);
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SETWORD, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SETWORD);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SETWORD);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Get (WORD)
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to retrieve
|
|
// WORD buffer to receive value
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to get a property that is not a WORD compatible type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::GetWORD(LPCWSTR name, WORD& w) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
ASSERT_BREAK(name != NULL);
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
CIMTYPE vtType;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, &vtType, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
// If bSuccess is TRUE, we don't need to log an error. This keeps Gets on
|
|
// null properties from logging an error.
|
|
BOOL bSuccess = SUCCEEDED(hr) && CIM_UINT16 == vtType;
|
|
|
|
ASSERT_BREAK(bSuccess);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// the CIM type is important here
|
|
if( (v.vt == VT_I4) && (CIM_UINT16 == vtType) )
|
|
{
|
|
w = (WORD)v.lVal;
|
|
bRet = true;
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = WBEM_E_TYPE_MISMATCH;
|
|
}
|
|
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GETWORD, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GETWORD);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GETWORD);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
return bRet;
|
|
}
|
|
|
|
// DWORD support //
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Set (DWORD)
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to set
|
|
// DWORD to be set
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to set a property that is not a DWORD compatible type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::SetDWORD(LPCWSTR name, DWORD d)
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
v.vt = VT_I4;
|
|
v.lVal = (long)d;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SETDWORD, name, hr);
|
|
}
|
|
|
|
VariantClear(&v);
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SETDWORD);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SETDWORD);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Get (DWORD)
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to retrieve
|
|
// DWORD buffer to receive value
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to get a property that is not a DWORD compatible type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::GetDWORD(LPCWSTR name, DWORD& d) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
// If bSuccess is TRUE, we don't need to log an error. This keeps Gets on
|
|
// null properties from logging an error.
|
|
BOOL bSuccess = SUCCEEDED(hr) && (v.vt == VT_I4 || v.vt == VT_NULL);
|
|
|
|
ASSERT_BREAK(bSuccess);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (v.vt == VT_I4)
|
|
{
|
|
d = (DWORD)v.lVal;
|
|
bRet = true;
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = WBEM_E_TYPE_MISMATCH;
|
|
}
|
|
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GETDWORD, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GETDWORD);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GETDWORD);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
return bRet;
|
|
}
|
|
|
|
// DOUBLE support //
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Set (DOUBLE)
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to set
|
|
// DOUBLE to be set
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to set a property that is not a DOUBLE compatible type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::SetDOUBLE(LPCWSTR name, DOUBLE dub)
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
V_R8(&v) = dub;
|
|
V_VT(&v) = VT_R8;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
VariantClear(&v);
|
|
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SETDOUBLE, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SETDOUBLE);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SETDOUBLE);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Get (DOUBLE)
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to retrieve
|
|
// DOUBLE buffer to receive value
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to get a property that is not a DOUBLE compatible type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::GetDOUBLE(LPCWSTR name, DOUBLE& dub) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
// If bSuccess is TRUE, we don't need to log an error. This keeps Gets on
|
|
// null properties from logging an error.
|
|
BOOL bSuccess = SUCCEEDED(hr) && (v.vt == VT_R8 || v.vt == VT_NULL);
|
|
|
|
ASSERT_BREAK(bSuccess);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (v.vt == VT_R8)
|
|
{
|
|
dub = V_R8(&v);
|
|
bRet = true;
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = WBEM_E_TYPE_MISMATCH;
|
|
}
|
|
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GETDOUBLE, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GETDOUBLE);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GETDOUBLE);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Set (Byte)
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to set
|
|
// BYTE to be set
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to set a property that is not a BYTE compatible type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::SetByte(LPCWSTR name, BYTE b)
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
v.vt = VT_UI1;
|
|
v.bVal = (long)b ;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SETBYTE, name, hr);
|
|
}
|
|
|
|
VariantClear(&v);
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SETBYTE);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SETBYTE);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: SetEmbeddedObject
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to set
|
|
// CInstance to be set
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to set a property that is not a IUnknown compatible type
|
|
//
|
|
// Comments: CInstance is not released - responsibility of caller
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::SetEmbeddedObject(LPCWSTR name, CInstance& cInstance )
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
IWbemClassObject *t_ClassObject = cInstance.GetClassObjectInterface();
|
|
if ( t_ClassObject )
|
|
{
|
|
variant_t v;
|
|
|
|
v.vt = VT_UNKNOWN;
|
|
v.punkVal = t_ClassObject;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SetEmbeddedObject, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SetEmbeddedObject);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SetEmbeddedObject);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Get (Byte)
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to retrieve
|
|
// BYTE buffer to receive value
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to get a property that is not a DWORD compatible type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::GetByte(LPCWSTR name, BYTE& b) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
CIMTYPE vtType;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, &vtType, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
// If bSuccess is TRUE, we don't need to log an error. This keeps Gets on
|
|
// null properties from logging an error.
|
|
BOOL bSuccess = (SUCCEEDED(hr)) && ((vtType == CIM_SINT8) || (vtType == CIM_UINT8));
|
|
|
|
ASSERT_BREAK(bSuccess);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if( (v.vt == VT_UI1) && ( (vtType == CIM_SINT8) || (vtType == CIM_UINT8) ) )
|
|
{
|
|
b = v.bVal;
|
|
bRet = true;
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = WBEM_E_TYPE_MISMATCH;
|
|
}
|
|
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GETBYTE, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GETBYTE);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GETBYTE);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: GetEmbeddedObject
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to retrieve
|
|
// reference to buffer hold pointer to new instance
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to get a property that is not a object compatible type
|
|
//
|
|
// Comments: Creates CInstance, user is responsible for release
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::GetEmbeddedObject (LPCWSTR name, CInstance** pInstance, MethodContext* pMethodContext) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
ASSERT_BREAK(m_piClassObject && (pInstance != NULL));
|
|
|
|
if (m_piClassObject && name && (pInstance != NULL))
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
// If bSuccess is TRUE, we don't need to log an error. This keeps Gets on
|
|
// null properties from logging an error.
|
|
BOOL bSuccess = SUCCEEDED(hr) && (v.vt == VT_UNKNOWN || v.vt == VT_NULL);
|
|
|
|
ASSERT_BREAK(bSuccess);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (v.vt == VT_UNKNOWN)
|
|
{
|
|
IUnknown *t_Unknown = v.punkVal ;
|
|
if ( t_Unknown )
|
|
{
|
|
IWbemClassObject *t_Object = NULL;
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT t_Result = t_Unknown->QueryInterface ( IID_IWbemClassObject , (void**) &t_Object ) ;
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
if ( SUCCEEDED ( t_Result ) )
|
|
{
|
|
*pInstance = new CInstance(t_Object, pMethodContext);
|
|
if (pInstance == NULL)
|
|
{
|
|
throw CHeap_Exception ( CHeap_Exception :: E_ALLOCATION_ERROR ) ;
|
|
}
|
|
bRet = true ;
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (t_Result);
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (bSuccess)
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = WBEM_E_TYPE_MISMATCH;
|
|
}
|
|
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GetEmbeddedObject, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GetEmbeddedObject);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GetEmbeddedObject);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
// bool support //
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Set (bool)
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to set
|
|
// bool to be set
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to set a property that is not a bool compatible type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::Setbool(LPCWSTR name, bool b)
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
v.vt = VT_BOOL;
|
|
if (b)
|
|
{
|
|
v.boolVal = VARIANT_TRUE;
|
|
}
|
|
else
|
|
{
|
|
v.boolVal = VARIANT_FALSE;
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SETBOOL, name, hr);
|
|
}
|
|
|
|
VariantClear(&v);
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SETBOOL);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SETBOOL);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: Get (bool)
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to retrieve
|
|
// bool buffer to receive value
|
|
// Outputs:
|
|
//
|
|
// Return: false if you try to get a property that is not a bool compatible type
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::Getbool(LPCWSTR name, bool& b) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
// If bSuccess is TRUE, we don't need to log an error. This keeps Gets on
|
|
// null properties from logging an error.
|
|
BOOL bSuccess = (SUCCEEDED(hr)) && (v.vt == VT_BOOL || v.vt == VT_NULL);
|
|
|
|
ASSERT_BREAK(bSuccess);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (v.vt == VT_BOOL)
|
|
{
|
|
if (v.boolVal)
|
|
{
|
|
b = true;
|
|
}
|
|
else
|
|
{
|
|
b = false;
|
|
}
|
|
bRet = true;
|
|
ASSERT_BREAK((v.boolVal == VARIANT_TRUE) || (v.boolVal == VARIANT_FALSE));
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = WBEM_E_TYPE_MISMATCH;
|
|
}
|
|
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GETBOOL, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GETBOOL);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GETBOOL);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: SetVariant
|
|
//
|
|
//
|
|
//
|
|
// Inputs: const LPCWSTR name - Name of property to set
|
|
// const VARIANT& variant - Value to assign to Name.
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if the supplied variant type is not correct
|
|
// for the property we are setting.
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::SetVariant( LPCWSTR name, const VARIANT& variant )
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
HRESULT hr;
|
|
|
|
// I realize the (VARIANT*) cast is ugly, as it is a const,
|
|
// HOWEVER, somewhere nobody seems to understand why we would
|
|
// possibly want to keep things const. I could copy the VARIANT,
|
|
// but that requires the same cast, so under duress, and to reduce
|
|
// redundant code, I'm casting here. Did I mention EXTREME
|
|
// DURESS?
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
hr = m_piClassObject->Put(name, 0, (VARIANT*) &variant, NULL );
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SETVARIANT, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SETVARIANT);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SETVARIANT);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: GetVariant
|
|
//
|
|
//
|
|
//
|
|
// Inputs: const LPCWSTR name - Name of property to set
|
|
// VARIANT& variant - Value to assign to Name.
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if the supplied variant type is not correct
|
|
// for the property we are setting.
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::GetVariant( LPCWSTR name, VARIANT& variant ) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &variant, NULL, NULL );
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GETVARIANT, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GETVARIANT);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GETVARIANT);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: SetDateTime
|
|
//
|
|
//
|
|
//
|
|
// Inputs: const LPCWSTR name - Name of property to set
|
|
// const WBEMTime& wbemtime - Value to assign to Name.
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if the supplied time type is not correct
|
|
// for the property we are setting.
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::SetDateTime( LPCWSTR name, const WBEMTime& wbemtime )
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name && (wbemtime.IsOk()))
|
|
{
|
|
//GetDMTF may throw so get htis before modifying variant_t
|
|
BSTR bstrTmp = wbemtime.GetDMTF(true);
|
|
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
// Time is stored as a BSTR
|
|
v.vt = VT_BSTR;
|
|
v.bstrVal = bstrTmp;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SETDATETIME, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SETDATETIME);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SETDATETIME);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: GetDateTime
|
|
//
|
|
//
|
|
//
|
|
// Inputs: const LPCWSTR name - Name of property to set
|
|
// WBEMTime& wbemtime - Value to obtain from Name.
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if the supplied variant type is not correct
|
|
// for the property we are setting.
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::GetDateTime( LPCWSTR name, WBEMTime& wbemtime ) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
//
|
|
// Get the name as a BSTR and pass it into the
|
|
// wbemtime, which handles the conversion internally
|
|
// like a good little class.
|
|
//
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
// If bSuccess is TRUE, we don't need to log an error. This keeps Gets on
|
|
// null properties from logging an error.
|
|
BOOL bSuccess = (SUCCEEDED(hr)) && (v.vt == VT_BSTR || v.vt == VT_NULL);
|
|
|
|
ASSERT_BREAK(bSuccess);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if ((v.vt == VT_BSTR) && (v.bstrVal != NULL))
|
|
{
|
|
wbemtime = v.bstrVal;
|
|
bRet = wbemtime.IsOk();
|
|
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (WBEM_E_TYPE_MISMATCH);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = WBEM_E_TYPE_MISMATCH;
|
|
}
|
|
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GETDATETIME, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GETDATETIME);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GETDATETIME);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: SetTimeSpan
|
|
//
|
|
//
|
|
//
|
|
// Inputs: const LPCWSTR name - Name of property to set
|
|
// const WBEMTimeSpan& wbemtimespan - Value to assign to Name.
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if the supplied timespan type is not correct
|
|
// for the property we are setting.
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
bool CInstance::SetTimeSpan( LPCWSTR name, const WBEMTimeSpan& wbemtimespan )
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name && (wbemtimespan.IsOk()))
|
|
{
|
|
//GetBSTR may throw so get this before modifying variant_t
|
|
BSTR bstrTmp = wbemtimespan.GetBSTR();
|
|
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
// Time is stored as a BSTR
|
|
v.vt = VT_BSTR;
|
|
v.bstrVal = bstrTmp;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SETTIMESPAN, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SETTIMESPAN);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SETTIMESPAN);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: GetTimeSpan
|
|
//
|
|
//
|
|
//
|
|
// Inputs: const LPCWSTR name - Name of property to set
|
|
// WBEMTimeSpan& wbemtimespan - Value to obtain from Name.
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if the supplied timespan type is not correct
|
|
// for the property we are setting.
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
bool CInstance::GetTimeSpan( LPCWSTR name, WBEMTimeSpan& wbemtimespan ) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
//
|
|
// Get the name as a BSTR and pass it into the
|
|
// wbemtimespan, which handles the conversion
|
|
// internally like a good little class.
|
|
//
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
// If bSuccess is TRUE, we don't need to log an error. This keeps Gets on
|
|
// null properties from logging an error.
|
|
BOOL bSuccess = (SUCCEEDED(hr)) && (v.vt == VT_BSTR || v.vt == VT_NULL);
|
|
|
|
ASSERT_BREAK(bSuccess);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if ((v.vt == VT_BSTR) && (v.bstrVal != NULL))
|
|
{
|
|
wbemtimespan = v.bstrVal;
|
|
bRet = wbemtimespan.IsOk();
|
|
// This is freed by the VariantClear
|
|
// SysFreeString(v.bstrVal);
|
|
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (WBEM_E_TYPE_MISMATCH);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = WBEM_E_TYPE_MISMATCH;
|
|
}
|
|
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GETTIMESPAN, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GETTIMESPAN);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GETTIMESPAN);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: SetWBEMINT64
|
|
//
|
|
//
|
|
//
|
|
// Inputs: const LPCWSTR name - Name of property to set
|
|
// const WBEMINT64& wbemint64 - Value to assign to Name.
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if the supplied wbemint64 type is not correct
|
|
// for the property we are setting.
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
bool CInstance::SetWBEMINT64( LPCWSTR name, const WBEMINT64& wbemint64 )
|
|
{
|
|
// For right now, this is just a CHString.
|
|
return SetWCHARSplat( name, wbemint64 );
|
|
}
|
|
|
|
bool CInstance::SetWBEMINT64( LPCWSTR name, const LONGLONG i64Value )
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
WCHAR szBuff[33];
|
|
|
|
_i64tow(i64Value, szBuff, 10);
|
|
|
|
return SetWCHARSplat(name, szBuff);
|
|
}
|
|
|
|
bool CInstance::SetWBEMINT64( LPCWSTR name, const ULONGLONG i64Value )
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
WCHAR szBuff[33];
|
|
|
|
_ui64tow(i64Value, szBuff, 10);
|
|
|
|
return SetWCHARSplat(name, szBuff);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: GetWBEMINT64
|
|
//
|
|
//
|
|
//
|
|
// Inputs: const LPCWSTR name - Name of property to set
|
|
// WBEMINT64& wbemint64 - Value to assign to Name.
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if the supplied wbemint64 type is not correct
|
|
// for the property we are setting.
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
bool CInstance::GetWBEMINT64( LPCWSTR name, WBEMINT64& wbemint64 ) const
|
|
{
|
|
// For right now, this is just a CHString.
|
|
return GetCHString( name, wbemint64 );
|
|
}
|
|
|
|
bool CInstance::GetWBEMINT64( LPCWSTR name, LONGLONG& i64Value) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
CHString s;
|
|
bool b = GetWBEMINT64(name, s);
|
|
|
|
if (b)
|
|
i64Value = _wtoi64(s);
|
|
|
|
return b;
|
|
}
|
|
|
|
bool CInstance::GetWBEMINT64( LPCWSTR name, ULONGLONG& i64Value) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
CHString s;
|
|
bool b = GetWBEMINT64(name, s);
|
|
|
|
if (b)
|
|
i64Value = _wtoi64(s);
|
|
|
|
return b;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: SetWBEMINT16
|
|
//
|
|
//
|
|
//
|
|
// Inputs: const LPCWSTR name - Name of property to set
|
|
// const WBEMINT16& wbemint16 - Value to assign to Name.
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if the supplied wbemint16 type is not correct
|
|
// for the property we are setting.
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
bool CInstance::SetWBEMINT16( LPCWSTR name, const WBEMINT16& wbemint16 )
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
VARIANT v;
|
|
VariantInit(&v);
|
|
|
|
v.vt = VT_I2;
|
|
v.iVal = wbemint16;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Put(name, 0, &v, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
ASSERT_BREAK(SUCCEEDED(hr));
|
|
|
|
bRet = (bool)SUCCEEDED(hr);
|
|
if (!bRet)
|
|
{
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_SETWBEMINT16, name, hr);
|
|
}
|
|
|
|
VariantClear(&v);
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_SETWBEMINT16);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_SETWBEMINT16);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: GetWBEMINT16
|
|
//
|
|
//
|
|
//
|
|
// Inputs: const LPCWSTR name - Name of property to set
|
|
// WBEMINT16& wbemint16 - Value to assign to Name.
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: false if the supplied wbemint16 type is not correct
|
|
// for the property we are setting.
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
bool CInstance::GetWBEMINT16( LPCWSTR name, WBEMINT16& wbemint16 ) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = false;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
CIMTYPE vtType;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, &vtType, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
// If bSuccess is TRUE, we don't need to log an error. This keeps Gets on
|
|
// null properties from logging an error.
|
|
BOOL bSuccess = (SUCCEEDED(hr)) && (CIM_SINT16 == vtType) && ((v.vt == VT_I2) || (v.vt == VT_NULL));
|
|
|
|
ASSERT_BREAK(bSuccess);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if ((vtType == CIM_SINT16) && (v.vt == VT_I2))
|
|
{
|
|
wbemint16 = v.iVal;
|
|
bRet = true;
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_S_NO_MORE_DATA);
|
|
}
|
|
}
|
|
|
|
if (!bSuccess)
|
|
{
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = WBEM_E_TYPE_MISMATCH;
|
|
}
|
|
|
|
dwLastErr = (hr);
|
|
LogError(IDS_FAILED, IDS_GETWBEMINT16, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
LogError(IDS_InParam, IDS_GETWBEMINT16);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
LogError(IDS_NOCLASS, IDS_GETWBEMINT16);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: IsNull (LPCWSTR)
|
|
//
|
|
// Inputs: Name of property to check
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: true if VT_NULL or (VT_BSTR and *bstr == NULL)
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::IsNull(LPCWSTR name) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool bRet = true;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (( v.vt != VT_NULL ) &&
|
|
( (v.vt != VT_BSTR) || (v.bstrVal != NULL) ))
|
|
{
|
|
bRet = false;
|
|
}
|
|
else
|
|
{
|
|
bRet = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ASSERT_BREAK(0);
|
|
LogError(IDS_FAILED, IDS_CINSTANCEISNULL, name, hr);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ASSERT_BREAK(0);
|
|
|
|
if (m_piClassObject)
|
|
{
|
|
LogError(IDS_InParam, IDS_CINSTANCEISNULL);
|
|
}
|
|
else
|
|
{
|
|
LogError(IDS_NOCLASS, IDS_CINSTANCEISNULL);
|
|
}
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
|
|
return bRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Function: GetStatus (LPCWSTR, bool&,VARTYPE &)
|
|
//
|
|
//
|
|
//
|
|
// Inputs: Name of property to check
|
|
//
|
|
// Outputs:
|
|
//
|
|
// Return: true if succeeded, false otherwise
|
|
//
|
|
// Comments:
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
bool CInstance::GetStatus (LPCWSTR name, bool &a_Exists , VARTYPE &a_VarType ) const
|
|
{
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
bool t_Status = true ;
|
|
DWORD dwLastErr = 0;
|
|
|
|
if (m_piClassObject && name)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::WinMgmtTimer);
|
|
HRESULT hr = m_piClassObject->Get(name, 0, &v, NULL, NULL);
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::FrameworkTimer);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
a_Exists = true ;
|
|
a_VarType = v.vt ;
|
|
}
|
|
else
|
|
{
|
|
a_Exists = false ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_piClassObject)
|
|
{
|
|
dwLastErr = (WBEM_E_INVALID_PARAMETER);
|
|
}
|
|
else
|
|
{
|
|
dwLastErr = (WBEM_E_FAILED);
|
|
}
|
|
|
|
t_Status = false ;
|
|
}
|
|
|
|
PROVIDER_INSTRUMENTATION_START(m_pMethodContext, StopWatch::ProviderTimer);
|
|
SetLastError(dwLastErr);
|
|
|
|
return t_Status ;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
MethodContext* CInstance::GetMethodContext() const
|
|
{
|
|
return m_pMethodContext;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
void CInstance::LogError(LPCWSTR errorStr, LPCWSTR pFunctionName, LPCWSTR pArgs /*= NULL*/, HRESULT hError /*= -1*/) const
|
|
{
|
|
if (IsErrorLoggingEnabled())
|
|
{
|
|
CHString className(IDS_UNKNOWNCLASS);
|
|
// GetCHString("__NAME", className);
|
|
// okay, I'm NOT going through GetCHString to get this
|
|
// why? what happens if it fails? it tries to call this function...
|
|
// can you say "stack overflow?"
|
|
if (m_piClassObject)
|
|
{
|
|
// Variant_t handles the VariantInit/VariantClear
|
|
variant_t v;
|
|
|
|
HRESULT hr = m_piClassObject->Get(IDS_CLASS, 0, &v, NULL, NULL);
|
|
|
|
ASSERT_BREAK((SUCCEEDED(hr)) && ((v.vt == VT_NULL) || (v.vt == VT_BSTR)));
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if ( v.bstrVal != NULL
|
|
&& v.vt != VT_NULL )
|
|
{
|
|
className = v.bstrVal;
|
|
}
|
|
}
|
|
}
|
|
|
|
// intent is that the error string look like:
|
|
// ERROR CInstance(Win32_UnlogicalDisk)::SetDoohicky(argVal) thing broke! error code: 0xFF1234
|
|
if (hError != -1)
|
|
{
|
|
if (pArgs == NULL)
|
|
{
|
|
LogErrorMessage6(L"%s%s)::%s %s error# %X", IDS_CINSTANCEERROR, (LPCWSTR)className, pFunctionName, errorStr, hError);
|
|
}
|
|
else
|
|
{
|
|
LogErrorMessage7(L"%s%s)::%s(%s) %s error# %X", IDS_CINSTANCEERROR, (LPCWSTR)className, pFunctionName, pArgs, errorStr, hError);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (pArgs == NULL)
|
|
{
|
|
LogErrorMessage5(L"%s%s)::%s %s", IDS_CINSTANCEERROR, (LPCWSTR)className, pFunctionName, errorStr);
|
|
}
|
|
else
|
|
{
|
|
LogErrorMessage6(L"%s%s)::%s(%s) %s", IDS_CINSTANCEERROR, (LPCWSTR)className, pFunctionName, pArgs, errorStr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
bool CInstance::SetCHString(LPCWSTR name, const CHString& str)
|
|
{
|
|
return SetWCHARSplat(name, str);
|
|
}
|
|
|
|
bool CInstance::SetCHString(LPCWSTR name, LPCWSTR str)
|
|
{
|
|
return SetWCHARSplat(name, str);
|
|
}
|
|
|
|
bool CInstance::SetCharSplat(LPCWSTR name, LPCWSTR pStr)
|
|
{
|
|
return SetWCHARSplat(name, pStr);
|
|
}
|
|
|
|
bool CInstance::SetCHString(LPCWSTR name, LPCSTR str)
|
|
{
|
|
return SetWCHARSplat(name, CHString(str));
|
|
}
|
|
|
|
bool CInstance::SetCharSplat( LPCWSTR name, LPCSTR pStr)
|
|
{
|
|
return SetWCHARSplat(name, CHString(pStr));
|
|
}
|
|
|
|
bool CInstance::SetCharSplat(LPCWSTR name, DWORD dwResID)
|
|
{
|
|
ASSERT_BREAK(DEPRECATED);
|
|
SetLastError(WBEM_E_NOT_SUPPORTED);
|
|
|
|
return false;
|
|
}
|