///////////////////////////////////////////////////////////////////////////// // // 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; } ///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////