|
|
/*-----------------------------------------------------------------------------
INSHandler.cpp
Implementation of CINSHandler - INS file processing
Copyright (C) 1999 Microsoft Corporation All rights reserved.
Authors: vyung thomasje
History: 2/7/99 Vyung created - code borrowed from ICW, icwhelp.dll 10/30/99 Thomasje modified - Broadband support (1483, PPPOA)
-----------------------------------------------------------------------------*/
#include "msobcomm.h"
#include <shellapi.h>
#include "inshdlr.h"
#include "webgate.h"
#include "import.h"
#include "rnaapi.h"
#include "inetreg.h"
#include "wininet.h"
#include "appdefs.h"
#include "util.h"
#include "wancfg.h"
#include "inets.h"
#define MAXNAME 80
#define MAXIPADDRLEN 20
#define MAXLONGLEN 80
#define MAX_ISP_MSG 560
#define MAX_ISP_PHONENUMBER 80
#define CCH_ReadBuf (SIZE_ReadBuf / sizeof(WCHAR)) // 32K buffer size
#define myisdigit(ch) (((ch) >= L'0') && ((ch) <= L'9'))
#define IS_PROXY L"Proxy"
#define IK_PROXYENABLE L"Proxy_Enable"
#define IK_HTTPPROXY L"HTTP_Proxy_Server"
// ICW INS PROCESSING FAIL
#define OEM_CONFIG_INS_FILENAME L"icw\\OEMCNFG.INS"
#define OEM_CONFIG_REGKEY L"SOFTWARE\\Microsoft\\Internet Connection Wizard\\INS processing"
#define OEM_CONFIG_REGVAL_FAILED L"Process failed"
#define OEM_CONFIG_REGVAL_ISPNAME L"ISP name"
#define OEM_CONFIG_REGVAL_SUPPORTNUM L"Support number"
#define OEM_CONFIG_INS_SECTION L"Entry"
#define OEM_CONFIG_INS_ISPNAME L"Entry_Name"
#define OEM_CONFIG_INS_SUPPORTNUM L"Support_Number"
typedef HRESULT (WINAPI * INTERNETSETOPTION) (IN HINTERNET hInternet OPTIONAL, IN DWORD dwOption, IN LPVOID lpBuffer, IN DWORD dwBufferLength); typedef HRESULT (WINAPI * INTERNETQUERYOPTION) (IN HINTERNET hInternet OPTIONAL, IN DWORD dwOption, IN LPVOID lpBuffer, IN LPDWORD dwBufferLength);
extern CObCommunicationManager* gpCommMgr;
// The following values are global read only strings used to
// process the INS file
#pragma data_seg(".rdata")
static const WCHAR cszAlias[] = L"Import_Name"; static const WCHAR cszML[] = L"Multilink";
static const WCHAR cszPhoneSection[] = L"Phone"; static const WCHAR cszDialAsIs[] = L"Dial_As_Is"; static const WCHAR cszPhone[] = L"Phone_Number"; static const WCHAR cszAreaCode[] = L"Area_Code"; static const WCHAR cszCountryCode[] = L"Country_Code"; static const WCHAR cszCountryID[] = L"Country_ID";
static const WCHAR cszDeviceSection[] = L"Device"; static const WCHAR cszDeviceType[] = L"Type"; static const WCHAR cszDeviceName[] = L"Name"; static const WCHAR cszDevCfgSize[] = L"Settings_Size"; static const WCHAR cszDevCfg[] = L"Settings";
static const WCHAR cszPnpId[] = L"Plug_and_Play_Id";
static const WCHAR cszServerSection[] = L"Server"; static const WCHAR cszServerType[] = L"Type"; static const WCHAR cszSWCompress[] = L"SW_Compress"; static const WCHAR cszPWEncrypt[] = L"PW_Encrypt"; static const WCHAR cszNetLogon[] = L"Network_Logon"; static const WCHAR cszSWEncrypt[] = L"SW_Encrypt"; static const WCHAR cszNetBEUI[] = L"Negotiate_NetBEUI"; static const WCHAR cszIPX[] = L"Negotiate_IPX/SPX"; static const WCHAR cszIP[] = L"Negotiate_TCP/IP"; static WCHAR cszDisableLcp[] = L"Disable_LCP";
static const WCHAR cszIPSection[] = L"TCP/IP"; static const WCHAR cszIPSpec[] = L"Specify_IP_Address"; static const WCHAR cszIPAddress[] = L"IP_address"; static const WCHAR cszIPMask[] = L"Subnet_Mask"; static const WCHAR cszServerSpec[] = L"Specify_Server_Address";
static const WCHAR cszGatewayList[] = L"Default_Gateway_List";
static const WCHAR cszDNSSpec[] = L"Specify_DNS_Address"; static const WCHAR cszDNSList[] = L"DNS_List";
static const WCHAR cszDNSAddress[] = L"DNS_address"; static const WCHAR cszDNSAltAddress[] = L"DNS_Alt_address";
static const WCHAR cszWINSSpec[] = L"Specify_WINS_Address"; static const WCHAR cszWINSList[] = L"WINS_List"; static const WCHAR cszScopeID[] = L"ScopeID";
static const WCHAR cszDHCPSpec[] = L"Specify_DHCP_Address"; static const WCHAR cszDHCPServer[] = L"DHCP_Server";
static const WCHAR cszWINSAddress[] = L"WINS_address"; static const WCHAR cszWINSAltAddress[]= L"WINS_Alt_address"; static const WCHAR cszIPCompress[] = L"IP_Header_Compress"; static const WCHAR cszWanPri[] = L"Gateway_On_Remote"; static const WCHAR cszDefaultGateway[] = L"Default_Gateway"; static const WCHAR cszDomainName[] = L"Domain_Name"; static const WCHAR cszHostName[] = L"Host_Name"; static const WCHAR cszDomainSuffixSearchList[] = L"Domain_Suffix_Search_List";
static const WCHAR cszATMSection[] = L"ATM"; static const WCHAR cszCircuitSpeed[] = L"Circuit_Speed"; static const WCHAR cszCircuitQOS[] = L"Circuit_QOS"; static const WCHAR cszCircuitType[] = L"Circuit_Type"; static const WCHAR cszSpeedAdjust[] = L"Speed_Adjust"; static const WCHAR cszQOSAdjust[] = L"QOS_Adjust"; static const WCHAR cszEncapsulation[] = L"Encapsulation"; static const WCHAR cszVPI[] = L"VPI"; static const WCHAR cszVCI[] = L"VCI"; static const WCHAR cszVendorConfig[] = L"Vendor_Config"; static const WCHAR cszShowStatus[] = L"Show_Status"; static const WCHAR cszEnableLog[] = L"Enable_Log";
static const WCHAR cszRfc1483Section[] = L"RFC1483"; static const WCHAR cszPppoeSection[] = L"PPPOE";
static const WCHAR cszMLSection[] = L"Multilink"; static const WCHAR cszLinkIndex[] = L"Line_%s";
static const WCHAR cszScriptingSection[] = L"Scripting"; static const WCHAR cszScriptName[] = L"Name";
static const WCHAR cszScriptSection[] = L"Script_File";
static const WCHAR cszCustomDialerSection[] = L"Custom_Dialer"; static const WCHAR cszAutoDialDLL[] = L"Auto_Dial_DLL"; static const WCHAR cszAutoDialFunc[] = L"Auto_Dial_Function";
// These strings will be use to populate the registry, with the data above
static const WCHAR cszKeyIcwRmind[] = L"Software\\Microsoft\\Internet Connection Wizard\\IcwRmind";
static const WCHAR cszTrialRemindSection[] = L"TrialRemind"; static const WCHAR cszEntryISPName[] = L"ISP_Name"; static const WCHAR cszEntryISPPhone[] = L"ISP_Phone"; static const WCHAR cszEntryISPMsg[] = L"ISP_Message"; static const WCHAR cszEntryTrialDays[] = L"Trial_Days"; static const WCHAR cszEntrySignupURL[] = L"Signup_URL"; // ICWRMIND expects this value in the registry
static const WCHAR cszEntrySignupURLTrialOver[] = L"Expired_URL";
// We get these two from the INS file
static const WCHAR cszEntryExpiredISPFileName[] = L"Expired_ISP_File"; static const WCHAR cszSignupExpiredISPURL[] = L"Expired_ISP_URL";
static const WCHAR cszEntryConnectoidName[] = L"Entry_Name"; static const WCHAR cszSignupSuccessfuly[] = L"TrialConverted";
static const WCHAR cszReminderApp[] = L"ICWRMIND.EXE"; static const WCHAR cszReminderParams[] = L"-t";
static const WCHAR cszPassword[] = L"Password";
extern SERVER_TYPES aServerTypes[];
// These are the field names from an INS file that will
// determine the mail and news settings
static const WCHAR cszMailSection[] = L"Internet_Mail"; static const WCHAR cszPOPServer[] = L"POP_Server"; static const WCHAR cszPOPServerPortNumber[] = L"POP_Server_Port_Number"; static const WCHAR cszPOPLogonName[] = L"POP_Logon_Name"; static const WCHAR cszPOPLogonPassword[] = L"POP_Logon_Password"; static const WCHAR cszSMTPServer[] = L"SMTP_Server"; static const WCHAR cszSMTPServerPortNumber[] = L"SMTP_Server_Port_Number"; static const WCHAR cszNewsSection[] = L"Internet_News"; static const WCHAR cszNNTPServer[] = L"NNTP_Server"; static const WCHAR cszNNTPServerPortNumber[] = L"NNTP_Server_Port_Number"; static const WCHAR cszNNTPLogonName[] = L"NNTP_Logon_Name"; static const WCHAR cszNNTPLogonPassword[] = L"NNTP_Logon_Password"; static const WCHAR cszUseMSInternetMail[] = L"Install_Mail"; static const WCHAR cszUseMSInternetNews[] = L"Install_News";
static const WCHAR cszEMailSection[] = L"Internet_Mail"; static const WCHAR cszEMailName[] = L"EMail_Name"; static const WCHAR cszEMailAddress[] = L"EMail_Address"; static const WCHAR cszUseExchange[] = L"Use_MS_Exchange"; static const WCHAR cszUserSection[] = L"User"; static const WCHAR cszUserName[] = L"Name"; static const WCHAR cszDisplayPassword[] = L"Display_Password"; static const WCHAR cszYes[] = L"yes"; static const WCHAR cszNo[] = L"no";
// "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"
static const WCHAR szRegPathInternetSettings[] = REGSTR_PATH_INTERNET_SETTINGS; static const WCHAR szRegPathDefInternetSettings[] = L".DEFAULT\\" REGSTR_PATH_INTERNET_SETTINGS; static const WCHAR cszCMHeader[] = L"Connection Manager CMS 0";
// "InternetProfile"
static const WCHAR szRegValInternetProfile[] = REGSTR_VAL_INTERNETPROFILE;
// "EnableAutodial"
static const WCHAR szRegValEnableAutodial[] = REGSTR_VAL_ENABLEAUTODIAL;
// "NoNetAutodial"
#ifndef REGSTR_VAL_NONETAUTODIAL
#define REGSTR_VAL_NONETAUTODIAL L"NoNetAutodial"
#endif
static const WCHAR szRegValNoNetAutodial[] = REGSTR_VAL_NONETAUTODIAL;
// "RemoteAccess"
static const WCHAR szRegPathRNAWizard[] = REGSTR_PATH_REMOTEACCESS;
#define CLIENT_ELEM(elem) (((LPINETCLIENTINFO)(NULL))->elem)
#define CLIENT_OFFSET(elem) ((DWORD_PTR)&CLIENT_ELEM(elem))
#define CLIENT_SIZE(elem) (sizeof(CLIENT_ELEM(elem)) / sizeof(CLIENT_ELEM(elem)[0]))
#define CLIENT_ENTRY(section, value, elem) \
{section, value, CLIENT_OFFSET(elem), CLIENT_SIZE(elem)}
CLIENT_TABLE iniTable[] = { CLIENT_ENTRY(cszEMailSection, cszEMailName, szEMailName), CLIENT_ENTRY(cszEMailSection, cszEMailAddress, szEMailAddress), CLIENT_ENTRY(cszEMailSection, cszPOPLogonName, szPOPLogonName), CLIENT_ENTRY(cszEMailSection, cszPOPLogonPassword, szPOPLogonPassword), CLIENT_ENTRY(cszEMailSection, cszPOPServer, szPOPServer), CLIENT_ENTRY(cszEMailSection, cszSMTPServer, szSMTPServer), CLIENT_ENTRY(cszNewsSection, cszNNTPLogonName, szNNTPLogonName), CLIENT_ENTRY(cszNewsSection, cszNNTPLogonPassword, szNNTPLogonPassword), CLIENT_ENTRY(cszNewsSection, cszNNTPServer, szNNTPServer), {NULL, NULL, 0, 0} };
static const WCHAR cszFileName[] = L"Custom_File"; static const WCHAR cszCustomFileSection[] = L"Custom_File"; static const WCHAR cszNull[] = L"";
static const WCHAR cszURLSection[] = L"URL"; static const WCHAR cszSignupURL[] = L"Signup"; static const WCHAR cszAutoConfigURL[] = L"Autoconfig";
static const WCHAR cszExtINS[] = L".ins"; static const WCHAR cszExtISP[] = L".isp"; static const WCHAR cszExtHTM[] = L".htm"; static const WCHAR cszExtHTML[] = L".html";
static const WCHAR cszEntrySection[] = L"Entry"; static const WCHAR cszCancel[] = L"Cancel"; static const WCHAR cszRun[] = L"Run"; static const WCHAR cszArgument[] = L"Argument";
static const WCHAR cszConnect2[] = L"icwconn2.exe"; static const WCHAR cszClientSetupSection[] = L"ClientSetup";
static const WCHAR cszRequiresLogon[] = L"Requires_Logon";
static const WCHAR cszCustomSection[] = L"Custom"; static const WCHAR cszKeepConnection[] = L"Keep_Connection"; static const WCHAR cszKeepBrowser[] = L"Keep_Browser";
static const WCHAR cszKioskMode[] = L"-k "; static const WCHAR cszOpen[] = L"open"; static const WCHAR cszBrowser[] = L"iexplore.exe"; static const WCHAR szNull[] = L""; static const WCHAR cszNullIP[] = L"0.0.0.0"; static const WCHAR cszWininet[] = L"WININET.DLL"; static const CHAR cszInternetSetOption[] = "InternetSetOptionA"; static const CHAR cszInternetQueryOption[] = "InternetQueryOptionA";
static const WCHAR cszDEFAULT_BROWSER_KEY[] = L"Software\\Microsoft\\Internet Explorer\\Main"; static const WCHAR cszDEFAULT_BROWSER_VALUE[] = L"check_associations";
// Registry keys which will contain News and Mail settings
#define MAIL_KEY L"SOFTWARE\\Microsoft\\Internet Mail and News\\Mail"
#define MAIL_POP3_KEY L"SOFTWARE\\Microsoft\\Internet Mail and News\\Mail\\POP3\\"
#define MAIL_SMTP_KEY L"SOFTWARE\\Microsoft\\Internet Mail and News\\Mail\\SMTP\\"
#define NEWS_KEY L"SOFTWARE\\Microsoft\\Internet Mail and News\\News"
#define MAIL_NEWS_INPROC_SERVER32 L"CLSID\\{89292102-4755-11cf-9DC2-00AA006C2B84}\\InProcServer32"
typedef HRESULT (WINAPI *PFNSETDEFAULTNEWSHANDLER)(void);
// These are the value names where the INS settings will be saved
// into the registry
static const WCHAR cszMailSenderName[] = L"Sender Name"; static const WCHAR cszMailSenderEMail[] = L"Sender EMail"; static const WCHAR cszMailRASPhonebookEntry[] = L"RAS Phonebook Entry"; static const WCHAR cszMailConnectionType[] = L"Connection Type"; static const WCHAR cszDefaultPOP3Server[] = L"Default POP3 Server"; static const WCHAR cszDefaultSMTPServer[] = L"Default SMTP Server"; static const WCHAR cszPOP3Account[] = L"Account"; static const WCHAR cszPOP3Password[] = L"Password"; static const WCHAR cszPOP3Port[] = L"Port"; static const WCHAR cszSMTPPort[] = L"Port"; static const WCHAR cszNNTPSenderName[] = L"Sender Name"; static const WCHAR cszNNTPSenderEMail[] = L"Sender EMail"; static const WCHAR cszNNTPDefaultServer[] = L"DefaultServer"; // NOTE: NO space between "Default" and "Server".
static const WCHAR cszNNTPAccountName[] = L"Account Name"; static const WCHAR cszNNTPPassword[] = L"Password"; static const WCHAR cszNNTPPort[] = L"Port"; static const WCHAR cszNNTPRasPhonebookEntry[] = L"RAS Phonebook Entry"; static const WCHAR cszNNTPConnectionType[] = L"Connection Type";
static const WCHAR arBase64[] = { L'A',L'B',L'C',L'D',L'E',L'F',L'G',L'H',L'I',L'J',L'K',L'L',L'M', L'N',L'O',L'P',L'Q',L'R',L'S',L'T',L'U',L'V',L'W',L'X',L'Y',L'Z', L'a',L'b',L'c',L'd',L'e',L'f',L'g',L'h',L'i',L'j',L'k',L'l',L'm', L'n',L'o',L'p',L'q',L'r',L's',L't',L'u',L'v',L'w',L'x',L'y',L'z', L'0',L'1',L'2',L'3',L'4',L'5',L'6',L'7',L'8',L'9',L'+',L'/',L'=' };
#define ICWCOMPLETEDKEY L"Completed"
// 2/19/97 jmazner Olympus #1106 -- SAM/SBS integration
WCHAR FAR cszSBSCFG_DLL[] = L"SBSCFG.DLL\0"; CHAR FAR cszSBSCFG_CONFIGURE[] = "Configure\0"; typedef DWORD (WINAPI * SBSCONFIGURE) (HWND hwnd, LPWSTR lpszINSFile, LPWSTR szConnectoidName); SBSCONFIGURE lpfnConfigure;
// 09/02/98 Donaldm: Integrate with Connection Manager
WCHAR FAR cszCMCFG_DLL[] = L"CMCFG32.DLL\0"; CHAR FAR cszCMCFG_CONFIGURE[] = "CMConfig\0"; CHAR FAR cszCMCFG_CONFIGUREEX[] = "CMConfigEx\0";
typedef BOOL (WINAPI * CMCONFIGUREEX)(LPCWSTR lpszINSFile); typedef BOOL (WINAPI * CMCONFIGURE)(LPCWSTR lpszINSFile, LPCWSTR lpszConnectoidNams); CMCONFIGURE lpfnCMConfigure; CMCONFIGUREEX lpfnCMConfigureEx; #pragma data_seg()
HRESULT InetGetAutodial(LPBOOL lpfEnable, LPWSTR lpszEntryName, DWORD cchEntryName) { HRESULT dwRet; HKEY hKey = NULL;
MYASSERT(lpfEnable); MYASSERT(lpszEntryName); MYASSERT(cchEntryName);
// Get the name of the connectoid set for autodial.
// HKCU\RemoteAccess\InternetProfile
dwRet = RegCreateKey(HKEY_CURRENT_USER, szRegPathRNAWizard, &hKey); if (ERROR_SUCCESS == dwRet) { DWORD dwType = REG_SZ; DWORD cbEntryName = BYTES_REQUIRED_BY_CCH(cchEntryName); dwRet = RegQueryValueEx(hKey, (LPWSTR) szRegValInternetProfile, 0, &dwType, (LPBYTE)lpszEntryName, &cbEntryName); RegCloseKey(hKey); }
if (ERROR_SUCCESS != dwRet) { return dwRet; }
// Get setting from registry that indicates whether autodialing is enabled.
// HKCU\Software\Microsoft\Windows\CurrentVersion\InternetSettings\EnableAutodial
dwRet = RegCreateKey(HKEY_CURRENT_USER, szRegPathInternetSettings, &hKey); if (ERROR_SUCCESS == dwRet) {
DWORD dwType = REG_BINARY; DWORD dwNumber = 0L; DWORD dwSize = sizeof(dwNumber); dwRet = RegQueryValueEx(hKey, (LPWSTR) szRegValEnableAutodial, 0, &dwType, (LPBYTE)&dwNumber, &dwSize);
if (ERROR_SUCCESS == dwRet) { *lpfEnable = dwNumber; } RegCloseKey(hKey); }
return dwRet; }
//*******************************************************************
//
// FUNCTION: InetSetAutodial
//
// PURPOSE: This function will set the autodial settings in the registry.
//
// PARAMETERS: fEnable - If set to TRUE, autodial will be enabled.
// If set to FALSE, autodial will be disabled.
// lpszEntryName - name of the phone book entry to set
// for autodial. If this is "", the
// entry is cleared. If NULL, it is not changed.
//
// RETURNS: HRESULT code, ERROR_SUCCESS if no errors occurred
//
// HISTORY:
// 96/03/11 markdu Created.
//
//*******************************************************************
HRESULT InetSetAutodial(BOOL fEnable, LPCWSTR lpszEntryName) {
HRESULT dwRet = ERROR_SUCCESS; BOOL bRet = FALSE;
// 2 seperate calls:
HINSTANCE hInst = NULL; FARPROC fp = NULL;
dwRet = ERROR_SUCCESS;
hInst = LoadLibrary(cszWininet); if (hInst && lpszEntryName) { fp = GetProcAddress(hInst, cszInternetSetOption); if (fp) { WCHAR szNewDefaultConnection[RAS_MaxEntryName+1]; lstrcpyn(szNewDefaultConnection, lpszEntryName, lstrlen(lpszEntryName)+1);
bRet = ((INTERNETSETOPTION)fp) (NULL, INTERNET_OPTION_AUTODIAL_CONNECTION, szNewDefaultConnection, lstrlen(szNewDefaultConnection));
if (bRet) { DWORD dwMode = AUTODIAL_MODE_ALWAYS; bRet = ((INTERNETSETOPTION)fp) (NULL, INTERNET_OPTION_AUTODIAL_MODE, &dwMode, sizeof(DWORD)); } if( !bRet ) { dwRet = GetLastError(); } } else { dwRet = GetLastError(); } }
// From DarrnMi, INTERNETSETOPTION for autodial is new for 5.5.
// We should try it this way and if the InternetSetOption fails (you'll get invalid option),
// set the registry the old way. That'll work everywhere.
if (!bRet) { HKEY hKey = NULL;
// Set the name if given, else do not change the entry.
if (lpszEntryName) { // Set the name of the connectoid for autodial.
// HKCU\RemoteAccess\InternetProfile
if (ERROR_SUCCESS == RegCreateKey(HKEY_CURRENT_USER, szRegPathRNAWizard, &hKey)) { dwRet = RegSetValueEx(hKey, szRegValInternetProfile, 0, REG_SZ, (BYTE*)lpszEntryName, BYTES_REQUIRED_BY_SZ(lpszEntryName)); RegCloseKey(hKey); } }
hKey = NULL; if (ERROR_SUCCESS == dwRet) { // Set setting in the registry that indicates whether autodialing is enabled.
// HKCC\Software\Microsoft\Windows\CurrentVersion\InternetSettings\EnableAutodial
if (ERROR_SUCCESS == RegCreateKey(HKEY_CURRENT_CONFIG, szRegPathInternetSettings, &hKey)) { dwRet = RegSetValueEx(hKey, szRegValEnableAutodial, 0, REG_DWORD, (BYTE*)&fEnable, sizeof(DWORD)); RegCloseKey(hKey); }
if (ERROR_SUCCESS == RegCreateKey(HKEY_LOCAL_MACHINE, szRegPathInternetSettings, &hKey)) { dwRet = RegSetValueEx(hKey, szRegValEnableAutodial, 0, REG_DWORD, (BYTE*)&fEnable, sizeof(DWORD)); RegCloseKey(hKey); }
// Set setting in the registry that indicates whether autodialing is enabled.
// HKCU\Software\Microsoft\Windows\CurrentVersion\InternetSettings\EnableAutodial
if (ERROR_SUCCESS == RegCreateKey(HKEY_CURRENT_USER, szRegPathInternetSettings, &hKey)) {
BOOL bVal = FALSE; dwRet = RegSetValueEx(hKey, szRegValEnableAutodial, 0, REG_DWORD, (BYTE*)&fEnable, sizeof(DWORD));
dwRet = RegSetValueEx(hKey, szRegValNoNetAutodial, 0, REG_DWORD, (BYTE*)&bVal, sizeof(DWORD)); RegCloseKey(hKey); } }
// 2/10/97 jmazner Normandy #9705, 13233 Notify wininet
// when we change proxy or autodial
if (fp) { if( !((INTERNETSETOPTION)fp) (NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0) ) { dwRet = GetLastError(); } } else { dwRet = GetLastError(); }
}
if (hInst) { FreeLibrary(hInst); hInst = NULL; }
return dwRet; }
//+----------------------------------------------------------------------------
//
// Function: CallCMConfig
//
// Synopsis: Call into the Connection Manager dll's Configure function to allow CM to
// process the .ins file as needed.
//
// Arguements: lpszINSFile -- full path to the .ins file
//
// Returns: TRUE if a CM profile is created, FALSE otherwise
//
// History: 09/02/98 DONALDM
//
//-----------------------------------------------------------------------------
BOOL CINSHandler::CallCMConfig(LPCWSTR lpszINSFile) { HINSTANCE hCMDLL = NULL; BOOL bRet = FALSE;
//// TraceMsg(TF_INSHANDLER, L"ICWCONN1: Calling LoadLibrary on %s\n", cszCMCFG_DLL);
// Load DLL and entry point
hCMDLL = LoadLibrary(cszCMCFG_DLL); if (NULL != hCMDLL) { // To determine whether we should call CMConfig or CMConfigEx
ULONG ulBufferSize = 1024*10;
// Parse the ISP section in the INI file to find query pair to append
WCHAR *pszKeys = NULL; PWSTR pszKey = NULL; ULONG ulRetVal = 0; BOOL bEnumerate = TRUE; BOOL bUseEx = FALSE; PWSTR pszBuff = NULL;
do { if (NULL != pszKeys) { delete [] pszKeys; ulBufferSize += ulBufferSize; } pszKeys = new WCHAR [ulBufferSize]; if (NULL == pszKeys) { bEnumerate = FALSE; break; }
ulRetVal = ::GetPrivateProfileString(NULL, NULL, L"", pszKeys, ulBufferSize, lpszINSFile); if (0 == ulRetVal) { bEnumerate = FALSE; break; } } while (ulRetVal == (ulBufferSize - 2));
if (bEnumerate) { pszKey = pszKeys; while (*pszKey) { if (!lstrcmpi(pszKey, cszCMHeader)) { bUseEx = TRUE; break; } pszKey += lstrlen(pszKey) + 1; } }
if (pszKeys) delete [] pszKeys; WCHAR szConnectoidName[RAS_MaxEntryName]; // Get the connectoid name from the [Entry] Section
GetPrivateProfileString(cszEntrySection, cszEntryName, cszNull, szConnectoidName, RAS_MaxEntryName, lpszINSFile);
if (bUseEx) { // Call CMConfigEx
lpfnCMConfigureEx = (CMCONFIGUREEX)GetProcAddress(hCMDLL, cszCMCFG_CONFIGUREEX); if( lpfnCMConfigureEx ) { bRet = lpfnCMConfigureEx(lpszINSFile); } } else { // Call CMConfig
lpfnCMConfigure = (CMCONFIGURE)GetProcAddress(hCMDLL, cszCMCFG_CONFIGURE); // Call function
if( lpfnCMConfigure ) { bRet = lpfnCMConfigure(lpszINSFile, szConnectoidName); } }
if (bRet) { // restore original autodial settings
SetDefaultConnectoid(AutodialTypeAlways, szConnectoidName); } }
// Cleanup
if( hCMDLL ) FreeLibrary(hCMDLL); if( lpfnCMConfigure ) lpfnCMConfigure = NULL;
// TraceMsg(TF_INSHANDLER, L"ICWCONN1: CallSBSConfig exiting with error code %d \n", bRet);
return bRet; }
//+----------------------------------------------------------------------------
//
// Function: CallSBSConfig
//
// Synopsis: Call into the SBSCFG dll's Configure function to allow SBS to
// process the .ins file as needed
//
// Arguements: hwnd -- hwnd of parent, in case sbs wants to put up messages
// lpszINSFile -- full path to the .ins file
//
// Returns: windows error code that sbscfg returns.
//
// History: 2/19/97 jmazner Created for Olympus #1106
//
//-----------------------------------------------------------------------------
DWORD CINSHandler::CallSBSConfig(HWND hwnd, LPCWSTR lpszINSFile) { HINSTANCE hSBSDLL = NULL; DWORD dwRet = ERROR_SUCCESS; WCHAR lpszConnectoidName[RAS_MaxEntryName] = L"nogood\0";
//
// Get name of connectoid we created by looking in autodial
// We need to pass this name into SBSCFG
// 5/14/97 jmazner Windosw NT Bugs #87209
//
BOOL fEnabled = FALSE;
dwRet = InetGetAutodial(&fEnabled, lpszConnectoidName, RAS_MaxEntryName);
// TraceMsg(TF_INSHANDLER, L"ICWCONN1: Calling LoadLibrary on %s\n", cszSBSCFG_DLL);
hSBSDLL = LoadLibrary(cszSBSCFG_DLL);
// Load DLL and entry point
if (NULL != hSBSDLL) { // TraceMsg(TF_INSHANDLER, L"ICWCONN1: Calling GetProcAddress on %s\n", cszSBSCFG_CONFIGURE);
lpfnConfigure = (SBSCONFIGURE)GetProcAddress(hSBSDLL, cszSBSCFG_CONFIGURE); } else { // 4/2/97 ChrisK Olympus 2759
// If the DLL can't be loaded, pick a specific error message to return.
dwRet = ERROR_DLL_NOT_FOUND; goto CallSBSConfigExit; }
// Call function
if( hSBSDLL && lpfnConfigure ) { // TraceMsg(TF_INSHANDLER, L"ICWCONN1: Calling the Configure entry point: %s, %s\n", lpszINSFile, lpszConnectoidName);
dwRet = lpfnConfigure(hwnd, (WCHAR *)lpszINSFile, lpszConnectoidName); } else { // TraceMsg(TF_INSHANDLER, L"ICWCONN1: Unable to call the Configure entry point\n");
dwRet = GetLastError(); }
CallSBSConfigExit: if( hSBSDLL ) FreeLibrary(hSBSDLL); if( lpfnConfigure ) lpfnConfigure = NULL;
// TraceMsg(TF_INSHANDLER, L"ICWCONN1: CallSBSConfig exiting with error code %d \n", dwRet);
return dwRet; }
BOOL CINSHandler::SetICWCompleted( DWORD dwCompleted ) { HKEY hKey = NULL;
HRESULT hr = RegCreateKey(HKEY_CURRENT_USER, ICWSETTINGSPATH, &hKey); if (ERROR_SUCCESS == hr) { hr = RegSetValueEx(hKey, ICWCOMPLETEDKEY, 0, REG_DWORD, (CONST BYTE*)&dwCompleted, sizeof(dwCompleted)); RegCloseKey(hKey); }
if( ERROR_SUCCESS == hr ) return TRUE; else return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
#define FILE_BUFFER_SIZE 65534
#ifndef FILE_BEGIN
#define FILE_BEGIN 0
#endif
//+---------------------------------------------------------------------------
//
// Function: MassageFile
//
// Synopsis: Convert lone carriage returns to CR/LF pairs.
//
// Note: The file is ANSI because these need to be shared with Win9X.
//
//+---------------------------------------------------------------------------
HRESULT CINSHandler::MassageFile(LPCWSTR lpszFile) { LPBYTE lpBufferIn; LPBYTE lpBufferOut; HANDLE hfile; HRESULT hr = ERROR_SUCCESS;
if (!SetFileAttributes(lpszFile, FILE_ATTRIBUTE_NORMAL)) { return GetLastError(); }
lpBufferIn = (LPBYTE) GlobalAlloc(GPTR, 2 * FILE_BUFFER_SIZE); if (NULL == lpBufferIn) { return ERROR_OUTOFMEMORY; } lpBufferOut = lpBufferIn + FILE_BUFFER_SIZE;
hfile = CreateFile(lpszFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, // security attributes
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE != hfile) { BOOL fChanged = FALSE; DWORD cbOut = 0; DWORD cbIn = 0;
if (ReadFile(hfile, lpBufferIn, FILE_BUFFER_SIZE - 1, &cbIn, NULL ) ) // Note: we asume, in our use of lpCharIn, that the file is always less than
// FILE_BUFFER_SIZE
{ LPBYTE lpCharIn = lpBufferIn; LPBYTE lpCharOut = lpBufferOut;
while ((*lpCharIn) && (FILE_BUFFER_SIZE - 2 > cbOut)) { *lpCharOut++ = *lpCharIn; cbOut++; if (('\r' == *lpCharIn) && ('\n' != *(lpCharIn + 1))) { fChanged = TRUE;
*lpCharOut++ = '\n'; cbOut++; } lpCharIn++; }
if (fChanged) { LARGE_INTEGER lnOffset = {0,0}; if (SetFilePointerEx(hfile, lnOffset, NULL, FILE_BEGIN)) { DWORD cbWritten = 0; if (! WriteFile(hfile, lpBufferOut, cbOut, &cbWritten, NULL ) ) { hr = GetLastError(); } } else { hr = GetLastError(); } } } else { hr = GetLastError(); } CloseHandle(hfile); } else { hr = GetLastError(); }
GlobalFree((HGLOBAL)lpBufferIn); return ERROR_SUCCESS; }
DWORD CINSHandler::RunExecutable(void) { DWORD dwRet; SHELLEXECUTEINFO sei;
// Hide the active window first
HWND hWndHide = GetActiveWindow(); ::ShowWindow(hWndHide, SW_HIDE);
sei.cbSize = sizeof(sei); sei.fMask = SEE_MASK_NOCLOSEPROCESS; sei.hwnd = NULL; sei.lpVerb = cszOpen; sei.lpFile = m_szRunExecutable; sei.lpParameters = m_szRunArgument; sei.lpDirectory = NULL; sei.nShow = SW_SHOWNORMAL; sei.hInstApp = NULL; // Optional members
sei.hProcess = NULL;
if (ShellExecuteEx(&sei)) { DWORD iWaitResult = 0; // wait for event or msgs. Dispatch msgs. Exit when event is signalled.
while((iWaitResult=MsgWaitForMultipleObjects(1, &sei.hProcess, FALSE, INFINITE, QS_ALLINPUT))==(WAIT_OBJECT_0 + 1)) { MSG msg ; // read all of the messages in this next loop
// removing each message as we read it
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { CloseHandle(sei.hProcess); return NO_ERROR; } else DispatchMessage(&msg); } }
CloseHandle(sei.hProcess); dwRet = ERROR_SUCCESS; } else { dwRet = GetLastError(); }
::ShowWindow(hWndHide, SW_SHOW);
return dwRet; }
void CINSHandler::SaveAutoDial(void) { // if the original autodial settings have not been saved
if (!m_fAutodialSaved) { // save the current autodial settings
InetGetAutodial( &m_fAutodialEnabled, m_szAutodialConnection, sizeof(m_szAutodialConnection));
m_fAutodialSaved = TRUE; } }
void CINSHandler::RestoreAutoDial(void) { if (m_fAutodialSaved) { // restore original autodial settings
AUTODIAL_TYPE eType = m_fAutodialEnabled ? AutodialTypeAlways : AutodialTypeNever; SetDefaultConnectoid(eType, m_szAutodialConnection); m_fAutodialSaved = FALSE; } }
BOOL CINSHandler::KeepConnection(LPCWSTR lpszFile) { WCHAR szTemp[10];
GetPrivateProfileString(cszCustomSection, cszKeepConnection, cszNo, szTemp, MAX_CHARS_IN_BUFFER(szTemp), lpszFile);
return (!lstrcmpi(szTemp, cszYes)); }
DWORD CINSHandler::ImportCustomInfo ( LPCWSTR lpszImportFile, LPWSTR lpszExecutable, DWORD cchExecutable, LPWSTR lpszArgument, DWORD cchArgument ) { GetPrivateProfileString(cszCustomSection, cszRun, cszNull, lpszExecutable, (int)cchExecutable, lpszImportFile);
GetPrivateProfileString(cszCustomSection, cszArgument, cszNull, lpszArgument, (int)cchArgument, lpszImportFile);
return ERROR_SUCCESS; }
DWORD CINSHandler::ImportFile ( LPCWSTR lpszImportFile, LPCWSTR lpszSection, LPCWSTR lpszOutputFile ) { HANDLE hScriptFile = INVALID_HANDLE_VALUE; LPWSTR pszLine, pszFile; int i, iMaxLine; UINT cch; DWORD cbRet; DWORD dwRet = ERROR_SUCCESS;
// Allocate a buffer for the file
if ((pszFile = (LPWSTR)LocalAlloc(LMEM_FIXED, CCH_ReadBuf * sizeof(WCHAR))) == NULL) { return ERROR_OUTOFMEMORY; }
// Look for script
if (GetPrivateProfileString(lpszSection, NULL, szNull, pszFile, CCH_ReadBuf, lpszImportFile) != 0) { // Get the maximum line number
pszLine = pszFile; iMaxLine = -1; while (*pszLine) { i = _wtoi(pszLine); iMaxLine = max(iMaxLine, i); pszLine += lstrlen(pszLine)+1; };
// If we have at least one line, we will import the script file
if (iMaxLine >= 0) { // Create the script file
hScriptFile = CreateFile(lpszOutputFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, // security attributes
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if (INVALID_HANDLE_VALUE != hScriptFile) { WCHAR szLineNum[MAXLONGLEN+1];
// From The first line to the last line
for (i = 0; i <= iMaxLine; i++) { // Read the script line
wsprintf(szLineNum, L"%d", i); if ((cch = GetPrivateProfileString(lpszSection, szLineNum, szNull, pszLine, CCH_ReadBuf, lpszImportFile)) != 0) { // Write to the script file
lstrcat(pszLine, L"\x0d\x0a"); if (! WriteFile(hScriptFile, pszLine, BYTES_REQUIRED_BY_CCH(cch + 2), &cbRet, NULL ) ) { dwRet = GetLastError(); break; } } } CloseHandle(hScriptFile); } else { dwRet = GetLastError(); } } else { dwRet = ERROR_NOT_FOUND; } } else { dwRet = ERROR_NOT_FOUND; } LocalFree(pszFile);
return dwRet; }
DWORD CINSHandler::ImportCustomFile ( LPCWSTR lpszImportFile ) { WCHAR szFile[_MAX_PATH]; WCHAR szTemp[_MAX_PATH];
// If a custom file name does not exist, do nothing
if (GetPrivateProfileString(cszCustomSection, cszFileName, cszNull, szTemp, MAX_CHARS_IN_BUFFER(szTemp), lpszImportFile) == 0) { return ERROR_SUCCESS; };
GetWindowsDirectory(szFile, MAX_CHARS_IN_BUFFER(szFile)); if (*CharPrev(szFile, szFile + lstrlen(szFile)) != L'\\') { lstrcat(szFile, L"\\"); } lstrcat(szFile, szTemp);
return (ImportFile(lpszImportFile, cszCustomFileSection, szFile)); }
BOOL CINSHandler::LoadExternalFunctions(void) { BOOL bRet = FALSE;
do { // Load the Brading library functions
m_hBranding = LoadLibrary(L"IEDKCS32.DLL"); if (m_hBranding != NULL) { if (NULL == (m_lpfnBrandICW2 = (PFNBRANDICW2)GetProcAddress(m_hBranding, "BrandICW2"))) break; } else { break; }
if( IsNT() ) { // Load the RAS functions
m_hRAS = LoadLibrary(L"RASAPI32.DLL"); if (m_hRAS != NULL) { if (NULL == (m_lpfnRasSetAutodialEnable = (PFNRASSETAUTODIALENABLE)GetProcAddress(m_hRAS, "RasSetAutodialEnableA"))) break; if (NULL == (m_lpfnRasSetAutodialAddress = (PFNRASSETAUTODIALADDRESS)GetProcAddress(m_hRAS, "RasSetAutodialAddressA"))) break; } else { break; } }
// Success if we get to here
bRet = TRUE; break; } while(1);
return bRet; }
//-----------------------------------------------------------------------------
// OpenIcwRmindKey
//-----------------------------------------------------------------------------
BOOL CINSHandler::OpenIcwRmindKey(HKEY* phkey) { // This method will open the IcwRmind key in the registry. If the key
// does not exist it will be created here.
LONG lResult = ERROR_SUCCESS; if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, cszKeyIcwRmind, 0, KEY_READ | KEY_WRITE, phkey)) { lResult = RegCreateKey(HKEY_LOCAL_MACHINE, cszKeyIcwRmind, phkey); }
return ( ERROR_SUCCESS == lResult ); }
BOOL CINSHandler::ConfigureTrialReminder ( LPCWSTR lpszFile ) {
WCHAR szISPName[MAX_ISP_NAME]; WCHAR szISPMsg[MAX_ISP_MSG]; WCHAR szISPPhoneNumber[MAX_ISP_PHONENUMBER]; int iTrialDays; WCHAR szConvertURL[INTERNET_MAX_URL_LENGTH];
WCHAR szExpiredISPFileURL[INTERNET_MAX_URL_LENGTH]; WCHAR szExpiredISPFileName[MAX_PATH]; // The fully qualified path to the final INS file
WCHAR szISPFile[MAX_PATH]; // The name we get in the INS
WCHAR szConnectoidName[MAXNAME];
if (GetPrivateProfileString(cszTrialRemindSection, cszEntryISPName, cszNull, szISPName, MAX_CHARS_IN_BUFFER(szISPName), lpszFile) == 0) { return FALSE; }
if (GetPrivateProfileString(cszTrialRemindSection, cszEntryISPPhone, cszNull, szISPPhoneNumber, MAX_CHARS_IN_BUFFER(szISPPhoneNumber), lpszFile) == 0) { return FALSE; }
if ((iTrialDays = GetPrivateProfileInt(cszTrialRemindSection, cszEntryTrialDays, 0, lpszFile)) == 0) { return FALSE; }
if (GetPrivateProfileString(cszTrialRemindSection, cszEntrySignupURL, cszNull, szConvertURL, MAX_CHARS_IN_BUFFER(szConvertURL), lpszFile) == 0) { return FALSE; }
//optional
GetPrivateProfileString(cszTrialRemindSection, cszEntryISPMsg, cszNull, szISPMsg, MAX_CHARS_IN_BUFFER(szISPMsg), lpszFile);
// Get the connectoid name from the [Entry] Section
if (GetPrivateProfileString(cszEntrySection, cszEntry_Name, cszNull, szConnectoidName, MAX_CHARS_IN_BUFFER(szConnectoidName), lpszFile) == 0) { return FALSE; }
// If we get to here, we have everything to setup a trial, so let's do it.
HKEY hkey; if (OpenIcwRmindKey(&hkey)) { // Set the values we have
RegSetValueEx(hkey, cszEntryISPName, 0, REG_SZ, LPBYTE(szISPName), BYTES_REQUIRED_BY_SZ((LPWSTR)szISPName) );
RegSetValueEx(hkey, cszEntryISPMsg, 0, REG_SZ, LPBYTE(szISPMsg), BYTES_REQUIRED_BY_SZ((LPWSTR)szISPMsg) );
RegSetValueEx(hkey, cszEntryISPPhone, 0, REG_SZ, LPBYTE(szISPPhoneNumber), BYTES_REQUIRED_BY_SZ((LPWSTR)szISPPhoneNumber) );
RegSetValueEx(hkey, cszEntryTrialDays, 0, REG_DWORD, (LPBYTE)&iTrialDays, sizeof(DWORD) + 1);
RegSetValueEx(hkey, cszEntrySignupURL, 0, REG_SZ, LPBYTE(szConvertURL), BYTES_REQUIRED_BY_SZ((LPWSTR)szConvertURL) );
RegSetValueEx(hkey, cszEntryConnectoidName, 0, REG_SZ, LPBYTE(szConnectoidName), BYTES_REQUIRED_BY_SZ((LPWSTR)szConnectoidName) );
// See if we have to create an ISP file
if (GetPrivateProfileString(cszTrialRemindSection, cszEntryExpiredISPFileName, cszNull, szISPFile, MAX_CHARS_IN_BUFFER(szISPFile), lpszFile) != 0) {
// Set the fully qualified path for the ISP file name
WCHAR szAppDir[MAX_PATH]; LPWSTR p; if (GetModuleFileName(GetModuleHandle(L"msobcomm.ldl"), szAppDir, MAX_PATH)) { p = &szAppDir[lstrlen(szAppDir)-1]; while (*p != L'\\' && p >= szAppDir) p--; if (*p == L'\\') *(p++) = L'\0'; }
wsprintf(szExpiredISPFileName, L"%s\\%s",szAppDir,szISPFile);
if (GetPrivateProfileString(cszTrialRemindSection, cszSignupExpiredISPURL, cszNull, szExpiredISPFileURL, MAX_CHARS_IN_BUFFER(szExpiredISPFileURL), lpszFile) != 0) {
// Download the ISP file, and then copy its contents
CWebGate WebGate; BSTR bstrURL; BSTR bstrFname; BOOL bRetVal;
// Setup the webGate object, and download the ISP file
bstrURL = SysAllocString(szExpiredISPFileURL); WebGate.put_Path(bstrURL); SysFreeString(bstrURL); WebGate.FetchPage(1, &bRetVal); if (bRetVal) { WebGate.get_DownloadFname(&bstrFname);
// Copy the file from the temp location, making sure one does not
// yet exist
DeleteFile(szExpiredISPFileName); MoveFile(bstrFname, szExpiredISPFileName); SysFreeString(bstrFname);
// Write the new file to the registry
RegSetValueEx(hkey, cszEntrySignupURLTrialOver, 0, REG_SZ, LPBYTE(szExpiredISPFileName), BYTES_REQUIRED_BY_SZ((LPWSTR)szExpiredISPFileName) );
}
} } // The key was opened inside OpenIcwRmindKey, close it here.
RegCloseKey(hkey); }
return TRUE;
}
DWORD CINSHandler::ImportBrandingInfo ( LPCWSTR lpszFile, LPCWSTR lpszConnectoidName ) { USES_CONVERSION; WCHAR szPath[_MAX_PATH + 1]; MYASSERT(m_lpfnBrandICW2 != NULL);
GetWindowsDirectory(szPath, MAX_CHARS_IN_BUFFER(szPath)); m_lpfnBrandICW2(W2A(lpszFile), W2A(szPath), m_dwBrandFlags, W2A(lpszConnectoidName));
return ERROR_SUCCESS; }
DWORD CINSHandler::ReadClientInfo ( LPCWSTR lpszFile, LPINETCLIENTINFO lpClientInfo, LPCLIENT_TABLE lpClientTable ) { LPCLIENT_TABLE lpTable;
for (lpTable = lpClientTable; NULL != lpTable->lpszSection; ++lpTable) { GetPrivateProfileString(lpTable->lpszSection, lpTable->lpszValue, cszNull, (LPWSTR)((LPBYTE)lpClientInfo + lpTable->uOffset), lpTable->uSize, lpszFile); }
lpClientInfo->dwFlags = 0; if (*lpClientInfo->szPOPLogonName) { lpClientInfo->dwFlags |= INETC_LOGONMAIL; } if ((*lpClientInfo->szNNTPLogonName) || (*lpClientInfo->szNNTPServer)) { lpClientInfo->dwFlags |= INETC_LOGONNEWS; }
return ERROR_SUCCESS; }
BOOL CINSHandler::WantsExchangeInstalled(LPCWSTR lpszFile) { WCHAR szTemp[10];
GetPrivateProfileString(cszEMailSection, cszUseExchange, cszNo, szTemp, MAX_CHARS_IN_BUFFER(szTemp), lpszFile);
return (!lstrcmpi(szTemp, cszYes)); }
BOOL CINSHandler::DisplayPassword(LPCWSTR lpszFile) { WCHAR szTemp[10];
GetPrivateProfileString(cszUserSection, cszDisplayPassword, cszNo, szTemp, MAX_CHARS_IN_BUFFER(szTemp), lpszFile);
return (!lstrcmpi(szTemp, cszYes)); }
DWORD CINSHandler::ImportClientInfo ( LPCWSTR lpszFile, LPINETCLIENTINFO lpClientInfo ) { DWORD dwRet;
lpClientInfo->dwSize = sizeof(INETCLIENTINFO);
dwRet = ReadClientInfo(lpszFile, lpClientInfo, iniTable);
return dwRet; }
DWORD CINSHandler::ConfigureClient ( HWND hwnd, LPCWSTR lpszFile, LPBOOL lpfNeedsRestart, LPBOOL lpfConnectoidCreated, BOOL fHookAutodial, LPWSTR szConnectoidName, DWORD dwConnectoidNameSize ) { LPICONNECTION pConn = NULL; LPINETCLIENTINFO pClientInfo = NULL; DWORD dwRet = ERROR_SUCCESS; UINT cb = sizeof(ICONNECTION) + sizeof(INETCLIENTINFO); DWORD dwfOptions = INETCFG_INSTALLTCP | INETCFG_WARNIFSHARINGBOUND; LPRASINFO pRasInfo = NULL; LPRASENTRY pRasEntry = NULL; RNAAPI Rnaapi; LPBYTE lpDeviceInfo = NULL; DWORD dwDeviceInfoSize = 0; BOOL lpfNeedsRestartLan = FALSE;
//
// ChrisK Olympus 4756 5/25/97
// Do not display busy animation on Win95
//
if (!m_bSilentMode && IsNT()) { dwfOptions |= INETCFG_SHOWBUSYANIMATION; }
// Allocate a buffer for connection and clientinfo objects
if ((pConn = (LPICONNECTION)LocalAlloc(LPTR, cb)) == NULL) { return ERROR_OUTOFMEMORY; }
if (WantsExchangeInstalled(lpszFile)) { dwfOptions |= INETCFG_INSTALLMAIL; }
// Create either a CM profile, or a connectoid
if (CallCMConfig(lpszFile)) { *lpfConnectoidCreated = TRUE; // A dialup connection was created
} else { switch ( InetSGetConnectionType ( lpszFile ) ) { case InetS_RASModem : case InetS_RASIsdn : { break; } case InetS_RASAtm : { lpDeviceInfo = (LPBYTE) malloc ( sizeof (ATMPBCONFIG) ); if ( !lpDeviceInfo ) { return ERROR_NOT_ENOUGH_MEMORY; } dwDeviceInfoSize = sizeof( ATMPBCONFIG ); break; }
case InetS_LANCable : { DWORD nRetVal = 0; LANINFO LanInfo;
memset ( &LanInfo, 0, sizeof (LANINFO) ); LanInfo.dwSize = sizeof (LanInfo); if ((nRetVal = InetSImportLanConnection (LanInfo, lpszFile)) != ERROR_SUCCESS ) { return nRetVal; } if ((nRetVal = InetSSetLanConnection (LanInfo)) != ERROR_SUCCESS ) { return nRetVal; } lpfNeedsRestartLan = TRUE; goto next_step; // skip the RAS processing code.
break; // not reached, of course
} case InetS_LAN1483 : { DWORD nRetVal = 0; RFC1483INFO Rfc1483Info;
memset ( &Rfc1483Info, 0, sizeof (RFC1483INFO) ); Rfc1483Info.dwSize = sizeof ( Rfc1483Info ); // first, we determine the size of the buffer required
// to hold the 1483 settings.
if ((nRetVal = InetSImportRfc1483Connection (Rfc1483Info, lpszFile)) != ERROR_SUCCESS ) { return nRetVal; } // verify that the size has been returned.
if ( !Rfc1483Info.Rfc1483Module.dwRegSettingsBufSize ) { return E_FAIL; } // we create the buffer.
if ( !(Rfc1483Info.Rfc1483Module.lpbRegSettingsBuf = (LPBYTE) malloc ( Rfc1483Info.Rfc1483Module.dwRegSettingsBufSize ) )) { return ERROR_OUTOFMEMORY; } // we call the function again with the correct settings.
if ((nRetVal = InetSImportRfc1483Connection (Rfc1483Info, lpszFile)) != ERROR_SUCCESS ) { free(Rfc1483Info.Rfc1483Module.lpbRegSettingsBuf); return nRetVal; } // we place the imported settings in the registry.
if ((nRetVal = InetSSetRfc1483Connection (Rfc1483Info) ) != ERROR_SUCCESS ) { free(Rfc1483Info.Rfc1483Module.lpbRegSettingsBuf); return nRetVal; } // we clean up.
free(Rfc1483Info.Rfc1483Module.lpbRegSettingsBuf); lpfNeedsRestartLan = TRUE; goto next_step; // skip RAS processing code.
break; // not reached
} case InetS_LANPppoe : { DWORD nRetVal = 0; PPPOEINFO PppoeInfo;
memset ( &PppoeInfo, 0, sizeof (RFC1483INFO) ); PppoeInfo.dwSize = sizeof ( PppoeInfo ); // first, we determine the size of the buffer required
// to hold the 1483 settings.
if ((nRetVal = InetSImportPppoeConnection (PppoeInfo, lpszFile)) != ERROR_SUCCESS ) { return nRetVal; } // verify that the size has been returned.
if ( !PppoeInfo.PppoeModule.dwRegSettingsBufSize ) { return E_FAIL; } // we create the buffer.
if ( !(PppoeInfo.PppoeModule.lpbRegSettingsBuf = (LPBYTE) malloc ( PppoeInfo.PppoeModule.dwRegSettingsBufSize ) )) { return ERROR_OUTOFMEMORY; } // we call the function again with the correct settings.
if ((nRetVal = InetSImportPppoeConnection (PppoeInfo, lpszFile)) != ERROR_SUCCESS ) { free(PppoeInfo.PppoeModule.lpbRegSettingsBuf); return nRetVal; } // we place the imported settings in the registry.
if ((nRetVal = InetSSetPppoeConnection (PppoeInfo) ) != ERROR_SUCCESS ) { free(PppoeInfo.PppoeModule.lpbRegSettingsBuf); return nRetVal; } // we clean up.
free(PppoeInfo.PppoeModule.lpbRegSettingsBuf); lpfNeedsRestartLan = TRUE; goto next_step; // skip RAS processing code.
break; // not reached
} default: break; } dwRet = ImportConnection(lpszFile, pConn, lpDeviceInfo, &dwDeviceInfoSize); if (ERROR_SUCCESS == dwRet) { pRasEntry = &pConn->RasEntry; dwfOptions |= INETCFG_SETASAUTODIAL | INETCFG_INSTALLRNA | INETCFG_INSTALLMODEM; } else if (ERROR_CANNOT_FIND_PHONEBOOK_ENTRY != dwRet) { free (lpDeviceInfo); return dwRet; }
if (!m_bSilentMode && DisplayPassword(lpszFile)) { if (*pConn->szPassword || *pConn->szUserName) { //WCHAR szFmt[128];
//WCHAR szMsg[384];
//LoadString(_Module.GetModuleInstance(), IDS_PASSWORD, szFmt, MAX_CHARS_IN_BUFFER(szFmt));
//wsprintf(szMsg, szFmt, pConn->szUserName, pConn->szPassword);
//::MessageBox(hwnd, szMsg, GetSz(IDS_TITLE), MB_ICONINFORMATION | MB_OK);
} }
if (fHookAutodial && ((0 == *pConn->RasEntry.szAutodialDll) || (0 == *pConn->RasEntry.szAutodialFunc))) { lstrcpy(pConn->RasEntry.szAutodialDll, L"isign32.dll"); lstrcpy(pConn->RasEntry.szAutodialFunc, L"AutoDialLogon"); }
pRasEntry->dwfOptions |= RASEO_ShowDialingProgress;
// humongous hack for ISBU
dwRet = Rnaapi.InetConfigClientEx(hwnd, NULL, pConn->szEntryName, pRasEntry, pConn->szUserName, pConn->szPassword, NULL, NULL, dwfOptions & ~INETCFG_INSTALLMAIL, lpfNeedsRestart, szConnectoidName, dwConnectoidNameSize, lpDeviceInfo, &dwDeviceInfoSize);
if ( lpDeviceInfo ) free (lpDeviceInfo);
LclSetEntryScriptPatch(pRasEntry->szScript, pConn->szEntryName); BOOL fEnabled = TRUE; DWORD dwResult = 0xba; dwResult = InetGetAutodial(&fEnabled, pConn->szEntryName, RAS_MaxEntryName+1); if ((ERROR_SUCCESS == dwRet) && lstrlen(szConnectoidName)) { *lpfConnectoidCreated = (NULL != pRasEntry); PopulateNTAutodialAddress( lpszFile, pConn->szEntryName ); } }
next_step: // If we were successfull in creating the connectiod, then see if the user wants a
// mail client installed
if (ERROR_SUCCESS == dwRet) { // Get the mail client info
if (m_dwDeviceType == InetS_LANCable) { if (!(pClientInfo = (LPINETCLIENTINFO) malloc (sizeof (INETCLIENTINFO)))) { return ERROR_OUTOFMEMORY; } } else { if (!pConn) return ERROR_INVALID_PARAMETER; pClientInfo = (LPINETCLIENTINFO)(((LPBYTE)pConn) + sizeof(ICONNECTION)); } ImportClientInfo(lpszFile, pClientInfo);
// use inet config to install the mail client
dwRet = Rnaapi.InetConfigClientEx(hwnd, NULL, NULL, NULL, NULL, NULL, NULL, pClientInfo, dwfOptions & INETCFG_INSTALLMAIL, lpfNeedsRestart, szConnectoidName, dwConnectoidNameSize);
}
// cleanup
if (m_dwDeviceType == InetS_LANCable) free (pClientInfo); if (pConn) LocalFree(pConn); *lpfNeedsRestart |= lpfNeedsRestartLan; return dwRet; }
//+----------------------------------------------------------------------------
//
// Function: PopulateNTAutodialAddress
//
// Synopsis: Take Internet addresses from INS file and load them into the
// autodial database
//
// Arguments: pszFileName - pointer to INS file name
//
// Returns: Error code (ERROR_SUCCESS == success)
//
// History: 8/29/96 ChrisK Created
//
//-----------------------------------------------------------------------------
#define AUTODIAL_ADDRESS_BUFFER_SIZE 2048
#define AUTODIAL_ADDRESS_SECTION_NAME L"Autodial_Addresses_for_NT"
HRESULT CINSHandler::PopulateNTAutodialAddress(LPCWSTR pszFileName, LPCWSTR pszEntryName) { HRESULT hr = ERROR_SUCCESS; LONG lRC = 0; LPLINETRANSLATECAPS lpcap = NULL; LPLINETRANSLATECAPS lpTemp = NULL; LPLINELOCATIONENTRY lpLE = NULL; RASAUTODIALENTRY* rADE; INT idx = 0; LPWSTR lpszBuffer = NULL; LPWSTR lpszNextAddress = NULL; rADE = NULL;
//RNAAPI *pRnaapi = NULL;
// jmazner 10/8/96 this function is NT specific
if( !IsNT() ) { // TraceMsg(TF_INSHANDLER, L"ISIGNUP: Bypassing PopulateNTAutodialAddress for win95.\r\n");
return( ERROR_SUCCESS ); }
MYASSERT(m_lpfnRasSetAutodialEnable); MYASSERT(m_lpfnRasSetAutodialAddress);
//MYASSERT(pszFileName && pszEntryName);
//dprintf(L"ISIGNUP: PopulateNTAutodialAddress "%s %s.\r\n", pszFileName, pszEntryName);
// TraceMsg(TF_INSHANDLER, pszFileName);
// TraceMsg(TF_INSHANDLER, L", ");
// TraceMsg(TF_INSHANDLER, pszEntryName);
// TraceMsg(TF_INSHANDLER, L".\r\n");
//
// Get list of TAPI locations
//
lpcap = (LPLINETRANSLATECAPS)GlobalAlloc(GPTR, sizeof(LINETRANSLATECAPS)); if (!lpcap) { hr = ERROR_NOT_ENOUGH_MEMORY; goto PopulateNTAutodialAddressExit; } lpcap->dwTotalSize = sizeof(LINETRANSLATECAPS); lRC = lineGetTranslateCaps(0, 0x10004, lpcap); if (SUCCESS == lRC) { lpTemp = (LPLINETRANSLATECAPS)GlobalAlloc(GPTR, lpcap->dwNeededSize); if (!lpTemp) { hr = ERROR_NOT_ENOUGH_MEMORY; goto PopulateNTAutodialAddressExit; } lpTemp->dwTotalSize = lpcap->dwNeededSize; GlobalFree(lpcap); lpcap = (LPLINETRANSLATECAPS)lpTemp; lpTemp = NULL; lRC = lineGetTranslateCaps(0, 0x10004, lpcap); }
if (SUCCESS != lRC) { hr = (HRESULT)lRC; // REVIEW: not real sure about this.
goto PopulateNTAutodialAddressExit; }
//
// Create an array of RASAUTODIALENTRY structs
//
rADE = (RASAUTODIALENTRY*)GlobalAlloc(GPTR, sizeof(RASAUTODIALENTRY)*lpcap->dwNumLocations); if (!rADE) { hr = ERROR_NOT_ENOUGH_MEMORY; goto PopulateNTAutodialAddressExit; }
//
// Enable autodialing for all locations
//
idx = lpcap->dwNumLocations; lpLE = (LPLINELOCATIONENTRY)((DWORD_PTR)lpcap + lpcap->dwLocationListOffset); while (idx) { idx--; m_lpfnRasSetAutodialEnable(lpLE[idx].dwPermanentLocationID, TRUE);
//
// fill in array values
//
rADE[idx].dwSize = sizeof(RASAUTODIALENTRY); rADE[idx].dwDialingLocation = lpLE[idx].dwPermanentLocationID; lstrcpyn(rADE[idx].szEntry, pszEntryName, RAS_MaxEntryName); }
//
// Get list of addresses
//
lpszBuffer = (LPWSTR)GlobalAlloc(GPTR, AUTODIAL_ADDRESS_BUFFER_SIZE * sizeof(WCHAR)); if (!lpszBuffer) { hr = ERROR_NOT_ENOUGH_MEMORY; goto PopulateNTAutodialAddressExit; }
if((AUTODIAL_ADDRESS_BUFFER_SIZE-2) == GetPrivateProfileSection(AUTODIAL_ADDRESS_SECTION_NAME, lpszBuffer, AUTODIAL_ADDRESS_BUFFER_SIZE, pszFileName)) { //AssertSz(0, L"Autodial address section bigger than buffer.\r\n");
hr = ERROR_NOT_ENOUGH_MEMORY; goto PopulateNTAutodialAddressExit; }
//
// Walk list of addresses and set autodialing for each one
//
lpszNextAddress = lpszBuffer; do { lpszNextAddress = MoveToNextAddress(lpszNextAddress); if (!(*lpszNextAddress)) break; // do-while
m_lpfnRasSetAutodialAddress(lpszNextAddress, 0, rADE, sizeof(RASAUTODIALENTRY)*lpcap->dwNumLocations, lpcap->dwNumLocations); lpszNextAddress = lpszNextAddress + lstrlen(lpszNextAddress); } while(1);
PopulateNTAutodialAddressExit: if (lpcap) GlobalFree(lpcap); lpcap = NULL; if (rADE) GlobalFree(rADE); rADE = NULL; if (lpszBuffer) GlobalFree(lpszBuffer); lpszBuffer = NULL; //if( pRnaapi )
// delete pRnaapi;
//pRnaapi = NULL;
return hr; }
//+----------------------------------------------------------------------------
//
// Function: MoveToNextAddress
//
// Synopsis: Given a pointer into the data bufffer, this function will move
// through the buffer until it points to the begining of the next
// address or it reaches the end of the buffer.
//
// Arguements: lpsz - pointer into buffer
//
// Returns: Pointer to the next address, return value will point to NULL
// if there are no more addresses
//
// History: 8/29/96 ChrisK Created
//
//-----------------------------------------------------------------------------
LPWSTR CINSHandler::MoveToNextAddress(LPWSTR lpsz) { BOOL fLastCharWasNULL = FALSE;
//assertSz(lpsz, L"MoveToNextAddress: NULL input\r\n");
//
// Look for an = sign
//
do { if (fLastCharWasNULL && L'\0' == *lpsz) break; // are we at the end of the data?
if (L'\0' == *lpsz) fLastCharWasNULL = TRUE; else fLastCharWasNULL = FALSE;
if (L'=' == *lpsz) break;
if (*lpsz) lpsz = CharNext(lpsz); else lpsz += BYTES_REQUIRED_BY_CCH(1); } while (1);
//
// Move to the first character beyond the = sign.
//
if (*lpsz) lpsz = CharNext(lpsz);
return lpsz; }
//+----------------------------------------------------------------------------
//
// Function: ImportCustomDialer
//
// Synopsis: Import custom dialer information from the specified file
// and save the information in the RASENTRY
//
// Arguments: lpRasEntry - pointer to a valid RASENTRY structure
// szFileName - text file (in .ini file format) containing the
// Custom Dialer information
//
// Returns: ERROR_SUCCESS - success otherwise a Win32 error
//
// History: ChrisK Created 7/11/96
// 8/12/96 ChrisK Ported from \\trango
//
//-----------------------------------------------------------------------------
DWORD CINSHandler::ImportCustomDialer(LPRASENTRY lpRasEntry, LPCWSTR szFileName) {
// If there is an error reading the information from the file, or the entry
// missing or blank, the default value (cszNull) will be used.
GetPrivateProfileString(cszCustomDialerSection, cszAutoDialDLL, cszNull, lpRasEntry->szAutodialDll, MAX_CHARS_IN_BUFFER(lpRasEntry->szAutodialDll), szFileName);
GetPrivateProfileString(cszCustomDialerSection, cszAutoDialFunc, cszNull, lpRasEntry->szAutodialFunc, MAX_CHARS_IN_BUFFER(lpRasEntry->szAutodialFunc), szFileName);
return ERROR_SUCCESS; }
//****************************************************************************
// DWORD NEAR PASCAL StrToip (LPWSTR szIPAddress, LPDWORD lpdwAddr)
//
// This function converts a IP address string to an IP address structure.
//
// History:
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
// Cloned from SMMSCRPT.
//****************************************************************************
LPCWSTR CINSHandler::StrToSubip (LPCWSTR szIPAddress, LPBYTE pVal) { LPCWSTR pszIP = szIPAddress; BYTE val = 0;
// skip separators (non digits)
while (*pszIP && !myisdigit(*pszIP)) { ++pszIP; }
while (myisdigit(*pszIP)) { val = (val * 10) + (BYTE)(*pszIP - L'0'); ++pszIP; }
*pVal = val;
return pszIP; }
DWORD CINSHandler::StrToip (LPCWSTR szIPAddress, RASIPADDR *ipAddr) { LPCWSTR pszIP = szIPAddress;
pszIP = StrToSubip(pszIP, &ipAddr->a); pszIP = StrToSubip(pszIP, &ipAddr->b); pszIP = StrToSubip(pszIP, &ipAddr->c); pszIP = StrToSubip(pszIP, &ipAddr->d);
return ERROR_SUCCESS; }
//****************************************************************************
// DWORD NEAR PASCAL ImportPhoneInfo(PPHONENUM ppn, LPCWSTR szFileName)
//
// This function imports the phone number.
//
// History:
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
DWORD CINSHandler::ImportPhoneInfo(LPRASENTRY lpRasEntry, LPCWSTR szFileName) { WCHAR szYesNo[MAXNAME];
if (GetPrivateProfileString(cszPhoneSection, cszPhone, cszNull, lpRasEntry->szLocalPhoneNumber, MAX_CHARS_IN_BUFFER(lpRasEntry->szLocalPhoneNumber), szFileName) == 0) { return ERROR_BAD_PHONE_NUMBER; }
lpRasEntry->dwfOptions &= ~RASEO_UseCountryAndAreaCodes;
GetPrivateProfileString(cszPhoneSection, cszDialAsIs, cszNo, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName);
// Do we have to get country code and area code?
if (!lstrcmpi(szYesNo, cszNo)) {
// If we cannot get the country ID or it is zero, default to dial as is
//
if ((lpRasEntry->dwCountryID = GetPrivateProfileInt(cszPhoneSection, cszCountryID, 0, szFileName)) != 0) { lpRasEntry->dwCountryCode = GetPrivateProfileInt(cszPhoneSection, cszCountryCode, 1, szFileName);
GetPrivateProfileString(cszPhoneSection, cszAreaCode, cszNull, lpRasEntry->szAreaCode, MAX_CHARS_IN_BUFFER(lpRasEntry->szAreaCode), szFileName);
lpRasEntry->dwfOptions |= RASEO_UseCountryAndAreaCodes;
} } else { // bug in RasSetEntryProperties still checks area codes
// even when RASEO_UseCountryAndAreaCodes is not set
lstrcpy(lpRasEntry->szAreaCode, L"805"); lpRasEntry->dwCountryID = 1; lpRasEntry->dwCountryCode = 1; } return ERROR_SUCCESS; }
//****************************************************************************
// DWORD NEAR PASCAL ImportServerInfo(PSMMINFO psmmi, LPWSTR szFileName)
//
// This function imports the server type name and settings.
//
// History:
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
DWORD CINSHandler::ImportServerInfo(LPRASENTRY lpRasEntry, LPCWSTR szFileName) { WCHAR szYesNo[MAXNAME]; WCHAR szType[MAXNAME]; DWORD i;
// Get the server type name
GetPrivateProfileString(cszServerSection, cszServerType, cszNull, szType, MAX_CHARS_IN_BUFFER(szType), szFileName);
// need to convert the string into
// one of the following values
// RASFP_Ppp
// RASFP_Slip Note CSLIP is SLIP with IP compression on
// RASFP_Ras
for (i = 0; i < NUM_SERVER_TYPES; ++i) { if (!lstrcmpi(aServerTypes[i].szType, szType)) { lpRasEntry->dwFramingProtocol = aServerTypes[i].dwType; lpRasEntry->dwfOptions |= aServerTypes[i].dwfOptions; break; } }
// Get the server type settings
if (GetPrivateProfileString(cszServerSection, cszSWCompress, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_SwCompression; } else { lpRasEntry->dwfOptions |= RASEO_SwCompression; } }
if (GetPrivateProfileString(cszServerSection, cszPWEncrypt, cszNull, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_RequireEncryptedPw; } else { lpRasEntry->dwfOptions |= RASEO_RequireEncryptedPw; } }
if (GetPrivateProfileString(cszServerSection, cszNetLogon, cszNo, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_NetworkLogon; } else { lpRasEntry->dwfOptions |= RASEO_NetworkLogon; } }
if (GetPrivateProfileString(cszServerSection, cszSWEncrypt, cszNo, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_RequireDataEncryption; } else { lpRasEntry->dwfOptions |= RASEO_RequireDataEncryption; } }
// Get the protocol settings
if (GetPrivateProfileString(cszServerSection, cszNetBEUI, cszNo, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfNetProtocols &= ~RASNP_NetBEUI; } else { lpRasEntry->dwfNetProtocols |= RASNP_NetBEUI; } }
if (GetPrivateProfileString(cszServerSection, cszIPX, cszNo, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfNetProtocols &= ~RASNP_Ipx; } else { lpRasEntry->dwfNetProtocols |= RASNP_Ipx; } }
if (GetPrivateProfileString(cszServerSection, cszIP, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfNetProtocols &= ~RASNP_Ip; } else { lpRasEntry->dwfNetProtocols |= RASNP_Ip; } }
if (GetPrivateProfileString(cszServerSection, cszDisableLcp, cszNull, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { lpRasEntry->dwfOptions |= RASEO_DisableLcpExtensions; } else { lpRasEntry->dwfOptions &= ~RASEO_DisableLcpExtensions; } }
return ERROR_SUCCESS; }
//****************************************************************************
// DWORD NEAR PASCAL ImportIPInfo(LPWSTR szEntryName, LPWSTR szFileName)
//
// This function imports the TCP/IP information
//
// History:
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
DWORD CINSHandler::ImportIPInfo(LPRASENTRY lpRasEntry, LPCWSTR szFileName) { WCHAR szIPAddr[MAXIPADDRLEN]; WCHAR szYesNo[MAXNAME];
// Import IP address information
if (GetPrivateProfileString(cszIPSection, cszIPSpec, cszNo, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { // The import file has IP address specified, get the IP address
lpRasEntry->dwfOptions |= RASEO_SpecificIpAddr; if (GetPrivateProfileString(cszIPSection, cszIPAddress, cszNull, szIPAddr, MAX_CHARS_IN_BUFFER(szIPAddr), szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddr); } } else { lpRasEntry->dwfOptions &= ~RASEO_SpecificIpAddr; } }
// Import Server address information
if (GetPrivateProfileString(cszIPSection, cszServerSpec, cszNo, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { // The import file has server address specified, get the server address
lpRasEntry->dwfOptions |= RASEO_SpecificNameServers; if (GetPrivateProfileString(cszIPSection, cszDNSAddress, cszNull, szIPAddr, MAX_CHARS_IN_BUFFER(szIPAddr), szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddrDns); }
if (GetPrivateProfileString(cszIPSection, cszDNSAltAddress, cszNull, szIPAddr, MAX_CHARS_IN_BUFFER(szIPAddr), szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddrDnsAlt); }
if (GetPrivateProfileString(cszIPSection, cszWINSAddress, cszNull, szIPAddr, MAX_CHARS_IN_BUFFER(szIPAddr), szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddrWins); }
if (GetPrivateProfileString(cszIPSection, cszWINSAltAddress, cszNull, szIPAddr, MAX_CHARS_IN_BUFFER(szIPAddr), szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddrWinsAlt); } } else { lpRasEntry->dwfOptions &= ~RASEO_SpecificNameServers; } }
// Header compression and the gateway settings
if (GetPrivateProfileString(cszIPSection, cszIPCompress, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_IpHeaderCompression; } else { lpRasEntry->dwfOptions |= RASEO_IpHeaderCompression; } }
if (GetPrivateProfileString(cszIPSection, cszWanPri, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_RemoteDefaultGateway; } else { lpRasEntry->dwfOptions |= RASEO_RemoteDefaultGateway; } } return ERROR_SUCCESS; }
DWORD CINSHandler::ImportScriptFile( LPCWSTR lpszImportFile, LPWSTR szScriptFile, UINT cbScriptFile) { WCHAR szTemp[_MAX_PATH]; DWORD dwRet = ERROR_SUCCESS;
// Get the script filename
//
if (GetPrivateProfileString(cszScriptingSection, cszScriptName, cszNull, szTemp, MAX_CHARS_IN_BUFFER(szTemp), lpszImportFile) != 0) {
//!!! commonize this code
//!!! make it DBCS compatible
//!!! check for overruns
//!!! check for absolute path name
GetWindowsDirectory(szScriptFile, cbScriptFile); if (*CharPrev(szScriptFile, szScriptFile + lstrlen(szScriptFile)) != L'\\') { lstrcat(szScriptFile, L"\\"); } lstrcat(szScriptFile, szTemp);
dwRet =ImportFile(lpszImportFile, cszScriptSection, szScriptFile); }
return dwRet; }
//****************************************************************************
// DWORD WINAPI RnaValidateImportEntry (LPWSTR)
//
// This function is called to validate an importable file
//
// History:
// Wed 03-Jan-1996 09:45:01 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
DWORD CINSHandler::RnaValidateImportEntry (LPCWSTR szFileName) { WCHAR szTmp[4];
// Get the alias entry name
//
// 12/4/96 jmazner Normandy #12373
// If no such key, don't return ERROR_INVALID_PHONEBOOK_ENTRY,
// since ConfigureClient always ignores that error code.
return (GetPrivateProfileString(cszEntrySection, cszEntry_Name, cszNull, szTmp, MAX_CHARS_IN_BUFFER(szTmp), szFileName) > 0 ? ERROR_SUCCESS : ERROR_UNKNOWN); }
DWORD CINSHandler::ImportRasEntry (LPCWSTR szFileName, LPRASENTRY lpRasEntry, LPBYTE & lpDeviceInfo, LPDWORD lpdwDeviceInfoSize) { DWORD dwRet;
dwRet = ImportPhoneInfo(lpRasEntry, szFileName); if (ERROR_SUCCESS == dwRet) { // Get device type
//
GetPrivateProfileString(cszDeviceSection, cszDeviceType, cszNull, lpRasEntry->szDeviceType, MAX_CHARS_IN_BUFFER(lpRasEntry->szDeviceType), szFileName);
// Get Server Type settings
//
dwRet = ImportServerInfo(lpRasEntry, szFileName); if (ERROR_SUCCESS == dwRet) { // Get IP address
//
dwRet = ImportIPInfo(lpRasEntry, szFileName); } if ( (ERROR_SUCCESS == dwRet) && (m_dwDeviceType == InetS_RASAtm) ) { // Get ATM-Specific Information
//
dwRet = ImportAtmInfo(lpRasEntry, szFileName, lpDeviceInfo, lpdwDeviceInfoSize); } }
return dwRet; }
//****************************************************************************
// DWORD ImportATMInfo (LPRASENTRY, LPCWSTR, LPBYTE, LPDWORD)
//
// This function is called to import ATM Information into a buffer.
// Note: Memory is allocated in this function to accomodate ATM data.
// This memory can be deallocated using delete.
//
// History:
// Mon 1-Nov-1999 11:27:02 -by- Thomas Jeyaseelan [thomasje]
// Created.
//****************************************************************************
DWORD CINSHandler::ImportAtmInfo (LPRASENTRY lpRasEntry, LPCWSTR cszFileName, LPBYTE & lpDeviceInfo, LPDWORD lpdwDeviceInfoSize) { // Error handling. Make sure that lpDeviceInfo = 0 and lpdwDeviceInfo != 0
// and lpdwDeviceInfo points to a DWORD that is assigned a value of 0.
DWORD dwRet = ERROR_SUCCESS; // <== investigate correct return value for failure
if ( lpDeviceInfo && lpdwDeviceInfoSize && (*lpdwDeviceInfoSize == sizeof (ATMPBCONFIG) ) ) { // Creating the ATM Buffer. Note that memory is allocated on the heap.
// This memory must be carefully deallocated in one of the caller routines.
LPATMPBCONFIG lpAtmConfig = (LPATMPBCONFIG) lpDeviceInfo; DWORD dwCircuitSpeed = 0; DWORD dwCircuitQOS = 0; DWORD dwCircuitType = 0; WCHAR szYesNo [MAXNAME]; // for Speed_Adjust, QOS_Adjust, Vendor_Config, Show_Status and Enable_Log.
DWORD dwEncapsulation = 0; DWORD dwVpi = 0; DWORD dwVci = 0;
dwCircuitSpeed = GetPrivateProfileInt (cszATMSection, cszCircuitSpeed, dwCircuitSpeed, cszFileName); switch (dwCircuitSpeed) { case 0: lpAtmConfig->dwCircuitSpeed = ATM_CIRCUIT_SPEED_LINE_RATE; break; case 1: lpAtmConfig->dwCircuitSpeed = ATM_CIRCUIT_SPEED_USER_SPEC; break; case 512: lpAtmConfig->dwCircuitSpeed = ATM_CIRCUIT_SPEED_512KB; break; case 1536: lpAtmConfig->dwCircuitSpeed = ATM_CIRCUIT_SPEED_1536KB; break; case 25000: lpAtmConfig->dwCircuitSpeed = ATM_CIRCUIT_SPEED_25MB; break; case 155000: lpAtmConfig->dwCircuitSpeed = ATM_CIRCUIT_SPEED_155MB; break; default: lpAtmConfig->dwCircuitSpeed = ATM_CIRCUIT_SPEED_DEFAULT; break; } lpAtmConfig->dwCircuitOpt |= lpAtmConfig->dwCircuitSpeed;
dwCircuitQOS = GetPrivateProfileInt (cszATMSection, cszCircuitQOS, dwCircuitQOS, cszFileName); switch (dwCircuitQOS) { case 0: lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_QOS_UBR; break; case 1: lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_QOS_VBR; break; case 2: lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_QOS_CBR; break; case 3: lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_QOS_ABR; break; default: lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_QOS_DEFAULT; break; } dwCircuitType = GetPrivateProfileInt (cszATMSection, cszCircuitType, dwCircuitType, cszFileName); switch (dwCircuitType) { case 0: lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_OPT_SVC; break; case 1: lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_OPT_PVC; break; default: lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_OPT_SVC; break; } dwEncapsulation = GetPrivateProfileInt (cszATMSection, cszEncapsulation, dwEncapsulation, cszFileName); switch (dwEncapsulation) { case 0: lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_ENCAP_NULL; break; case 1: lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_ENCAP_LLC; break; default: lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_ENCAP_DEFAULT; break; } dwVpi = GetPrivateProfileInt (cszATMSection, cszVPI, dwVpi, cszFileName); lpAtmConfig->wPvcVpi = (WORD) dwVpi; dwVci = GetPrivateProfileInt (cszATMSection, cszVCI, dwVci, cszFileName); lpAtmConfig->wPvcVci = (WORD) dwVci;
// Speed_Adjust
if (GetPrivateProfileString(cszATMSection, cszSpeedAdjust, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), cszFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_OPT_SPEED_ADJUST; } else { lpAtmConfig->dwCircuitOpt &= ~ATM_CIRCUIT_OPT_SPEED_ADJUST; } } else { // if this field is not correctly specified, we use the default settings
// as specified in the ATMCFG header file.
lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_OPT_SPEED_ADJUST; }
// QOS_Adjust
if (GetPrivateProfileString(cszATMSection, cszQOSAdjust, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), cszFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_OPT_QOS_ADJUST; } else { lpAtmConfig->dwCircuitOpt &= ~ATM_CIRCUIT_OPT_QOS_ADJUST; } } else { lpAtmConfig->dwCircuitOpt |= ATM_CIRCUIT_OPT_QOS_ADJUST; }
// Vendor_Config
if (GetPrivateProfileString(cszATMSection, cszVendorConfig, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), cszFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { lpAtmConfig->dwGeneralOpt |= ATM_GENERAL_OPT_VENDOR_CONFIG; } else { lpAtmConfig->dwGeneralOpt &= ~ATM_GENERAL_OPT_VENDOR_CONFIG; } } else { lpAtmConfig->dwGeneralOpt &= ~ATM_GENERAL_OPT_VENDOR_CONFIG; }
// Show_Status
if (GetPrivateProfileString(cszATMSection, cszShowStatus, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), cszFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { lpAtmConfig->dwGeneralOpt |= ATM_GENERAL_OPT_SHOW_STATUS; } else { lpAtmConfig->dwGeneralOpt &= ~ATM_GENERAL_OPT_SHOW_STATUS; } } else { lpAtmConfig->dwGeneralOpt &= ~ATM_GENERAL_OPT_SHOW_STATUS; }
// Enable_Log
if (GetPrivateProfileString(cszATMSection, cszEnableLog, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), cszFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { lpAtmConfig->dwGeneralOpt |= ATM_GENERAL_OPT_ENABLE_LOG; } else { lpAtmConfig->dwGeneralOpt &= ~ATM_GENERAL_OPT_ENABLE_LOG; } } else { lpAtmConfig->dwGeneralOpt &= ~ATM_GENERAL_OPT_ENABLE_LOG; }
} else dwRet = ERROR_CANCELLED;
return dwRet; // note that lpDeviceInfo now points to a buffer. also, *lpdwDeviceInfoSize > 0.
}
//****************************************************************************
// DWORD WINAPI RnaImportEntry (LPWSTR, LPBYTE, DWORD)
//
// This function is called to import an entry from a specified file
//
// History:
// Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
DWORD CINSHandler::ImportConnection (LPCWSTR szFileName, LPICONNECTION lpConn, LPBYTE & lpDeviceInfo, LPDWORD lpdwDeviceInfoSize) { DWORD dwRet;
lpConn->RasEntry.dwSize = sizeof(RASENTRY);
dwRet = RnaValidateImportEntry(szFileName); if (ERROR_SUCCESS != dwRet) { return dwRet; }
GetPrivateProfileString(cszEntrySection, cszEntry_Name, cszNull, lpConn->szEntryName, MAX_CHARS_IN_BUFFER(lpConn->szEntryName), szFileName);
GetPrivateProfileString(cszUserSection, cszUserName, cszNull, lpConn->szUserName, MAX_CHARS_IN_BUFFER(lpConn->szUserName), szFileName);
GetPrivateProfileString(cszUserSection, cszPassword, cszNull, lpConn->szPassword, MAX_CHARS_IN_BUFFER(lpConn->szPassword), szFileName);
// thomasje - We are no longer dealing with only RAS.
// There are two types of connections. One is RAS
// and the other is Ethernet. By exmining the device type
// we will call the correct engine to handle the matter.
dwRet = ImportRasEntry(szFileName, &lpConn->RasEntry, lpDeviceInfo, lpdwDeviceInfoSize); if (ERROR_SUCCESS == dwRet) { dwRet = ImportCustomDialer(&lpConn->RasEntry, szFileName); }
if (ERROR_SUCCESS == dwRet) { // Import the script file
//
dwRet = ImportScriptFile(szFileName, lpConn->RasEntry.szScript, MAX_CHARS_IN_BUFFER(lpConn->RasEntry.szScript)); }
// Use an ISPImport object to Config The ras device
CISPImport ISPImport;
ISPImport.set_hWndMain(GetActiveWindow()); dwRet = ISPImport.ConfigRasEntryDevice(&lpConn->RasEntry); switch( dwRet ) { case ERROR_SUCCESS: break; case ERROR_CANCELLED: /*
if(!m_bSilentMode) InfoMsg1(NULL, IDS_SIGNUPCANCELLED, NULL); */ // Fall through
default: goto ImportConnectionExit; } ImportConnectionExit: return dwRet; }
// Prototype for acct manager entry point we want
typedef HRESULT (WINAPI *PFNCREATEACCOUNTSFROMFILEEX)(LPSTR szFile, CONNECTINFO *pCI, DWORD dwFlags);
// Regkeys for Acct manager
#define ACCTMGR_PATHKEY L"SOFTWARE\\Microsoft\\Internet Account Manager"
#define ACCTMGR_DLLPATH L"DllPath"
// ############################################################################
//
// Name: ImportMailAndNewsInfo
//
// Description: Import information from INS file and set the associated
// registry keys for Internet Mail and News (Athena)
//
// Input: lpszFile - Fully qualified filename of INS file
//
// Return: Error value
//
// History: 6/27/96 Created
//
// ############################################################################
DWORD CINSHandler::ImportMailAndNewsInfo(LPCWSTR lpszFile, BOOL fConnectPhone) { USES_CONVERSION; DWORD dwRet = ERROR_SUCCESS;
WCHAR szAcctMgrPath[MAX_PATH + 1] = L""; WCHAR szExpandedPath[MAX_PATH + 1] = L""; DWORD dwAcctMgrPathSize = 0; HRESULT hr = S_OK; HKEY hKey = NULL; HINSTANCE hInst = NULL; CONNECTINFO connectInfo; WCHAR szConnectoidName[RAS_MaxEntryName] = L"nogood\0"; PFNCREATEACCOUNTSFROMFILEEX fp = NULL;
// get path to the AcctMgr dll
dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ACCTMGR_PATHKEY, 0, KEY_READ, &hKey); if ( (dwRet != ERROR_SUCCESS) || (NULL == hKey) ) { // TraceMsg(TF_INSHANDLER, L"ImportMailAndNewsInfo couldn't open reg key %s\n", ACCTMGR_PATHKEY);
return( dwRet ); }
dwAcctMgrPathSize = sizeof (szAcctMgrPath); dwRet = RegQueryValueEx(hKey, ACCTMGR_DLLPATH, NULL, NULL, (LPBYTE) szAcctMgrPath, &dwAcctMgrPathSize);
RegCloseKey( hKey );
if ( dwRet != ERROR_SUCCESS ) { // TraceMsg(TF_INSHANDLER, L"ImportMailAndNewsInfo: RegQuery failed with error %d\n", dwRet);
return( dwRet ); }
// 6/18/97 jmazner Olympus #6819
// TraceMsg(TF_INSHANDLER, L"ImportMailAndNewsInfo: read in DllPath of %s\n", szAcctMgrPath);
ExpandEnvironmentStrings( szAcctMgrPath, szExpandedPath, MAX_CHARS_IN_BUFFER(szExpandedPath) );
//
// 6/4/97 jmazner
// if we created a connectoid, then get its name and use that as the
// connection type. Otherwise, assume we're supposed to connect via LAN
//
connectInfo.cbSize = sizeof(CONNECTINFO); connectInfo.type = CONNECT_LAN;
if( fConnectPhone ) { BOOL fEnabled = FALSE;
dwRet = InetGetAutodial(&fEnabled, szConnectoidName, RAS_MaxEntryName);
if( ERROR_SUCCESS==dwRet && szConnectoidName[0] ) { connectInfo.type = CONNECT_RAS; lstrcpyn( connectInfo.szConnectoid, szConnectoidName, MAX_CHARS_IN_BUFFER(connectInfo.szConnectoid) ); // TraceMsg(TF_INSHANDLER, L"ImportMailAndNewsInfo: setting connection type to RAS with %s\n", szConnectoidName);
} }
if( CONNECT_LAN == connectInfo.type ) { // TraceMsg(TF_INSHANDLER, L"ImportMailAndNewsInfo: setting connection type to LAN\n");
lstrcpy( connectInfo.szConnectoid, L"I said CONNECT_LAN!" ); }
hInst = LoadLibrary(szExpandedPath); if (hInst) { fp = (PFNCREATEACCOUNTSFROMFILEEX) GetProcAddress(hInst, "CreateAccountsFromFileEx"); if (fp) hr = fp( W2A(lpszFile), &connectInfo, NULL ); } else { // TraceMsg(TF_INSHANDLER, L"ImportMailAndNewsInfo unable to LoadLibrary on %s\n", szAcctMgrPath);
}
//
// Clean up and release resourecs
//
if( hInst) { FreeLibrary(hInst); hInst = NULL; }
if( fp ) { fp = NULL; }
return dwRet; }
// ############################################################################
//
// Name: WriteMailAndNewsKey
//
// Description: Read a string value from the given INS file and write it
// to the registry
//
// Input: hKey - Registry key where the data will be written
// lpszSection - Section name inside of INS file where data is read
// from
// lpszValue - Name of value to read from INS file
// lpszBuff - buffer where data will be read into
// dwBuffLen - size of lpszBuff
// lpszSubKey - Value name where information will be written to
// dwType - data type (Should always be REG_SZ)
// lpszFileName - Fully qualified filename to INS file
//
// Return: Error value
//
// Histroy: 6/27/96 Created
//
// ############################################################################
HRESULT CINSHandler::WriteMailAndNewsKey(HKEY hKey, LPCWSTR lpszSection, LPCWSTR lpszValue, LPWSTR lpszBuff, DWORD dwBuffLen, LPCWSTR lpszSubKey, DWORD dwType, LPCWSTR lpszFile) { ZeroMemory(lpszBuff, dwBuffLen); GetPrivateProfileString(lpszSection, lpszValue, L"", lpszBuff, dwBuffLen, lpszFile); if (lstrlen(lpszBuff)) { return RegSetValueEx(hKey, lpszSubKey, 0, dwType, (CONST BYTE*)lpszBuff, BYTES_REQUIRED_BY_SZ(lpszBuff)); } else { // TraceMsg(TF_INSHANDLER, L"ISIGNUP: WriteMailAndNewsKey, missing value in INS file\n");
return ERROR_NO_MORE_ITEMS; } }
// ############################################################################
//
// Name: PreparePassword
//
// Description: Encode given password and return value in place. The
// encoding is done right to left in order to avoid having
// to allocate a copy of the data. The encoding uses base64
// standard as specified in RFC 1341 5.2
//
// Input: szBuff - Null terminated data to be encoded
// dwBuffLen - Full length of buffer, this should exceed the length of
// the input data by at least 1/3
//
// Return: Error value
//
// Histroy: 6/27/96 Created
//
// ############################################################################
HRESULT CINSHandler::PreparePassword(LPWSTR szBuff, DWORD dwBuffLen) { DWORD dwX; LPWSTR szOut = NULL; LPWSTR szNext = NULL; HRESULT hr = ERROR_SUCCESS; BYTE bTemp = 0; DWORD dwLen = 0;
dwLen = lstrlen(szBuff); if (!dwLen) { hr = ERROR_INVALID_PARAMETER; goto PreparePasswordExit; }
// Calculate the size of the buffer that will be needed to hold
// encoded data
//
szNext = &szBuff[dwLen-1]; dwLen = (((dwLen % 3 ? (3-(dwLen%3)):0) + dwLen) * 4 / 3);
if (dwBuffLen < dwLen+1) { hr = ERROR_INVALID_PARAMETER; goto PreparePasswordExit; }
szOut = &szBuff[dwLen]; *szOut-- = L'\0';
// Add padding = characters
//
switch (lstrlen(szBuff) % 3) { case 0: // no padding
break; case 1: *szOut-- = 64; *szOut-- = 64; *szOut-- = (*szNext & 0x3) << 4; *szOut-- = (*szNext-- & 0xFC) >> 2; break; case 2: *szOut-- = 64; *szOut-- = (*szNext & 0xF) << 2; *szOut = ((*szNext-- & 0xF0) >> 4); *szOut-- |= ((*szNext & 0x3) << 4); *szOut-- = (*szNext-- & 0xFC) >> 2; }
// Encrypt data into indicies
//
while (szOut > szNext && szNext >= szBuff) { *szOut-- = *szNext & 0x3F; *szOut = ((*szNext-- & 0xC0) >> 6); *szOut-- |= ((*szNext & 0xF) << 2); *szOut = ((*szNext-- & 0xF0) >> 4); *szOut-- |= ((*szNext & 0x3) << 4); *szOut-- = (*szNext-- & 0xFC) >> 2; }
// Translate indicies into printable characters
//
szNext = szBuff;
// BUG OSR#10435--if there is a 0 in the generated string of base-64
// encoded digits (this can happen if the password is "Willypassword"
// for example), then instead of encoding the 0 to 'A', we just quit
// at this point, produces an invalid base-64 string.
for(dwX=0; dwX < dwLen; dwX++) *szNext = arBase64[*szNext++];
PreparePasswordExit: return hr; }
// ############################################################################
//
// Name: FIsAthenaPresent
//
// Description: Determine if Microsoft Internet Mail And News client (Athena)
// is installed
//
// Input: none
//
// Return: TRUE - Athena is installed
// FALSE - Athena is NOT installed
//
// History: 7/1/96 Created
//
// ############################################################################
BOOL CINSHandler::FIsAthenaPresent() { WCHAR szBuff[MAX_PATH + 1]; HRESULT hr = ERROR_SUCCESS; HINSTANCE hInst = NULL; DWORD dwLen = 0; DWORD dwType = REG_SZ; // Get path to Athena client
//
dwLen = MAX_PATH; hr = RegQueryValueEx(HKEY_CLASSES_ROOT, MAIL_NEWS_INPROC_SERVER32, NULL, &dwType, (LPBYTE) szBuff, &dwLen); if (hr == ERROR_SUCCESS) { // Attempt to load client
//
hInst = LoadLibrary(szBuff); if (!hInst) { // TraceMsg(TF_INSHANDLER, L"ISIGNUP: Internet Mail and News server didn't load.\n");
hr = ERROR_FILE_NOT_FOUND; } else { FreeLibrary(hInst); } hInst = NULL; }
return (hr == ERROR_SUCCESS); }
// ############################################################################
//
// Name: FTurnOffBrowserDefaultChecking
//
// Description: Turn Off IE checking to see if it is the default browser
//
// Input: none
//
// Output: TRUE - success
// FALSE - failed
//
// History: 7/2/96 Created
//
// ############################################################################
BOOL CINSHandler::FTurnOffBrowserDefaultChecking() { HKEY hKey = NULL; DWORD dwType = 0; DWORD dwSize = 0; BOOL bRC = TRUE;
//
// Open IE settings registry key
//
if (RegOpenKey(HKEY_CURRENT_USER, cszDEFAULT_BROWSER_KEY, &hKey)) { bRC = FALSE; goto FTurnOffBrowserDefaultCheckingExit; }
//
// Read current settings for check associations
//
dwType = 0; dwSize = sizeof(m_szCheckAssociations); ZeroMemory(m_szCheckAssociations, dwSize); RegQueryValueEx(hKey, cszDEFAULT_BROWSER_VALUE, 0, &dwType, (LPBYTE)m_szCheckAssociations, &dwSize); // ignore return value, even if the calls fails we are going to try
// to change the setting to "NO"
//
// Set value to "no" to turn off checking
//
if (RegSetValueEx(hKey, cszDEFAULT_BROWSER_VALUE, 0, REG_SZ, (LPBYTE)cszNo, BYTES_REQUIRED_BY_SZ(cszNo))) { bRC = FALSE; goto FTurnOffBrowserDefaultCheckingExit; }
//
// Clean up and return
//
FTurnOffBrowserDefaultCheckingExit: if (hKey) RegCloseKey(hKey); if (bRC) m_fResforeDefCheck = TRUE; hKey = NULL; return bRC; }
// ############################################################################
//
// Name: FRestoreBrowserDefaultChecking
//
// Description: Restore IE checking to see if it is the default browser
//
// Input: none
//
// Output: TRUE - success
// FALSE - failed
//
// History: 7/2/96 Created
//
// ############################################################################
BOOL CINSHandler::FRestoreBrowserDefaultChecking() { HKEY hKey = NULL; BOOL bRC = TRUE;
//
// Open IE settings registry key
//
if (RegOpenKey(HKEY_CURRENT_USER, cszDEFAULT_BROWSER_KEY, &hKey)) { bRC = FALSE; goto FRestoreBrowserDefaultCheckingExit; }
//
// Set value to original value
//
if (RegSetValueEx(hKey, cszDEFAULT_BROWSER_VALUE, 0, REG_SZ, (LPBYTE)m_szCheckAssociations, BYTES_REQUIRED_BY_SZ(m_szCheckAssociations))) { bRC = FALSE; goto FRestoreBrowserDefaultCheckingExit; }
FRestoreBrowserDefaultCheckingExit: if (hKey) RegCloseKey(hKey); hKey = NULL; return bRC; }
// This is the main entry point for processing an INS file.
// DJM: BUGBUG: TODO: Need to pass in branding flags
HRESULT CINSHandler::ProcessINS( LPCWSTR lpszFile, LPWSTR lpszConnectoidName, BOOL * pbRetVal ) {
BOOL fConnectoidCreated = FALSE; BOOL fClientSetup = FALSE; BOOL bKeepConnection = FALSE; BOOL fErrMsgShown = FALSE; HRESULT hr = E_FAIL; LPRASENTRY lpRasEntry = NULL; WCHAR szTemp[3] = L"\0"; WCHAR szConnectoidName[RAS_MaxEntryName] = L"";
if (NULL == lpszFile || NULL == lpszConnectoidName || NULL == pbRetVal ) { MYASSERT(FALSE); return E_INVALIDARG; }
*pbRetVal = FALSE;
// The Connection has not been killed yet
m_fConnectionKilled = FALSE; m_fNeedsRestart = FALSE;
MYASSERT(NULL != lpszFile);
if (0xFFFFFFFF == GetFileAttributes(lpszFile)) { return E_FAIL; }
do { // Make sure we can load the necessary extern support functions
if (!LoadExternalFunctions()) break;
// Convert EOL chars in the passed file.
if (FAILED(MassageFile(lpszFile))) { break; } if(GetPrivateProfileString(cszURLSection, cszStartURL, szNull, m_szStartURL, MAX_CHARS_IN_BUFFER(m_szStartURL), lpszFile) == 0) { m_szStartURL[0] = L'\0'; }
if (GetPrivateProfileString(cszEntrySection, cszCancel, szNull, szTemp, MAX_CHARS_IN_BUFFER(szTemp), lpszFile) != 0) { // We do not want to process a CANCEL.INS file
// here.
break; }
// See if this INS has a client setup section
if (GetPrivateProfileSection(cszClientSetupSection, szTemp, MAX_CHARS_IN_BUFFER(szTemp), lpszFile) != 0) fClientSetup = TRUE;
// Process the trial reminder section, if it exists. this needs to be
// done BEFORE we allow the connection to be closed
//
// VYUNG 2/25/99 ReminderApp not supported by OOBE.
// Ask WJPARK for more questions
/*
if (ConfigureTrialReminder(lpszFile)) { // We configured a trial, so we need to launch the remind app now
SHELLEXECUTEINFO sei;
sei.cbSize = sizeof(sei); sei.fMask = SEE_MASK_NOCLOSEPROCESS; sei.hwnd = NULL; sei.lpVerb = cszOpen; sei.lpFile = cszReminderApp; sei.lpParameters = cszReminderParams; sei.lpDirectory = NULL; sei.nShow = SW_SHOWNORMAL; sei.hInstApp = NULL; // Optional members
sei.hProcess = NULL;
ShellExecuteEx(&sei); }*/
// Check to see if we should keep the connection open. The custom section
// might want this for processing stuff
if (!fClientSetup && !KeepConnection(lpszFile)) { // Kill the connection
gpCommMgr->m_pRefDial->DoHangup(); m_fConnectionKilled = TRUE; }
// Import the Custom Info
ImportCustomInfo(lpszFile, m_szRunExecutable, MAX_CHARS_IN_BUFFER(m_szRunExecutable), m_szRunArgument, MAX_CHARS_IN_BUFFER(m_szRunArgument));
ImportCustomFile(lpszFile);
// configure the client.
hr = ConfigureClient(GetActiveWindow(), lpszFile, &m_fNeedsRestart, &fConnectoidCreated, FALSE, szConnectoidName, RAS_MaxEntryName); if( ERROR_SUCCESS != hr ) { /*if(!m_bSilentMode)
ErrorMsg1(GetActiveWindow(), IDS_INSTALLFAILED, NULL);*/ fErrMsgShown = TRUE; }
lstrcpy(lpszConnectoidName, szConnectoidName);
ImportBrandingInfo(lpszFile, szConnectoidName);
// If we created a connectoid, tell the world that ICW
// has left the building...
if(ERROR_SUCCESS == hr) SetICWCompleted( (DWORD)1 );
// 2/19/97 jmazner Olympus 1106
// For SBS/SAM integration.
DWORD dwSBSRet = CallSBSConfig(GetActiveWindow(), lpszFile); switch( dwSBSRet ) { case ERROR_SUCCESS: break; case ERROR_MOD_NOT_FOUND: case ERROR_DLL_NOT_FOUND: // TraceMsg(TF_INSHANDLER, L"ISIGN32: SBSCFG DLL not found, I guess SAM ain't installed.\n");
break; }
//
// If the INS file contains the ClientSetup section, build the commandline
// arguments for ICWCONN2.exe.
//
if (fClientSetup) { // Check to see if a REBOOT is needed and tell the next application to
// handle it.
if (m_fNeedsRestart) { wsprintf(m_szRunArgument, L" /INS:\"%s\" /REBOOT", lpszFile); m_fNeedsRestart = FALSE; } else { wsprintf(m_szRunArgument, L" /INS:\"%s\"", lpszFile); } }
// humongous hack for ISBU
if (ERROR_SUCCESS != hr && fConnectoidCreated) { //if(!m_bSilentMode)
// InfoMsg1(GetActiveWindow(), IDS_MAILFAILED, NULL);
hr = ERROR_SUCCESS; }
//
// Import settings for mail and new read from INS file (ChrisK, 7/1/96)
//
if (ERROR_SUCCESS == hr) { ImportMailAndNewsInfo(lpszFile, fConnectoidCreated);
// If we did not create a connectiod, then restore
// the autodial one
if (!fConnectoidCreated) { RestoreAutoDial(); } else { SetDefaultConnectoid(AutodialTypeAlways, szConnectoidName); } //InetSetAutodial(TRUE, m_szAutodialConnection);
// Delete the INS file now
/**** VYUNG DO NOT REMOVE ISP FILE IN OOBE ****
if (m_szRunExecutable[0] == L'\0') { DeleteFile(lpszFile); }*/ } else { RestoreAutoDial(); }
if (m_szRunExecutable[0] != L'\0') { // Fire an event to the container telling it that we are
// about to run a custom executable
//Fire_RunningCustomExecutable();
if FAILED(RunExecutable()) { //if(!m_bSilentMode)
// ErrorMsg1(NULL, IDS_EXECFAILED, m_szRunExecutable);
}
// If the Connection has not been killed yet
// then tell the browser to do it now
if (!m_fConnectionKilled) { gpCommMgr->m_pRefDial->DoHangup(); m_fConnectionKilled = TRUE; } }
// If we get to here, we are successful.
if(fConnectoidCreated && SUCCEEDED(hr)) *pbRetVal = TRUE; break;
} while(1);
return S_OK; }
// If this is true, then the user will need to reboot, so
// the finish page should indicate this.
STDMETHODIMP CINSHandler::get_NeedRestart(BOOL *pVal) { if (pVal == NULL) return E_POINTER;
*pVal = m_fNeedsRestart; return S_OK; }
STDMETHODIMP CINSHandler::put_BrandingFlags(long lFlags) { m_dwBrandFlags = lFlags; return S_OK; }
STDMETHODIMP CINSHandler::put_SilentMode(BOOL bSilent) { m_bSilentMode = bSilent; return S_OK; }
// If this is true, get the URL from the INS file
STDMETHODIMP CINSHandler::get_DefaultURL(BSTR *pszURL) { if (pszURL == NULL) return E_POINTER;
*pszURL = SysAllocString(m_szStartURL); return S_OK; }
// This is the main entry point for merge an INS file.
HRESULT CINSHandler::MergeINSFiles(LPCWSTR lpszMainFile, LPCWSTR lpszOtherFile, LPWSTR lpszOutputFile, DWORD dwFNameSize) { PWSTR pszSection; WCHAR *pszKeys = NULL; PWSTR pszKey = NULL; WCHAR szValue[MAX_PATH]; WCHAR szTempFileFullName[MAX_PATH]; ULONG ulRetVal = 0; HRESULT hr = E_FAIL; ULONG ulBufferSize = MAX_SECTIONS_BUFFER; WCHAR *pszSections = NULL;
if (dwFNameSize < MAX_PATH) goto MergeINSFilesExit;
// Check if branding file doesn't exists, just use the original
if (0xFFFFFFFF == GetFileAttributes(lpszOtherFile)) { lstrcpy(lpszOutputFile, lpszMainFile); return S_OK; }
// Make sure it is an htm extension, otherwise, IE will promp for download
GetTempPath(MAX_CHARS_IN_BUFFER(szTempFileFullName), szTempFileFullName); lstrcat(szTempFileFullName, L"OBEINS.htm");
if(!CopyFile(lpszMainFile, szTempFileFullName, FALSE)) goto MergeINSFilesExit; lstrcpy(lpszOutputFile, szTempFileFullName);
//
// Unfortunately the .ini file functions don't offer a direct way of updating
// some entry value. So enumerate each of the sections of the .ini file, enumerate
// each of the keys within each section, get the value for each of the keys,
// write them to the value specified and if they compare equal.
//
// Loop to find the appropriate buffer size to retieve the ins to memory
do { if (NULL != pszSections) { GlobalFree( pszSections); ulBufferSize += ulBufferSize; } pszSections = (LPWSTR)GlobalAlloc(GPTR, ulBufferSize*sizeof(WCHAR)); if (NULL == pszSections) { goto MergeINSFilesExit; }
ulRetVal = ::GetPrivateProfileString(NULL, NULL, L"", pszSections, ulBufferSize, lpszOtherFile); if (0 == ulRetVal) { goto MergeINSFilesExit; } } while (ulRetVal == (ulBufferSize - 2));
pszSection = pszSections; ulRetVal= 0;
while (*pszSection) { ulBufferSize = MAX_KEYS_BUFFER; ulRetVal = 0;
// Loop to find the appropriate buffer size to retieve the ins to memory
do { if (NULL != pszKeys) { GlobalFree( pszKeys ); ulBufferSize += ulBufferSize; } pszKeys = (LPWSTR)GlobalAlloc(GPTR, ulBufferSize*sizeof(WCHAR)); if (NULL == pszKeys) { goto MergeINSFilesExit; }
ulRetVal = ::GetPrivateProfileString(pszSection, NULL, L"", pszKeys, ulBufferSize, lpszOtherFile); if (0 == ulRetVal) { goto MergeINSFilesExit; } } while (ulRetVal == (ulBufferSize - 2));
// Enumerate each key value pair in the section
pszKey = pszKeys; while (*pszKey) { ulRetVal = ::GetPrivateProfileString(pszSection, pszKey, L"", szValue, MAX_CHARS_IN_BUFFER(szValue), lpszOtherFile); if ((ulRetVal != 0) && (ulRetVal < (MAX_CHARS_IN_BUFFER(szValue) - 1))) { WritePrivateProfileString(pszSection, pszKey, szValue, szTempFileFullName); } pszKey += lstrlen(pszKey) + 1; }
pszSection += lstrlen(pszSection) + 1; }
hr = S_OK;
MergeINSFilesExit:
if (pszSections) GlobalFree( pszSections );
if (pszKeys) GlobalFree( pszKeys );
return hr; }
/*******************************************************************
NAME: ProcessOEMBrandINS
SYNOPSIS: Read OfflineOffers flag from the oeminfo.ini file
ENTRY: None
RETURN: True if OEM offline is read
********************************************************************/ BOOL CINSHandler::ProcessOEMBrandINS( BSTR bstrFileName, LPWSTR lpszConnectoidName ) {
// OEM code
//
WCHAR szOeminfoPath [MAX_PATH + 1]; WCHAR szMergedINSFName [MAX_PATH + 1]; WCHAR szOrigINSFile [MAX_PATH + 1];
WCHAR *lpszTerminator = NULL; WCHAR *lpszLastChar = NULL; BOOL bRet = FALSE;
// If we already checked, don't do it again
//if( 0 != GetSystemDirectory( szOeminfoPath, MAX_PATH + 1 ) )
{ /*
lpszTerminator = &(szOeminfoPath[ lstrlen(szOeminfoPath) ]); lpszLastChar = CharPrev( szOeminfoPath, lpszTerminator );
if( L'\\' != *lpszLastChar ) { lpszLastChar = CharNext( lpszLastChar ); *lpszLastChar = L'\\'; lpszLastChar = CharNext( lpszLastChar ); *lpszLastChar = L'\0'; }
if (bstrFileName) { // Download INS case
lstrcat( szOeminfoPath, cszOEMBRND ); lstrcpy( szOrigINSFile, bstrFileName); } else { // Proconfig case
lstrcpy( szPreCfgINSPath, szOeminfoPath); lstrcat( szPreCfgINSPath, cszISPCNFG ); lstrcat( szOeminfoPath, cszOEMBRND ); lstrcpy( szOrigINSFile, szPreCfgINSPath); } */
// find the oemcnfg.ins file
if (0 == SearchPath(NULL, cszOEMCNFG, NULL, MAX_PATH, szOeminfoPath, NULL)) { *szOeminfoPath = L'\0'; }
if (bstrFileName) // if Filename is there, read the ins file
{ lstrcpy( szOrigINSFile, bstrFileName); } else { // find the ISPCNFG.ins file
// If it is not there, it is ok. It is not an error condition. Just bail out.
WCHAR szINSPath[MAX_PATH];
if (!GetOOBEPath((LPWSTR)szINSPath)) return 0;
lstrcat(szINSPath, L"\\HTML\\ISPSGNUP");
if (0 == SearchPath(szINSPath, cszISPCNFG, NULL, MAX_PATH, szOrigINSFile, NULL)) { *szOrigINSFile = L'\0'; return 0; } }
if (S_OK == MergeINSFiles(szOrigINSFile , szOeminfoPath, szMergedINSFName, MAX_PATH)) { ProcessINS(szMergedINSFName, lpszConnectoidName, &bRet); }
if (!bRet) { HKEY hKey = NULL; DWORD dwDisposition = 0; DWORD dwFailed = 1; WCHAR szIspName [MAX_PATH+1] = L"\0"; WCHAR szSupportNum [MAX_PATH+1] = L"\0";
//ProcessINS will nuke the file so if we want this info we should get it now
GetPrivateProfileString(OEM_CONFIG_INS_SECTION, OEM_CONFIG_INS_ISPNAME, L"", szIspName, MAX_CHARS_IN_BUFFER(szIspName), szMergedINSFName);
GetPrivateProfileString(OEM_CONFIG_INS_SECTION, OEM_CONFIG_INS_SUPPORTNUM, L"", szSupportNum, MAX_CHARS_IN_BUFFER(szSupportNum), szMergedINSFName);
RegCreateKeyEx(HKEY_LOCAL_MACHINE, OEM_CONFIG_REGKEY, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition);
if(hKey) { RegSetValueEx(hKey, OEM_CONFIG_REGVAL_FAILED, 0, REG_DWORD, (LPBYTE)&dwFailed, sizeof(dwFailed)); RegSetValueEx(hKey, OEM_CONFIG_REGVAL_ISPNAME, 0, REG_SZ, (LPBYTE)szIspName, BYTES_REQUIRED_BY_SZ(szIspName) );
RegSetValueEx(hKey, OEM_CONFIG_REGVAL_SUPPORTNUM, 0, REG_SZ, (LPBYTE)szSupportNum, BYTES_REQUIRED_BY_SZ(szSupportNum) );
RegCloseKey(hKey);
} }
}
return bRet; }
// This function will restore connetoid password
HRESULT CINSHandler::RestoreConnectoidInfo() { WCHAR szPassword[PWLEN+1]; WCHAR szConnectoid[MAX_RASENTRYNAME+1]; LPRASDIALPARAMS lpRasDialParams = NULL; HRESULT hr = ERROR_SUCCESS; BOOL bPW; DWORD dwSize; RNAAPI *pcRNA = new RNAAPI;
if (!pcRNA) { hr = ERROR_NOT_ENOUGH_MEMORY; goto RestoreConnectoidInfoExit; }
dwSize = sizeof(szConnectoid); ReadSignUpReg((LPBYTE)szConnectoid, &dwSize, REG_SZ, CONNECTOIDNAME);
// Get connectoid information
//
lpRasDialParams = (LPRASDIALPARAMS)GlobalAlloc(GPTR, sizeof(RASDIALPARAMS)); if (!lpRasDialParams) { hr = ERROR_NOT_ENOUGH_MEMORY; goto RestoreConnectoidInfoExit; } lpRasDialParams->dwSize = sizeof(RASDIALPARAMS); lstrcpyn(lpRasDialParams->szEntryName, szConnectoid, MAX_CHARS_IN_BUFFER(lpRasDialParams->szEntryName)); bPW = FALSE; hr = pcRNA->RasGetEntryDialParams(NULL, lpRasDialParams, &bPW); if (hr != ERROR_SUCCESS) { goto RestoreConnectoidInfoExit; }
// If the original connectoid had password, do not reset it
if (lstrlen(lpRasDialParams->szPassword) == 0) { szPassword[0] = 0; dwSize = sizeof(szPassword); ReadSignUpReg((LPBYTE)szPassword, &dwSize, REG_SZ, ACCESSINFO); if(szPassword[0]) lstrcpy(lpRasDialParams->szPassword, szPassword); hr = pcRNA->RasSetEntryDialParams(NULL, lpRasDialParams, FALSE); }
RestoreConnectoidInfoExit: DeleteSignUpReg(CONNECTOIDNAME); DeleteSignUpReg(ACCESSINFO); if (lpRasDialParams) GlobalFree(lpRasDialParams); lpRasDialParams = NULL;
if (pcRNA) delete pcRNA;
return hr; }
DWORD CINSHandler::InetSImportLanConnection(LANINFO& LANINFO, LPCWSTR cszINSFile) { if ( cszINSFile && ( GetPrivateProfileString( cszDeviceSection, cszPnpId, L"", LANINFO.szPnPId, MAX_CHARS_IN_BUFFER (LANINFO.szPnPId), cszINSFile ) != 0 ) && ( InetSImportTcpIpModule ( LANINFO.TcpIpInfo, cszINSFile ) == ERROR_SUCCESS ) ) return ERROR_SUCCESS; else return E_FAIL; }
// Caution: Memory might have been allocated.
// this function is currently not used, due to lack of legacy support.
DWORD CINSHandler::InetSImportRasConnection(RASINFO &RasEntry, LPCWSTR cszINSFile) { if (!cszINSFile) return ERROR_INVALID_PARAMETER;
// how do you get the RAS Entry and RAS Phonebook Entry information ?
ImportPhoneInfo ( &RasEntry.RasEntry, cszINSFile );
ImportServerInfo( &RasEntry.RasEntry, cszINSFile );
ImportIPInfo ( &RasEntry.RasEntry, cszINSFile );
// Now, we consider the device-specific data.
switch ( m_dwDeviceType ) { case InetS_RASAtm: { ATMPBCONFIG AtmMod; memset ( &AtmMod, 0, sizeof (ATMPBCONFIG) ); if (InetSImportAtmModule ( AtmMod, cszINSFile ) != ERROR_SUCCESS) { // function aborted as ATM Module fails
return E_ABORT; }
// copy this into the RASINFO Buffer.
// the lpDeviceInfo and dwDeviceInfoSize cannot have been previously used!
if ( RasEntry.lpDeviceInfo || RasEntry.dwDeviceInfoSize ) { return ERROR_INVALID_PARAMETER; } if (! (RasEntry.lpDeviceInfo = (LPBYTE) malloc (sizeof(ATMPBCONFIG))) ) { return ERROR_NOT_ENOUGH_MEMORY; } memcpy ( RasEntry.lpDeviceInfo, &AtmMod, sizeof (ATMPBCONFIG) ); RasEntry.dwDeviceInfoSize = sizeof (ATMPBCONFIG); } break; default: break; }
return ERROR_SUCCESS; }
DWORD CINSHandler::InetSImportTcpIpModule(TCPIP_INFO_EXT &TcpIpInfoMod, LPCWSTR cszINSFile) { DWORD nReturnValue = ERROR_SUCCESS; WCHAR szYesNo [GEN_MAX_STRING_LENGTH]; // temporary buffer for storing Yes/No results
if (!cszINSFile) { return ERROR_INVALID_PARAMETER; } // IP
GetPrivateProfileString( cszIPSection, cszIPSpec, cszNo, szYesNo, MAX_CHARS_IN_BUFFER (szYesNo ), cszINSFile );
if (!(TcpIpInfoMod.EnableIP = !lstrcmpi(szYesNo, cszYes))) { // we do not need to look for IPAddress or IPMask values if EnableIP is false.
goto GATEWAY; }
GetPrivateProfileString( cszIPSection, cszIPAddress, cszNullIP, TcpIpInfoMod.szIPAddress, MAX_CHARS_IN_BUFFER (TcpIpInfoMod.szIPAddress), cszINSFile );
GetPrivateProfileString( cszIPSection, cszIPMask, cszNullIP, TcpIpInfoMod.szIPMask, MAX_CHARS_IN_BUFFER (TcpIpInfoMod.szIPMask), cszINSFile );
GATEWAY: GetPrivateProfileString( cszIPSection, cszGatewayList, cszNullIP, TcpIpInfoMod.szDefaultGatewayList, MAX_CHARS_IN_BUFFER (TcpIpInfoMod.szDefaultGatewayList), cszINSFile );
// DNS: we do not need to mention "DNS:" but will do so within comments, for clarity.
// DNS
GetPrivateProfileString( cszIPSection, cszDNSSpec, cszNo, szYesNo, MAX_CHARS_IN_BUFFER (szYesNo ), cszINSFile );
if (!(TcpIpInfoMod.EnableDNS = !lstrcmpi(szYesNo, cszYes))) { // we do not need to look for other DNS entries if EnableDNS is false.
goto WINS; } GetPrivateProfileString( cszIPSection, cszHostName, cszNull, TcpIpInfoMod.szHostName, MAX_CHARS_IN_BUFFER (TcpIpInfoMod.szHostName), cszINSFile );
GetPrivateProfileString( cszIPSection, cszDomainName, cszNull, TcpIpInfoMod.szDomainName, MAX_CHARS_IN_BUFFER (TcpIpInfoMod.szDomainName), cszINSFile );
GetPrivateProfileString( cszIPSection, cszDNSList, cszNullIP, TcpIpInfoMod.szDNSList, MAX_CHARS_IN_BUFFER (TcpIpInfoMod.szDNSList), cszINSFile );
GetPrivateProfileString( cszIPSection, cszDomainSuffixSearchList, cszNull, TcpIpInfoMod.szSuffixSearchList, MAX_CHARS_IN_BUFFER (TcpIpInfoMod.szSuffixSearchList), cszINSFile );
// WINS
WINS: GetPrivateProfileString( cszIPSection, cszWINSSpec, cszNo, szYesNo, MAX_CHARS_IN_BUFFER (szYesNo ), cszINSFile );
if (!(TcpIpInfoMod.EnableWINS = !lstrcmpi(szYesNo, cszYes))) { // we do not need to look for other DNS entries if EnableDNS is false.
goto DHCP; } GetPrivateProfileString( cszIPSection, cszWINSList, cszNullIP, TcpIpInfoMod.szWINSList, MAX_CHARS_IN_BUFFER (TcpIpInfoMod.szWINSList), cszINSFile );
TcpIpInfoMod.uiScopeID = GetPrivateProfileInt ( cszIPSection, cszScopeID, ~0x0, cszINSFile );
// DHCP
DHCP: GetPrivateProfileString( cszIPSection, cszDHCPSpec, cszNo, szYesNo, MAX_CHARS_IN_BUFFER (szYesNo ), cszINSFile );
if (!(TcpIpInfoMod.EnableDHCP = !lstrcmpi(szYesNo, cszYes))) { // we do not need to look for other DNS entries if EnableDNS is false.
goto end; } GetPrivateProfileString( cszIPSection, cszDHCPServer, cszNullIP, TcpIpInfoMod.szDHCPServer, MAX_CHARS_IN_BUFFER (TcpIpInfoMod.szDHCPServer), cszINSFile );
end: return nReturnValue; }
DWORD CINSHandler::InetSImportRfc1483Connection ( RFC1483INFO &Rfc1483Info, LPCWSTR cszINSFile ) { BOOL bBufGiven = FALSE; if ( !cszINSFile ) return ERROR_INVALID_PARAMETER;
if ( ( Rfc1483Info.Rfc1483Module.dwRegSettingsBufSize!=0 && Rfc1483Info.Rfc1483Module.lpbRegSettingsBuf==NULL) || ( Rfc1483Info.Rfc1483Module.dwRegSettingsBufSize==0 && Rfc1483Info.Rfc1483Module.lpbRegSettingsBuf!=NULL) ) { return ERROR_INVALID_PARAMETER; }
bBufGiven = (BOOL) (Rfc1483Info.Rfc1483Module.dwRegSettingsBufSize != 0);
if ( InetSImportRfc1483Module ( Rfc1483Info.Rfc1483Module, cszINSFile ) != ERROR_SUCCESS ) { return E_FAIL; }
if ( !bBufGiven ) return ERROR_SUCCESS;
if ( InetSImportLanConnection ( Rfc1483Info.TcpIpInfo, cszINSFile ) != ERROR_SUCCESS ) { return E_FAIL; }
return ERROR_SUCCESS; }
DWORD CINSHandler::InetSImportPppoeConnection ( PPPOEINFO &PppoeInfo, LPCWSTR cszINSFile ) { BOOL bBufGiven = FALSE; if ( !cszINSFile ) return ERROR_INVALID_PARAMETER;
if (!( (PppoeInfo.PppoeModule.dwRegSettingsBufSize==0) ^ (PppoeInfo.PppoeModule.lpbRegSettingsBuf==NULL)) ) { return ERROR_INVALID_PARAMETER; }
bBufGiven = (BOOL) !PppoeInfo.PppoeModule.dwRegSettingsBufSize;
if ( InetSImportPppoeModule ( PppoeInfo.PppoeModule, cszINSFile ) != ERROR_SUCCESS ) { return E_FAIL; }
if ( !bBufGiven ) return ERROR_SUCCESS;
if ( InetSImportLanConnection ( PppoeInfo.TcpIpInfo, cszINSFile ) != ERROR_SUCCESS ) { return E_FAIL; }
return ERROR_SUCCESS; }
DWORD CINSHandler::InetSImportRfc1483Module (RFC1483_INFO_EXT &Rfc1483InfoMod, LPCWSTR cszINSFile) { static const INT CCH_BUF_MIN = 200; static const INT CCH_BUF_PAD = 10; LPBYTE lpbTempBuf = NULL; DWORD cchTempBuf = 0; DWORD cchFinalBuf = 0; // not required but used for clarity.
BOOL bBufferGiven = FALSE;
if (!cszINSFile) return ERROR_INVALID_PARAMETER; // check if a buffer has been given, or a buffer size is required.
if ( !(Rfc1483InfoMod.dwRegSettingsBufSize) ) { // we will create a temporary buffer to find out how large a buffer we need
// to accomodate the entire 1483 section. this buffer will be freed at the
// end of the function (or if error conditions arise).
bBufferGiven = FALSE; if ( !(lpbTempBuf = (LPBYTE) malloc (BYTES_REQUIRED_BY_CCH(CCH_BUF_MIN))) ) { return ERROR_OUTOFMEMORY; } cchTempBuf = CCH_BUF_MIN;
} else { bBufferGiven = TRUE; lpbTempBuf = Rfc1483InfoMod.lpbRegSettingsBuf; cchTempBuf = Rfc1483InfoMod.dwRegSettingsBufSize;
} while ( (cchFinalBuf = GetPrivateProfileSection( cszRfc1483Section, (WCHAR*)lpbTempBuf, cchTempBuf, cszINSFile ) ) == (cchTempBuf - 2) ) { if (!bBufferGiven) { if ( !(lpbTempBuf = (LPBYTE) realloc (lpbTempBuf, BYTES_REQUIRED_BY_CCH(cchTempBuf = cchTempBuf * 2) ))) { free (lpbTempBuf); return ERROR_OUTOFMEMORY; } } else { // if the caller has provided a buffer, we do not reallocate it
// to try to fit the section in. the caller has to reallocate it.
return ERROR_INSUFFICIENT_BUFFER; }
} if ( bBufferGiven ) { return ERROR_SUCCESS; } else { free (lpbTempBuf); // clear the temporary buffer.
Rfc1483InfoMod.dwRegSettingsBufSize = BYTES_REQUIRED_BY_CCH(cchFinalBuf + 1 + CCH_BUF_PAD); // needed for '\0'. BUGBUG: WHY ARE WE PADDING THE BUFFER?
return ERROR_SUCCESS;
} }
DWORD CINSHandler::InetSImportPppoeModule (PPPOE_INFO_EXT &PppoeInfoMod, LPCWSTR cszINSFile) { static const INT MIN_BUF_SIZE = 200; static const INT CCH_BUF_PAD = 10; LPBYTE lpbTempBuf = NULL; DWORD cchTempBuf = 0; DWORD cchFinalBuf = 0; // not required but used for clarity.
BOOL bBufferGiven = FALSE;
if (!cszINSFile) return ERROR_INVALID_PARAMETER; // check if a buffer has been given, or a buffer size is required.
if ( !(PppoeInfoMod.dwRegSettingsBufSize) ) { // we will create a temporary buffer to find out how large a buffer we need
// to accomodate the entire pppoe section. this buffer will be freed at the
// end of the function (or if error conditions arise).
bBufferGiven = FALSE; if ( !(lpbTempBuf = (LPBYTE) malloc (MIN_BUF_SIZE*sizeof(WCHAR))) ) { return ERROR_OUTOFMEMORY; } cchTempBuf = MIN_BUF_SIZE;
} else { bBufferGiven = TRUE; lpbTempBuf = PppoeInfoMod.lpbRegSettingsBuf; cchTempBuf = PppoeInfoMod.dwRegSettingsBufSize / sizeof(WCHAR);
} while ( (cchFinalBuf = GetPrivateProfileSection (cszPppoeSection, (WCHAR*)lpbTempBuf, cchTempBuf, cszINSFile)) == (cchTempBuf - 2) ) { if (!bBufferGiven) { cchTempBuf *= 2; if ( !(lpbTempBuf = (LPBYTE) realloc (lpbTempBuf, cchTempBuf*sizeof(WCHAR) ))) { free (lpbTempBuf); return ERROR_OUTOFMEMORY; } } else { // if the caller has provided a buffer, we do not reallocate it
// to try to fit the section in. the caller has to reallocate it.
return ERROR_INSUFFICIENT_BUFFER; }
} if ( bBufferGiven ) { return ERROR_SUCCESS; } else { free (lpbTempBuf); // clear the temporary buffer.
PppoeInfoMod.dwRegSettingsBufSize = BYTES_REQUIRED_BY_CCH(cchFinalBuf+CCH_BUF_PAD); return ERROR_SUCCESS;
} }
// It is acceptable for many of the values to be default. if a
// parameter is not given in the file, the default will be chosen.
DWORD CINSHandler::InetSImportAtmModule(ATMPBCONFIG &AtmInfoMod, LPCWSTR cszINSFile) { if (!cszINSFile) return ERROR_INVALID_PARAMETER;
DWORD dwCircuitSpeed = 0; DWORD dwCircuitQOS = 0; DWORD dwCircuitType = 0;
DWORD dwEncapsulation = 0; DWORD dwVpi = 0; DWORD dwVci = 0;
WCHAR szYesNo [MAXNAME]; // for Speed_Adjust, QOS_Adjust, Vendor_Config, Show_Status and Enable_Log.
dwCircuitSpeed = GetPrivateProfileInt (cszATMSection, cszCircuitSpeed, dwCircuitSpeed, cszINSFile); AtmInfoMod.dwCircuitSpeed &= ~ATM_CIRCUIT_SPEED_MASK; switch (dwCircuitSpeed) { case 0: AtmInfoMod.dwCircuitSpeed = ATM_CIRCUIT_SPEED_LINE_RATE; break; case 1: AtmInfoMod.dwCircuitSpeed = ATM_CIRCUIT_SPEED_USER_SPEC; break; case 512: AtmInfoMod.dwCircuitSpeed = ATM_CIRCUIT_SPEED_512KB; break; case 1536: AtmInfoMod.dwCircuitSpeed = ATM_CIRCUIT_SPEED_1536KB; break; case 25000: AtmInfoMod.dwCircuitSpeed = ATM_CIRCUIT_SPEED_25MB; break; case 155000: AtmInfoMod.dwCircuitSpeed = ATM_CIRCUIT_SPEED_155MB; break; default: AtmInfoMod.dwCircuitSpeed = ATM_CIRCUIT_SPEED_DEFAULT; break; } AtmInfoMod.dwCircuitOpt &= ~ATM_CIRCUIT_SPEED_MASK; AtmInfoMod.dwCircuitOpt |= AtmInfoMod.dwCircuitSpeed;
dwCircuitQOS = GetPrivateProfileInt (cszATMSection, cszCircuitQOS, dwCircuitQOS, cszINSFile); AtmInfoMod.dwCircuitOpt &= ~ATM_CIRCUIT_QOS_MASK; switch (dwCircuitQOS) { case 0: AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_QOS_UBR; break; case 1: AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_QOS_VBR; break; case 2: AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_QOS_CBR; break; case 3: AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_QOS_ABR; break; default: AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_QOS_DEFAULT; break; } dwCircuitType = GetPrivateProfileInt (cszATMSection, cszCircuitType, dwCircuitType, cszINSFile); AtmInfoMod.dwCircuitOpt &= ~ATM_CIRCUIT_OPT_MASK; switch (dwCircuitType) { case 0: AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_OPT_SVC; break; case 1: AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_OPT_PVC; break; default: AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_OPT_SVC; break; } dwEncapsulation = GetPrivateProfileInt (cszATMSection, cszEncapsulation, dwEncapsulation, cszINSFile); AtmInfoMod.dwCircuitOpt &= ~ATM_CIRCUIT_ENCAP_MASK; switch (dwEncapsulation) { case 0: AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_ENCAP_NULL; break; case 1: AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_ENCAP_LLC; break; default: AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_ENCAP_DEFAULT; break; } dwVpi = GetPrivateProfileInt (cszATMSection, cszVPI, dwVpi, cszINSFile); AtmInfoMod.wPvcVpi = (WORD) dwVpi; dwVci = GetPrivateProfileInt (cszATMSection, cszVCI, dwVci, cszINSFile); AtmInfoMod.wPvcVci = (WORD) dwVci;
// Speed_Adjust
if (GetPrivateProfileString(cszATMSection, cszSpeedAdjust, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), cszINSFile)) { if (!lstrcmpi(szYesNo, cszYes)) { AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_OPT_SPEED_ADJUST; } else { AtmInfoMod.dwCircuitOpt &= ~ATM_CIRCUIT_OPT_SPEED_ADJUST; } } else { // if this field is not correctly specified, we use the default settings
// as specified in the ATMCFG header file.
AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_OPT_SPEED_ADJUST; }
// QOS_Adjust
if (GetPrivateProfileString(cszATMSection, cszQOSAdjust, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), cszINSFile)) { if (!lstrcmpi(szYesNo, cszYes)) { AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_OPT_QOS_ADJUST; } else { AtmInfoMod.dwCircuitOpt &= ~ATM_CIRCUIT_OPT_QOS_ADJUST; } } else { AtmInfoMod.dwCircuitOpt |= ATM_CIRCUIT_OPT_QOS_ADJUST; }
// Vendor_Config
AtmInfoMod.dwGeneralOpt &= ~ATM_GENERAL_OPT_MASK; if (GetPrivateProfileString(cszATMSection, cszVendorConfig, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), cszINSFile)) { if (!lstrcmpi(szYesNo, cszYes)) { AtmInfoMod.dwGeneralOpt |= ATM_GENERAL_OPT_VENDOR_CONFIG; } else { AtmInfoMod.dwGeneralOpt &= ~ATM_GENERAL_OPT_VENDOR_CONFIG; } } else { AtmInfoMod.dwGeneralOpt &= ~ATM_GENERAL_OPT_VENDOR_CONFIG; }
// Show_Status
if (GetPrivateProfileString(cszATMSection, cszShowStatus, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), cszINSFile)) { if (!lstrcmpi(szYesNo, cszYes)) { AtmInfoMod.dwGeneralOpt |= ATM_GENERAL_OPT_SHOW_STATUS; } else { AtmInfoMod.dwGeneralOpt &= ~ATM_GENERAL_OPT_SHOW_STATUS; } } else { AtmInfoMod.dwGeneralOpt &= ~ATM_GENERAL_OPT_SHOW_STATUS; }
// Enable_Log
if (GetPrivateProfileString(cszATMSection, cszEnableLog, cszYes, szYesNo, MAX_CHARS_IN_BUFFER(szYesNo), cszINSFile)) { if (!lstrcmpi(szYesNo, cszYes)) { AtmInfoMod.dwGeneralOpt |= ATM_GENERAL_OPT_ENABLE_LOG; } else { AtmInfoMod.dwGeneralOpt &= ~ATM_GENERAL_OPT_ENABLE_LOG; } } else { AtmInfoMod.dwGeneralOpt &= ~ATM_GENERAL_OPT_ENABLE_LOG; }
return ERROR_SUCCESS; }
DWORD CINSHandler::InetSGetConnectionType ( LPCWSTR cszINSFile ) { WCHAR szDeviceTypeBuf [MAX_PATH]; DWORD dwBufSize = MAX_CHARS_IN_BUFFER (szDeviceTypeBuf);
if (!GetPrivateProfileString ( cszDeviceSection, cszDeviceType, szNull, szDeviceTypeBuf, dwBufSize, cszINSFile ) ) { return (m_dwDeviceType = 0); }
if (!lstrcmpi (szDeviceTypeBuf, RASDT_Modem)) { return (m_dwDeviceType = InetS_RASModem); } if (!lstrcmpi (szDeviceTypeBuf, RASDT_Isdn)) { return (m_dwDeviceType = InetS_RASIsdn); } if (!lstrcmpi (szDeviceTypeBuf, RASDT_Atm)) { return (m_dwDeviceType = InetS_RASAtm); } if (!lstrcmpi (szDeviceTypeBuf, LANDT_Cable)) { return (m_dwDeviceType = InetS_LANCable); } if (!lstrcmpi (szDeviceTypeBuf, LANDT_Ethernet)) { return (m_dwDeviceType = InetS_LANEthernet); } if (!lstrcmpi (szDeviceTypeBuf, LANDT_Pppoe)) { return (m_dwDeviceType = InetS_LANPppoe); } if (!lstrcmpi (szDeviceTypeBuf, LANDT_1483)) { return (m_dwDeviceType = InetS_LAN1483); } return (m_dwDeviceType = InetS_RASModem); // we default to modem!
}
|