windows-nt/Source/XPSP1/NT/admin/wmi/wbem/winmgmt/ess3/permbind.cpp
2020-09-26 16:20:57 +08:00

271 lines
7.4 KiB
C++

//******************************************************************************
//
// PERMBIND.CPP
//
// Copyright (C) 1996-1999 Microsoft Corporation
//
//******************************************************************************
#include "precomp.h"
#include <stdio.h>
#include "pragmas.h"
#include <permbind.h>
#include <permfilt.h>
long CPermanentBinding::mstatic_lConsumerHandle = 0;
long CPermanentBinding::mstatic_lFilterHandle = 0;
long CPermanentBinding::mstatic_lQosHandle = 0;
long CPermanentBinding::mstatic_lSynchronicityHandle = 0;
long CPermanentBinding::mstatic_lSlowDownHandle = 0;
long CPermanentBinding::mstatic_lSecureHandle = 0;
long CPermanentBinding::mstatic_lSidHandle = 0;
bool CPermanentBinding::mstatic_bHandlesInitialized = false;
// static
HRESULT CPermanentBinding::InitializeHandles( _IWmiObject* pBindingObj)
{
if(mstatic_bHandlesInitialized)
return S_FALSE;
CIMTYPE ct;
pBindingObj->GetPropertyHandle(CONSUMER_ROLE_NAME, &ct,
&mstatic_lConsumerHandle);
pBindingObj->GetPropertyHandle(FILTER_ROLE_NAME, &ct,
&mstatic_lFilterHandle);
pBindingObj->GetPropertyHandle(BINDING_SYNCHRONICITY_PROPNAME, &ct,
&mstatic_lSynchronicityHandle);
pBindingObj->GetPropertyHandle(BINDING_QOS_PROPNAME, &ct,
&mstatic_lQosHandle);
pBindingObj->GetPropertyHandle(BINDING_SECURE_PROPNAME, &ct,
&mstatic_lSecureHandle);
pBindingObj->GetPropertyHandle(BINDING_SLOWDOWN_PROPNAME, &ct,
&mstatic_lSlowDownHandle);
pBindingObj->GetPropertyHandleEx(OWNER_SID_PROPNAME, 0, &ct,
&mstatic_lSidHandle);
mstatic_bHandlesInitialized = true;
return S_OK;
}
HRESULT CPermanentBinding::Initialize( IWbemClassObject* pObj )
{
HRESULT hres;
CWbemPtr<_IWmiObject> pBindingObj;
hres = pObj->QueryInterface(IID__IWmiObject, (void**)&pBindingObj );
if (FAILED(hres))
return hres;
hres = InitializeHandles(pBindingObj);
if(FAILED(hres))
return hres;
long lSize;
//
// Read the Qos property.
//
hres = pBindingObj->ReadPropertyValue( mstatic_lQosHandle,
sizeof(DWORD),
&lSize,
(BYTE*)&m_dwQoS );
if(FAILED(hres))
return hres;
if ( hres != WBEM_S_NO_ERROR)
{
m_dwQoS = WMIMSG_FLAG_QOS_EXPRESS; // default.
}
#ifdef __WHISTLER_UNCUT
if ( m_dwQoS > WMIMSG_FLAG_QOS_XACT )
{
ERRORTRACE((LOG_ESS, "Invalid QoS of %d is used in a binding. "
"Setting to default.\n", m_dwQoS));
m_dwQoS = WMIMSG_FLAG_QOS_EXPRESS;
}
else if ( m_dwQoS == WMIMSG_FLAG_QOS_XACT )
{
ERRORTRACE((LOG_ESS, "XACT QoS is not a supported qos for binding. "
"Downgrading to Guaranteed Delivery.\n"));
m_dwQoS = WMIMSG_FLAG_QOS_GUARANTEED;
}
#else
if ( m_dwQoS > WMIMSG_FLAG_QOS_EXPRESS )
{
ERRORTRACE((LOG_ESS, "Invalid QoS of %d is used in a binding.", m_dwQoS));
return WBEM_E_INVALID_OBJECT;
}
#endif
//
// Read the synchronousness property - for backwards compatibility
// Always overrides any Qos setting.
//
VARIANT_BOOL bTemp;
hres = pBindingObj->ReadPropertyValue(mstatic_lSynchronicityHandle,
sizeof(VARIANT_BOOL), &lSize, (BYTE*)&bTemp);
if(FAILED(hres))
return hres;
if( hres == WBEM_S_NO_ERROR && bTemp == VARIANT_TRUE )
{
m_dwQoS = WMIMSG_FLAG_QOS_SYNCHRONOUS;
}
// Read security property
// ======================
hres = pBindingObj->ReadPropertyValue(mstatic_lSecureHandle,
sizeof(VARIANT_BOOL), &lSize, (BYTE*)&bTemp);
if(FAILED(hres))
return hres;
if(hres != WBEM_S_NO_ERROR)
m_bSecure = FALSE;
else
m_bSecure = (bTemp != 0);
// Read "slow down" property
// =========================
hres = pBindingObj->ReadPropertyValue(mstatic_lSlowDownHandle,
sizeof(VARIANT_BOOL), &lSize, (BYTE*)&bTemp);
if(FAILED(hres))
return hres;
if(hres != WBEM_S_NO_ERROR)
m_bSlowDown = FALSE;
else
m_bSlowDown = (bTemp != 0);
return WBEM_S_NO_ERROR;
}
HRESULT CPermanentBinding::ComputeKeysFromObject( IWbemClassObject* pObj,
BSTR* pstrConsumer,
BSTR* pstrFilter )
{
HRESULT hres;
CWbemPtr<_IWmiObject> pBindingObj;
hres = pObj->QueryInterface(IID__IWmiObject, (void**)&pBindingObj );
if ( hres != S_OK)
{
return NULL;
}
InitializeHandles(pBindingObj);
// Read filter path
// ================
ULONG ulFlags;
CCompressedString* pcsFilter;
hres = pBindingObj->GetPropAddrByHandle( mstatic_lFilterHandle,
WMIOBJECT_FLAG_ENCODING_V1,
&ulFlags,
(void**)&pcsFilter );
if( hres != S_OK )
{
return WBEM_E_INVALID_OBJECT;
}
BSTR strFilterPath = pcsFilter->CreateBSTRCopy();
if(strFilterPath == NULL)
return WBEM_E_OUT_OF_MEMORY;
CSysFreeMe sfm1(strFilterPath);
// Construct its key
// =================
BSTR strFilter = CPermanentFilter::ComputeKeyFromPath(strFilterPath);
if(strFilter == NULL)
return WBEM_E_INVALID_OBJECT_PATH;
// Read consumer path
// ==================
CCompressedString* pcsConsumer;
hres = pBindingObj->GetPropAddrByHandle( mstatic_lConsumerHandle,
WMIOBJECT_FLAG_ENCODING_V1,
&ulFlags,
(void**)&pcsConsumer );
if( hres != S_OK )
{
SysFreeString(strFilter);
return WBEM_E_INVALID_OBJECT;
}
*pstrConsumer = pcsConsumer->CreateBSTRCopy();
if(*pstrConsumer == NULL)
{
SysFreeString(strFilter);
return WBEM_E_OUT_OF_MEMORY;
}
*pstrFilter = strFilter;
return WBEM_S_NO_ERROR;
}
INTERNAL DELETE_ME PSID
CPermanentBinding::GetSidFromObject(IWbemClassObject* pObj)
{
HRESULT hres;
CWbemPtr<_IWmiObject> pBindingObj;
hres = pObj->QueryInterface(IID__IWmiObject, (void**)&pBindingObj );
if ( hres != S_OK)
{
return NULL;
}
InitializeHandles(pBindingObj);
PSID pAddr;
ULONG ulNumElements;
hres = pBindingObj->GetArrayPropAddrByHandle( mstatic_lSidHandle,
0,
&ulNumElements,
&pAddr );
if ( hres != S_OK )
{
return NULL;
}
//
// we copy the SID here because the SID that is returned might be
// unaligned. To avoid having the caller deal with these issues, we
// just copy the sid into a buffer that is guaranteed to be aligned.
//
PBYTE pSid = new BYTE[ulNumElements];
if ( pSid != NULL )
{
memcpy( pSid, pAddr, ulNumElements );
}
return pSid;
}