//+---------------------------------------------------------------------------- // // File: RasApiDll.h // // Module: CMMON32.EXE // // Synopsis: Dynamicly link to RASAPI32.dll // // Copyright (c) 1998-1999 Microsoft Corporation // // Author: fengsun Created 03/12/98 // //+---------------------------------------------------------------------------- #ifndef RASAPIALL_H #define RASAPIALL_H #include #include "DynamicLib.h" // // The statistics structure used with RasGetConnectionStatistics API // typedef struct _RAS_STATS { DWORD dwSize; DWORD dwBytesXmited; DWORD dwBytesRcved; DWORD dwFramesXmited; DWORD dwFramesRcved; DWORD dwCrcErr; DWORD dwTimeoutErr; DWORD dwAlignmentErr; DWORD dwHardwareOverrunErr; DWORD dwFramingErr; DWORD dwBufferOverrunErr; DWORD dwCompressionRatioIn; DWORD dwCompressionRatioOut; DWORD dwBps; DWORD dwConnectDuration; } RAS_STATS, *PRAS_STATS; //+--------------------------------------------------------------------------- // // class : CRasApiDll // // Synopsis: A class to dynamic link to RASAPI32.DLL, derived from CDynamicLibrary // Calling any of the RAS function will load the DLL // // History: fengsun created 3/12/98 // //---------------------------------------------------------------------------- class CRasApiDll : public CDynamicLibrary { public: CRasApiDll(); DWORD RasGetConnectStatus(HRASCONN hrasconn, LPRASCONNSTATUS lprasconnstatus); DWORD RasConnectionNotification(HRASCONN hrasconn, HANDLE hEvent, DWORD dwFlags); DWORD RasGetConnectionStatistics(HRASCONN hrasconn, PRAS_STATS pRasStats); BOOL Load(); BOOL HasRasConnectionNotification() const; protected: typedef DWORD (WINAPI* RasGetConnectStatusFUNC)(HRASCONN, LPRASCONNSTATUS); typedef DWORD (WINAPI* RasConnectionNotificationFUNC)(HRASCONN hrasconn, HANDLE hEvent, DWORD dwFlags); typedef DWORD (WINAPI* RasGetConnectionStatisticsFUNC) (HRASCONN, PRAS_STATS); RasGetConnectStatusFUNC m_pfnRasGetConnectStatus; RasConnectionNotificationFUNC m_pfnRasConnectionNotification; RasGetConnectionStatisticsFUNC m_pfnRasGetConnectionStatistics; }; // // Constructor // inline CRasApiDll::CRasApiDll() : CDynamicLibrary() { m_pfnRasGetConnectStatus = NULL; m_pfnRasConnectionNotification = NULL; } //+---------------------------------------------------------------------------- // // Function: CRasApiDll::Load // // Synopsis: Load RASAPI32.dll // // Arguments: None // // Returns: BOOL - TRUE if load successfully // // History: fengsun Created Header 3/12/98 // //+---------------------------------------------------------------------------- inline BOOL CRasApiDll::Load() { if(IsLoaded()) { return TRUE; } if (!CDynamicLibrary::Load(TEXT("RASAPI32.DLL"))) { return FALSE; } LPSTR pszGetConnectStatusFuncName; LPSTR pszConnectionNotificationFuncName; LPSTR pszGetConnectionStatisticsFuncName; if (OS_NT) { pszGetConnectStatusFuncName = "RasGetConnectStatusW"; pszConnectionNotificationFuncName = "RasConnectionNotificationW"; } else { pszGetConnectStatusFuncName = "RasGetConnectStatusA"; pszConnectionNotificationFuncName = "RasConnectionNotificationA"; } m_pfnRasGetConnectStatus = (RasGetConnectStatusFUNC)CDynamicLibrary::GetProcAddress (pszGetConnectStatusFuncName); m_pfnRasConnectionNotification = (RasConnectionNotificationFUNC)CDynamicLibrary::GetProcAddress (pszConnectionNotificationFuncName); // // Only on NT5, we load the statistics retrieval API // if (OS_NT5) { pszGetConnectionStatisticsFuncName = "RasGetConnectionStatistics"; m_pfnRasGetConnectionStatistics = (RasGetConnectionStatisticsFUNC)CDynamicLibrary::GetProcAddress (pszGetConnectionStatisticsFuncName); } MYDBGASSERT(m_pfnRasGetConnectStatus); return TRUE; } //+---------------------------------------------------------------------------- // // Function: CRasApiDll::RasGetConnectionStatistics // // Synopsis: Call the ras function RasGetConnectionStatistics. // Load the Dll, if not loaded yet // // Arguments: HRASCONN hrasconn - Same as ::RasGetConnectStatus // RAS_STATS RasStats - The Ras statistics // // Returns: DWORD - Same as ::RasGetConnectStatus // // History: nickball 03/04/00 Created. Cloned from RasGetConnectStatus // //+---------------------------------------------------------------------------- inline DWORD CRasApiDll::RasGetConnectionStatistics(HRASCONN hRasConn, PRAS_STATS pRasStats) { DWORD dwReturn = ERROR_INVALID_FUNCTION; MYDBGASSERT(hRasConn); MYDBGASSERT(pRasStats); MYVERIFY(Load()); if (IsLoaded() && m_pfnRasGetConnectionStatistics) { return (m_pfnRasGetConnectionStatistics(hRasConn, pRasStats)); } return ERROR_INVALID_FUNCTION; } //+---------------------------------------------------------------------------- // // Function: CRasApiDll::RasGetConnectStatus // // Synopsis: Call the ras function RasGetConnectStatus. // Load the Dll, if not loaded yet // // Arguments: HRASCONN hrasconn - Same as ::RasGetConnectStatus // LPRASCONNSTATUSA lprasconnstatus - Same as ::RasGetConnectStatus // // Returns: DWORD - Same as ::RasGetConnectStatus // // History: fengsun Created Header 3/12/98 // //+---------------------------------------------------------------------------- inline DWORD CRasApiDll::RasGetConnectStatus(HRASCONN hrasconn, LPRASCONNSTATUS lprasconnstatus) { DWORD dwReturn = ERROR_INVALID_FUNCTION; MYDBGASSERT(hrasconn); MYDBGASSERT(lprasconnstatus); MYVERIFY(Load()); if (IsLoaded() && m_pfnRasGetConnectStatus != NULL) { if (OS_NT) { dwReturn = m_pfnRasGetConnectStatus(hrasconn, lprasconnstatus); } else { RASCONNSTATUSA RasConnStatusA; ZeroMemory(&RasConnStatusA, sizeof(RASCONNSTATUSA)); RasConnStatusA.dwSize = sizeof(RASCONNSTATUSA); // // We cast this here because we only have one function declaration. We should // probably have one for Unicode and one for ANSI but for now the cast works // fine. // dwReturn = m_pfnRasGetConnectStatus(hrasconn, (LPRASCONNSTATUS)&RasConnStatusA); if (ERROR_SUCCESS == dwReturn) { lprasconnstatus->rasconnstate = RasConnStatusA.rasconnstate; lprasconnstatus->dwError = RasConnStatusA.dwError; SzToWz(RasConnStatusA.szDeviceType, lprasconnstatus->szDeviceType, RAS_MaxDeviceType); SzToWz(RasConnStatusA.szDeviceName, lprasconnstatus->szDeviceName, RAS_MaxDeviceName); } } } return dwReturn; } //+---------------------------------------------------------------------------- // // Function: CRasApiDll::RasConnectionNotification // // Synopsis: Call the ras function RasConnectionNotification. // Load the Dll, if not loaded yet // // Arguments: HRASCONN hrasconn - Same as ::RasConnectionNotification // HANDLE hEvent - Same as ::RasConnectionNotification // DWORD dwFlags - Same as ::RasConnectionNotification // // Returns: DWORD - Same as ::RasConnectionNotification // // History: fengsun Created Header 3/12/98 // //+---------------------------------------------------------------------------- inline DWORD CRasApiDll::RasConnectionNotification(HRASCONN hrasconn, HANDLE hEvent, DWORD dwFlags) { MYDBGASSERT(hrasconn); MYDBGASSERT(hEvent); MYDBGASSERT(dwFlags); MYVERIFY(Load()); if(!IsLoaded() || m_pfnRasConnectionNotification == NULL) { return ERROR_INVALID_FUNCTION; } return m_pfnRasConnectionNotification(hrasconn, hEvent, dwFlags); } //+---------------------------------------------------------------------------- // // Function: CRasApiDll::HasRasConnectionNotification // // Synopsis: Whether the dll has the function RasConnectionNotification() // which is not available for WIN9x w/ DUN1.0 // // Arguments: None // // Returns: BOOL - TRUE if the function is avalaible // // History: fengsun Created Header 3/13/98 // //+---------------------------------------------------------------------------- inline BOOL CRasApiDll::HasRasConnectionNotification() const { MYDBGASSERT(m_hInst); return m_pfnRasConnectionNotification != NULL; } #endif