windows-nt/Source/XPSP1/NT/net/rras/cm/cmdial/connstat.cpp
2020-09-26 16:20:57 +08:00

342 lines
8.4 KiB
C++

//+----------------------------------------------------------------------------
//
// File: ConnStat.cpp
//
// Module: CMDIAL32.DLL
//
// Synopsis: Implementation of class CConnStatistics
//
// Copyright (c) 1998-1999 Microsoft Corporation
//
// Author: Fengsun Created 10/15/97
//
//+----------------------------------------------------------------------------
#include "cmmaster.h"
#include "ConnStat.h"
//
// Include the constants describing the reg keys used for perf stats
//
#include "perf_str.h"
//
// Constructor and destructor
//
CConnStatistics::CConnStatistics()
{
MYDBGASSERT(!OS_NT4); // class is never used on NT4
m_hKey = NULL;
m_dwInitBytesRead = -1;
m_dwInitBytesWrite = -1;
m_dwBaudRate = 0;
m_pszTotalBytesRecvd = NULL;
m_pszTotalBytesXmit = NULL;
m_pszConnectSpeed = NULL;
}
CConnStatistics::~CConnStatistics()
{
CmFree( m_pszTotalBytesRecvd );
CmFree( m_pszTotalBytesXmit );
CmFree( m_pszConnectSpeed );
}
//+----------------------------------------------------------------------------
//
// Function: CConnStatistics::GetStatRegValues
//
// Synopsis: Helper method, builds the reg value names using the localized
// form of the word "Dial-up Adapter".
//
// Arguments: HINSTANCE hInst
//
// Returns: Nothing
//
// History: nickball Created 11/14/98
//
//+----------------------------------------------------------------------------
void CConnStatistics::GetStatRegValues(HINSTANCE hInst)
{
//
// bug 149367 The word "Dial-up Adapter" need to be localized.
// Load it from resource if no loaded yet
//
if (m_pszTotalBytesRecvd == NULL)
{
m_pszTotalBytesRecvd = CmLoadString(hInst, IDS_REG_DIALUP_ADAPTER);
CmStrCatAlloc(&m_pszTotalBytesRecvd, m_fAdapter2 ? c_pszDialup_2_TotalBytesRcvd : c_pszDialupTotalBytesRcvd);
m_pszTotalBytesXmit = CmLoadString(hInst, IDS_REG_DIALUP_ADAPTER);
CmStrCatAlloc(&m_pszTotalBytesXmit, m_fAdapter2 ? c_pszDialup_2_TotalBytesXmit : c_pszDialupTotalBytesXmit);
m_pszConnectSpeed = CmLoadString(hInst, IDS_REG_DIALUP_ADAPTER);
CmStrCatAlloc(&m_pszConnectSpeed, m_fAdapter2 ? c_pszDialup_2_ConnectSpeed : c_pszDialupConnectSpeed);
}
}
//+---------------------------------------------------------------------------
//
// Function: InitStatistics()
//
// Synopsis: Retrieves Performance Data. On 9x this data is pulled from
// the registry. Defaults are used NT5. Not used on NT4.
//
// Arguments: None
//
// Returns: TRUE if succeed
// FALSE otherwise
//
// History: byao 07/16/97 created
// fengsun 10/97 make it a member fuction
// nickball 03/04/98 always close key
// nickball 03/04/00 added NT5 support
//
//----------------------------------------------------------------------------
BOOL CConnStatistics::InitStatistics()
{
if (OS_W9X)
{
MYDBGASSERT(NULL == m_hKey); // Not already opened
if (m_hKey)
{
RegCloseKey(m_hKey);
m_hKey = NULL;
}
DWORD dwErrCode;
BOOL bRet = FALSE;
//
// If there is already a connected dial up connection
// use the adapter#2 registry key
//
m_fAdapter2 = RasConnectionExists();
dwErrCode = RegOpenKeyExU(HKEY_DYN_DATA,
c_pszDialupPerfKey,
0,
KEY_ALL_ACCESS,
&m_hKey );
CMTRACE1(TEXT("OpenDAPPerfKey() RegOpenKeyEx() returned GLE=%u."), dwErrCode);
if ( dwErrCode != ERROR_SUCCESS )
{
m_hKey = NULL;
}
else
{
GetStatRegValues(g_hInst);
//
// Get the initial statistic info
//
if (!GetPerfData(m_dwInitBytesRead, m_dwInitBytesWrite, m_dwBaudRate))
{
//
// No dial-up statistic info
//
RegCloseKey(m_hKey);
m_hKey = NULL;
}
}
return m_hKey != NULL;
}
else
{
//
// On NT5, there is the starting bytes is always zero because
// numbers aren't available to us until the connection is up.
// Note: Adapter2 indicates the reg key to be examined on 9x
// it is a non-issue on NT.
//
m_fAdapter2 = FALSE;
m_dwInitBytesRead = 0;
m_dwInitBytesWrite = 0;
}
return TRUE;
}
//+---------------------------------------------------------------------------
//
// Function: GetPerfData
//
// Synopsis: Get Performance Data from DUN1.2 performance registry
//
// Arguments:
//
// Returns: TRUE: succeed
// FALSE otherwise
//
// History: byao created 7/16/97
// fengsun change it into a member function 10/14/97
//
//----------------------------------------------------------------------------
BOOL CConnStatistics::GetPerfData(DWORD& dwRead, DWORD& dwWrite, DWORD& dwBaudRate) const
{
MYDBGASSERT(m_hKey != NULL);
MYDBGASSERT(m_pszTotalBytesRecvd && *m_pszTotalBytesRecvd);
LONG dwErrCode;
DWORD dwValueSize, dwValueType;
DWORD dwValue;
LPTSTR lpKeyName;
//
// "Dial-up Adapter\TotalBytesRecvd"
//
dwValueSize = sizeof(DWORD);
dwErrCode = RegQueryValueExU(m_hKey,
m_pszTotalBytesRecvd,
NULL,
&dwValueType,
(PBYTE)&dwValue,
&dwValueSize);
if (dwErrCode == ERROR_SUCCESS)
{
dwRead = dwValue;
}
else
{
return FALSE;
}
//
// "Dial-up Adapter\TotalBytesXmit"
//
dwValueSize = sizeof(DWORD);
dwErrCode = RegQueryValueExU(m_hKey,
m_pszTotalBytesXmit,
NULL,
&dwValueType,
(PBYTE)&dwValue,
&dwValueSize);
if (dwErrCode == ERROR_SUCCESS)
{
dwWrite = dwValue;
}
else
{
return FALSE;
}
//
// "Dial-up Adapter\ConnectSpeed"
//
dwValueSize = sizeof(DWORD);
dwErrCode = RegQueryValueExU(m_hKey,
m_pszConnectSpeed,
NULL,
&dwValueType,
(PBYTE)&dwValue,
&dwValueSize);
if (dwErrCode == ERROR_SUCCESS)
{
dwBaudRate = dwValue;
}
else
{
return FALSE;
}
return TRUE;
}
//+----------------------------------------------------------------------------
//
// Function: CConnStatistics::RasConnectionExists
//
// Synopsis: Whether there is a connected ras connection running on Win9x.
//
// Arguments: None
//
// Returns: BOOL - TRUE if there is one up and connected
//
// History: fengsun Created 1/15/98
//
//+----------------------------------------------------------------------------
BOOL CConnStatistics::RasConnectionExists()
{
//
// Try RasEnumConnections to find out active connections
//
HINSTANCE hRasInstance = LoadLibraryExA("RASAPI32", NULL, 0);
MYDBGASSERT(hRasInstance);
if (!hRasInstance)
{
return FALSE;
}
typedef DWORD (WINAPI *PFN_RasEnumConnections)(LPRASCONN, LPDWORD, LPDWORD);
PFN_RasEnumConnections lpRasEnumConnections;
lpRasEnumConnections = (PFN_RasEnumConnections)GetProcAddress(hRasInstance, "RasEnumConnectionsA");
MYDBGASSERT(lpRasEnumConnections);
if (!lpRasEnumConnections)
{
FreeLibrary(hRasInstance);
return FALSE;
}
DWORD dwConnections = 0;
DWORD dwSizeNeeded = 0;
if (lpRasEnumConnections(NULL,&dwSizeNeeded,&dwConnections))
{
MYDBGASSERT(dwConnections < 2);
if (dwConnections > 0)
{
FreeLibrary(hRasInstance);
return TRUE;
}
}
FreeLibrary(hRasInstance);
return FALSE;
}
//+----------------------------------------------------------------------------
//
// Function: CConnStatistics::Close
//
// Synopsis: Stop gathering statistic and close the handle
//
// Arguments: None
//
// Returns: Nothing
//
// History: Anonymous Created Header 10/15/97
// nickball Reduced to close key 03/04/98
//
//+----------------------------------------------------------------------------
void CConnStatistics::Close()
{
if (m_hKey)
{
DWORD dwErrCode = RegCloseKey(m_hKey);
CMTRACE1(TEXT("Close() RegCloseKey() returned GLE=%u."), dwErrCode);
m_hKey = NULL;
}
}