2025-04-27 07:49:33 -04:00

636 lines
14 KiB
C++

//***************************************************************************
//
// MINISERV.CPP
//
// Module: OLE MS Property Provider
//
// Purpose: Implementation for the GetEventObject class.
//
// Copyright (c) 1996-2001 Microsoft Corporation, All Rights Reserved
//
//***************************************************************************
#include <windows.h>
#include <snmptempl.h>
#include <snmpmt.h>
#include <typeinfo.h>
#include <process.h>
#include <objbase.h>
#include <stdio.h>
#include <wbemidl.h>
#include "classfac.h"
#include "guids.h"
#include <snmpevt.h>
#include <snmpthrd.h>
#include <snmplog.h>
#include <snmpcl.h>
#include <instpath.h>
#include <snmpcont.h>
#include <snmptype.h>
#include <snmpobj.h>
#include <genlex.h>
#include <sql_1.h>
#include <objpath.h>
#include "wndtime.h"
#include "rmon.h"
#include "trrtprov.h"
#include "trrt.h"
BOOL GetObjectAsyncEventObject :: Hop_Put (
WbemSnmpErrorObject &a_ErrorObject ,
IWbemClassObject *a_Hop ,
wchar_t *a_SourceAddress ,
wchar_t *a_DestinationAddress ,
wchar_t *a_SubnetAddress ,
wchar_t *a_SubnetMask ,
ULONG a_InterfaceIndex ,
wchar_t *a_GatewayAddress ,
wchar_t *a_GatewaySubnetAddress ,
wchar_t *a_GatewaySubnetMask ,
ULONG a_GatewayInterfaceIndex ,
wchar_t *a_DestinationRouteAddress ,
wchar_t *a_DestinationRouteMask ,
BOOL a_IpForwarding
)
{
VARIANT t_Variant ;
VariantInit ( &t_Variant ) ;
t_Variant.vt = VT_BSTR ;
t_Variant.bstrVal = SysAllocString ( a_SourceAddress ) ;
HRESULT t_Result = a_Hop->Put ( L"m_IpAddress" , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( ! SUCCEEDED ( t_Result ) )
{
return FALSE ;
}
t_Variant.vt = VT_BSTR ;
t_Variant.bstrVal = SysAllocString ( a_DestinationAddress ) ;
t_Result = a_Hop->Put ( L"m_DestinationIpAddress" , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( ! SUCCEEDED ( t_Result ) )
{
return FALSE ;
}
t_Variant.vt = VT_BSTR ;
t_Variant.bstrVal = SysAllocString ( a_SubnetMask ) ;
t_Result = a_Hop->Put ( L"m_IpSubnetMask" , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( ! SUCCEEDED ( t_Result ) )
{
return FALSE ;
}
t_Variant.vt = VT_BSTR ;
t_Variant.bstrVal = SysAllocString ( a_SubnetAddress ) ;
t_Result = a_Hop->Put ( L"m_IpSubnetAddress" , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( ! SUCCEEDED ( t_Result ) )
{
return FALSE ;
}
t_Variant.vt = VT_I4 ;
t_Variant.lVal = a_InterfaceIndex ;
t_Result = a_Hop->Put ( L"m_InterfaceIndex" , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( ! SUCCEEDED ( t_Result ) )
{
return FALSE ;
}
t_Variant.vt = VT_BSTR ;
t_Variant.bstrVal = SysAllocString ( a_DestinationRouteAddress ) ;
t_Result = a_Hop->Put ( L"m_RouteAddress" , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( ! SUCCEEDED ( t_Result ) )
{
return FALSE ;
}
t_Variant.vt = VT_BSTR ;
t_Variant.bstrVal = SysAllocString ( a_DestinationRouteMask ) ;
t_Result = a_Hop->Put ( L"m_RouteMask" , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( ! SUCCEEDED ( t_Result ) )
{
return FALSE ;
}
t_Variant.vt = VT_BSTR ;
t_Variant.bstrVal = SysAllocString ( a_GatewayAddress ) ;
t_Result = a_Hop->Put ( L"m_GatewayIpAddress" , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( ! SUCCEEDED ( t_Result ) )
{
return FALSE ;
}
t_Variant.vt = VT_BSTR ;
t_Variant.bstrVal = SysAllocString ( a_GatewaySubnetMask ) ;
t_Result = a_Hop->Put ( L"m_GatewayIpSubnetMask" , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( ! SUCCEEDED ( t_Result ) )
{
return FALSE ;
}
t_Variant.vt = VT_BSTR ;
t_Variant.bstrVal = SysAllocString ( a_GatewaySubnetAddress ) ;
t_Result = a_Hop->Put ( L"m_GatewayIpSubnetAddress" , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( ! SUCCEEDED ( t_Result ) )
{
return FALSE ;
}
t_Variant.vt = VT_I4 ;
t_Variant.lVal = a_GatewayInterfaceIndex ;
t_Result = a_Hop->Put ( L"m_GatewayInterfaceIndex" , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( ! SUCCEEDED ( t_Result ) )
{
return FALSE ;
}
t_Variant.vt = VT_BOOL ;
t_Variant.boolVal = a_IpForwarding ? VARIANT_TRUE : VARIANT_FALSE;
t_Result = a_Hop->Put ( L"m_IpForwarding" , 0 , & t_Variant , 0 ) ;
VariantClear ( &t_Variant ) ;
if ( ! SUCCEEDED ( t_Result ) )
{
return FALSE ;
}
return TRUE ;
}
BOOL GetObjectAsyncEventObject :: Hop_GetIpForwarding ( WbemSnmpErrorObject &a_ErrorObject , IWbemServices *t_Proxy , BOOL &a_IpForwarding )
{
BOOL t_Status ;
IWbemClassObject *t_IpForwardObject = NULL ;
IWbemCallResult *t_ErrorObject = NULL ;
HRESULT t_Result = t_Proxy->GetObject (
L"MS_SNMP_RFC1213_MIB_ip=@" ,
0 ,
NULL,
& t_IpForwardObject ,
& t_ErrorObject
) ;
if ( t_ErrorObject )
t_ErrorObject->Release () ;
if ( t_Status = SUCCEEDED ( t_Result ) )
{
VARIANT t_Variant ;
VariantInit ( &t_Variant ) ;
LONG t_PropertyFlavour = 0 ;
VARTYPE t_PropertyType = 0 ;
HRESULT t_Result = t_IpForwardObject->Get (
L"ipForwarding" ,
0 ,
& t_Variant ,
& t_PropertyType ,
& t_PropertyFlavour
) ;
if ( t_Status = SUCCEEDED ( t_Result ) )
{
a_IpForwarding = wcscmp ( t_Variant.bstrVal , L"forwarding" ) == 0 ;
}
VariantClear ( & t_Variant ) ;
t_IpForwardObject->Release () ;
}
return t_Status ;
}
BOOL GetObjectAsyncEventObject :: Hop_Get ( WbemSnmpErrorObject &a_ErrorObject , KeyRef *a_SourceKey , KeyRef *a_DestinationKey )
{
BOOL t_Status ;
wchar_t *t_SourceAddress = a_SourceKey->m_vValue.bstrVal ;
wchar_t *t_DestinationAddress = a_DestinationKey->m_vValue.bstrVal ;
wchar_t *t_SourceAddressName = GetHostNameByAddress ( a_SourceKey->m_vValue.bstrVal ) ;
if ( t_SourceAddress && t_DestinationAddress )
{
SnmpIpAddressType t_SourceIpAddress ( t_SourceAddress ) ;
SnmpIpAddressType t_DestinationIpAddress ( t_DestinationAddress ) ;
if ( t_SourceIpAddress && t_DestinationIpAddress )
{
IWbemServices *t_Server = m_Provider->GetServer () ;
IWbemServices *t_Proxy ;
t_Status = GetProxy ( a_ErrorObject , t_Server , t_SourceAddressName , &t_Proxy ) ;
if ( t_Status )
{
wchar_t *t_DestinationRouteAddress = 0 ;
wchar_t *t_DestinationRouteMask = 0 ;
wchar_t *t_SubnetAddress = 0 ;
wchar_t *t_SubnetMask = 0 ;
ULONG t_InterfaceIndex = 0 ;
wchar_t *t_GatewayAddress = 0 ;
wchar_t *t_GatewaySubnetAddress = 0 ;
wchar_t *t_GatewaySubnetMask = 0 ;
ULONG t_GatewayInterfaceIndex = 0 ;
BOOL t_IpForwarding = FALSE ;
t_Status = Hop_GetIpForwarding (
a_ErrorObject ,
t_Proxy ,
t_IpForwarding
) ;
t_Status = t_Status & CalculateRoute (
a_ErrorObject ,
t_Proxy ,
t_SourceIpAddress.GetValue () ,
t_DestinationIpAddress.GetValue () ,
t_SubnetAddress ,
t_SubnetMask ,
t_InterfaceIndex ,
t_GatewayAddress ,
t_GatewaySubnetAddress ,
t_GatewaySubnetMask ,
t_GatewayInterfaceIndex ,
t_DestinationRouteAddress ,
t_DestinationRouteMask
) ;
if ( t_Status )
{
SnmpIpAddressType t_HopDestinationType ( t_GatewayAddress ) ;
wchar_t *t_HopDestination = t_HopDestinationType.GetStringValue () ;
IWbemClassObject *t_Hop = NULL ;
HRESULT t_Result = m_ClassObject->SpawnInstance ( 0 , & t_Hop ) ;
if ( t_Status = SUCCEEDED ( t_Result ) )
{
t_Status = Hop_Put (
a_ErrorObject ,
t_Hop ,
t_SourceAddress ,
t_DestinationAddress ,
t_SubnetAddress ,
t_SubnetMask ,
t_InterfaceIndex ,
t_GatewayAddress ,
t_GatewaySubnetAddress ,
t_GatewaySubnetMask ,
t_GatewayInterfaceIndex ,
t_DestinationRouteAddress ,
t_DestinationRouteMask ,
t_IpForwarding
) ;
if ( t_Status = SUCCEEDED ( t_Result ) )
{
m_NotificationHandler->Indicate ( 1 , & t_Hop ) ;
}
}
t_Hop->Release () ;
}
delete [] t_DestinationRouteAddress ;
delete [] t_DestinationRouteMask ;
delete [] t_GatewayAddress ;
delete [] t_GatewaySubnetAddress ;
delete [] t_GatewaySubnetMask ;
delete [] t_SubnetAddress ;
delete [] t_SubnetMask ;
t_Proxy->Release () ;
}
t_Server->Release () ;
}
else
{
t_Status = FALSE ;
}
}
else
{
t_Status = FALSE ;
}
delete [] t_SourceAddressName ;
return t_Status ;
}
BOOL GetObjectAsyncEventObject :: Dispatch_Hop ( WbemSnmpErrorObject &a_ErrorObject )
{
BOOL t_Status ;
KeyRef *t_Key1 = m_ParsedObjectPath->m_paKeys [ 0 ] ;
KeyRef *t_Key2 = m_ParsedObjectPath->m_paKeys [ 1 ] ;
if ( t_Key1 && t_Key2 )
{
if ( wcscmp ( t_Key1->m_pName , L"m_IpAddress" ) == 0 )
{
if ( wcscmp ( t_Key2->m_pName , L"m_DestinationIpAddress" ) == 0 )
{
if ( ( t_Key1->m_vValue.vt == VT_BSTR ) && ( t_Key2->m_vValue.vt == VT_BSTR ) )
{
t_Status = Hop_Get ( a_ErrorObject , t_Key1 , t_Key2 ) ;
}
else
{
t_Status = FALSE ;
}
}
else
{
t_Status = FALSE ;
}
}
else if ( wcscmp ( t_Key2->m_pName , L"m_IpAddress" ) == 0 )
{
if ( wcscmp ( t_Key1->m_pName , L"m_DestinationIpAddress" ) == 0 )
{
if ( ( t_Key1->m_vValue.vt == VT_BSTR ) && ( t_Key2->m_vValue.vt == VT_BSTR ) )
{
t_Status = Hop_Get ( a_ErrorObject , t_Key2 , t_Key1 ) ;
}
else
{
t_Status = FALSE ;
}
}
else
{
t_Status = FALSE ;
}
}
else
{
t_Status = FALSE ;
}
}
else
{
t_Status = FALSE ;
}
return t_Status ;
}
BOOL GetObjectAsyncEventObject :: ProvidedTopNTable_Get ( WbemSnmpErrorObject &a_ErrorObject , KeyRef *a_TopNReport , KeyRef *a_TopNIndex )
{
BOOL t_Status = FALSE ;
TopNTableProv *t_TopNTableProv = m_Provider->GetTopNTableProv () ;
TopNCache *t_TopNCache = t_TopNTableProv->LockTopNCache () ;
IWbemClassObject *t_TopNTableObject = NULL ;
ULONG t_Key = TopNTableStore :: GetKey ( a_TopNReport->m_vValue.lVal , a_TopNIndex->m_vValue.lVal ) ;
if ( t_TopNCache->Lookup ( t_Key , t_TopNTableObject ) )
{
IWbemClassObject* t_pClone = NULL;
t_TopNTableObject->Clone(&t_pClone);
m_NotificationHandler->Indicate ( 1 , & t_pClone ) ;
t_pClone->Release();
t_Status = TRUE ;
}
t_TopNTableProv->UnlockTopNCache () ;
return t_Status ;
}
BOOL GetObjectAsyncEventObject :: Dispatch_ProvidedTopNTable ( WbemSnmpErrorObject &a_ErrorObject )
{
BOOL t_Status ;
KeyRef *t_Key1 = m_ParsedObjectPath->m_paKeys [ 0 ] ;
KeyRef *t_Key2 = m_ParsedObjectPath->m_paKeys [ 1 ] ;
if ( t_Key1 && t_Key2 )
{
if ( wcscmp ( t_Key1->m_pName , L"hostTopNReport" ) == 0 )
{
if ( wcscmp ( t_Key2->m_pName , L"hostTopNIndex" ) == 0 )
{
if ( ( t_Key1->m_vValue.vt == VT_I4 ) && ( t_Key2->m_vValue.vt == VT_I4 ) )
{
t_Status = ProvidedTopNTable_Get ( a_ErrorObject , t_Key1 , t_Key2 ) ;
}
else
{
t_Status = FALSE ;
}
}
else
{
t_Status = FALSE ;
}
}
else if ( wcscmp ( t_Key2->m_pName , L"hostTopNReport" ) == 0 )
{
if ( wcscmp ( t_Key1->m_pName , L"hostTopNIndex" ) == 0 )
{
if ( ( t_Key1->m_vValue.vt == VT_I4 ) && ( t_Key2->m_vValue.vt == VT_I4 ) )
{
t_Status = ProvidedTopNTable_Get ( a_ErrorObject , t_Key2 , t_Key1 ) ;
}
else
{
t_Status = FALSE ;
}
}
else
{
t_Status = FALSE ;
}
}
else
{
t_Status = FALSE ;
}
}
else
{
t_Status = FALSE ;
}
return t_Status ;
}
BOOL GetObjectAsyncEventObject :: Instantiate ( WbemSnmpErrorObject &a_ErrorObject )
{
BOOL t_Status = ! m_ObjectPathParser.Parse ( m_ObjectPath , &m_ParsedObjectPath ) ;
if ( t_Status )
{
t_Status = GetClassObject ( m_ParsedObjectPath->m_pClass ) ;
if ( t_Status )
{
if ( wcscmp ( m_ParsedObjectPath->m_pClass , L"Hop" ) == 0 )
{
t_Status = Dispatch_Hop ( a_ErrorObject ) ;
if ( t_Status )
SetState ( WBEM_TASKSTATE_ASYNCHRONOUSCOMPLETE ) ;
}
else if ( wcscmp ( m_ParsedObjectPath->m_pClass , L"MS_SNMP_RFC1271_MIB_ProvidedhostTopNTable" ) == 0 )
{
t_Status = Dispatch_ProvidedTopNTable ( a_ErrorObject ) ;
if ( t_Status )
SetState ( WBEM_TASKSTATE_ASYNCHRONOUSCOMPLETE ) ;
}
else
{
ProcessComplete () ;
}
}
}
else
{
t_Status = FALSE ;
a_ErrorObject.SetStatus ( WBEM_SNMP_E_INVALID_CLASS ) ;
a_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ;
a_ErrorObject.SetMessage ( L"Unknown Class" ) ;
}
return t_Status ;
}
GetObjectAsyncEventObject :: GetObjectAsyncEventObject (
CImpTraceRouteProv *a_Provider ,
BSTR a_ObjectPath ,
ULONG a_OperationFlag ,
IWbemObjectSink *a_NotificationHandler ,
IWbemContext *a_Context
) : WbemTaskObject ( a_Provider , a_NotificationHandler , a_OperationFlag ) ,
m_Class ( NULL )
{
m_ObjectPath = UnicodeStringDuplicate ( a_ObjectPath ) ;
}
GetObjectAsyncEventObject :: ~GetObjectAsyncEventObject ()
{
// Get Status object
delete [] m_ObjectPath ;
IWbemClassObject *t_NotifyStatus = NULL ;
BOOL t_Status = GetExtendedNotifyStatusObject ( &t_NotifyStatus ) ;
if ( t_Status )
{
HRESULT t_Result = m_NotificationHandler->Indicate ( 1 , & t_NotifyStatus ) ;
t_NotifyStatus->Release () ;
}
}
void GetObjectAsyncEventObject :: ProcessComplete ()
{
if ( SUCCEEDED ( m_ErrorObject.GetWbemStatus () ) )
{
}
else
{
}
/*
* Remove worker object from worker thread container
*/
if ( CImpTraceRouteProv:: s_DefaultThreadObject->GetActive () )
{
CImpTraceRouteProv:: s_BackupThreadObject->ReapTask ( *this ) ;
}
else
{
CImpTraceRouteProv:: s_DefaultThreadObject->ReapTask ( *this ) ;
}
delete this ;
}
void GetObjectAsyncEventObject :: Process ()
{
switch ( m_State )
{
case 0:
{
Complete () ;
BOOL t_Status = Instantiate ( m_ErrorObject ) ;
if ( t_Status )
{
if ( GetState () == WBEM_TASKSTATE_ASYNCHRONOUSCOMPLETE )
{
ProcessComplete () ;
}
}
else
{
ProcessComplete () ;
}
}
break ;
default:
{
}
break ;
}
}