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.
 
 
 
 
 
 

503 lines
11 KiB

//***************************************************************************
//
// File:
//
// Module: MS SNMP Provider
//
// Purpose:
//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
//***************************************************************************
#include "precomp.h"
#include <provexpt.h>
#include <snmptempl.h>
#include <snmpmt.h>
#include <typeinfo.h>
#include <process.h>
#include <objbase.h>
#include <stdio.h>
#include <wbemidl.h>
#include <snmplog.h>
#include <snmpcl.h>
#include <snmpcont.h>
#include <snmptype.h>
#include <snmpauto.h>
#include <snmpevt.h>
#include <snmpthrd.h>
#include <snmpobj.h>
#include <smir.h>
#include <notify.h>
#include <evtdefs.h>
#include <evtthrd.h>
#include <evtmap.h>
#include <evtprov.h>
#include <evtencap.h>
extern CEventProviderWorkerThread* g_pWorkerThread ;
CEncapMapper::CEncapMapper() : m_WbemSnmpObj(NULL)
{
}
HRESULT CEncapMapper::GetSpecificPropertyValue(long lNumElements, MYWBEM_NAME_ELEMENT *aElements,
long lFlags, VARIANT *pvValue)
{
//all specific properties have one element, the property name...
if ((lNumElements != 1) || (0 != aElements[0].m_nType))
{
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GetSpecificPropertyValue invalid parameters\r\n");
)
return WBEM_E_FAILED;
}
BOOL bContinue = TRUE;
if (NULL == m_WbemSnmpObj)
{
m_WbemSnmpObj = new WbemSnmpClassObject;
IWbemClassObject *pObj = NULL;
GetClassInstance(&pObj);
if (NULL != pObj)
{
WbemSnmpErrorObject errorObj;
if (!m_WbemSnmpObj->Set(errorObj, pObj, FALSE))
{
bContinue = FALSE;
}
}
else
{
bContinue = FALSE;
}
}
if (bContinue)
{
WbemSnmpProperty *snmpProp = m_WbemSnmpObj->FindProperty(aElements[0].Element.m_wszPropertyName);
if (NULL != snmpProp)
{
//set the property value using the snmp varbind
//and get the property value and return TRUE...
if (SetAndGetProperty(snmpProp, pvValue))
{
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GetSpecificPropertyValue successful\r\n");
)
return NOERROR;
}
}
}
else if (NULL != m_WbemSnmpObj)
{
delete m_WbemSnmpObj;
m_WbemSnmpObj = NULL;
}
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GetSpecificPropertyValue failed\r\n");
)
return WBEM_E_FAILED;
}
CEncapMapper::~CEncapMapper()
{
if (NULL != m_WbemSnmpObj)
{
delete m_WbemSnmpObj;
}
}
BOOL CEncapMapper::SetAndGetProperty(WbemSnmpProperty *wbemSnmpProp, VARIANT *pvValue)
{
//Get the varbind qualifier value, set the keyvalues qualifier and set the
//property value using the snmp varbind.
//Get the property value and return TRUE;
WbemSnmpQualifier *vbQual = wbemSnmpProp->FindQualifier(EVENT_VBINDEX_QUAL);
if (NULL == vbQual)
{
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::SetAndGetProperty missing parameter's vbindex qualifier\r\n");
)
return FALSE;
}
VARIANT v;
VariantInit(&v);
ULONG vbindex;
//has to be at least 3, i.e. third vb, to be a specific property...
if (!vbQual->GetValue(v) || (VT_I4 != v.vt) || (2 > v.lVal))
{
VariantClear(&v);
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::SetAndGetProperty invalid index qual\r\n");
)
return FALSE;
}
if (v.lVal >= m_vbs.length)
{
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::SetAndGetProperty no value return TRUE\r\n");
)
return TRUE;
}
vbindex = v.lVal - 1; //zero based in our array
VariantClear(&v);
if (m_vbs.vbs[vbindex].fDone)
{
//we've done this one already,
//just get the property value and return it..
CIMTYPE cimType;
if (!wbemSnmpProp->GetValue(*pvValue, cimType))
{
pvValue->vt = VT_NULL;
}
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::SetAndGetProperty return value\r\n");
)
return TRUE;
}
const SnmpObjectIdentifier& vb_OID = m_vbs.vbs[vbindex].pVarBind->GetInstance();
WbemSnmpQualifier *oidQual = wbemSnmpProp->FindQualifier(WBEM_QUALIFIER_OBJECT_IDENTIFIER);
BOOL bMatchedOID = FALSE;
m_vbs.vbs[vbindex].fDone = TRUE;
if (NULL == oidQual)
{
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::SetAndGetProperty missing parameter's OID qualifier\r\n");
)
}
else
{
SnmpInstanceType *oid_valuetype = oidQual->GetValue () ;
if ( typeid ( *oid_valuetype ) == typeid ( SnmpObjectIdentifierType ) )
{
SnmpObjectIdentifier oid_value = *(SnmpObjectIdentifier *) oid_valuetype->GetValueEncoding () ;
//compare without the instance info
if (oid_value.GetValueLength() < vb_OID.GetValueLength())
{
SnmpObjectIdentifier* common = vb_OID.Cut(oid_value);
if (NULL != common)
{
if ((*common) == oid_value)
{
bMatchedOID = TRUE;
}
delete common;
}
}
}
else
{
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::SetAndGetProperty parameter's OID is of wrong type\r\n");
)
}
}
if (wbemSnmpProp->SetValue(&(m_vbs.vbs[vbindex].pVarBind->GetValue())))
{
CIMTYPE cimType;
if (wbemSnmpProp->GetValue(*pvValue, cimType))
{
}
}
else
{
bMatchedOID = FALSE;
}
if (!bMatchedOID)
{
WbemSnmpQualifier *qualifier = NULL ;
wbemSnmpProp->AddQualifier ( WBEM_QUALIFIER_TYPE_MISMATCH ) ;
if ( qualifier = wbemSnmpProp->FindQualifier ( WBEM_QUALIFIER_TYPE_MISMATCH ) )
{
IWbemQualifierSet *t_QualifierSet = NULL;
IWbemClassObject *pObj = NULL;
GetClassInstance(&pObj);
HRESULT result = pObj->GetPropertyQualifierSet ( wbemSnmpProp->GetName () , & t_QualifierSet ) ;
if ( SUCCEEDED ( result ) )
{
SnmpIntegerType integer ( 1 , NULL ) ;
qualifier->SetValue ( t_QualifierSet , integer ) ;
}
t_QualifierSet->Release () ;
}
}
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::SetAndGetProperty returning TRUE\r\n");
)
return TRUE;
}
void CEncapMapper::GenerateInstance(IWbemClassObject** ppInst)
{
if (NULL == ppInst)
{
//invalid out parameter
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GenerateInstance invalid parameter\r\n");
)
return;
}
//set out parameter to NULL;
*ppInst = NULL;
IWbemClassObject *pObj = NULL;
GetClassInstance(&pObj);
if (NULL == pObj)
{
//failed to get class instance
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GenerateInstance failed to get class defn\r\n");
)
return;
}
#if 0
HRESULT result = S_OK ;
#else
//get all the property names and set their values...
SAFEARRAY* pPropNames;
HRESULT result = pObj->GetNames(NULL, WBEM_FLAG_NONSYSTEM_ONLY, NULL, &pPropNames);
if (FAILED(result))
{
//failed to get the property names
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GenerateInstance failed to get parameter list\r\n");
)
return;
}
//time to <insert expletive> around with a safearray...
//work out the size of the safearray and access the data
if(SafeArrayGetDim(pPropNames) != 1)
{
//wrong dimensions in this array
SafeArrayDestroy(pPropNames);
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GenerateInstance parameter array is WRONG!\r\n");
)
return;
}
LONG arraylen = pPropNames->rgsabound[0].cElements;
BSTR *pbstr;
result = SafeArrayAccessData(pPropNames, (void **)&pbstr);
if(FAILED(result))
{
SafeArrayDestroy(pPropNames);
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GenerateInstance failed to access parameter array\r\n");
)
return;
}
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GenerateInstance setting properties\r\n");
)
BOOL t_bSetProp = FALSE;
//iterate through the names and set the properties...
for (LONG i = 0; i < arraylen; i++)
{
VARIANT v;
MYWBEM_NAME_ELEMENT property_struct;
property_struct.m_nType = 0; //string value
property_struct.Element.m_wszPropertyName = pbstr[i];
result = GetPropertyValue(1, &property_struct, 0, &v);
if (FAILED(result))
{
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GenerateInstance failed to get value for %s\r\n",
pbstr[i]);
)
continue;
}
else
{
t_bSetProp = TRUE;
}
if ((v.vt != VT_NULL) && (v.vt != VT_EMPTY))
{
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GenerateInstance setting property %s\r\n",
pbstr[i]);
)
result = pObj->Put(pbstr[i], 0, &v, 0);
DebugMacro9(
if (FAILED(result))
{
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GenerateInstance setting property %s\r\n",
pbstr[i]);
}
)
}
VariantClear(&v);
}
SafeArrayUnaccessData(pPropNames);
SafeArrayDestroy(pPropNames);
#endif
//if a single property has been put send it on....
if (t_bSetProp)
{
pObj->AddRef();
*ppInst = pObj;
}
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GenerateInstance returning\r\n");
)
}
void CEncapMapper::ResetData()
{
//do class specific stuff then call parent class's reset
if (NULL != m_WbemSnmpObj)
{
delete m_WbemSnmpObj;
m_WbemSnmpObj = NULL;
}
CMapToEvent::ResetData();
}
BOOL CEncapMapper::GetSpecificClass()
{
//Build path of mapper instance...
CString path(MAPPER_CLASS_PATH_PREFIX);
path += m_oid;
path += '\"';
BSTR pathstr = path.AllocSysString();
IWbemClassObject *pObj = NULL;
HRESULT result = g_pWorkerThread->GetServerWrap ()->GetMapperObject(pathstr, NULL, & pObj );
SysFreeString(pathstr);
if (result == S_OK)
{
VARIANT v;
VariantInit(&v);
result = pObj->Get(MAPPER_CLASS_EVENTCLASSPROP, 0, &v, NULL, NULL);
pObj->Release();
if (SUCCEEDED(result) && (VT_BSTR == v.vt))
{
m_class = v.bstrVal;
VariantClear(&v);
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GetSpecificClass got class defn\r\n");
)
return TRUE;
}
else
{
VariantClear(&v);
}
}
DebugMacro9(
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
__FILE__,__LINE__,
L"CEncapMapper::GetSpecificClass failed to get class defn\r\n");
)
return FALSE;
}