windows-nt/Source/XPSP1/NT/net/homenet/beacon/server/statisticsproviders.cpp
2020-09-26 16:20:57 +08:00

149 lines
3.7 KiB
C++

#include "pch.h"
#pragma hdrstop
#include "StatisticsProviders.h"
#include "ras.h"
#include "rasuip.h"
#include "ndispnp.h"
CLANStatisticsProvider::CLANStatisticsProvider()
{
}
HRESULT CLANStatisticsProvider::Initialize(GUID* pGuid)
{
HRESULT hr = S_OK;
lstrcpy(m_pszDeviceString, L"\\Device\\");
StringFromGUID2(*pGuid, m_pszDeviceString + (sizeof(L"\\Device\\") / sizeof(WCHAR) - 1), 54);
RtlInitUnicodeString(&m_Device, m_pszDeviceString);
return hr;
}
HRESULT CLANStatisticsProvider::FinalRelease()
{
HRESULT hr = S_OK;
return hr;
}
HRESULT CLANStatisticsProvider::GetStatistics(ULONG* pulBytesSent, ULONG* pulBytesReceived, ULONG* pulPacketsSent, ULONG* pulPacketsReceived, ULONG* pulSpeedbps, ULONG* pulUptime)
{
HRESULT hr = S_OK;
NIC_STATISTICS nsNewLanStats;
ZeroMemory(&nsNewLanStats, sizeof(nsNewLanStats));
nsNewLanStats.Size = sizeof(NIC_STATISTICS);
if (NdisQueryStatistics(&m_Device, &nsNewLanStats))
{
if(NULL != pulBytesSent)
{
*pulBytesSent = static_cast<ULONG>(nsNewLanStats.BytesSent);
}
if(NULL != pulBytesReceived)
{
*pulBytesReceived = static_cast<ULONG>(nsNewLanStats.DirectedBytesReceived);
}
if(NULL != pulPacketsSent)
{
*pulPacketsSent = static_cast<ULONG>(nsNewLanStats.PacketsSent);
}
if(NULL != pulPacketsReceived)
{
*pulPacketsReceived = static_cast<ULONG>(nsNewLanStats.DirectedPacketsReceived);
}
if(NULL != pulUptime)
{
*pulUptime = nsNewLanStats.ConnectTime;
}
if(NULL != pulSpeedbps)
{
*pulSpeedbps = nsNewLanStats.LinkSpeed * 100;
}
}
else
{
hr = E_FAIL;
}
return hr;
}
CRASStatisticsProvider::CRASStatisticsProvider()
{
m_pNetRasConnection = NULL;
}
HRESULT CRASStatisticsProvider::Initialize(INetConnection* pNetConnection)
{
HRESULT hr = S_OK;
hr = pNetConnection->QueryInterface(IID_INetRasConnection, reinterpret_cast<void**>(&m_pNetRasConnection));
return hr;
}
HRESULT CRASStatisticsProvider::FinalRelease()
{
HRESULT hr = S_OK;
if(NULL != m_pNetRasConnection)
{
m_pNetRasConnection->Release();
}
return hr;
}
HRESULT CRASStatisticsProvider::GetStatistics(ULONG* pulBytesSent, ULONG* pulBytesReceived, ULONG* pulPacketsSent, ULONG* pulPacketsReceived, ULONG* pulSpeedbps, ULONG* pulUptime)
{
HRESULT hr = S_OK;
HRASCONN hRasConnection;
hr = m_pNetRasConnection->GetRasConnectionHandle(reinterpret_cast<ULONG_PTR*>(&hRasConnection));
if(SUCCEEDED(hr))
{
RAS_STATS Statistics;
Statistics.dwSize = sizeof(RAS_STATS);
if(0 == RasGetConnectionStatistics(hRasConnection, &Statistics))
{
if(NULL != pulBytesSent)
{
*pulBytesSent = Statistics.dwBytesXmited;
}
if(NULL != pulBytesReceived)
{
*pulBytesReceived = Statistics.dwBytesRcved;
}
if(NULL != pulPacketsSent)
{
*pulPacketsSent = Statistics.dwFramesXmited;
}
if(NULL != pulPacketsReceived)
{
*pulPacketsReceived = Statistics.dwFramesRcved;
}
if(NULL != pulUptime)
{
*pulUptime = Statistics.dwConnectDuration / 1000;
}
if(NULL != pulSpeedbps)
{
*pulSpeedbps = Statistics.dwBps;
}
}
else
{
hr = E_FAIL;
}
// any cleanup here?
}
return hr;
}