// Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved #include #include #include #include #include #include #include #include "classfac.h" #include #include #include #include #include #include #include #include #include #include #include #include "wndtime.h" #include "rmon.h" #include "trrtprov.h" #include "trrt.h" #include "guids.h" SnmpMap WbemTaskObject :: s_ConnectionPool ; SnmpMap WbemTaskObject :: s_AddressPool ; SnmpMap WbemTaskObject :: s_NamePool ; SnmpMap WbemTaskObject :: s_QualifiedNamePool ; BOOL WbemTaskObject :: GetProxy ( WbemSnmpErrorObject &a_ErrorObject , IWbemServices *a_RootService , wchar_t *a_Proxy , IWbemServices **a_ProxyService ) { BOOL t_Status = TRUE ; if ( a_ProxyService ) { *a_ProxyService = NULL ; IWbemServices *t_Service = NULL ; if ( ! s_ConnectionPool.Lookup ( a_Proxy , t_Service ) ) { IWbemCallResult *t_ErrorObject = NULL ; HRESULT t_Result = a_RootService->OpenNamespace ( a_Proxy , 0 , NULL, ( IWbemServices ** ) & t_Service , &t_ErrorObject ) ; if ( t_Result == WBEM_NO_ERROR ) { IWbemConfigure* t_Configure; t_Result = t_Service->QueryInterface ( IID_IWbemConfigure , ( void ** ) & t_Configure ) ; if ( SUCCEEDED ( t_Result ) ) { t_Configure->SetConfigurationFlags(WBEM_CONFIGURATION_FLAG_CRITICAL_USER); t_Configure->Release(); s_ConnectionPool [ UnicodeStringDuplicate ( a_Proxy ) ] = t_Service ; } else { t_Status = FALSE ; } } else { t_Status = FALSE ; } } if ( t_Service ) { t_Service->AddRef () ; *a_ProxyService = t_Service ; } } return t_Status ; } WbemTaskObject :: WbemTaskObject ( CImpTraceRouteProv *a_Provider , IWbemObjectSink *a_NotificationHandler , ULONG a_OperationFlag ) : m_State ( WBEM_TASKSTATE_START ) , m_OperationFlag ( a_OperationFlag ) , m_Provider ( a_Provider ) , m_NotificationHandler ( a_NotificationHandler ) , m_Context ( 0 ) , m_ClassObject ( NULL ) { m_Provider->AddRef () ; m_NotificationHandler->AddRef () ; } WbemTaskObject :: ~WbemTaskObject () { m_Provider->Release () ; m_NotificationHandler->Release () ; if ( m_Context ) m_Context->Release () ; if ( m_ClassObject ) m_ClassObject->Release () ; } ULONG WbemTaskObject :: GetState () { return m_State ; } void WbemTaskObject :: SetState ( ULONG a_State ) { m_State = a_State ; } WbemSnmpErrorObject &WbemTaskObject :: GetErrorObject () { return m_ErrorObject ; } BOOL WbemTaskObject :: GetClassObject ( wchar_t *a_Class ) { if ( m_ClassObject ) m_ClassObject->Release () ; IWbemCallResult *t_ErrorObject = NULL ; IWbemServices *t_Server = m_Provider->GetServer() ; HRESULT t_Result = t_Server->GetObject ( a_Class , 0 , NULL, & m_ClassObject , & t_ErrorObject ) ; t_Server->Release () ; if ( t_ErrorObject ) t_ErrorObject->Release () ; return SUCCEEDED ( t_Result ) ; } BOOL WbemTaskObject :: GetExtendedNotifyStatusObject ( IWbemClassObject **a_NotifyObject ) { IWbemClassObject *t_NotificationClassObject = NULL ; IWbemCallResult *t_ErrorObject = NULL ; BOOL t_Status = TRUE ; WbemSnmpErrorObject t_ErrorStatusObject ; if ( t_NotificationClassObject = m_Provider->GetExtendedNotificationObject ( t_ErrorStatusObject ) ) { HRESULT t_Result = t_NotificationClassObject->SpawnInstance ( 0 , a_NotifyObject ) ; if ( SUCCEEDED ( t_Result ) ) { VARIANT t_Variant ; VariantInit ( &t_Variant ) ; t_Variant.vt = VT_I4 ; t_Variant.lVal = m_ErrorObject.GetWbemStatus () ; t_Result = (*a_NotifyObject)->Put ( WBEM_PROPERTY_STATUSCODE , 0 , & t_Variant , 0 ) ; VariantClear ( &t_Variant ) ; if ( SUCCEEDED ( t_Result ) ) { t_Variant.vt = VT_I4 ; t_Variant.lVal = m_ErrorObject.GetStatus () ; t_Result = (*a_NotifyObject)->Put ( WBEM_PROPERTY_SNMPSTATUSCODE , 0 , & t_Variant , 0 ) ; VariantClear ( &t_Variant ) ; if ( SUCCEEDED ( t_Result ) ) { if ( m_ErrorObject.GetMessage () ) { t_Variant.vt = VT_BSTR ; t_Variant.bstrVal = SysAllocString ( m_ErrorObject.GetMessage () ) ; t_Result = (*a_NotifyObject)->Put ( WBEM_PROPERTY_SNMPSTATUSMESSAGE , 0 , & t_Variant , 0 ) ; VariantClear ( &t_Variant ) ; if ( ! SUCCEEDED ( t_Result ) ) { (*a_NotifyObject)->Release () ; t_Status = GetNotifyStatusObject ( a_NotifyObject ) ; } } } else { (*a_NotifyObject)->Release () ; t_Status = GetNotifyStatusObject ( a_NotifyObject ) ; } } else { (*a_NotifyObject)->Release () ; t_Status = GetNotifyStatusObject ( a_NotifyObject ) ; } t_NotificationClassObject->Release () ; } else { t_Status = GetNotifyStatusObject ( a_NotifyObject ) ; } } else { t_Status = GetNotifyStatusObject ( a_NotifyObject ) ; } return t_Status ; } BOOL WbemTaskObject :: GetNotifyStatusObject ( IWbemClassObject **a_NotifyObject ) { IWbemClassObject *t_NotificationClassObject = NULL ; BOOL t_Status = TRUE ; WbemSnmpErrorObject t_ErrorStatusObject ; if ( t_NotificationClassObject = m_Provider->GetNotificationObject ( t_ErrorStatusObject ) ) { HRESULT t_Result = t_NotificationClassObject->SpawnInstance ( 0 , a_NotifyObject ) ; if ( SUCCEEDED ( t_Result ) ) { VARIANT t_Variant ; VariantInit ( &t_Variant ) ; t_Variant.vt = VT_I4 ; t_Variant.lVal = m_ErrorObject.GetWbemStatus () ; t_Result = (*a_NotifyObject)->Put ( WBEM_PROPERTY_STATUSCODE , 0 , & t_Variant , 0 ) ; if ( SUCCEEDED ( t_Result ) ) { if ( m_ErrorObject.GetMessage () ) { t_Variant.vt = VT_BSTR ; t_Variant.bstrVal = SysAllocString ( m_ErrorObject.GetMessage () ) ; t_Result = (*a_NotifyObject)->Put ( WBEM_PROPERTY_SNMPSTATUSMESSAGE , 0 , & t_Variant , 0 ) ; VariantClear ( &t_Variant ) ; if ( ! SUCCEEDED ( t_Result ) ) { t_Status = FALSE ; (*a_NotifyObject)->Release () ; (*a_NotifyObject)=NULL ; } } } else { (*a_NotifyObject)->Release () ; (*a_NotifyObject)=NULL ; t_Status = FALSE ; } VariantClear ( &t_Variant ) ; t_NotificationClassObject->Release () ; } else { t_Status = FALSE ; } } else { t_Status = FALSE ; } return t_Status ; } wchar_t *WbemTaskObject :: GetHostNameByAddress ( wchar_t *a_HostAddress ) { wchar_t *t_HostName = NULL ; if ( a_HostAddress ) { wchar_t *t_Name = NULL ; if ( ! s_NamePool.Lookup ( a_HostAddress , t_Name ) ) { t_HostName = GetUncachedHostNameByAddress ( a_HostAddress ) ; s_NamePool [ UnicodeStringDuplicate ( a_HostAddress ) ] = t_HostName ; } else { t_HostName = t_Name ; } } return UnicodeStringDuplicate ( t_HostName ) ; } wchar_t *WbemTaskObject :: GetQualifiedHostNameByAddress ( wchar_t *a_HostAddress ) { wchar_t *t_HostName = NULL ; if ( a_HostAddress ) { wchar_t *t_Name = NULL ; if ( ! s_QualifiedNamePool.Lookup ( a_HostAddress , t_Name ) ) { t_HostName = GetUncachedQualifiedHostNameByAddress ( a_HostAddress ) ; s_QualifiedNamePool [ UnicodeStringDuplicate ( a_HostAddress ) ] = t_HostName ; } else { t_HostName = t_Name ; } } return UnicodeStringDuplicate ( t_HostName ) ; } wchar_t *WbemTaskObject :: GetHostAddressByName ( wchar_t *a_HostName ) { wchar_t *t_HostAddress = NULL ; if ( a_HostName ) { wchar_t *t_Address = NULL ; if ( ! s_AddressPool.Lookup ( a_HostName , t_Address ) ) { t_HostAddress = GetUncachedHostAddressByName ( a_HostName ) ; s_AddressPool [ UnicodeStringDuplicate ( a_HostName ) ] = t_HostAddress ; } else { t_HostAddress = t_Address ; } } return UnicodeStringDuplicate ( t_HostAddress ) ; } wchar_t *WbemTaskObject :: GetUncachedHostAddressByName ( wchar_t *a_HostName ) { wchar_t *t_Address = NULL ; if ( a_HostName ) { char *t_DbcsString = UnicodeToDbcsString ( a_HostName ) ; if ( t_DbcsString ) { hostent FAR *t_HostEntry = gethostbyname ( t_DbcsString ); if ( t_HostEntry ) { ULONG t_HostAddress = ntohl ( * ( ( ULONG * ) t_HostEntry->h_addr ) ) ; SnmpIpAddressType t_IpAddress ( t_HostAddress ) ; t_Address = t_IpAddress.GetStringValue () ; } } delete [] t_DbcsString ; } return t_Address ; } wchar_t *WbemTaskObject :: GetUncachedHostNameByAddress ( wchar_t *a_HostAddress ) { wchar_t *t_Name = NULL ; SnmpIpAddressType t_IpAddress ( a_HostAddress ) ; if ( t_IpAddress ) { ULONG t_Address = htonl ( t_IpAddress.GetValue () ) ; hostent FAR *t_HostEntry = gethostbyaddr ( ( char * ) & t_Address , sizeof ( ULONG ) , IPPROTO_IP ) ; if ( t_HostEntry ) { ULONG t_Index = 0; ULONG t_HostEntryLength = strlen ( t_HostEntry->h_name ) ; for ( t_Index = 0 ; t_Index < t_HostEntryLength ; t_Index ++ ) { if ( t_HostEntry->h_name [ t_Index ] == '.' ) break ; } char *t_Machine = new char [ t_Index + 1 ] ; strncpy ( t_Machine , t_HostEntry->h_name , t_Index ) ; t_Machine [ t_Index ] = 0 ; t_Name = DbcsToUnicodeString ( t_Machine ) ; delete [] t_Machine ; } } return t_Name ; } wchar_t *WbemTaskObject :: GetUncachedQualifiedHostNameByAddress ( wchar_t *a_HostAddress ) { wchar_t *t_Name = NULL ; SnmpIpAddressType t_IpAddress ( a_HostAddress ) ; if ( t_IpAddress ) { ULONG t_Address = htonl ( t_IpAddress.GetValue () ) ; hostent FAR *t_HostEntry = gethostbyaddr ( ( char * ) & t_Address , sizeof ( ULONG ) , IPPROTO_IP ) ; if ( t_HostEntry ) { t_Name = DbcsToUnicodeString ( t_HostEntry->h_name ) ; } } return t_Name ; } wchar_t *WbemTaskObject :: GetHostName () { wchar_t buffer [MAX_COMPUTERNAME_LENGTH + 1]; DWORD t_Length = ( DWORD ) ( sizeof ( buffer ) / sizeof ( wchar_t ) ) ; GetComputerName ( buffer , & t_Length ) ; return UnicodeStringDuplicate ( buffer ) ; } wchar_t *WbemTaskObject :: QuoteAndEscapeString ( wchar_t *a_String ) { ULONG t_StringLength = wcslen ( a_String ) ; ULONG t_NumberOfEscaped = 0 ; for ( ULONG t_Index = 0 ; t_Index < t_StringLength ; t_Index ++ ) { if ( ( a_String [ t_Index ] == '\"' ) || ( a_String [ t_Index ] == '\\' ) ) { t_NumberOfEscaped ++ ; } } wchar_t *t_QuotedString = new wchar_t [ t_StringLength + t_NumberOfEscaped + 3 ] ; t_QuotedString [ 0 ] = '\"' ; ULONG t_QuotedIndex = 1 ; for ( t_Index = 0 ; t_Index < t_StringLength ; t_Index ++ ) { if ( ( a_String [ t_Index ] == '\"' ) || ( a_String [ t_Index ] == '\\' ) ) { t_QuotedString [ t_QuotedIndex ] = '\\' ; t_QuotedIndex ++ ; } t_QuotedString [ t_QuotedIndex ] = a_String [ t_Index ] ; t_QuotedIndex ++ ; } t_QuotedString [ t_QuotedIndex ] = '\"' ; t_QuotedString [ t_QuotedIndex + 1 ] = 0 ; return t_QuotedString ; } wchar_t *WbemTaskObject :: QuoteString ( wchar_t *a_String ) { ULONG t_StringLength = wcslen ( a_String ) ; wchar_t *t_QuotedString = new wchar_t [ t_StringLength + 3 ] ; t_QuotedString [ 0 ] = '\"' ; memcpy ( & t_QuotedString [ 1 ] , a_String , sizeof ( wchar_t ) * t_StringLength ) ; t_QuotedString [ t_StringLength + 1 ] = '\"' ; t_QuotedString [ t_StringLength + 2 ] = 0 ; return t_QuotedString ; } BOOL WbemTaskObject :: FindAddressEntryByIndex ( WbemSnmpErrorObject &a_ErrorObject , IEnumWbemClassObject *a_AddressTableEnumerator , wchar_t *&a_ipAdEntAddr , wchar_t *&a_ipAdEntNetMask , ULONG a_ipAdEntIfIndex ) { BOOL t_ReturnStatus = FALSE ; a_ipAdEntAddr = NULL ; a_ipAdEntNetMask = NULL ; IWbemClassObject *t_AddressTableEntry = NULL ; ULONG t_Returned = 0 ; a_AddressTableEnumerator->Reset () ; HRESULT t_Result ; while ( ( t_Result = a_AddressTableEnumerator->Next ( -1 , 1 , &t_AddressTableEntry , & t_Returned ) ) == WBEM_NO_ERROR ) { wchar_t *t_ipAdEntAddr = NULL ; wchar_t *t_ipAdEntNetMask = NULL ; ULONG t_ipAdEntIfIndex = 0 ; BOOL t_Status = GetAddressEntry ( a_ErrorObject , t_AddressTableEntry , t_ipAdEntAddr , t_ipAdEntNetMask , t_ipAdEntIfIndex ) ; if ( t_Status ) { if ( t_ipAdEntIfIndex == a_ipAdEntIfIndex ) { t_AddressTableEntry->Release () ; a_ipAdEntAddr = t_ipAdEntAddr ; a_ipAdEntNetMask = t_ipAdEntNetMask ; t_ReturnStatus = TRUE ; break ; } } delete [] t_ipAdEntAddr ; delete [] t_ipAdEntNetMask ; t_AddressTableEntry->Release () ; } return t_ReturnStatus ; } BOOL WbemTaskObject :: FindAddressEntryByAddress ( WbemSnmpErrorObject &a_ErrorObject , IEnumWbemClassObject *a_AddressTableEnumerator , wchar_t *a_ipAdEntAddr , wchar_t *&a_ipAdEntNetMask , ULONG &a_ipAdEntIfIndex ) { BOOL t_ReturnStatus = FALSE ; a_ipAdEntNetMask = NULL ; a_ipAdEntIfIndex = 0 ; IWbemClassObject *t_AddressTableEntry = NULL ; ULONG t_Returned = 0 ; a_AddressTableEnumerator->Reset () ; HRESULT t_Result ; while ( ( t_Result = a_AddressTableEnumerator->Next ( -1 , 1 , &t_AddressTableEntry , & t_Returned ) ) == WBEM_NO_ERROR ) { wchar_t *t_ipAdEntAddr = NULL ; wchar_t *t_ipAdEntNetMask = NULL ; ULONG t_ipAdEntIfIndex = 0 ; BOOL t_Status = GetAddressEntry ( a_ErrorObject , t_AddressTableEntry , t_ipAdEntAddr , t_ipAdEntNetMask , t_ipAdEntIfIndex ) ; if ( t_Status ) { if ( wcscmp ( t_ipAdEntAddr , a_ipAdEntAddr ) == 0 ) { t_AddressTableEntry->Release () ; a_ipAdEntIfIndex = t_ipAdEntIfIndex ; a_ipAdEntNetMask = t_ipAdEntNetMask ; t_ReturnStatus = TRUE ; break ; } } delete [] t_ipAdEntAddr ; delete [] t_ipAdEntNetMask ; t_AddressTableEntry->Release () ; } return t_ReturnStatus ; } BOOL WbemTaskObject :: GetAddressEntry ( WbemSnmpErrorObject &a_ErrorObject , IWbemClassObject *a_AddressTableEntry , wchar_t *&a_ipAdEntAddr , wchar_t *&a_ipAdEntNetMask , ULONG &a_ipAdEntIfIndex ) { BOOL t_Status ; a_ipAdEntAddr = NULL ; a_ipAdEntNetMask = NULL ; a_ipAdEntIfIndex = 0 ; VARIANT t_Variant ; VariantInit ( &t_Variant ) ; LONG t_PropertyFlavour = 0 ; VARTYPE t_PropertyType = 0 ; HRESULT t_Result = a_AddressTableEntry->Get ( L"ipAdEntIfIndex" , 0 , & t_Variant , & t_PropertyType , & t_PropertyFlavour ) ; if ( t_Status = SUCCEEDED ( t_Result ) ) { if ( t_Variant.vt == VT_I4 ) { a_ipAdEntIfIndex = t_Variant.lVal ; } else { t_Status = FALSE ; } } VariantClear ( &t_Variant ) ; t_Result = a_AddressTableEntry->Get ( L"ipAdEntAddr" , 0 , & t_Variant , & t_PropertyType , & t_PropertyFlavour ) ; if ( t_Status = SUCCEEDED ( t_Result ) ) { if ( ( t_Variant.vt == VT_BSTR ) && ( t_Variant.bstrVal ) ) { a_ipAdEntAddr = UnicodeStringDuplicate ( t_Variant.bstrVal ) ; } else { t_Status = FALSE ; } } VariantClear ( &t_Variant ) ; t_Result = a_AddressTableEntry->Get ( L"ipAdEntNetMask" , 0 , & t_Variant , & t_PropertyType , & t_PropertyFlavour ) ; if ( t_Status = SUCCEEDED ( t_Result ) ) { if ( ( t_Variant.vt == VT_BSTR ) && ( t_Variant.bstrVal ) ) { a_ipAdEntNetMask = UnicodeStringDuplicate ( t_Variant.bstrVal ) ; } else { t_Status = FALSE ; } } VariantClear ( &t_Variant ) ; return t_Status ; } BOOL WbemTaskObject :: GetRouteEntry ( WbemSnmpErrorObject &a_ErrorObject , IWbemClassObject *a_RoutingTableEntry , wchar_t *&a_ipRouteDest , wchar_t *&a_ipRouteNextHop , wchar_t *&a_ipRouteMask , ULONG &a_ipRouteIfIndex , ULONG &a_ipRouteMetric1 ) { BOOL t_Status ; a_ipRouteDest = NULL ; a_ipRouteNextHop = NULL ; a_ipRouteMask = NULL ; a_ipRouteIfIndex = 0 ; a_ipRouteMetric1 = 0 ; VARIANT t_Variant ; VariantInit ( &t_Variant ) ; LONG t_PropertyFlavour = 0 ; VARTYPE t_PropertyType = 0 ; HRESULT t_Result = a_RoutingTableEntry->Get ( L"ipRouteIfIndex" , 0 , & t_Variant , & t_PropertyType , & t_PropertyFlavour ) ; if ( t_Status = SUCCEEDED ( t_Result ) ) { if ( t_Variant.vt == VT_I4 ) { a_ipRouteIfIndex = t_Variant.lVal ; } else { t_Status = FALSE ; } } VariantClear ( &t_Variant ) ; t_Result = a_RoutingTableEntry->Get ( L"ipRouteMetric1" , 0 , & t_Variant , & t_PropertyType , & t_PropertyFlavour ) ; if ( t_Status = SUCCEEDED ( t_Result ) ) { if ( t_Variant.vt == VT_I4 ) { a_ipRouteMetric1 = t_Variant.lVal ; } else { t_Status = FALSE ; } } VariantClear ( &t_Variant ) ; t_Result = a_RoutingTableEntry->Get ( L"ipRouteDest" , 0 , & t_Variant , & t_PropertyType , & t_PropertyFlavour ) ; if ( t_Status = SUCCEEDED ( t_Result ) ) { if ( ( t_Variant.vt == VT_BSTR ) && ( t_Variant.bstrVal ) ) { a_ipRouteDest = UnicodeStringDuplicate ( t_Variant.bstrVal ) ; } else { t_Status = FALSE ; } } VariantClear ( &t_Variant ) ; t_Result = a_RoutingTableEntry->Get ( L"ipRouteNextHop" , 0 , & t_Variant , & t_PropertyType , & t_PropertyFlavour ) ; if ( t_Status = SUCCEEDED ( t_Result ) ) { if ( ( t_Variant.vt == VT_BSTR ) && ( t_Variant.bstrVal ) ) { a_ipRouteNextHop = UnicodeStringDuplicate ( t_Variant.bstrVal ) ; } else { t_Status = FALSE ; } } VariantClear ( &t_Variant ) ; t_Result = a_RoutingTableEntry->Get ( L"ipRouteMask" , 0 , & t_Variant , & t_PropertyType , & t_PropertyFlavour ) ; if ( t_Status = SUCCEEDED ( t_Result ) ) { if ( ( t_Variant.vt == VT_BSTR ) && ( t_Variant.bstrVal ) ) { a_ipRouteMask = UnicodeStringDuplicate ( t_Variant.bstrVal ) ; } else { t_Status = FALSE ; } } VariantClear ( &t_Variant ) ; return t_Status ; } BOOL WbemTaskObject :: CalculateRoute ( WbemSnmpErrorObject &a_ErrorObject , IWbemServices *a_Proxy , ULONG a_SourceAddress , ULONG 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 t_Status = TRUE ; BOOL t_RouteInitialised = FALSE ; ULONG t_BestDestinationRouteAddress = 0 ; ULONG t_BestDestinationRouteMask = 0 ; ULONG t_BestSubnetAddress = 0 ; ULONG t_BestSubnetMask = 0 ; ULONG t_BestInterfaceIndex = 0 ; ULONG t_BestGatewayAddress = 0 ; ULONG t_BestGatewaySubnetAddress = 0 ; ULONG t_BestGatewaySubnetMask = 0 ; ULONG t_BestGatewayInterfaceIndex = 0 ; IEnumWbemClassObject *t_AddressTableEnumerator = NULL ; HRESULT t_Result = a_Proxy->CreateInstanceEnum ( L"MS_SNMP_RFC1213_MIB_ipAddrTable" , 0 , NULL , & t_AddressTableEnumerator ) ; if ( t_Status = SUCCEEDED ( t_Result ) ) { SnmpIpAddressType t_SourceAddressType ( a_SourceAddress ) ; wchar_t *t_SourceipAdEntAddr = t_SourceAddressType.GetStringValue () ; wchar_t *t_SourceipAdEntNetMask = NULL ; ULONG t_SourceipAdEntIfIndex = 0 ; t_Status = FindAddressEntryByAddress ( a_ErrorObject , t_AddressTableEnumerator , t_SourceipAdEntAddr , t_SourceipAdEntNetMask , t_SourceipAdEntIfIndex ) ; if ( t_Status ) { SnmpIpAddressType t_SourceipAdEntNetMaskType ( t_SourceipAdEntNetMask ) ; SnmpIpAddressType t_SubNetworkAddress ( t_SourceipAdEntNetMaskType.GetValue () & a_SourceAddress ) ; SnmpIpAddressType t_DestinationSubNetworkAddress ( t_SourceipAdEntNetMaskType.GetValue () & a_DestinationAddress ) ; IEnumWbemClassObject *t_RoutingTableEnumerator = NULL ; HRESULT t_Result = a_Proxy->CreateInstanceEnum ( L"MS_SNMP_RFC1213_MIB_ipRouteTable" , 0 , NULL , & t_RoutingTableEnumerator ) ; if ( t_Status = SUCCEEDED ( t_Result ) ) { IWbemClassObject *t_RoutingTableEntry = NULL ; ULONG t_Returned = 0 ; t_RoutingTableEnumerator->Reset () ; while ( ( t_Result = t_RoutingTableEnumerator->Next ( -1 , 1 , &t_RoutingTableEntry , & t_Returned ) ) == WBEM_NO_ERROR ) { wchar_t *t_ipRouteDest = NULL ; wchar_t *t_ipRouteNextHop = NULL ; wchar_t *t_ipRouteMask = NULL ; ULONG t_ipRouteIfIndex = 0 ; ULONG t_ipRouteMetric1 = 0 ; t_Status = GetRouteEntry ( a_ErrorObject , t_RoutingTableEntry , t_ipRouteDest , t_ipRouteNextHop , t_ipRouteMask , t_ipRouteIfIndex , t_ipRouteMetric1 ) ; if ( t_Status ) { SnmpIpAddressType t_ipRouteDestType ( t_ipRouteDest ) ; SnmpIpAddressType t_ipRouteMaskType ( t_ipRouteMask ) ; SnmpIpAddressType t_ipNextHopType ( t_ipRouteNextHop ) ; if ( t_ipRouteDestType && t_ipRouteMaskType && t_ipNextHopType ) { wchar_t *t_ipAdEntAddr = NULL ; wchar_t *t_ipAdEntNetMask = NULL ; t_Status = FindAddressEntryByIndex ( a_ErrorObject , t_AddressTableEnumerator , t_ipAdEntAddr , t_ipAdEntNetMask , t_ipRouteIfIndex ) ; if ( t_Status ) { SnmpIpAddressType t_ipAdEntNetMaskType ( t_ipAdEntNetMask ) ; SnmpIpAddressType t_ipAdEntAddrType ( t_ipAdEntAddr ) ; if ( ! t_RouteInitialised ) { if ( ( a_DestinationAddress & t_ipRouteMaskType.GetValue () ) == t_ipRouteDestType.GetValue () ) { t_BestInterfaceIndex = t_ipRouteIfIndex ; t_BestSubnetMask = t_SourceipAdEntNetMaskType.GetValue () ; t_BestSubnetAddress = t_SubNetworkAddress.GetValue () ; t_BestGatewayInterfaceIndex = t_SourceipAdEntIfIndex ; t_BestGatewayAddress = t_ipNextHopType.GetValue () ; t_BestGatewaySubnetMask = t_ipAdEntNetMaskType.GetValue () ; t_BestGatewaySubnetAddress = t_ipAdEntNetMaskType.GetValue () & t_ipNextHopType.GetValue () ; t_BestDestinationRouteAddress = t_ipRouteDestType.GetValue () ; t_BestDestinationRouteMask = t_ipRouteMaskType.GetValue () ; t_RouteInitialised = TRUE ; } } else { if ( ( a_DestinationAddress & t_ipRouteMaskType.GetValue () ) == t_ipRouteDestType.GetValue () ) { if ( t_ipRouteMaskType.GetValue () > t_BestDestinationRouteMask ) { t_BestInterfaceIndex = t_ipRouteIfIndex ; t_BestSubnetMask = t_SourceipAdEntNetMaskType.GetValue () ; t_BestSubnetAddress = t_SubNetworkAddress.GetValue () ; t_BestGatewayInterfaceIndex = t_SourceipAdEntIfIndex ; t_BestGatewayAddress = t_ipNextHopType.GetValue () ; t_BestGatewaySubnetMask = t_ipAdEntNetMaskType.GetValue () ; t_BestGatewaySubnetAddress = t_ipAdEntNetMaskType.GetValue () & t_ipNextHopType.GetValue () ; t_BestDestinationRouteAddress = t_ipRouteDestType.GetValue () ; t_BestDestinationRouteMask = t_ipRouteMaskType.GetValue () ; } } } } delete [] t_ipAdEntAddr ; delete [] t_ipAdEntNetMask ; } else { t_Status = FALSE ; } } delete [] t_ipRouteDest ; delete [] t_ipRouteMask ; delete [] t_ipRouteNextHop ; t_RoutingTableEntry->Release () ; } } } delete [] t_SourceipAdEntAddr ; delete [] t_SourceipAdEntNetMask ; } if ( t_RouteInitialised ) { a_InterfaceIndex = t_BestInterfaceIndex ; a_GatewayInterfaceIndex = t_BestGatewayInterfaceIndex ; SnmpIpAddressType t_GatewayAddressType ( t_BestGatewayAddress ) ; SnmpIpAddressType t_GatewaySubnetAddressType ( t_BestGatewaySubnetAddress ) ; SnmpIpAddressType t_GatewaySubnetMaskType ( t_BestGatewaySubnetMask ) ; SnmpIpAddressType t_SubnetMaskType ( t_BestSubnetMask ) ; SnmpIpAddressType t_SubnetAddressType ( t_BestSubnetAddress ) ; SnmpIpAddressType t_DestinationRouteAddressType ( t_BestDestinationRouteAddress ) ; SnmpIpAddressType t_DestinationRouteMaskType ( t_BestDestinationRouteMask ) ; a_GatewayAddress = t_GatewayAddressType.GetStringValue () ; a_GatewaySubnetAddress = t_GatewaySubnetAddressType.GetStringValue () ; a_GatewaySubnetMask = t_GatewaySubnetMaskType.GetStringValue () ; a_SubnetMask = t_SubnetMaskType.GetStringValue () ; a_SubnetAddress = t_SubnetAddressType.GetStringValue () ; a_DestinationRouteAddress = t_DestinationRouteAddressType.GetStringValue () ; a_DestinationRouteMask = t_DestinationRouteMaskType.GetStringValue () ; } return t_RouteInitialised ; }