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.
473 lines
8.8 KiB
473 lines
8.8 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 <classfac.h>
|
|
|
|
#include <smir.h>
|
|
#include <notify.h>
|
|
|
|
#include <evtdefs.h>
|
|
#include <evtthrd.h>
|
|
#include <evtmap.h>
|
|
#include <evtprov.h>
|
|
|
|
extern CRITICAL_SECTION g_CacheCriticalSection;
|
|
extern CEventProviderWorkerThread* g_pWorkerThread;
|
|
|
|
CWbemServerWrap::CWbemServerWrap(IWbemServices *pServ) : m_ref ( 0 ), m_Serv(NULL)
|
|
{
|
|
m_Serv = pServ;
|
|
|
|
if (m_Serv)
|
|
{
|
|
m_Serv->AddRef();
|
|
}
|
|
|
|
g_pWorkerThread->AddClassesToCache((DWORD_PTR)(&m_ClassMap), &m_ClassMap);
|
|
}
|
|
|
|
CWbemServerWrap::~CWbemServerWrap()
|
|
{
|
|
if (m_Serv)
|
|
{
|
|
m_Serv->Release();
|
|
}
|
|
|
|
g_pWorkerThread->RemoveClassesFromCache((DWORD_PTR)(&m_ClassMap));
|
|
m_ClassMap.RemoveAll();
|
|
}
|
|
|
|
ULONG CWbemServerWrap::AddRef()
|
|
{
|
|
return (ULONG)(InterlockedIncrement(&m_ref));
|
|
}
|
|
|
|
ULONG CWbemServerWrap::Release()
|
|
{
|
|
ULONG i = (ULONG)(InterlockedDecrement(&m_ref));
|
|
|
|
if (i == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
HRESULT CWbemServerWrap::GetMapperObject(BSTR a_path, IWbemContext *a_pCtx, IWbemClassObject **a_ppObj)
|
|
{
|
|
if (a_ppObj == NULL)
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
*a_ppObj = NULL;
|
|
HRESULT result = WBEM_NO_ERROR;
|
|
SCacheEntry *t_CacheEntry = NULL;
|
|
EnterCriticalSection ( & g_CacheCriticalSection ) ;
|
|
|
|
if (!m_ClassMap.Lookup(a_path, t_CacheEntry))
|
|
{
|
|
DebugMacro14(
|
|
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
|
|
__FILE__,__LINE__,
|
|
L"Cache Miss [%s]\r\n" , a_path
|
|
);
|
|
)
|
|
|
|
LPUNKNOWN pInterrogativeInt = NULL;
|
|
|
|
result = CoCreateInstance (
|
|
|
|
CLSID_SMIR_Database,
|
|
NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER,
|
|
IID_ISMIR_Interrogative,
|
|
(void**)&pInterrogativeInt
|
|
);
|
|
|
|
if ((result != S_OK) || (NULL == pInterrogativeInt))
|
|
{
|
|
DebugMacro9(
|
|
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
|
|
__FILE__,__LINE__,
|
|
L"CEncapMapper::GetSpecificClass failed to connect to SMIR\r\n");
|
|
)
|
|
return result ;
|
|
}
|
|
|
|
result = ((ISmirInterrogator*)pInterrogativeInt)->GetWBEMClass(a_ppObj, a_path);
|
|
pInterrogativeInt->Release();
|
|
|
|
if ( SUCCEEDED ( result ) )
|
|
{
|
|
t_CacheEntry = new SCacheEntry(*a_ppObj);
|
|
m_ClassMap[a_path] = t_CacheEntry;
|
|
(*a_ppObj)->AddRef();
|
|
}
|
|
else
|
|
{
|
|
t_CacheEntry = new SCacheEntry(NULL);
|
|
m_ClassMap[a_path] = t_CacheEntry;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ( t_CacheEntry->m_Class )
|
|
{
|
|
*a_ppObj = t_CacheEntry->m_Class;
|
|
(*a_ppObj)->AddRef();
|
|
}
|
|
else
|
|
{
|
|
result = WBEM_E_NOT_FOUND ;
|
|
}
|
|
}
|
|
|
|
LeaveCriticalSection ( & g_CacheCriticalSection ) ;
|
|
|
|
return result ;
|
|
}
|
|
|
|
HRESULT CWbemServerWrap::GetObject(BSTR a_path, IWbemContext *a_pCtx, IWbemClassObject **a_ppObj)
|
|
{
|
|
if ((a_ppObj == NULL) || (m_Serv == NULL))
|
|
{
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
*a_ppObj = NULL;
|
|
HRESULT result = WBEM_NO_ERROR;
|
|
SCacheEntry *t_CacheEntry = NULL;
|
|
EnterCriticalSection ( & g_CacheCriticalSection ) ;
|
|
|
|
if (!m_ClassMap.Lookup(a_path, t_CacheEntry))
|
|
{
|
|
DebugMacro14(
|
|
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
|
|
__FILE__,__LINE__,
|
|
L"Cache Miss [%s]\r\n" , a_path
|
|
);
|
|
)
|
|
|
|
result = m_Serv->GetObject(a_path, 0, a_pCtx, a_ppObj, NULL);
|
|
|
|
if ( SUCCEEDED(result) )
|
|
{
|
|
t_CacheEntry = new SCacheEntry(*a_ppObj);
|
|
m_ClassMap[a_path] = t_CacheEntry;
|
|
(*a_ppObj)->AddRef();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
*a_ppObj = t_CacheEntry->m_Class;
|
|
(*a_ppObj)->AddRef();
|
|
}
|
|
|
|
LeaveCriticalSection ( & g_CacheCriticalSection ) ;
|
|
return result;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CTrapEventProvider::Initialize (
|
|
LPWSTR pszUser,
|
|
LONG lFlags,
|
|
LPWSTR pszNamespace,
|
|
LPWSTR pszLocale,
|
|
IWbemServices *pCIMOM, // For anybody
|
|
IWbemContext *pCtx,
|
|
IWbemProviderInitSink *pInitSink // For init signals
|
|
)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
DebugMacro9(
|
|
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
|
|
__FILE__,__LINE__,
|
|
L"Entering CTrapEventProvider::Initialize\n");
|
|
)
|
|
|
|
m_pNamespace = new CWbemServerWrap(pCIMOM);
|
|
m_pNamespace->AddRef();
|
|
pInitSink->SetStatus ( WBEM_S_INITIALIZED , 0 );
|
|
|
|
|
|
DebugMacro9(
|
|
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
|
|
__FILE__,__LINE__,
|
|
L"Leaving CTrapEventProvider::Initialize with SUCCEEDED\n");
|
|
)
|
|
|
|
return WBEM_NO_ERROR;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return WBEM_E_OUT_OF_MEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
|
|
STDMETHODIMP CTrapEventProvider::ProvideEvents(IWbemObjectSink* pSink, LONG lFlags)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
DebugMacro9(
|
|
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
|
|
__FILE__,__LINE__,
|
|
L"Entering CTrapEventProvider::ProvideEvents\n");
|
|
)
|
|
|
|
m_pEventSink = pSink;
|
|
m_pEventSink->AddRef();
|
|
|
|
if (!m_thrd->Register(this))
|
|
{
|
|
|
|
DebugMacro9(
|
|
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
|
|
__FILE__,__LINE__,
|
|
L"Leaving CTrapEventProvider::ProvideEvents with FAILED\n");
|
|
)
|
|
|
|
return WBEM_E_FAILED;
|
|
}
|
|
|
|
DebugMacro9(
|
|
SnmpDebugLog :: s_SnmpDebugLog->WriteFileAndLine (
|
|
__FILE__,__LINE__,
|
|
L"Leaving CNTEventProvider::ProvideEvents with SUCCEEDED\n");
|
|
)
|
|
|
|
return WBEM_NO_ERROR;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return WBEM_E_OUT_OF_MEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return WBEM_E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
|
|
CTrapEventProvider::~CTrapEventProvider()
|
|
{
|
|
if (m_thrd)
|
|
{
|
|
m_thrd->UnRegister(this);
|
|
}
|
|
|
|
if ( m_pEventSink )
|
|
{
|
|
m_pEventSink->Release () ;
|
|
}
|
|
|
|
if ( m_pNamespace )
|
|
{
|
|
m_pNamespace->Release () ;
|
|
}
|
|
}
|
|
|
|
|
|
CTrapEventProvider::CTrapEventProvider(DWORD mapperType, CEventProviderThread* thrd)
|
|
: m_thrd (NULL),
|
|
m_pNamespace (NULL),
|
|
m_pEventSink (NULL)
|
|
{
|
|
m_thrd = thrd;
|
|
m_MapType = mapperType;
|
|
m_ref = 0;
|
|
}
|
|
|
|
|
|
CWbemServerWrap* CTrapEventProvider::GetNamespace()
|
|
{
|
|
m_pNamespace->AddRef();
|
|
return m_pNamespace;
|
|
}
|
|
|
|
IWbemObjectSink* CTrapEventProvider::GetEventSink()
|
|
{
|
|
m_pEventSink->AddRef();
|
|
return m_pEventSink;
|
|
}
|
|
void CTrapEventProvider::ReleaseAll()
|
|
{
|
|
//release dependencies
|
|
m_pNamespace->Release();
|
|
m_pEventSink->Release();
|
|
|
|
if ( 0 != InterlockedDecrement(&m_ref) )
|
|
{
|
|
InterlockedDecrement(&(CSNMPEventProviderClassFactory::objectsInProgress));
|
|
return;
|
|
}
|
|
|
|
delete this;
|
|
InterlockedDecrement(&(CSNMPEventProviderClassFactory::objectsInProgress));
|
|
return;
|
|
}
|
|
|
|
void CTrapEventProvider::AddRefAll()
|
|
{
|
|
//addref dependencies
|
|
m_pNamespace->AddRef();
|
|
m_pEventSink->AddRef();
|
|
|
|
InterlockedIncrement(&(CSNMPEventProviderClassFactory::objectsInProgress));
|
|
InterlockedIncrement ( &m_ref ) ;
|
|
}
|
|
|
|
STDMETHODIMP_( ULONG ) CTrapEventProvider::AddRef()
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
InterlockedIncrement(&(CSNMPEventProviderClassFactory::objectsInProgress));
|
|
return InterlockedIncrement ( &m_ref ) ;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CTrapEventProvider::Release()
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
long ret;
|
|
|
|
if ( 0 != (ret = InterlockedDecrement(&m_ref)) )
|
|
{
|
|
InterlockedDecrement(&(CSNMPEventProviderClassFactory::objectsInProgress));
|
|
return ret;
|
|
}
|
|
|
|
delete this;
|
|
InterlockedDecrement(&(CSNMPEventProviderClassFactory::objectsInProgress));
|
|
return 0;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return 0;
|
|
}
|
|
catch(...)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
STDMETHODIMP CTrapEventProvider::QueryInterface(REFIID riid, PVOID* ppv)
|
|
{
|
|
SetStructuredExceptionHandler seh;
|
|
|
|
try
|
|
{
|
|
*ppv = NULL;
|
|
|
|
if (IID_IUnknown == riid)
|
|
{
|
|
*ppv= (IWbemEventProvider*)this;
|
|
}
|
|
else if (IID_IWbemEventProvider == riid)
|
|
{
|
|
*ppv=(IWbemEventProvider*)this;
|
|
}
|
|
else if (IID_IWbemProviderInit == riid)
|
|
{
|
|
*ppv=(IWbemProviderInit*)this;
|
|
}
|
|
|
|
if (NULL==*ppv)
|
|
{
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
//AddRef any interface we'll return.
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
catch(Structured_Exception e_SE)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
catch(Heap_Exception e_HE)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|