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.
238 lines
5.8 KiB
238 lines
5.8 KiB
#include "precomp.h"
|
|
#include "ObjAccess.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CObjAccess
|
|
|
|
CObjAccess::CObjAccess() :
|
|
m_pObj(NULL),
|
|
m_pObjAccess(NULL),
|
|
m_pWmiObj(NULL),
|
|
m_pProps(0)
|
|
{
|
|
}
|
|
|
|
CObjAccess::CObjAccess(const CObjAccess& other) :
|
|
m_pProps(other.m_pProps),
|
|
m_pObj(NULL),
|
|
m_pObjAccess(NULL),
|
|
m_pWmiObj(NULL)
|
|
{
|
|
other.m_pObj->Clone(&m_pObj);
|
|
|
|
m_pObj->QueryInterface(
|
|
IID_IWbemObjectAccess,
|
|
(LPVOID*) &m_pObjAccess);
|
|
m_pObj->QueryInterface(
|
|
IID__IWmiObject,
|
|
(LPVOID*) &m_pWmiObj);
|
|
}
|
|
|
|
CObjAccess::~CObjAccess()
|
|
{
|
|
if (m_pObjAccess)
|
|
m_pObjAccess->Release();
|
|
|
|
if (m_pObj)
|
|
m_pObj->Release();
|
|
|
|
if (m_pWmiObj)
|
|
m_pWmiObj->Release();
|
|
}
|
|
|
|
|
|
const CObjAccess& CObjAccess::operator=(const CObjAccess& other)
|
|
{
|
|
m_pProps = other.m_pProps;
|
|
|
|
other.m_pObj->Clone(&m_pObj);
|
|
|
|
m_pObj->QueryInterface(
|
|
IID_IWbemObjectAccess,
|
|
(LPVOID*) &m_pObjAccess);
|
|
|
|
m_pObj->QueryInterface(
|
|
IID__IWmiObject,
|
|
(LPVOID*) &m_pWmiObj);
|
|
|
|
return *this;
|
|
}
|
|
|
|
BOOL CObjAccess::Init(
|
|
IWbemServices *pSvc,
|
|
LPCWSTR szClass,
|
|
LPCWSTR *pszPropNames,
|
|
DWORD nProps,
|
|
INIT_FAILED_PROP_TYPE typeFail)
|
|
{
|
|
IWbemClassObject *pClass = NULL;
|
|
BOOL bRet = FALSE;
|
|
|
|
if (SUCCEEDED(pSvc->GetObject(
|
|
_bstr_t(szClass),
|
|
0,
|
|
NULL,
|
|
&pClass,
|
|
NULL)) &&
|
|
SUCCEEDED(pClass->SpawnInstance(0, &m_pObj)))
|
|
{
|
|
// Get out if we don't need the whole IWbemObjectAccess stuff.
|
|
if (nProps == 0)
|
|
return TRUE;
|
|
|
|
m_pObj->QueryInterface(IID_IWbemObjectAccess, (LPVOID*) &m_pObjAccess);
|
|
m_pObj->QueryInterface(IID__IWmiObject, (LPVOID*) &m_pWmiObj);
|
|
|
|
if (m_pProps.Init(nProps))
|
|
{
|
|
m_pProps.SetCount(nProps);
|
|
|
|
bRet = TRUE;
|
|
|
|
for (DWORD i = 0; i < nProps; i++)
|
|
{
|
|
CProp &prop = m_pProps[i];
|
|
|
|
if(m_pWmiObj)
|
|
{
|
|
if (SUCCEEDED(m_pWmiObj->GetPropertyHandleEx(
|
|
pszPropNames[i],
|
|
0,
|
|
&prop.m_type,
|
|
&prop.m_lHandle)))
|
|
{
|
|
prop.m_strName = pszPropNames[i];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (SUCCEEDED(m_pObjAccess->GetPropertyHandle(
|
|
pszPropNames[i],
|
|
&prop.m_type,
|
|
&prop.m_lHandle)))
|
|
{
|
|
prop.m_strName = pszPropNames[i];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pClass)
|
|
pClass->Release();
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL CObjAccess::WriteData(DWORD dwIndex, LPVOID pData, DWORD dwSize)
|
|
{
|
|
CProp &prop = m_pProps[dwIndex];
|
|
BOOL bRet = FALSE;
|
|
|
|
// This function only works for non arrays.
|
|
_ASSERT((prop.m_type & CIM_FLAG_ARRAY) == 0);
|
|
|
|
bRet =
|
|
SUCCEEDED(m_pObjAccess->WritePropertyValue(
|
|
prop.m_lHandle,
|
|
dwSize,
|
|
(LPBYTE) pData));
|
|
|
|
return bRet;
|
|
}
|
|
|
|
BOOL CObjAccess::WriteArrayData(DWORD dwIndex, LPVOID pData, DWORD dwItemSize)
|
|
{
|
|
if(m_pWmiObj == NULL)
|
|
return TRUE; // pretend we did it
|
|
|
|
CProp &prop = m_pProps[dwIndex];
|
|
|
|
// This function only works for arrays.
|
|
_ASSERT(prop.m_type & CIM_FLAG_ARRAY);
|
|
|
|
DWORD dwItems = *(DWORD*) pData,
|
|
dwSize = dwItems * dwItemSize;
|
|
|
|
HRESULT hr;
|
|
|
|
hr =
|
|
m_pWmiObj->SetArrayPropRangeByHandle(
|
|
prop.m_lHandle,
|
|
WMIARRAY_FLAG_ALLELEMENTS, // flags
|
|
0, // start index
|
|
dwItems, // # items
|
|
dwSize, // buffer size
|
|
((LPBYTE) pData) + sizeof(DWORD)); // data buffer
|
|
|
|
return SUCCEEDED(hr);
|
|
}
|
|
|
|
BOOL CObjAccess::WriteNonPackedArrayData(
|
|
DWORD dwIndex,
|
|
LPVOID pData,
|
|
DWORD dwItems,
|
|
DWORD dwTotalSize)
|
|
{
|
|
if(m_pWmiObj == NULL)
|
|
return TRUE; // pretend we did it
|
|
|
|
CProp &prop = m_pProps[dwIndex];
|
|
HRESULT hr;
|
|
|
|
// This function only works for arrays.
|
|
_ASSERT(prop.m_type & CIM_FLAG_ARRAY);
|
|
|
|
hr =
|
|
m_pWmiObj->SetArrayPropRangeByHandle(
|
|
prop.m_lHandle,
|
|
WMIARRAY_FLAG_ALLELEMENTS, // flags
|
|
0, // start index
|
|
dwItems, // # items
|
|
dwTotalSize, // buffer size
|
|
pData); // data buffer
|
|
|
|
return SUCCEEDED(hr);
|
|
}
|
|
|
|
|
|
BOOL CObjAccess::WriteString(DWORD dwIndex, LPCWSTR szValue)
|
|
{
|
|
return
|
|
SUCCEEDED(m_pObjAccess->WritePropertyValue(
|
|
m_pProps[dwIndex].m_lHandle,
|
|
(wcslen(szValue) + 1) * sizeof(WCHAR),
|
|
(LPBYTE) szValue));
|
|
}
|
|
|
|
BOOL CObjAccess::WriteString(DWORD dwIndex, LPCSTR szValue)
|
|
{
|
|
return WriteString(dwIndex, (LPCWSTR) _bstr_t(szValue));
|
|
}
|
|
|
|
BOOL CObjAccess::WriteDWORD(DWORD dwIndex, DWORD dwValue)
|
|
{
|
|
return
|
|
SUCCEEDED(m_pObjAccess->WriteDWORD(
|
|
m_pProps[dwIndex].m_lHandle,
|
|
dwValue));
|
|
}
|
|
|
|
BOOL CObjAccess::WriteDWORD64(DWORD dwIndex, DWORD64 dwValue)
|
|
{
|
|
return
|
|
SUCCEEDED(m_pObjAccess->WriteQWORD(
|
|
m_pProps[dwIndex].m_lHandle,
|
|
dwValue));
|
|
}
|
|
|
|
BOOL CObjAccess::WriteNULL(DWORD dwIndex)
|
|
{
|
|
return
|
|
SUCCEEDED(m_pObj->Put(
|
|
m_pProps[dwIndex].m_strName,
|
|
0,
|
|
NULL,
|
|
0));
|
|
}
|
|
|