windows-nt/Source/XPSP1/NT/base/ntsetup/oobe/msobcomm/inshdlr.cpp
2020-09-26 16:20:57 +08:00

4398 lines
144 KiB
C++

/*-----------------------------------------------------------------------------
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!
}