//*************************************************************************** // // MINISERV.CPP // // Module: OLE MS SNMP Property Provider // // Purpose: Implementation for the CImpTraceRouteProv class. // // Copyright (c) 1996-2001 Microsoft Corporation, All Rights Reserved // //*************************************************************************** #include #include #include #include #include #include #include #ifndef INITGUID #define INITGUID #endif #include #include #include #include #include "classfac.h" #include #include #include #include #include #include #include #include #include #include "wndtime.h" #include "rmon.h" #include "trrtprov.h" #include "trrt.h" #include "guids.h" ///////////////////////////////////////////////////////////////////////////// // Functions constructor, destructor and IUnknown //*************************************************************************** // // CImpTraceRouteProv ::CImpTraceRouteProv // CImpTraceRouteProv ::~CImpTraceRouteProv // //*************************************************************************** SnmpDefaultThreadObject *CImpTraceRouteProv :: s_DefaultThreadObject = NULL ; SnmpDefaultThreadObject *CImpTraceRouteProv :: s_BackupThreadObject = NULL ; ProviderStore CImpTraceRouteProv :: s_ProviderStore ; CImpTraceRouteProv ::CImpTraceRouteProv () { m_ReferenceCount = 0 ; InterlockedIncrement ( & CTraceRouteLocatorClassFactory :: s_ObjectsInProgress ) ; /* * Implementation */ m_Initialised = FALSE ; m_Parent = NULL ; m_Server = NULL ; m_Namespace = NULL ; m_NotificationClassObject = NULL ; m_ExtendedNotificationClassObject = NULL ; m_GetNotifyCalled = FALSE ; m_GetExtendedNotifyCalled = FALSE ; m_localeId = NULL ; m_TopNTableProv = NULL ; } CImpTraceRouteProv ::~CImpTraceRouteProv(void) { /* * Place code in critical section */ InterlockedDecrement ( & CTraceRouteLocatorClassFactory :: s_ObjectsInProgress ) ; delete [] m_localeId ; delete [] m_Namespace ; if ( m_TopNTableProv ) delete m_TopNTableProv ; if ( m_Parent ) m_Parent->Release () ; if ( m_Server ) m_Server->Release () ; if ( m_NotificationClassObject ) m_NotificationClassObject->Release () ; if ( m_ExtendedNotificationClassObject ) m_ExtendedNotificationClassObject->Release () ; } //*************************************************************************** // // CImpTraceRouteProv ::QueryInterface // CImpTraceRouteProv ::AddRef // CImpTraceRouteProv ::Release // // Purpose: IUnknown members for CImpTraceRouteProv object. //*************************************************************************** STDMETHODIMP CImpTraceRouteProv ::QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemServices ) { *iplpv = ( LPVOID ) this ; } if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ; return S_OK ; } else { return E_NOINTERFACE ; } } STDMETHODIMP_(ULONG) CImpTraceRouteProv ::AddRef(void) { return InterlockedIncrement ( & m_ReferenceCount ) ; } STDMETHODIMP_(ULONG) CImpTraceRouteProv ::Release(void) { LONG t_Ref ; if ( ( t_Ref = InterlockedDecrement ( & m_ReferenceCount ) ) == 0 ) { delete this ; return 0 ; } else { return t_Ref ; } } void CImpTraceRouteProv :: SetParent ( IWbemServices *a_Parent ) { m_Parent = a_Parent ; m_Parent->AddRef () ; } void CImpTraceRouteProv :: SetServer ( IWbemServices *a_Server ) { m_Server = a_Server ; m_Server->AddRef () ; } IWbemServices *CImpTraceRouteProv :: GetServer () { if ( m_Server ) m_Server->AddRef () ; return m_Server ; } IWbemServices *CImpTraceRouteProv :: GetParent () { if ( m_Parent ) m_Parent->AddRef () ; return ( IWbemServices * ) m_Parent ; } void CImpTraceRouteProv :: SetLocaleId ( wchar_t *localeId ) { m_localeId = UnicodeStringDuplicate ( localeId ) ; } wchar_t *CImpTraceRouteProv :: GetNamespace () { return m_Namespace ; } void CImpTraceRouteProv :: SetNamespace ( wchar_t *a_Namespace ) { m_Namespace = UnicodeStringDuplicate ( a_Namespace ) ; } void CImpTraceRouteProv :: EnableRmonPolling () { IWbemServices *t_Server = GetServer () ; m_TopNTableProv = new TopNTableProv ( t_Server , s_ProviderStore ) ; t_Server->Release () ; } IWbemClassObject *CImpTraceRouteProv :: GetNotificationObject ( WbemSnmpErrorObject &a_errorObject ) { if ( m_NotificationClassObject ) { m_NotificationClassObject->AddRef () ; } else { BOOL t_Status = CreateNotificationObject ( a_errorObject ) ; if ( t_Status ) { /* * Keep around until we close */ m_NotificationClassObject->AddRef () ; } } return m_NotificationClassObject ; } IWbemClassObject *CImpTraceRouteProv :: GetExtendedNotificationObject ( WbemSnmpErrorObject &a_errorObject ) { if ( m_ExtendedNotificationClassObject ) { m_ExtendedNotificationClassObject->AddRef () ; } else { BOOL t_Status = CreateExtendedNotificationObject ( a_errorObject ) ; if ( t_Status ) { /* * Keep around until we close */ m_ExtendedNotificationClassObject->AddRef () ; } } return m_ExtendedNotificationClassObject ; } BOOL CImpTraceRouteProv :: CreateExtendedNotificationObject ( WbemSnmpErrorObject &a_errorObject ) { if ( m_GetExtendedNotifyCalled ) { if ( m_ExtendedNotificationClassObject ) return TRUE ; else return FALSE ; } else m_GetExtendedNotifyCalled = TRUE ; BOOL t_Status = TRUE ; IWbemCallResult *t_ErrorObject = NULL ; HRESULT t_Result = m_Server->GetObject ( WBEM_CLASS_EXTENDEDSTATUS , 0 , NULL, & m_ExtendedNotificationClassObject , & t_ErrorObject ) ; if ( t_ErrorObject ) t_ErrorObject->Release () ; if ( ! SUCCEEDED ( t_Result ) ) { t_Status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_OBJECT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Failed to get __ExtendedStatus" ) ; m_ExtendedNotificationClassObject = NULL ; } return t_Status ; } BOOL CImpTraceRouteProv :: CreateNotificationObject ( WbemSnmpErrorObject &a_errorObject ) { if ( m_GetNotifyCalled ) { if ( m_NotificationClassObject ) return TRUE ; else return FALSE ; } else m_GetNotifyCalled = TRUE ; BOOL t_Status = TRUE ; IWbemCallResult *t_ErrorObject = NULL ; HRESULT t_Result = m_Server->GetObject ( WBEM_CLASS_EXTENDEDSTATUS , 0 , NULL, & m_NotificationClassObject , & t_ErrorObject ) ; if ( t_ErrorObject ) t_ErrorObject->Release () ; if ( ! SUCCEEDED ( t_Result ) ) { t_Status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_E_INVALID_OBJECT ) ; a_errorObject.SetWbemStatus ( WBEM_E_FAILED ) ; a_errorObject.SetMessage ( L"Failed to get __ExtendedStatus" ) ; } return t_Status ; } BOOL CImpTraceRouteProv ::AttachServer ( WbemSnmpErrorObject &a_errorObject , BSTR ObjectPath, IWbemContext FAR* pCtx, long lFlags, IWbemServices FAR* FAR* ppNewContext, IWbemCallResult FAR* FAR* ppErrorObject ) { BOOL t_Status = TRUE ; IWbemLocator *t_Locator = NULL ; IWbemServices *t_Server = NULL ; HRESULT t_Result = CoCreateInstance ( CLSID_WbemLocator , NULL , CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER , IID_IWbemLocator , ( void ** ) & t_Locator ); if ( SUCCEEDED ( t_Result ) ) { t_Result = t_Locator->ConnectServer ( ObjectPath , NULL, NULL, NULL , 0 , NULL, NULL, ( IWbemServices ** ) & t_Server ) ; if ( t_Result == WBEM_NO_ERROR ) { // Mark this interface pointer as "critical" IWbemConfigure* t_Configure; t_Result = t_Server->QueryInterface ( IID_IWbemConfigure , ( void ** ) & t_Configure ) ; if ( SUCCEEDED ( t_Result ) ) { t_Configure->SetConfigurationFlags(WBEM_CONFIGURATION_FLAG_CRITICAL_USER); t_Configure->Release(); ( ( * ( CImpTraceRouteProv ** ) ppNewContext ) )->SetServer ( t_Server ) ; t_Status = AttachParentServer ( a_errorObject , ObjectPath , pCtx , lFlags, ppNewContext, ppErrorObject ) ; } else { t_Status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_ERROR_CRITICAL_ERROR ) ; a_errorObject.SetWbemStatus ( WBEM_ERROR_CRITICAL_ERROR ) ; a_errorObject.SetMessage ( L"Failed to configure" ) ; } t_Server->Release () ; } else { t_Status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_ERROR_CRITICAL_ERROR ) ; a_errorObject.SetWbemStatus ( WBEM_ERROR_CRITICAL_ERROR ) ; a_errorObject.SetMessage ( L"Failed to connect to this namespace" ) ; } t_Locator->Release () ; } else { t_Status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_ERROR_CRITICAL_ERROR ) ; a_errorObject.SetWbemStatus ( WBEM_ERROR_CRITICAL_ERROR ) ; a_errorObject.SetMessage ( L"Failed to CoCreateInstance on IID_IWbemLocator" ) ; } return t_Status ; } BOOL CImpTraceRouteProv ::AttachParentServer ( WbemSnmpErrorObject &a_errorObject , BSTR ObjectPath, IWbemContext FAR* pCtx, long lFlags, IWbemServices FAR* FAR* ppNewContext, IWbemCallResult FAR* FAR* ppErrorObject ) { BOOL t_Status = TRUE ; CImpTraceRouteProv *propertyProvider = * ( CImpTraceRouteProv ** ) ppNewContext ; IWbemLocator *t_Locator = NULL ; IWbemServices *t_Server = NULL ; // Get Parent Namespace Path WbemNamespacePath *t_NamespacePath = propertyProvider->GetNamespacePath () ; ULONG t_Count = t_NamespacePath->GetCount () ; wchar_t *t_Path = NULL ; if ( t_NamespacePath->GetServer () ) { t_Path = UnicodeStringDuplicate ( L"\\\\" ) ; wchar_t *t_ConcatPath = UnicodeStringAppend ( t_Path , t_NamespacePath->GetServer () ) ; delete [] t_Path ; t_Path = t_ConcatPath ; } if ( ! t_NamespacePath->Relative () ) { wchar_t *t_ConcatPath = UnicodeStringAppend ( t_Path , L"\\" ) ; delete [] t_Path ; t_Path = t_ConcatPath ; } ULONG t_PathIndex = 0 ; wchar_t *t_PathComponent ; t_NamespacePath->Reset () ; while ( ( t_PathIndex < t_Count - 1 ) && ( t_PathComponent = t_NamespacePath->Next () ) ) { wchar_t *t_ConcatPath = UnicodeStringAppend ( t_Path , t_PathComponent ) ; delete [] t_Path ; t_Path = t_ConcatPath ; if ( t_PathIndex < t_Count - 2 ) { t_ConcatPath = UnicodeStringAppend ( t_Path , L"\\" ) ; delete [] t_Path ; t_Path = t_ConcatPath ; } t_PathIndex ++ ; } // Get Name of child namespace relative to parent namespace if ( t_PathComponent = t_NamespacePath->Next () ) { ( ( * ( CImpTraceRouteProv ** ) ppNewContext ) )->SetNamespace ( t_PathComponent ) ; } // Connect to parent namespace HRESULT t_Result = CoCreateInstance ( CLSID_WbemLocator , NULL , CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER , IID_IWbemLocator , ( void ** ) & t_Locator ); if ( SUCCEEDED ( t_Result ) ) { IWbemServices *t_Parent = NULL ; t_Result = t_Locator->ConnectServer ( t_Path , NULL, NULL, NULL , 0 , NULL, NULL, ( IWbemServices ** ) & t_Parent ) ; if ( t_Result == WBEM_NO_ERROR ) { // Mark this interface pointer as "critical" IWbemConfigure* t_Configure ; t_Result = t_Parent->QueryInterface ( IID_IWbemConfigure , (void ** ) & t_Configure ) ; if( SUCCEEDED ( t_Result ) ) { t_Configure->SetConfigurationFlags ( WBEM_CONFIGURATION_FLAG_CRITICAL_USER ) ; t_Configure->Release() ; ( ( * ( CImpTraceRouteProv ** ) ppNewContext ) )->SetParent ( t_Parent ) ; } else { t_Status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_ERROR_CRITICAL_ERROR ) ; a_errorObject.SetWbemStatus ( WBEM_ERROR_CRITICAL_ERROR ) ; a_errorObject.SetMessage ( L"Failed to configure" ) ; } t_Parent->Release () ; } else { t_Status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_ERROR_CRITICAL_ERROR ) ; a_errorObject.SetWbemStatus ( WBEM_ERROR_CRITICAL_ERROR ) ; a_errorObject.SetMessage ( L"Failed to connect to this namespace's parent namespace" ) ; } t_Locator->Release () ; } else { t_Status = FALSE ; a_errorObject.SetStatus ( WBEM_SNMP_ERROR_CRITICAL_ERROR ) ; a_errorObject.SetWbemStatus ( WBEM_ERROR_CRITICAL_ERROR ) ; a_errorObject.SetMessage ( L"Failed to CoCreateInstance on IID_IWbemLocator" ) ; } delete [] t_Path ; return t_Status ; } ///////////////////////////////////////////////////////////////////////////// // Functions for the IWbemServices interface that are handled here HRESULT CImpTraceRouteProv ::OpenNamespace ( BSTR ObjectPath, long lFlags, IWbemContext FAR* pCtx, IWbemServices FAR* FAR* ppNewContext, IWbemCallResult FAR* FAR* ppErrorObject ) { BOOL t_Status = TRUE ; HRESULT t_Result = S_OK ; WbemSnmpErrorObject t_ErrorObject ; if ( ppErrorObject ) *ppErrorObject = NULL ; wchar_t *t_OpenPath = NULL ; if ( m_Initialised ) { WbemNamespacePath t_OpenNamespacePath ( m_NamespacePath ) ; WbemNamespacePath t_ObjectPathArg ; if ( t_ObjectPathArg.SetNamespacePath ( ObjectPath ) ) { if ( t_ObjectPathArg.Relative () ) { if ( t_OpenNamespacePath.ConcatenatePath ( t_ObjectPathArg ) ) { t_OpenPath = t_OpenNamespacePath.GetNamespacePath () ; } else { t_Status = FALSE ; t_ErrorObject.SetStatus ( WBEM_SNMP_E_INVALID_PATH ) ; t_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; t_ErrorObject.SetMessage ( L"Path specified was not relative to current namespace" ) ; } } else { t_Status = FALSE ; t_ErrorObject.SetStatus ( WBEM_SNMP_E_INVALID_PATH ) ; t_ErrorObject.SetWbemStatus ( WBEM_E_FAILED ) ; t_ErrorObject.SetMessage ( L"Path specified was not relative to current namespace" ) ; } } } else { t_OpenPath = UnicodeStringDuplicate ( ObjectPath ) ; } if ( t_Status ) { t_Result = CoCreateInstance ( CLSID_CTraceRouteProvClassFactory , NULL , CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER , IID_IWbemServices , ( void ** ) ppNewContext ); if ( SUCCEEDED ( t_Result ) ) { CImpTraceRouteProv *t_Provider = * ( CImpTraceRouteProv ** ) ppNewContext ; if ( t_Provider->GetNamespacePath ()->SetNamespacePath ( t_OpenPath ) ) { t_Status = AttachServer ( t_ErrorObject , t_OpenPath , pCtx, lFlags, ppNewContext, ppErrorObject ) ; if ( t_Status ) { t_Provider->EnableRmonPolling () ; t_Status = t_Provider->GetTopNTableProv ()->IsValid () ; } } } else { t_Status = FALSE ; t_ErrorObject.SetStatus ( WBEM_SNMP_ERROR_CRITICAL_ERROR ) ; t_ErrorObject.SetWbemStatus ( WBEM_ERROR_CRITICAL_ERROR ) ; t_ErrorObject.SetMessage ( L"Failed to CoCreateInstance on IID_IWbemServices" ) ; } } delete [] t_OpenPath ; t_Result = t_ErrorObject.GetWbemStatus () ; return t_Result ; } HRESULT CImpTraceRouteProv :: CancelAsyncCall ( IWbemObjectSink __RPC_FAR *pSink ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CImpTraceRouteProv :: QueryObjectSink ( long lFlags, IWbemObjectSink FAR* FAR* ppHandler ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CImpTraceRouteProv :: GetObject ( BSTR ObjectPath, long lFlags, IWbemContext FAR *pCtx, IWbemClassObject FAR* FAR *ppObject, IWbemCallResult FAR* FAR *ppCallResult ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CImpTraceRouteProv :: GetObjectAsync ( BSTR ObjectPath, long lFlags, IWbemContext FAR *pCtx, IWbemObjectSink FAR* pHandler ) { DebugMacro2( SnmpDebugLog :: s_SnmpDebugLog.Write ( L"\r\n" ) ; SnmpDebugLog :: s_SnmpDebugLog.Write ( __FILE__,__LINE__, L"CImpTraceRouteProv::GetObjectAsync ()" ) ; ) HRESULT t_Result = S_OK ; /* * Create Asynchronous GetObjectByPath object */ GetObjectAsyncEventObject *t_AsyncEvent = new GetObjectAsyncEventObject ( this , ObjectPath , lFlags , pHandler , pCtx ) ; if ( CImpTraceRouteProv :: s_DefaultThreadObject->GetActive () ) { CImpTraceRouteProv :: s_BackupThreadObject->ScheduleTask ( *t_AsyncEvent ) ; } else { CImpTraceRouteProv :: s_DefaultThreadObject->ScheduleTask ( *t_AsyncEvent ) ; } t_AsyncEvent->Exec () ; /* * Wait for worker object to complete processing */ if ( t_AsyncEvent->Wait ( FALSE ) ) { t_Result = t_AsyncEvent->GetErrorObject ().GetWbemStatus () ; } else { t_Result = WBEM_ERROR_CRITICAL_ERROR ; } DebugMacro2( SnmpDebugLog :: s_SnmpDebugLog.Write ( __FILE__,__LINE__, L"Returning from CImpTraceRouteProv::GetObjectAsync ( (%s) ) with Result = (%lx)" , ObjectPath , t_Result ) ; ) return t_Result ; } HRESULT CImpTraceRouteProv :: PutClass ( IWbemClassObject FAR* pClass , long lFlags, IWbemContext FAR *pCtx, IWbemCallResult FAR* FAR* ppCallResult ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CImpTraceRouteProv :: PutClassAsync ( IWbemClassObject FAR* pClass, long lFlags, IWbemContext FAR *pCtx, IWbemObjectSink FAR* pHandler ) { DebugMacro2( SnmpDebugLog :: s_SnmpDebugLog.Write ( L"\r\n" ) ; SnmpDebugLog :: s_SnmpDebugLog.Write ( __FILE__,__LINE__, L"CImpTraceRouteProv::PutClassAsync ()" ) ; ) HRESULT t_Result = S_OK ; /* * Create Synchronous UpdateInstance object */ PutClassAsyncEventObject *t_AsyncEvent = new PutClassAsyncEventObject ( this , pClass , lFlags , pHandler , pCtx ) ; if ( CImpTraceRouteProv :: s_DefaultThreadObject->GetActive () ) { CImpTraceRouteProv :: s_BackupThreadObject->ScheduleTask ( *t_AsyncEvent ) ; } else { CImpTraceRouteProv :: s_DefaultThreadObject->ScheduleTask ( *t_AsyncEvent ) ; } t_AsyncEvent->Exec () ; /* * Wait for worker object to complete processing */ if ( t_AsyncEvent->Wait ( FALSE ) ) { t_Result = t_AsyncEvent->GetErrorObject ().GetWbemStatus () ; } else { t_Result = WBEM_ERROR_CRITICAL_ERROR ; } DebugMacro2( SnmpDebugLog :: s_SnmpDebugLog.Write ( __FILE__,__LINE__, L"Returning from CImpTraceRouteProv::PutClasseAsync () with Result = (%lx)" , t_Result ) ; ) return t_Result ; } HRESULT CImpTraceRouteProv :: DeleteClass ( BSTR Class, long lFlags, IWbemContext FAR *pCtx, IWbemCallResult FAR* FAR* ppCallResult ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CImpTraceRouteProv :: DeleteClassAsync ( BSTR Class, long lFlags, IWbemContext FAR *pCtx, IWbemObjectSink FAR* pHandler ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CImpTraceRouteProv :: CreateClassEnum ( BSTR Superclass, long lFlags, IWbemContext FAR *pCtx, IEnumWbemClassObject FAR *FAR *ppEnum ) { return WBEM_E_NOT_AVAILABLE ; } SCODE CImpTraceRouteProv :: CreateClassEnumAsync ( BSTR Superclass, long lFlags, IWbemContext FAR* pCtx, IWbemObjectSink FAR* pHandler ) { HRESULT t_Result = S_OK ; /* * Create Synchronous Enum Instance object */ CreateClassEnumAsyncEventObject *t_AsyncEvent = new CreateClassEnumAsyncEventObject ( this , Superclass , lFlags , pHandler , pCtx ) ; if ( CImpTraceRouteProv :: s_DefaultThreadObject->GetActive () ) { CImpTraceRouteProv :: s_BackupThreadObject->ScheduleTask ( *t_AsyncEvent ) ; } else { CImpTraceRouteProv :: s_DefaultThreadObject->ScheduleTask ( *t_AsyncEvent ) ; } t_AsyncEvent->Exec () ; /* * Wait for worker object to complete processing */ if ( t_AsyncEvent->Wait ( FALSE ) ) { t_Result = t_AsyncEvent->GetErrorObject ().GetWbemStatus () ; if ( SUCCEEDED ( t_Result ) ) { } } else { t_Result = WBEM_ERROR_CRITICAL_ERROR ; } return t_Result ; } HRESULT CImpTraceRouteProv :: PutInstance ( IWbemClassObject FAR *pInstance, long lFlags, IWbemContext FAR *pCtx, IWbemCallResult FAR *FAR *ppCallResult ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CImpTraceRouteProv :: PutInstanceAsync ( IWbemClassObject FAR* pInstance, long lFlags, IWbemContext FAR *pCtx, IWbemObjectSink FAR* pHandler ) { DebugMacro2( SnmpDebugLog :: s_SnmpDebugLog.Write ( L"\r\n" ) ; SnmpDebugLog :: s_SnmpDebugLog.Write ( __FILE__,__LINE__, L"CImpTraceRouteProv::PutInstanceAsync ()" ) ; ) HRESULT t_Result = S_OK ; /* * Create Synchronous UpdateInstance object */ PutInstanceAsyncEventObject *t_AsyncEvent = new PutInstanceAsyncEventObject ( this , pInstance , lFlags , pHandler , pCtx ) ; if ( CImpTraceRouteProv :: s_DefaultThreadObject->GetActive () ) { CImpTraceRouteProv :: s_BackupThreadObject->ScheduleTask ( *t_AsyncEvent ) ; } else { CImpTraceRouteProv :: s_DefaultThreadObject->ScheduleTask ( *t_AsyncEvent ) ; } t_AsyncEvent->Exec () ; /* * Wait for worker object to complete processing */ if ( t_AsyncEvent->Wait ( FALSE ) ) { t_Result = t_AsyncEvent->GetErrorObject ().GetWbemStatus () ; } else { t_Result = WBEM_ERROR_CRITICAL_ERROR ; } DebugMacro2( SnmpDebugLog :: s_SnmpDebugLog.Write ( __FILE__,__LINE__, L"Returning from CImpTraceRouteProv::PutInstanceAsync () with Result = (%lx)" , t_Result ) ; ) return t_Result ; } HRESULT CImpTraceRouteProv :: DeleteInstance ( BSTR ObjectPath, long lFlags, IWbemContext FAR *pCtx, IWbemCallResult FAR *FAR *ppCallResult ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CImpTraceRouteProv :: DeleteInstanceAsync ( BSTR ObjectPath, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR *pHandler ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CImpTraceRouteProv :: CreateInstanceEnum ( BSTR Class, long lFlags, IWbemContext FAR *pCtx, IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CImpTraceRouteProv :: CreateInstanceEnumAsync ( BSTR Class, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink FAR* pHandler ) { DebugMacro2( SnmpDebugLog :: s_SnmpDebugLog.Write ( L"\r\n" ) ; SnmpDebugLog :: s_SnmpDebugLog.Write ( __FILE__,__LINE__, L"CImpTraceRouteProv::CreateInstanceEnumAsync ( (%s) )" , Class ) ; ) HRESULT t_Result = S_OK ; /* * Create Synchronous Enum Instance object */ CreateInstanceEnumAsyncEventObject *t_AsyncEvent = new CreateInstanceEnumAsyncEventObject ( this , Class , lFlags , pHandler , pCtx ) ; if ( CImpTraceRouteProv :: s_DefaultThreadObject->GetActive () ) { CImpTraceRouteProv :: s_BackupThreadObject->ScheduleTask ( *t_AsyncEvent ) ; } else { CImpTraceRouteProv :: s_DefaultThreadObject->ScheduleTask ( *t_AsyncEvent ) ; } t_AsyncEvent->Exec () ; /* * Wait for worker object to complete processing */ if ( t_AsyncEvent->Wait ( FALSE ) ) { t_Result = t_AsyncEvent->GetErrorObject ().GetWbemStatus () ; if ( SUCCEEDED ( t_Result ) ) { } } else { t_Result = WBEM_ERROR_CRITICAL_ERROR ; } DebugMacro2( SnmpDebugLog :: s_SnmpDebugLog.Write ( __FILE__,__LINE__, L"ReturningFrom CImpTraceRouteProv::CreateInstanceEnum ( (%s) ) with Result = (%lx)" , Class , t_Result ) ; ) return t_Result ; } HRESULT CImpTraceRouteProv :: ExecQuery ( BSTR QueryLanguage, BSTR Query, long lFlags, IWbemContext FAR *pCtx, IEnumWbemClassObject FAR *FAR *ppEnum ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CImpTraceRouteProv :: ExecQueryAsync ( BSTR QueryFormat, BSTR Query, long lFlags, IWbemContext FAR* pCtx, IWbemObjectSink FAR* pHandler ) { DebugMacro2( SnmpDebugLog :: s_SnmpDebugLog.Write ( L"\r\n" ) ; SnmpDebugLog :: s_SnmpDebugLog.Write ( __FILE__,__LINE__, L"CImpTraceRouteProv::ExecQueryAsync ( (%s),(%s) )" , QueryFormat , Query ) ; ) HRESULT t_Result = S_OK ; /* * Create Synchronous Enum Instance object */ ExecQueryAsyncEventObject *t_AsyncEvent = new ExecQueryAsyncEventObject ( this , QueryFormat , Query , lFlags , pHandler , pCtx ) ; if ( CImpTraceRouteProv :: s_DefaultThreadObject->GetActive () ) { CImpTraceRouteProv :: s_BackupThreadObject->ScheduleTask ( *t_AsyncEvent ) ; } else { CImpTraceRouteProv :: s_DefaultThreadObject->ScheduleTask ( *t_AsyncEvent ) ; } t_AsyncEvent->Exec() ; /* * Wait for worker object to complete processing */ if ( t_AsyncEvent->Wait ( FALSE ) ) { t_Result = t_AsyncEvent->GetErrorObject ().GetWbemStatus () ; if ( SUCCEEDED ( t_Result ) ) { } } else { t_Result = WBEM_ERROR_CRITICAL_ERROR ; } DebugMacro2( SnmpDebugLog :: s_SnmpDebugLog.Write ( __FILE__,__LINE__, L"Returning from CImpTraceRouteProv::ExecqQueryAsync ( (%s),(%s) ) with Result = (%lx)" , QueryFormat, Query, t_Result ) ; ) return t_Result ; } HRESULT CImpTraceRouteProv :: ExecNotificationQuery ( BSTR QueryLanguage, BSTR Query, long lFlags, IWbemContext __RPC_FAR *pCtx, IEnumWbemClassObject __RPC_FAR *__RPC_FAR *ppEnum ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT CImpTraceRouteProv :: ExecNotificationQueryAsync ( BSTR QueryLanguage, BSTR Query, long lFlags, IWbemContext __RPC_FAR *pCtx, IWbemObjectSink __RPC_FAR *pHandler ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT STDMETHODCALLTYPE CImpTraceRouteProv :: ExecMethod( BSTR ObjectPath, BSTR MethodName, long lFlags, IWbemContext FAR *pCtx, IWbemClassObject FAR *pInParams, IWbemClassObject FAR *FAR *ppOutParams, IWbemCallResult FAR *FAR *ppCallResult ) { return WBEM_E_NOT_AVAILABLE ; } HRESULT STDMETHODCALLTYPE CImpTraceRouteProv :: ExecMethodAsync ( BSTR ObjectPath, BSTR MethodName, long lFlags, IWbemContext FAR *pCtx, IWbemClassObject FAR *pInParams, IWbemObjectSink FAR *pResponseHandler ) { return WBEM_E_NOT_AVAILABLE ; } ///////////////////////////////////////////////////////////////////////////// // Functions constructor, destructor and IUnknown //*************************************************************************** // // CImpTraceRouteLocator::CImpTraceRouteLocator // CImpTraceRouteLocator::~CImpTraceRouteLocator // //*************************************************************************** CImpTraceRouteLocator::CImpTraceRouteLocator () { m_ReferenceCount = 0 ; /* * Place code in critical section */ InterlockedIncrement ( & CTraceRouteLocatorClassFactory :: s_ObjectsInProgress ) ; } CImpTraceRouteLocator::~CImpTraceRouteLocator(void) { /* * Place code in critical section */ InterlockedDecrement ( & CTraceRouteLocatorClassFactory :: s_ObjectsInProgress ) ; } //*************************************************************************** // // CImpTraceRouteLocator::QueryInterface // CImpTraceRouteLocator::AddRef // CImpTraceRouteLocator::Release // // Purpose: IUnknown members for CImpTraceRouteLocator object. //*************************************************************************** STDMETHODIMP CImpTraceRouteLocator::QueryInterface ( REFIID iid , LPVOID FAR *iplpv ) { *iplpv = NULL ; if ( iid == IID_IUnknown ) { *iplpv = ( LPVOID ) this ; } else if ( iid == IID_IWbemLocator ) { *iplpv = ( LPVOID ) this ; } if ( *iplpv ) { ( ( LPUNKNOWN ) *iplpv )->AddRef () ; return S_OK ; } else { return E_NOINTERFACE ; } } STDMETHODIMP_(ULONG) CImpTraceRouteLocator::AddRef(void) { return InterlockedIncrement ( & m_ReferenceCount ) ; } STDMETHODIMP_(ULONG) CImpTraceRouteLocator::Release(void) { LONG t_Ref ; if ( ( t_Ref = InterlockedDecrement ( & m_ReferenceCount ) ) == 0 ) { delete this ; return 0 ; } else { return t_Ref ; } } STDMETHODIMP_( HRESULT ) CImpTraceRouteLocator :: ConnectServer ( BSTR a_Namespace, BSTR a_User, BSTR a_Password, BSTR a_lLocaleId, long a_lFlags, BSTR Authority, IWbemContext FAR *pCtx , IWbemServices FAR* FAR* a_Service ) { if ( ! CImpTraceRouteProv :: s_DefaultThreadObject ) { CImpTraceRouteProv :: s_DefaultThreadObject = new SnmpDefaultThreadObject ( "s_DefaultTraceRoute" ) ; CImpTraceRouteProv :: s_BackupThreadObject = new SnmpDefaultThreadObject ( "s_BackupTraceRoute" ) ; } IWbemServices FAR* t_Locator ; HRESULT t_Result = CoCreateInstance ( CLSID_CTraceRouteProvClassFactory , NULL , CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER , IID_IWbemServices , ( void ** ) & t_Locator ) ; if ( SUCCEEDED ( t_Result ) ) { IWbemCallResult *t_ErrorObject = NULL ; t_Result = t_Locator->OpenNamespace ( a_Namespace , 0 , pCtx, ( IWbemServices ** ) a_Service , &t_ErrorObject ) ; if ( t_Result == WBEM_NO_ERROR ) { /* * Connected to OLE MS Server */ ((CImpTraceRouteProv *)*a_Service)->SetLocaleId ( a_lLocaleId ) ; } else { /* * Failed to connect to OLE MS Server. */ } if ( t_ErrorObject ) t_ErrorObject->Release () ; t_Locator->Release () ; } return t_Result ; }