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.
 
 
 
 
 
 

575 lines
14 KiB

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 1999-2001 Microsoft Corporation
//
// Module Name:
// SANetEvent.cpp
//
// Description:
// implement the class CSANetEvent
//
// History:
// 1. lustar.li (Guogang Li), creation date in 7-DEC-2000
//
// Notes:
//
//
//////////////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <stdio.h>
#include <debug.h>
#include <wbemidl.h>
#include <tchar.h>
#include "oahelp.inl"
#include "SAEventComm.h"
#include "SANetEvent.h"
//
// Define the registry information
//
#define SA_NETWOARKMONITOR_REGKEY \
_T("SOFTWARE\\Microsoft\\ServerAppliance\\DeviceMonitor")
#define SA_NETWORKMONITOR_QUEARY_INTERVAL _T("NetworkQueryInterval")
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSANetEvent::CSANetEventt
//
// Description:
// Constructor
//
// Arguments:
// NONE
//
// Returns:
// NONE
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
CSANetEvent::CSANetEvent()
{
m_cRef = 0;
m_pNs = 0;
m_pSink = 0;
m_pEventClassDef = 0;
m_eStatus = Pending;
m_hThread = 0;
m_pQueryNetInfo=NULL;
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSANetEvent::~CSANetEventt
//
// Description:
// Destructor
//
// Arguments:
// NONE
//
// Returns:
// NONE
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
CSANetEvent::~CSANetEvent()
{
if(m_pQueryNetInfo)
delete m_pQueryNetInfo;
if (m_hThread)
CloseHandle(m_hThread);
if (m_pNs)
m_pNs->Release();
if (m_pSink)
m_pSink->Release();
if (m_pEventClassDef)
m_pEventClassDef->Release();
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSANetEvent::QueryInterface
//
// Description:
// access to interfaces on the object
//
// Arguments:
// [in] REFIID - Identifier of the requested interface
// [out] LPVOID - Address of output variable that receives the
// interface pointer requested in iid
// Returns:
// STDMETHODIMP - fail/success
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
STDMETHODIMP
CSANetEvent::QueryInterface(
/*[in]*/ REFIID riid,
/*[out]*/ LPVOID * ppv
)
{
*ppv = 0;
if (IID_IUnknown==riid || IID_IWbemEventProvider==riid)
{
*ppv = (IWbemEventProvider *) this;
AddRef();
return NOERROR;
}
if (IID_IWbemProviderInit==riid)
{
*ppv = (IWbemProviderInit *) this;
AddRef();
return NOERROR;
}
TRACE(" SANetworkMonitor: CSANetEvent::QueryInterface failed \
<no interface>");
return E_NOINTERFACE;
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSANetEvent::AddRef
//
// Description:
// inc referrence to the object
//
// Arguments:
// NONE
//
// Returns:
// ULONG - current refferrence number
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
ULONG
CSANetEvent::AddRef()
{
return ++m_cRef;
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSANetEvent::Release
//
// Description:
// Dereferrence to the object
//
// Arguments:
// NONE
//
// Returns:
// ULONG - current refferrence number
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
ULONG
CSANetEvent::Release()
{
if (0 != --m_cRef)
return m_cRef;
//
// event provider is shutting down.
//
m_eStatus = PendingStop;
return 0;
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSANetEvent::ProvideEvents
//
// Description:
// signal an event provider to begin delivery of its events
//
// Arguments:
// [in] IWbemObjectSink * - pointer to event sink
// [in] long - Reserved, It must be zero
//
// Returns:
// HRESULT
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CSANetEvent::ProvideEvents(
/*[in]*/ IWbemObjectSink *pSink,
/*[in]*/ long lFlags
)
{
//
// Copy the sink.
//
m_pSink = pSink;
m_pSink->AddRef();
//
// Create the event generation thread.
//
DWORD dwTID;
m_hThread = CreateThread(
0,
0,
CSANetEvent::EventThread,
this,
0,
&dwTID
);
if(!m_hThread)
{
TRACE(" SANetworkMonitor: CSANetEvent::ProvideEvents failed \
<CreateThread>");
return WBEM_E_FAILED;
}
//
// Wait for provider to be 'ready'.
//
while (m_eStatus != Running)
Sleep(100);
return WBEM_NO_ERROR;
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSANetEvent::EventThread
//
// Description:
// the thread of generating and delivering event
//
// Arguments:
// [in] LPVOID - the argument input to the thread
//
// Returns:
// DWORD - end status of status
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
DWORD WINAPI
CSANetEvent::EventThread(
/*[in]*/ LPVOID pArg
)
{
//
// Make transition to the per-instance method.
//
((CSANetEvent *)pArg)->InstanceThread();
return 0;
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSANetEvent::InstanceThread
//
// Description:
// the main proccesor of thread
//
// Arguments:
// NONE
//
// Returns:
// NONE
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
void
CSANetEvent::InstanceThread()
{
m_eStatus = Running;
CBSTR bstrUniqueName = CBSTR(SA_RESOURCEEVENT_UNIQUENAME);
CBSTR bstrDisplayInfo = CBSTR(SA_RESOURCEEVENT_DISPLAYINFORMATION);
CBSTR bstrCurrentState = CBSTR(SA_RESOURCEEVENT_CURRENTSTATE);
if ( ((BSTR)bstrUniqueName == NULL) ||
((BSTR)bstrDisplayInfo == NULL) ||
((BSTR)bstrCurrentState == NULL) )
{
TRACE(" SANetworkMonitor:CSANetEvent::InstanceThread failed on memory allocation ");
return;
}
while (m_eStatus == Running)
{
//
// Spawn a new event object.
//
IWbemClassObject *pEvt = 0;
HRESULT hRes = m_pEventClassDef->SpawnInstance(0, &pEvt);
if (hRes != 0)
continue;
//
// Generate the network event.
//
CVARIANT vUniqueName(SA_NET_EVENT);
pEvt->Put(
bstrUniqueName,
0,
vUniqueName,
0
);
CVARIANT vDisplayInformationID(
(LONG)(m_pQueryNetInfo->GetDisplayInformation()));
pEvt->Put(
bstrDisplayInfo,
0,
vDisplayInformationID,
0
);
CVARIANT vCurrentState((LONG)SA_RESOURCEEVENT_DEFAULT_CURRENTSTATE);
pEvt->Put(
bstrCurrentState,
0,
vCurrentState,
0
);
//
// Deliver the event to CIMOM.
//
hRes = m_pSink->Indicate(1, &pEvt);
if (FAILED (hRes))
{
//
// If failed, ...
//
TRACE(" SANetworkMonitor: CSANetEvent::InstanceThread failed \
<m_pSink->Indicate>");
}
pEvt->Release();
}
//
// When we get to here, we are no longer interested in the
// provider and Release() has long since returned.
//
m_eStatus = Stopped;
delete this;
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSANetEvent::Initialize
//
// Description:
// initialize the event provider
//
// Arguments:
// [in] LPWSTR - Pointer to the user name
// [in] LONG - Reserved. It must be zero
// [in] LPWSTR - Namespace name for which the provider is being
// initialized
// [in] LPWSTR - Locale name for which the provider is being initialized
// [in] IWbemServices * - An IWbemServices pointer back into
// Windows Management
// [in] IWbemContext * - An IWbemContext pointer associated
// with initialization
// [in] IWbemProviderInitSink * - report initialization status
//
// Returns:
// HRESULT
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
HRESULT
CSANetEvent::Initialize(
/* [in] */ LPWSTR pszUser,
/* [in] */ LONG lFlags,
/* [in] */ LPWSTR pszNamespace,
/* [in] */ LPWSTR pszLocale,
/* [in] */ IWbemServices *pNamespace,
/* [in] */ IWbemContext *pCtx,
/* [in] */ IWbemProviderInitSink *pInitSink
)
{
HKEY hKey;
UINT uiQueryInterval;
DWORD dwRegType = REG_DWORD;
DWORD dwRegSize = sizeof(DWORD);
//
// We don't care about most of the incoming parameters in this
// simple sample. However, we will save the namespace pointer
// and get our event class definition.
//
m_pNs = pNamespace;
m_pNs->AddRef();
//
// Grab the class definition for the event.
//
IWbemClassObject *pObj = 0;
CBSTR bstrClassName = CBSTR(SA_RESOURCEEVENT_CLASSNAME);
if ( (BSTR)bstrClassName == NULL)
{
TRACE(" SANetworkMonitor:CSANetEvent::Initialize failed on memory allocation ");
return E_OUTOFMEMORY;
}
HRESULT hRes = m_pNs->GetObject(
bstrClassName,
0,
pCtx,
&pObj,
0
);
if (hRes != 0)
{
return WBEM_E_FAILED;
}
m_pEventClassDef = pObj;
//
// From registry get the interval of query network
//
LONG lRes = RegOpenKey(
HKEY_LOCAL_MACHINE,
SA_NETWOARKMONITOR_REGKEY,
&hKey);
if (lRes)
{
TRACE(" SANetworkMonitor: CSANetEvent::Initialize failed \
<RegOpenKey>");
//
// Create the Key
//
lRes = RegCreateKey(
HKEY_LOCAL_MACHINE,
SA_NETWOARKMONITOR_REGKEY,
&hKey);
if(lRes)
{
TRACE(" SANetworkMonitor: CSANetEvent::Initialize failed \
<RegCreateKey>");
return WBEM_E_FAILED;
}
}
lRes = RegQueryValueEx(
hKey,
SA_NETWORKMONITOR_QUEARY_INTERVAL,
NULL,
&dwRegType,
(LPBYTE)&uiQueryInterval,
&dwRegSize);
if(lRes)
{
TRACE(" SANetworkMonitor: CSANetEvent::Initialize failed \
<RegQueryValueEx>");
uiQueryInterval = 1000;
lRes = RegSetValueEx(
hKey,
SA_NETWORKMONITOR_QUEARY_INTERVAL,
NULL,
REG_DWORD,
(LPBYTE)&uiQueryInterval,
sizeof(DWORD));
if(lRes)
{
TRACE(" SANetworkMonitor: CSANetEvent::Initialize failed \
<RegSetValueEx>");
RegCloseKey(hKey);
return WBEM_E_FAILED;
}
}
RegCloseKey(hKey);
//
// Initial m_pQueryNetInfo
//
m_pQueryNetInfo = NULL;
m_pQueryNetInfo = new CSAQueryNetInfo(m_pNs, uiQueryInterval);
if( (m_pQueryNetInfo == NULL) || (!m_pQueryNetInfo->Initialize()) )
{
if (m_pQueryNetInfo)
{
delete m_pQueryNetInfo;
}
pObj->Release();
TRACE(" SANetworkMonitor: CSANetEvent::Initialize failed \
<Init CSAQueryNetInfo>");
return WBEM_E_FAILED;
}
//
// Tell CIMOM that we're up and running.
//
pInitSink->SetStatus(WBEM_S_INITIALIZED,0);
return WBEM_NO_ERROR;
}