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.
 
 
 
 
 
 

428 lines
11 KiB

//////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 1999-2001 Microsoft Corporation
//
// Module Name:
// SAQueryNetInfo.cpp
//
// Description:
// implement the class CSAQueryNetInfo
//
// 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 <SAEventcomm.h>
#include <oahelp.inl>
#include "SAQueryNetInfo.h"
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSAQueryNetInfo::CSAQueryNetInfo
//
// Description:
// Constructor
//
// Arguments:
// [in] IWbemServices * - pointer to IWbemServices
// [in] UINT - the interval of generate event
//
// Returns:
// NONE
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
CSAQueryNetInfo::CSAQueryNetInfo(
/*[in]*/ IWbemServices * pNS,
/*[in]*/ UINT uiInterval
)
{
m_uiQueryInterval = uiInterval;
m_bLinkCable = TRUE;
m_bFirstQuery = TRUE;
m_nPacketsSent = 0;
m_nPacketsCurrentSent = 0;
m_nPacketsReceived = 0;
m_nPacketsCurrentReceived = 0;
m_pNs = pNS;
m_pWmiNs = NULL;
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSAQueryNetInfo::~CSAQueryNetInfo
//
// Description:
// Destructor
//
// Arguments:
// NONE
//
// Returns:
// NONE
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
CSAQueryNetInfo::~CSAQueryNetInfo()
{
if(m_pWmiNs)
m_pWmiNs->Release();
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSAQueryNetInfo::GetDisplayInformation
//
// Description:
// return the display information ID
//
// Arguments:
// NONE
//
// Returns:
// UINT
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
UINT
CSAQueryNetInfo::GetDisplayInformation()
{
//
// Generate an event one second
//
Sleep(m_uiQueryInterval);
//
// Get network information
//
if(!GetNetConnection()||!GetNetInfo())
return SA_NET_DISPLAY_IDLE;
//
// first query
//
if(m_bFirstQuery)
{
m_bFirstQuery=!m_bFirstQuery;
return SA_NET_DISPLAY_IDLE;
}
if(!m_bLinkCable)
{
return SA_NET_DISPLAY_NO_CABLE;
}
else if(m_nPacketsCurrentReceived||m_nPacketsCurrentSent)
{
return SA_NET_DISPLAY_TRANSMITING;
}
else
return SA_NET_DISPLAY_IDLE;
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSAQueryNetInfo::GetNetInfo
//
// Description:
// get net info from wmi
//
// Arguments:
// NONE
//
// Returns:
// BOOL
//
// History: lustar.li Created 12/7/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
BOOL
CSAQueryNetInfo::GetNetInfo()
{
HRESULT hr;
VARIANT vVal;
ULONG uReturned;
UINT uiPacketsSent = 0;
UINT uiPacketsReceived = 0;
IEnumWbemClassObject *pEnum = NULL;
IWbemClassObject *pPerfInst = NULL;
CBSTR bstrClassName = CBSTR(SANETCLASSNAME);
CBSTR bstrPropName1 = CBSTR(SANETRECEIVEPACKET);
CBSTR bstrPropName2 = CBSTR(SANETSENDPACKET);
if ( ((BSTR)bstrClassName == NULL) ||
((BSTR)bstrPropName1 == NULL) ||
((BSTR)bstrPropName2 == NULL) )
{
TRACE(" SANetworkMonitor: CSAQueryNetInfo::GetNetInfo failed on memory allocation ");
return FALSE;
}
//
// Create the object enumerator to net transfer
//
hr = m_pNs->CreateInstanceEnum( bstrClassName,
WBEM_FLAG_SHALLOW,
NULL,
&pEnum );
if(hr == WBEM_NO_ERROR)
{
while ( pEnum->Next( INFINITE,
1,
&pPerfInst,
&uReturned ) == WBEM_NO_ERROR )
{
//
// Get the property of "PacketsReceivedUnicastPersec"
//
if ( ( pPerfInst->Get( bstrPropName1,
0L,
&vVal,
NULL, NULL ) ) != WBEM_NO_ERROR )
{
pPerfInst->Release( );
pEnum->Release();
TRACE(" SANetworkMonitor: CSAQueryNetInfo::GetNetInfo failed \
<Get PacketsReceivedUnicastPersec>");
return FALSE;
}
uiPacketsReceived+=vVal.uintVal;
//
// Get the property of "PacketsSentUnicastPersec"
//
VariantInit(&vVal);
if ( ( pPerfInst->Get( bstrPropName2,
0L,
&vVal,
NULL, NULL ) ) != WBEM_NO_ERROR )
{
pPerfInst->Release( );
pEnum->Release();
TRACE(" SANetworkMonitor: CSAQueryNetInfo::GetNetInfo failed \
<Get PacketsSentUnicastPersec>");
return FALSE;
}
uiPacketsSent+=vVal.uintVal;
pPerfInst->Release( );
}
}
else
{
TRACE(" SANetworkMonitor: CSAQueryNetInfo::GetNetInfo failed \
<Create the object enumerator>");
return FALSE;
}
pEnum->Release();
//
// update the data in this class
//
m_nPacketsCurrentReceived = uiPacketsReceived-m_nPacketsReceived;
m_nPacketsReceived = uiPacketsReceived;
m_nPacketsCurrentSent = uiPacketsSent-m_nPacketsSent;
m_nPacketsSent = uiPacketsSent;
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSAQueryNetInfo::Initialize()
//
// Description:
// complete the initialize of the class
//
// Arguments:
// NONE
//
// Returns:
// BOOL
//
// History: lustar.li Created 12/8/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
BOOL
CSAQueryNetInfo::Initialize()
{
HRESULT hr;
IWbemLocator *pIWbemLocator = NULL;
IWbemServices *pIWbemServices = NULL;
if(!m_pNs)
{
TRACE(" SANetworkMonitor: CSAQueryNetInfo::Initialize failed \
<Namespace is NULL>");
return FALSE;
}
CBSTR bstrNameSpace = CBSTR(SAWMINAMESPACE);
if ((BSTR)bstrNameSpace == NULL)
{
TRACE(" SANetworkMonitor: CSAQueryNetInfo::Initialize failed on memory allocation ");
return FALSE;
}
if ( CoCreateInstance( CLSID_WbemAdministrativeLocator,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWbemLocator,
(LPVOID *) &pIWbemLocator ) == S_OK )
{
hr = pIWbemLocator->ConnectServer( bstrNameSpace,
NULL,
NULL,
0L,
0L,
NULL,
NULL,
&m_pWmiNs );
if(hr!=WBEM_S_NO_ERROR)
{
pIWbemLocator->Release();
TRACE(" SANetworkMonitor: CSAQueryNetInfo::Initialize failed \
<cannot connect server>");
return FALSE;
}
}
else
{
TRACE(" SANetworkMonitor: CSAQueryNetInfo::Initialize failed \
<CoCreateInstance fail>");
return FALSE;
}
pIWbemLocator->Release();
return TRUE;
}
//////////////////////////////////////////////////////////////////////////////
//++
//
// method:
// CSAQueryNetInfo::GetNetConnection()
//
// Description:
// get the net connection status
//
// Arguments:
// NONE
//
// Returns:
// BOOL
//
// History: lustar.li Created 12/8/2000
//
//--
//////////////////////////////////////////////////////////////////////////////
BOOL
CSAQueryNetInfo::GetNetConnection()
{
HRESULT hr;
VARIANT vVal;
ULONG uReturned;
IEnumWbemClassObject *pEnum = NULL;
IWbemClassObject *pPerfInst = NULL;
m_bLinkCable=TRUE;
CBSTR bstrClassName = CBSTR(SAMEDIACLASSNAME);
CBSTR bstrPropName = CBSTR(SAMEDIACONNECTSTATUS);
if ( ((BSTR)bstrClassName == NULL) || ((BSTR)bstrPropName == NULL) )
{
TRACE(" SANetworkMonitor: CSAQueryNetInfo::GetNetConnection failed on memory allocation ");
return FALSE;
}
//
// Query the status of network connection
//
hr = m_pWmiNs->CreateInstanceEnum( bstrClassName,
WBEM_FLAG_SHALLOW,
NULL,
&pEnum );
if(hr == WBEM_NO_ERROR)
{
while ( pEnum->Next( INFINITE,
1,
&pPerfInst,
&uReturned ) == WBEM_NO_ERROR )
{
//
// Get the property of "NdisMediaConnectStatus"
//
if ( ( pPerfInst->Get( bstrPropName,
0L,
&vVal,
NULL, NULL ) ) != WBEM_NO_ERROR )
{
pPerfInst->Release( );
pEnum->Release();
TRACE(" SANetworkMonitor: CSAQueryNetInfo::GetNetConnection \
failed <Get NdisMediaConnectStatus>");
return FALSE;
}
pPerfInst->Release( );
if(vVal.uintVal)
{
m_bLinkCable = FALSE;
break;
}
else
{
continue;
}
}
}
else
{
TRACE(" SANetworkMonitor: CSAQueryNetInfo::GetNetConnection failed \
<CreateInstanceEnum>");
return FALSE;
}
pEnum->Release();
return TRUE;
}