Leaked source code of windows server 2003
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

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