342 lines
8.4 KiB
C++
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|