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.
 
 
 
 
 
 

889 lines
21 KiB

/////////////////////////////////////////////////////////////////////////////
//
// RAS API wrappers for wide/ansi
//
// Works on all NT platforms correctly, maintaining unicode
// whenever possible.
//
/////////////////////////////////////////////////////////////////////////////
#include "wininetp.h"
#include "rashelp.h"
#include "autodial.h"
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
ENUM_TYPE GetOSVersion::_EnumType = ENUM_NONE;
GetOSVersion::GetOSVersion()
{
if(_EnumType == ENUM_NONE)
{
if(0 == GlobalPlatformType)
GlobalPlatformType = PlatformType(&GlobalPlatformVersion5);
INET_ASSERT(PLATFORM_TYPE_WINNT == GlobalPlatformType);
if(TRUE == GlobalPlatformVersion5)
_EnumType = ENUM_WIN2K;
else
_EnumType = ENUM_UNICODE;
}
}
GetOSVersion::~GetOSVersion()
{
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
RasEnumHelp::RasEnumHelp()
{
DWORD dwBufSize, dwStructSize = 0;
// init
_dwEntries = 0;
_dwLastError = 0;
switch(_EnumType)
{
case ENUM_UNICODE:
dwStructSize = sizeof(RASENTRYNAMEW);
break;
case ENUM_WIN2K:
dwStructSize = sizeof(W2KRASENTRYNAMEW);
break;
}
// allocate space for 16 entries
dwBufSize = 16 * dwStructSize;
_preList = (LPRASENTRYNAMEA)LocalAlloc(LPTR, dwBufSize);
if(_preList)
{
do
{
// set up list
_preList[0].dwSize = dwStructSize;
// call ras to enumerate
_dwLastError = ERROR_UNKNOWN;
_dwLastError = _RasEnumEntriesW(
NULL,
NULL,
(LPRASENTRYNAMEW)_preList,
&dwBufSize,
&_dwEntries
);
// reallocate buffer if necessary
if(ERROR_BUFFER_TOO_SMALL == _dwLastError)
{
LocalFree(_preList);
_preList = (LPRASENTRYNAMEA)LocalAlloc(LPTR, dwBufSize);
if(NULL == _preList)
{
_dwLastError = ERROR_NOT_ENOUGH_MEMORY;
break;
}
}
else
{
break;
}
} while(TRUE);
}
else
{
_dwLastError = ERROR_NOT_ENOUGH_MEMORY;
}
if(_preList && (ERROR_SUCCESS != _dwLastError))
{
LocalFree(_preList);
_preList = NULL;
_dwEntries = 0;
}
return;
}
RasEnumHelp::~RasEnumHelp()
{
if(_preList)
{
LocalFree(_preList);
}
}
DWORD
RasEnumHelp::GetError()
{
return _dwLastError;
}
DWORD
RasEnumHelp::GetEntryCount()
{
return _dwEntries;
}
LPWSTR
RasEnumHelp::GetEntryW(DWORD dwConnectionNum)
{
LPWSTR pwszName = NULL;
if(dwConnectionNum >= _dwEntries)
{
return NULL;
}
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASENTRYNAMEW lpTemp = (LPRASENTRYNAMEW)_preList;
if(*lpTemp[dwConnectionNum].szEntryName)
pwszName = lpTemp[dwConnectionNum].szEntryName;
break;
}
case ENUM_WIN2K:
{
LPW2KRASENTRYNAMEW lpTemp = (LPW2KRASENTRYNAMEW)_preList;
if(*lpTemp[dwConnectionNum].szEntryName)
pwszName = lpTemp[dwConnectionNum].szEntryName;
break;
}
}
return pwszName;
}
LPSTR
RasEnumHelp::GetEntryA(DWORD dwConnectionNum)
{
LPSTR pszName = NULL;
if(dwConnectionNum >= _dwEntries)
{
return NULL;
}
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASENTRYNAMEW lpTemp = (LPRASENTRYNAMEW)_preList;
if(*lpTemp[dwConnectionNum].szEntryName)
{
WideCharToMultiByte(CP_ACP, 0, lpTemp[dwConnectionNum].szEntryName, -1,
_szCurrentEntryA, RAS_MaxEntryName + 1, NULL, NULL);
pszName = _szCurrentEntryA;
}
break;
}
case ENUM_WIN2K:
{
LPW2KRASENTRYNAMEW lpTemp = (LPW2KRASENTRYNAMEW)_preList;
if(*lpTemp[dwConnectionNum].szEntryName)
{
WideCharToMultiByte(CP_ACP, 0, lpTemp[dwConnectionNum].szEntryName, -1,
_szCurrentEntryA, RAS_MaxEntryName + 1, NULL, NULL);
pszName = _szCurrentEntryA;
}
break;
}
}
return pszName;
}
/////////////////////////////////////////////////////////////////////////////
//
// RasEnumConnHelp
//
/////////////////////////////////////////////////////////////////////////////
RasEnumConnHelp::RasEnumConnHelp()
{
DWORD dwBufSize;
// init
_dwConnections = 0;
_dwLastError = 0;
switch(_EnumType)
{
case ENUM_UNICODE:
_dwStructSize = sizeof(RASCONNW);
break;
case ENUM_WIN2K:
_dwStructSize = sizeof(W2KRASCONNW);
break;
}
// allocate space for MAX_CONNECTION entries
dwBufSize = MAX_CONNECTION * _dwStructSize;
_pRasCon = (LPRASCONNA)LocalAlloc(LPTR, dwBufSize);
if(_pRasCon == NULL)
{
_dwLastError = ERROR_NOT_ENOUGH_MEMORY;
}
return;
}
RasEnumConnHelp::~RasEnumConnHelp()
{
if(_pRasCon)
{
LocalFree(_pRasCon);
_pRasCon = NULL;
}
}
DWORD RasEnumConnHelp::Enum()
{
DWORD dwBufSize;
_dwLastError = 0;
if(_pRasCon)
{
dwBufSize = MAX_CONNECTION * _dwStructSize;
do
{
// set up list
_pRasCon[0].dwSize = _dwStructSize;
// call ras to enumerate
_dwLastError = ERROR_UNKNOWN;
switch(_EnumType)
{
case ENUM_UNICODE:
case ENUM_WIN2K:
_dwLastError = _RasEnumConnectionsW((LPRASCONNW)_pRasCon, &dwBufSize, &_dwConnections);
break;
}
// reallocate buffer if necessary
if(ERROR_BUFFER_TOO_SMALL == _dwLastError)
{
LocalFree(_pRasCon);
_pRasCon = (LPRASCONNA)LocalAlloc(LPTR, dwBufSize);
if(NULL == _pRasCon)
{
_dwLastError = ERROR_NOT_ENOUGH_MEMORY;
break;
}
}
else
{
break;
}
} while(TRUE);
}
else
{
_dwLastError = ERROR_NOT_ENOUGH_MEMORY;
}
return _dwLastError;
}
DWORD
RasEnumConnHelp::GetError()
{
return _dwLastError;
}
DWORD
RasEnumConnHelp::GetConnectionsCount()
{
return _dwConnections;
}
LPWSTR
RasEnumConnHelp::GetEntryW(DWORD dwConnectionNum)
{
LPWSTR pwszName = NULL;
if((_pRasCon == NULL) || (dwConnectionNum >= _dwConnections))
{
return NULL;
}
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASCONNW lpTemp = (LPRASCONNW)_pRasCon;
if(*lpTemp[dwConnectionNum].szEntryName)
pwszName = lpTemp[dwConnectionNum].szEntryName;
break;
}
case ENUM_WIN2K:
{
LPW2KRASCONNW lpTemp = (LPW2KRASCONNW)_pRasCon;
if(*lpTemp[dwConnectionNum].szEntryName)
pwszName = lpTemp[dwConnectionNum].szEntryName;
break;
}
}
return pwszName;
}
LPSTR
RasEnumConnHelp::GetEntryA(DWORD dwConnectionNum)
{
LPSTR pszName = NULL;
if((_pRasCon == NULL) || (dwConnectionNum >= _dwConnections))
{
return NULL;
}
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASCONNW lpTemp = (LPRASCONNW)_pRasCon;
if(*lpTemp[dwConnectionNum].szEntryName)
{
WideCharToMultiByte(CP_ACP, 0, lpTemp[dwConnectionNum].szEntryName, -1, _szEntryNameA, RAS_MaxEntryName + 1, NULL, NULL);
pszName = _szEntryNameA;
}
break;
}
case ENUM_WIN2K:
{
LPW2KRASCONNW lpTemp = (LPW2KRASCONNW )_pRasCon;
if(*lpTemp[dwConnectionNum].szEntryName)
{
WideCharToMultiByte(CP_ACP, 0, lpTemp[dwConnectionNum].szEntryName, -1, _szEntryNameA, RAS_MaxEntryName + 1, NULL, NULL);
pszName = _szEntryNameA;
}
break;
}
}
return pszName;
}
LPWSTR
RasEnumConnHelp::GetLastEntryW(DWORD dwConnectionNum)
{
UNREFERENCED_PARAMETER(dwConnectionNum);
if(_pRasCon == NULL)
return NULL;
return _szEntryNameW;
}
LPSTR
RasEnumConnHelp::GetLastEntryA(DWORD dwConnectionNum)
{
UNREFERENCED_PARAMETER(dwConnectionNum);
if(_pRasCon == NULL)
return NULL;
return _szEntryNameA;
}
HRASCONN
RasEnumConnHelp::GetHandle(DWORD dwConnectionNum)
{
HRASCONN hTemp = NULL;
if((_pRasCon == NULL) || (dwConnectionNum >= _dwConnections))
{
return NULL;
}
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASCONNW lpTemp = (LPRASCONNW)_pRasCon;
hTemp = lpTemp[dwConnectionNum].hrasconn;
break;
}
case ENUM_WIN2K:
{
LPW2KRASCONNW lpTemp = (LPW2KRASCONNW)_pRasCon;
hTemp = lpTemp[dwConnectionNum].hrasconn;
break;
}
}
return hTemp;
}
/////////////////////////////////////////////////////////////////////////////
//
// RasEntryPropHelp
//
/////////////////////////////////////////////////////////////////////////////
RasEntryPropHelp::RasEntryPropHelp()
{
// init
_dwLastError = 0;
switch(_EnumType)
{
case ENUM_UNICODE:
_dwStructSize = sizeof(RASENTRYW);
break;
case ENUM_WIN2K:
_dwStructSize = sizeof(W2KRASENTRYW);
break;
}
_pRasEntry = (LPRASENTRYA)LocalAlloc(LPTR, _dwStructSize * 2);
if(_pRasEntry)
{
_pRasEntry->dwSize = _dwStructSize;
}
else
{
_dwLastError = ERROR_NOT_ENOUGH_MEMORY;
}
if(_pRasEntry && (ERROR_SUCCESS != _dwLastError))
{
LocalFree(_pRasEntry);
_pRasEntry = NULL;
}
return;
}
RasEntryPropHelp::~RasEntryPropHelp()
{
if(_pRasEntry)
{
LocalFree(_pRasEntry);
_pRasEntry = NULL;
}
}
DWORD RasEntryPropHelp::GetError()
{
return _dwLastError;
}
DWORD RasEntryPropHelp::GetA(LPSTR lpszEntryName)
{
DWORD dwSize = _dwStructSize * 2;
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
MultiByteToWideChar(CP_ACP, 0, lpszEntryName, -1, _szEntryNameW, RAS_MaxEntryName + 1 );
_dwLastError = _RasGetEntryPropertiesW(NULL, _szEntryNameW, (LPRASENTRYW)lpTemp, &dwSize, NULL, NULL);
break;
}
case ENUM_WIN2K:
{
LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
MultiByteToWideChar(CP_ACP, 0, lpszEntryName, -1, _szEntryNameW, RAS_MaxEntryName + 1);
_dwLastError = _RasGetEntryPropertiesW(NULL, _szEntryNameW, (LPRASENTRYW)lpTemp, &dwSize, NULL, NULL);
break;
}
}
return(_dwLastError);
}
DWORD RasEntryPropHelp::GetW(LPWSTR lpszEntryName)
{
DWORD dwSize = _dwStructSize * 2;
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
_dwLastError = _RasGetEntryPropertiesW(NULL, lpszEntryName, (LPRASENTRYW)lpTemp, &dwSize, NULL, NULL);
break;
}
case ENUM_WIN2K:
{
LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
_dwLastError = _RasGetEntryPropertiesW(NULL, lpszEntryName, (LPRASENTRYW)lpTemp, &dwSize, NULL, NULL);
break;
}
}
return(_dwLastError);
}
LPWSTR RasEntryPropHelp::GetDeviceTypeW(VOID)
{
LPWSTR lpwstr = NULL;
if(_pRasEntry)
{
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
if(*lpTemp->szDeviceType)
lpwstr = lpTemp->szDeviceType;
break;
}
case ENUM_WIN2K:
{
LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
if(*lpTemp->szDeviceType)
lpwstr = lpTemp->szDeviceType;
break;
}
}
}
return lpwstr;
}
LPSTR RasEntryPropHelp::GetDeviceTypeA(VOID)
{
LPSTR lpstr = NULL;
if(_pRasEntry)
{
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
if(*lpTemp->szDeviceType)
{
WideCharToMultiByte(CP_ACP, 0, lpTemp->szDeviceType, -1, _szDeviceTypeA, RAS_MaxDeviceType + 1, NULL, NULL);
lpstr = _szDeviceTypeA;
}
break;
}
case ENUM_WIN2K:
{
LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
if(*lpTemp->szDeviceType)
{
WideCharToMultiByte(CP_ACP, 0, lpTemp->szDeviceType, -1, _szDeviceTypeA, RAS_MaxDeviceType + 1, NULL, NULL);
lpstr = _szDeviceTypeA;
}
break;
}
}
}
return lpstr;
}
LPWSTR RasEntryPropHelp::GetAutodiallDllW()
{
LPWSTR lpwstr = NULL;
if(_pRasEntry)
{
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
if(*lpTemp->szAutodialDll)
lpwstr = lpTemp->szAutodialDll;
break;
}
case ENUM_WIN2K:
{
LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
if(*lpTemp->szAutodialDll)
lpwstr = lpTemp->szAutodialDll;
break;
}
}
}
return lpwstr;
}
LPSTR RasEntryPropHelp::GetAutodiallDllA()
{
LPSTR lpstr = NULL;
if(_pRasEntry)
{
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
if(*lpTemp->szAutodialDll)
{
WideCharToMultiByte(CP_ACP, 0, lpTemp->szAutodialDll, -1, _szAutodialDllA, MAX_PATH, NULL, NULL);
lpstr = _szAutodialDllA;
}
break;
}
case ENUM_WIN2K:
{
LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
if(*lpTemp->szAutodialDll)
{
WideCharToMultiByte(CP_ACP, 0, lpTemp->szAutodialDll, -1, _szAutodialDllA, MAX_PATH, NULL, NULL);
lpstr = _szAutodialDllA;
}
break;
}
}
}
return lpstr;
}
LPWSTR RasEntryPropHelp::GetAutodialFuncW()
{
LPWSTR lpwstr = NULL;
if(_pRasEntry)
{
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
if(*lpTemp->szAutodialFunc)
lpwstr = lpTemp->szAutodialFunc;
break;
}
case ENUM_WIN2K:
{
LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
if(*lpTemp->szAutodialFunc)
lpwstr = lpTemp->szAutodialFunc;
break;
}
}
}
return lpwstr;
}
LPSTR RasEntryPropHelp::GetAutodialFuncA()
{
LPSTR lpstr = NULL;
if(_pRasEntry)
{
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
if(*lpTemp->szAutodialFunc)
{
WideCharToMultiByte(CP_ACP, 0, lpTemp->szAutodialFunc, -1, _szAutodialFuncA, RAS_MaxDeviceType + 1, NULL, NULL);
lpstr = _szAutodialFuncA;
}
break;
}
case ENUM_WIN2K:
{
LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
if(*lpTemp->szAutodialFunc)
{
WideCharToMultiByte(CP_ACP, 0, lpTemp->szAutodialFunc, -1, _szAutodialFuncA, RAS_MaxDeviceType + 1, NULL, NULL);
lpstr = _szAutodialFuncA;
}
break;
}
}
}
return lpstr;
}
LPWSTR RasEntryPropHelp::GetCustomDialDllW()
{
LPWSTR lpwstr = NULL;
if(_pRasEntry)
{
switch(_EnumType)
{
case ENUM_UNICODE: // Not is NT4
break;
case ENUM_WIN2K:
{
LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry ;
if(*lpTemp->szCustomDialDll)
lpwstr = lpTemp->szCustomDialDll;
break;
}
}
}
return lpwstr;
}
LPWSTR RasEntryPropHelp::GetPhoneNumberW()
{
LPWSTR lpwstr = NULL;
if(_pRasEntry)
{
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
if(*lpTemp->szLocalPhoneNumber)
lpwstr = lpTemp->szLocalPhoneNumber;
break;
}
case ENUM_WIN2K:
{
LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
if(*lpTemp->szLocalPhoneNumber)
lpwstr = lpTemp->szLocalPhoneNumber;
break;
}
}
}
return lpwstr;
}
DWORD RasEntryPropHelp::GetCountryCode()
{
DWORD dwCode = 0;
if(_pRasEntry)
{
// country code is at the same place for all versions of the struct,
// so take the shortcut
dwCode = _pRasEntry->dwCountryCode;
}
return dwCode;
}
DWORD RasEntryPropHelp::GetOptions()
{
DWORD dwOptions = 0;
if(_pRasEntry)
{
// dwfOptions is at the same place for all versions of the struct,
// so take the shortcut
dwOptions = _pRasEntry->dwfOptions;
}
return dwOptions;
}
LPWSTR RasEntryPropHelp::GetAreaCodeW()
{
LPWSTR lpwstr = NULL;
if(_pRasEntry)
{
switch(_EnumType)
{
case ENUM_UNICODE:
{
LPRASENTRYW lpTemp = (LPRASENTRYW)_pRasEntry;
if(*lpTemp->szAreaCode)
lpwstr = lpTemp->szAreaCode;
break;
}
case ENUM_WIN2K:
{
LPW2KRASENTRYW lpTemp = (LPW2KRASENTRYW)_pRasEntry;
if(*lpTemp->szAreaCode)
lpwstr = lpTemp->szAreaCode;
break;
}
}
}
return lpwstr;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
RasGetConnectStatusHelp::RasGetConnectStatusHelp(HRASCONN hrasconn)
{
// init
_dwLastError = 0;
switch(_EnumType)
{
case ENUM_UNICODE:
case ENUM_WIN2K:
_dwStructSize = sizeof(RASCONNSTATUSW);
break;
}
_pRasConnStatus = (LPRASCONNSTATUSA)LocalAlloc(LPTR, _dwStructSize);
if(_pRasConnStatus)
{
_pRasConnStatus->dwSize = _dwStructSize;
_dwLastError = _RasGetConnectStatusW(hrasconn, (LPRASCONNSTATUSW)_pRasConnStatus);
if(_pRasConnStatus && (ERROR_SUCCESS != _dwLastError))
{
LocalFree(_pRasConnStatus);
_pRasConnStatus = NULL;
}
}
else
{
_dwLastError = ERROR_NOT_ENOUGH_MEMORY;
}
return;
}
RasGetConnectStatusHelp::~RasGetConnectStatusHelp()
{
_dwLastError = 0;
if(_pRasConnStatus)
{
LocalFree(_pRasConnStatus);
_pRasConnStatus = NULL;
}
}
DWORD RasGetConnectStatusHelp::GetError()
{
return _dwLastError;
}
RASCONNSTATE RasGetConnectStatusHelp::ConnState()
{
RASCONNSTATE hConnState = (RASCONNSTATE)NULL;
if(_pRasConnStatus)
{
LPRASCONNSTATUSW lpTemp = (LPRASCONNSTATUSW)_pRasConnStatus;
hConnState = lpTemp->rasconnstate;
}
return hConnState;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////