Windows2003-3790/inetcore/connectionwizard/inetcfg/inetapi.cpp
2020-09-30 16:53:55 +02:00

1074 lines
37 KiB
C++

//*********************************************************************
//* Microsoft Windows **
//* Copyright(c) Microsoft Corp., 1994-1995 **
//*********************************************************************
//
// INETAPI.C - APIs for external components to use to configure system
//
//
// HISTORY:
//
// 3/9/95 jeremys Created.
// 96/02/26 markdu Moved ClearConnectoidIPParams functionality
// into CreateConnectoid, so SetPhoneNumber only makes the
// call to CreateConnectoid
// 96/03/09 markdu Added LPRASENTRY parameter to CreateConnectoid()
// and SetPhoneNumber
// 96/03/09 markdu Moved all references to 'need terminal window after
// dial' into RASENTRY.dwfOptions.
// 96/03/10 markdu Moved all references to modem name into RASENTRY.
// 96/03/10 markdu Copy phone number info into the RASENTRY struct
// in SetPhoneNumber().
// 96/03/10 markdu Set TCP/IP info and autodial info per-connectoid.
// 96/03/21 markdu Set RASEO flags appropriately.
// 96/03/22 markdu Validate pointers before using them.
// 96/03/23 markdu Replaced CLIENTINFO references with CLIENTCONFIG.
// 96/03/24 markdu Replaced memset with ZeroMemory for consistency.
// 96/03/24 markdu Replaced lstrcpy with lstrcpyn where appropriate.
// 96/03/25 markdu Replaced ApplyGlobalTcpInfo with ClearGlobalTcpInfo.
// and replaced GetGlobalTcpInfo with IsThereGlobalTcpInfo.
// 96/03/26 markdu Put #ifdef __cplusplus around extern "C"
// 96/03/26 markdu Use MAX_ISP_NAME instead of RAS_MaxEntryName
// because of bug in RNA.
// 96/04/04 markdu Added phonebook name param to CreateConnectoid.
// 96/04/06 markdu NASH BUG 15653 Use exported autodial API.
// 96/05/25 markdu Use ICFG_ flags for lpNeedDrivers and lpInstallDrivers.
// 96/05/26 markdu Use lpIcfgTurnOffFileSharing and lpIcfgIsFileSharingTurnedOn,
// lpIsGlobalDNS and lpIcfgRemoveGlobalDNS.
// 96/05/27 markdu Use lpIcfgInstallInetComponents and lpIcfgNeedInetComponents.
// 96/06/04 markdu OSR BUG 7246 If no area code supplied, turn off
// RASEO_UseCountryAndAreaCodes flag.
//
#include "wizard.h"
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
#include "inetapi.h"
// avoid name mangling
VOID WINAPI InetPerformSecurityCheck(HWND hWnd,BOOL * pfNeedRestart);
#define ERROR_ALREADY_DISPLAYED -1
BOOL ConfigureSystemForInternet_W(LPINTERNET_CONFIG lpInternetConfig,
BOOL fPromptIfConfigNeeded);
#ifdef __cplusplus
}
#endif // __cplusplus
DWORD SetPhoneNumber(LPTSTR pszEntryName,UINT cbEntryName,LPRASENTRY lpRasEntry,
PHONENUM * pPhoneNum,
LPCTSTR pszUserName,LPCTSTR pszPassword,UINT uDefNameID);
INT_PTR CALLBACK SecurityCheckDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
LPARAM lParam);
BOOL CenterWindow (HWND hwndChild, HWND hwndParent);
BOOL CALLBACK WarningDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
LPARAM lParam);
extern ICFGINSTALLSYSCOMPONENTS lpIcfgInstallInetComponents;
extern ICFGNEEDSYSCOMPONENTS lpIcfgNeedInetComponents;
extern ICFGISGLOBALDNS lpIcfgIsGlobalDNS;
extern ICFGREMOVEGLOBALDNS lpIcfgRemoveGlobalDNS;
extern ICFGTURNOFFFILESHARING lpIcfgTurnOffFileSharing;
extern ICFGISFILESHARINGTURNEDON lpIcfgIsFileSharingTurnedOn;
extern ICFGGETLASTINSTALLERRORTEXT lpIcfgGetLastInstallErrorText;
typedef struct tagWARNINGDLGINFO {
BOOL fResult; // TRUE if user chose yes/OK to warning
BOOL fDisableWarning; // TRUE if user wants to disable warning in future
} WARNINGDLGINFO;
#ifdef UNICODE
PWCHAR ToUnicodeWithAlloc(LPCSTR);
#endif
/*******************************************************************
NAME: ConfigureSystemForInternet
SYNOPSIS: Performs all necessary configuration to set system up
to use Internet.
ENTRY: lpInternetConfig - pointer to structure with configuration
information.
EXIT: TRUE if successful, or FALSE if fails. Displays its
own error message upon failure.
If the output flag ICOF_NEEDREBOOT is set, the caller
must restart the system before continuing.
NOTES: Will install TCP/IP, RNA, PPPMAC as necessary; will
create or modify an Internet RNA connectoid.
This API displays error messages itself rather than
passing back an error code because there is a wide range of
possible error codes from different families, it is difficult
for the caller to obtain text for all of them.
Calls worker function ConfigureSystemForInternet_W.
********************************************************************/
#ifdef UNICODE
extern "C" BOOL WINAPI ConfigureSystemForInternetA
(
LPINTERNET_CONFIGA lpInternetConfig
)
{
HRESULT hr;
LPTSTR pszModemNameW = ToUnicodeWithAlloc(lpInternetConfig->pszModemName);
LPTSTR pszUserNameW = ToUnicodeWithAlloc(lpInternetConfig->pszUserName);
LPTSTR pszPasswordW = ToUnicodeWithAlloc(lpInternetConfig->pszPassword);
LPTSTR pszEntryNameW = ToUnicodeWithAlloc(lpInternetConfig->pszEntryName);
LPTSTR pszEntryName2W = ToUnicodeWithAlloc(lpInternetConfig->pszEntryName2);
LPTSTR pszDNSServerW = ToUnicodeWithAlloc(lpInternetConfig->pszDNSServer);
LPTSTR pszDNSServer2W = ToUnicodeWithAlloc(lpInternetConfig->pszDNSServer2);
LPTSTR pszAutodialDllNameW = ToUnicodeWithAlloc(lpInternetConfig->pszAutodialDllName);
LPTSTR pszAutodialFcnNameW = ToUnicodeWithAlloc(lpInternetConfig->pszAutodialFcnName);
INTERNET_CONFIGW InternetConfigW;
InternetConfigW.cbSize = sizeof(INTERNET_CONFIGW);
InternetConfigW.hwndParent = lpInternetConfig->hwndParent;
InternetConfigW.pszModemName = pszModemNameW;
InternetConfigW.pszUserName = pszUserNameW;
InternetConfigW.pszEntryName = pszEntryNameW;
InternetConfigW.pszEntryName2 = pszEntryName2W;
InternetConfigW.pszDNSServer = pszDNSServerW;
InternetConfigW.pszDNSServer2 = pszDNSServer2W;
InternetConfigW.pszAutodialDllName = pszAutodialDllNameW;
InternetConfigW.pszAutodialFcnName = pszAutodialFcnNameW;
InternetConfigW.dwInputFlags = lpInternetConfig->dwInputFlags;
InternetConfigW.dwOutputFlags = lpInternetConfig->dwOutputFlags;
InternetConfigW.PhoneNum.dwCountryID = lpInternetConfig->PhoneNum.dwCountryID;
InternetConfigW.PhoneNum.dwCountryCode = lpInternetConfig->PhoneNum.dwCountryCode;
mbstowcs(InternetConfigW.PhoneNum.szAreaCode,
lpInternetConfig->PhoneNum.szAreaCode,
lstrlenA(lpInternetConfig->PhoneNum.szAreaCode)+1);
mbstowcs(InternetConfigW.PhoneNum.szLocal,
lpInternetConfig->PhoneNum.szLocal,
lstrlenA(lpInternetConfig->PhoneNum.szLocal)+1);
mbstowcs(InternetConfigW.PhoneNum.szExtension,
lpInternetConfig->PhoneNum.szExtension,
lstrlenA(lpInternetConfig->PhoneNum.szExtension)+1);
InternetConfigW.PhoneNum2.dwCountryID = lpInternetConfig->PhoneNum2.dwCountryID;
InternetConfigW.PhoneNum2.dwCountryCode = lpInternetConfig->PhoneNum2.dwCountryCode;
mbstowcs(InternetConfigW.PhoneNum2.szAreaCode,
lpInternetConfig->PhoneNum2.szAreaCode,
lstrlenA(lpInternetConfig->PhoneNum2.szAreaCode)+1);
mbstowcs(InternetConfigW.PhoneNum2.szLocal,
lpInternetConfig->PhoneNum2.szLocal,
lstrlenA(lpInternetConfig->PhoneNum2.szLocal)+1);
mbstowcs(InternetConfigW.PhoneNum2.szExtension,
lpInternetConfig->PhoneNum2.szExtension,
lstrlenA(lpInternetConfig->PhoneNum2.szExtension)+1);
hr = ConfigureSystemForInternetW(&InternetConfigW);
// Free all allocated WCHAR.
if(pszModemNameW)
GlobalFree(pszModemNameW);
if(pszUserNameW)
GlobalFree(pszUserNameW);
if(pszEntryNameW)
GlobalFree(pszEntryNameW);
if(pszEntryName2W)
GlobalFree(pszEntryName2W);
if(pszDNSServerW)
GlobalFree(pszDNSServerW);
if(pszDNSServer2W)
GlobalFree(pszDNSServer2W);
if(pszAutodialDllNameW)
GlobalFree(pszAutodialDllNameW);
if(pszAutodialFcnNameW)
GlobalFree(pszAutodialFcnNameW);
return hr;
}
extern "C" BOOL WINAPI ConfigureSystemForInternetW
#else
extern "C" BOOL WINAPI ConfigureSystemForInternetA
#endif
(
LPINTERNET_CONFIG lpInternetConfig
)
{
BOOL fRet;
// call worker function
fRet = ConfigureSystemForInternet_W(lpInternetConfig,FALSE);
if (fRet)
{
// make sure "The Internet" icon on desktop points to web browser
// (it may initially be pointing at internet wizard) (for versions < IE 4)
// //10/24/96 jmazner Normandy 6968
// //No longer neccessary thanks to Valdon's hooks for invoking ICW.
// 11/21/96 jmazner Normandy 11812
// oops, it _is_ neccessary, since if user downgrades from IE 4 to IE 3,
// ICW 1.1 needs to morph the IE 3 icon.
SetDesktopInternetIconToBrowser();
}
return fRet;
}
/*******************************************************************
NAME: SetInternetPhoneNumber
SYNOPSIS: Sets the phone number used to auto-dial to the Internet.
If the system is not fully configured when this API is called,
this API will do the configuration after checking with the user.
(This step is included for extra robustness, in case the user has
removed something since the system was configured.)
ENTRY: lpPhonenumConfig - pointer to structure with configuration
information.
If the input flag ICIF_NOCONFIGURE is set, then if the system
is not already configured properly, this API will display an
error message and return FALSE. (Otherwise this API will
ask the user if it's OK to configure the system, and do it.)
EXIT: TRUE if successful, or FALSE if fails. Displays its
own error message upon failure.
If the output flag ICOF_NEEDREBOOT is set, the caller
must restart the system before continuing. (
NOTES: Will create a new connectoid if a connectoid for the internet
does not exist yet, otherwise modifies existing internet
connectoid.
This API displays error messages itself rather than
passing back an error code because there is a wide range of
possible error codes from different families, it is difficult
for the caller to obtain text for all of them.
Calls worker function ConfigureSystemForInternet_W.
********************************************************************/
#ifdef UNICODE
extern "C" BOOL WINAPI SetInternetPhoneNumberA
(
LPINTERNET_CONFIGA lpInternetConfig
)
{
HRESULT hr;
LPTSTR pszModemNameW = ToUnicodeWithAlloc(lpInternetConfig->pszModemName);
LPTSTR pszUserNameW = ToUnicodeWithAlloc(lpInternetConfig->pszUserName);
LPTSTR pszPasswordW = ToUnicodeWithAlloc(lpInternetConfig->pszPassword);
LPTSTR pszEntryNameW = ToUnicodeWithAlloc(lpInternetConfig->pszEntryName);
LPTSTR pszEntryName2W = ToUnicodeWithAlloc(lpInternetConfig->pszEntryName2);
LPTSTR pszDNSServerW = ToUnicodeWithAlloc(lpInternetConfig->pszDNSServer);
LPTSTR pszDNSServer2W = ToUnicodeWithAlloc(lpInternetConfig->pszDNSServer2);
LPTSTR pszAutodialDllNameW = ToUnicodeWithAlloc(lpInternetConfig->pszAutodialDllName);
LPTSTR pszAutodialFcnNameW = ToUnicodeWithAlloc(lpInternetConfig->pszAutodialFcnName);
INTERNET_CONFIGW InternetConfigW;
InternetConfigW.cbSize = sizeof(INTERNET_CONFIGW);
InternetConfigW.hwndParent = lpInternetConfig->hwndParent;
InternetConfigW.pszModemName = pszModemNameW;
InternetConfigW.pszUserName = pszUserNameW;
InternetConfigW.pszEntryName = pszEntryNameW;
InternetConfigW.pszEntryName2 = pszEntryName2W;
InternetConfigW.pszDNSServer = pszDNSServerW;
InternetConfigW.pszDNSServer2 = pszDNSServer2W;
InternetConfigW.pszAutodialDllName = pszAutodialDllNameW;
InternetConfigW.pszAutodialFcnName = pszAutodialFcnNameW;
InternetConfigW.dwInputFlags = lpInternetConfig->dwInputFlags;
InternetConfigW.dwOutputFlags = lpInternetConfig->dwOutputFlags;
InternetConfigW.PhoneNum.dwCountryID = lpInternetConfig->PhoneNum.dwCountryID;
InternetConfigW.PhoneNum.dwCountryCode = lpInternetConfig->PhoneNum.dwCountryCode;
mbstowcs(InternetConfigW.PhoneNum.szAreaCode,
lpInternetConfig->PhoneNum.szAreaCode,
lstrlenA(lpInternetConfig->PhoneNum.szAreaCode)+1);
mbstowcs(InternetConfigW.PhoneNum.szLocal,
lpInternetConfig->PhoneNum.szLocal,
lstrlenA(lpInternetConfig->PhoneNum.szLocal)+1);
mbstowcs(InternetConfigW.PhoneNum.szExtension,
lpInternetConfig->PhoneNum.szExtension,
lstrlenA(lpInternetConfig->PhoneNum.szExtension)+1);
InternetConfigW.PhoneNum2.dwCountryID = lpInternetConfig->PhoneNum2.dwCountryID;
InternetConfigW.PhoneNum2.dwCountryCode = lpInternetConfig->PhoneNum2.dwCountryCode;
mbstowcs(InternetConfigW.PhoneNum2.szAreaCode,
lpInternetConfig->PhoneNum2.szAreaCode,
lstrlenA(lpInternetConfig->PhoneNum2.szAreaCode)+1);
mbstowcs(InternetConfigW.PhoneNum2.szLocal,
lpInternetConfig->PhoneNum2.szLocal,
lstrlenA(lpInternetConfig->PhoneNum2.szLocal)+1);
mbstowcs(InternetConfigW.PhoneNum2.szExtension,
lpInternetConfig->PhoneNum2.szExtension,
lstrlenA(lpInternetConfig->PhoneNum2.szExtension)+1);
hr = SetInternetPhoneNumberW(&InternetConfigW);
// Free all allocated WCHAR.
if(pszModemNameW)
GlobalFree(pszModemNameW);
if(pszUserNameW)
GlobalFree(pszUserNameW);
if(pszEntryNameW)
GlobalFree(pszEntryNameW);
if(pszEntryName2W)
GlobalFree(pszEntryName2W);
if(pszDNSServerW)
GlobalFree(pszDNSServerW);
if(pszDNSServer2W)
GlobalFree(pszDNSServer2W);
if(pszAutodialDllNameW)
GlobalFree(pszAutodialDllNameW);
if(pszAutodialFcnNameW)
GlobalFree(pszAutodialFcnNameW);
return hr;
}
extern "C" BOOL WINAPI SetInternetPhoneNumberW
#else
extern "C" BOOL WINAPI SetInternetPhoneNumberA
#endif
(
LPINTERNET_CONFIG lpInternetConfig
)
{
// call worker function
return ConfigureSystemForInternet_W(lpInternetConfig,TRUE);
}
/*******************************************************************
NAME: ConfigureSystemForInternet_W
SYNOPSIS: worker function to do system configuration for Internet
ENTRY: lpInternetConfig - pointer to structure with configuration
information.
fPromptIfConfigNeeded - if TRUE, then if any system
configuration is needed the user will be prompted and
asked if it's OK to reconfigure the system
EXIT: TRUE if successful, or FALSE if fails. Displays its
own error message upon failure.
If the output flag ICOF_NEEDREBOOT is set, the caller
must restart the system before continuing.
NOTES: Will install TCP/IP, RNA, PPPMAC as necessary; will
create or modify an Internet RNA connectoid.
This API displays error messages itself rather than
passing back an error code because there is a wide range of
possible error codes from different families, it is difficult
for the caller to obtain text for all of them.
********************************************************************/
BOOL ConfigureSystemForInternet_W(LPINTERNET_CONFIG lpInternetConfig,
BOOL fPromptIfConfigNeeded)
{
UINT uErr=ERROR_SUCCESS,uErrMsgID=IDS_ERRSetPhoneNumber;
DWORD dwErrCls = ERRCLS_STANDARD;
BOOL fNeedDrivers = FALSE;
BOOL fRet = FALSE;
BOOL fNeedReboot = FALSE;
TCHAR szEntryName[MAX_ISP_NAME+1]=TEXT("");
BOOL fNeedToDeInitRNA = FALSE;
DWORD dwfInstallOptions;
DEBUGMSG("inetapi.c::ConfigureSystemForInternet_W()");
// validate parameters
ASSERT(lpInternetConfig);
if (!lpInternetConfig)
return FALSE;
ASSERT(lpInternetConfig->cbSize == sizeof(INTERNET_CONFIG));
if (lpInternetConfig->cbSize != sizeof(INTERNET_CONFIG))
return FALSE;
// clear output flags
lpInternetConfig->dwOutputFlags = 0;
HWND hwndParent = lpInternetConfig->hwndParent;
WAITCURSOR WaitCursor; // set an hourglass cursor
// Also allocate a RASENTRY struct for connectoid data
LPRASENTRY pRasEntry = new RASENTRY;
ASSERT(pRasEntry);
if (!pRasEntry)
{
// out of memory!
uErr = ERROR_NOT_ENOUGH_MEMORY;
dwErrCls = ERRCLS_STANDARD;
goto exit;
}
InitRasEntry(pRasEntry);
// based on config and preferences, find out if we need to install
// drivers/files or not
dwfInstallOptions = ICFG_INSTALLTCP | ICFG_INSTALLRAS;
if (!(lpInternetConfig->dwInputFlags & ICIF_NOCONFIGURE))
{
uErr = lpIcfgNeedInetComponents(dwfInstallOptions, &fNeedDrivers);
if (ERROR_SUCCESS != uErr)
{
TCHAR szErrorText[MAX_ERROR_TEXT+1]=TEXT("");
// Get the text of the error message and display it.
if (lpIcfgGetLastInstallErrorText(szErrorText, MAX_ERROR_TEXT+1))
{
MsgBoxSz(NULL,szErrorText,MB_ICONEXCLAMATION,MB_OK);
uErr = (UINT) ERROR_ALREADY_DISPLAYED;
}
goto exit;
}
}
else
{
fNeedDrivers = FALSE;
}
if (fNeedDrivers && fPromptIfConfigNeeded) {
// if this API is just getting called to set a new phone number,
// we check the configuration anyway in case the user has accidentally
// changed something. Since we noticed we need to do something
// to user's config and fPromptIfConfigNeeded is TRUE, we will ask
// the user if it's OK to change the machine's config.
if (MsgBox(hwndParent,IDS_OKTOCHANGECONFIG,MB_ICONQUESTION,MB_YESNO)
!= IDYES) {
// user elected not to have us do necessary setup, so just set
// fNeedDrivers flag to FALSE so we don't do setup. We will
// stil try to set internet phone # below... this may fail
// if part of the required setup was to do something like install
// RNA
fNeedDrivers = FALSE;
}
}
if (fNeedDrivers) {
// yes, need to install some drivers
// warn user that we're about to do stuff that may need win 95 disks.
// also let user cancel this part
// the message is long and takes up two string resources, allocate
// memory to build the string
BUFFER MsgBuf(MAX_RES_LEN*2+1),Msg1(MAX_RES_LEN),Msg2(MAX_RES_LEN);
ASSERT(MsgBuf);
ASSERT(Msg1);
ASSERT(Msg2);
if (!MsgBuf || !Msg1 || !Msg2) {
// out of memory!
uErr = ERROR_NOT_ENOUGH_MEMORY;
dwErrCls = ERRCLS_STANDARD;
goto exit;
}
LoadSz(IDS_ABOUTTOCHANGECONFIG1,Msg1.QueryPtr(),Msg1.QuerySize());
LoadSz(IDS_ABOUTTOCHANGECONFIG2,Msg2.QueryPtr(),Msg2.QuerySize());
wsprintf(MsgBuf.QueryPtr(),Msg1.QueryPtr(),Msg2.QueryPtr());
if (MsgBoxSz(hwndParent,MsgBuf.QueryPtr(),MB_ICONINFORMATION,
MB_OKCANCEL) != IDOK) {
// user cancelled, stop
uErr = (UINT) ERROR_ALREADY_DISPLAYED;
goto exit;
}
WAITCURSOR WaitCursor; // construct a wait cursor since MessageBox
// destroys the hourglass cursor
// install the drivers we need
uErr = lpIcfgInstallInetComponents(hwndParent, dwfInstallOptions, &fNeedReboot);
if (ERROR_SUCCESS != uErr)
{
TCHAR szErrorText[MAX_ERROR_TEXT+1]=TEXT("");
// Get the text of the error message and display it.
if (lpIcfgGetLastInstallErrorText(szErrorText, MAX_ERROR_TEXT+1))
{
MsgBoxSz(hwndParent,szErrorText,MB_ICONEXCLAMATION,MB_OK);
uErr = (UINT) ERROR_ALREADY_DISPLAYED;
}
goto exit;
}
// set "need reboot" output flag if appropriate
if (fNeedReboot)
lpInternetConfig->dwOutputFlags |= ICOF_NEEDREBOOT;
}
// MSN dial-in points dynamically assign DNS (as of this writing)... if
// DNS is set statically in registry, dynamic DNS assignment will not
// work and user may be hosed. Check, warn user and offer to remove if
// set...
if (!(lpInternetConfig->dwInputFlags & (ICIF_NOCONFIGURE | ICIF_NODNSCHECK))) {
if (DoDNSCheck(lpInternetConfig->hwndParent,&fNeedReboot)) {
// set "need reboot" output flag if appropriate
if (fNeedReboot)
lpInternetConfig->dwOutputFlags |= ICOF_NEEDREBOOT;
}
}
// create or modify connectoid(s)
// make sure RNA is loaded
fRet = InitRNA(hwndParent);
if (!fRet) {
uErr = (UINT) ERROR_ALREADY_DISPLAYED;
goto exit;
}
fNeedToDeInitRNA = TRUE; // set a flag so we know to free RNA later
// Copy the modem name into the rasentry struct
if (lpInternetConfig->pszModemName)
{
lstrcpyn(pRasEntry->szDeviceName,lpInternetConfig->pszModemName,
ARRAYSIZE(pRasEntry->szDeviceName));
}
// set autodial handler dll if specified by caller
// only do anything if both DLL and function name are set
if (lpInternetConfig && lpInternetConfig->pszAutodialDllName &&
lpInternetConfig->pszAutodialFcnName &&
lpInternetConfig->pszAutodialDllName[0] &&
lpInternetConfig->pszAutodialFcnName[0])
{
lstrcpyn(pRasEntry->szAutodialDll,lpInternetConfig->pszAutodialDllName,
ARRAYSIZE(pRasEntry->szAutodialDll));
lstrcpyn(pRasEntry->szAutodialFunc,lpInternetConfig->pszAutodialFcnName,
ARRAYSIZE(pRasEntry->szAutodialFunc));
}
// Default to not show terminal window after dial.
pRasEntry->dwfOptions &= ~RASEO_TerminalAfterDial;
// Don't use specific IP addresses.
pRasEntry->dwfOptions &= ~RASEO_SpecificIpAddr;
// set DNS information if specified
if (lpInternetConfig->pszDNSServer && lstrlen(lpInternetConfig->pszDNSServer))
{
IPADDRESS dwDNSAddr;
if (IPStrToLong(lpInternetConfig->pszDNSServer,&dwDNSAddr))
{
CopyDw2Ia(dwDNSAddr, &pRasEntry->ipaddrDns);
// Turn on Specific name servers
pRasEntry->dwfOptions |= RASEO_SpecificNameServers;
}
}
if (lpInternetConfig->pszDNSServer2 && lstrlen(lpInternetConfig->pszDNSServer2))
{
IPADDRESS dwDNSAddr;
if (IPStrToLong(lpInternetConfig->pszDNSServer2,&dwDNSAddr))
{
CopyDw2Ia(dwDNSAddr, &pRasEntry->ipaddrDnsAlt);
}
}
// set first phone number
// should always have a real phone number for first phone number
ASSERT(lstrlen(lpInternetConfig->PhoneNum.szLocal));
if (lstrlen(lpInternetConfig->PhoneNum.szLocal))
{
if (lpInternetConfig->pszEntryName)
{
lstrcpyn(szEntryName,lpInternetConfig->pszEntryName,
ARRAYSIZE(szEntryName));
}
else
{
szEntryName[0] = '\0';
}
uErr = SetPhoneNumber(szEntryName,sizeof(szEntryName),pRasEntry,
&lpInternetConfig->PhoneNum,lpInternetConfig->pszUserName,
lpInternetConfig->pszPassword,IDS_DEF_CONNECTION_NAME_1);
dwErrCls = ERRCLS_RNA;
if (uErr == ERROR_SUCCESS)
{
if (!(lpInternetConfig->dwInputFlags & ICIF_DONTSETASINTERNETENTRY))
{
// set this number as the number used to autodial to the Internet
// 96/04/06 markdu NASH BUG 15653 Use exported autodial API.
InetSetAutodial(TRUE, szEntryName);
}
}
}
// set 2nd (backup) phone number
if ((uErr == ERROR_SUCCESS) && (lpInternetConfig->PhoneNum2.szLocal) &&
(lstrlen(lpInternetConfig->PhoneNum2.szLocal)))
{
TCHAR szEntryNameTmp[MAX_ISP_NAME+1];
if (lpInternetConfig->pszEntryName2)
{
lstrcpyn(szEntryNameTmp,lpInternetConfig->pszEntryName2,
ARRAYSIZE(szEntryNameTmp));
}
else
{
szEntryNameTmp[0] = '\0';
}
uErr = SetPhoneNumber(szEntryNameTmp,sizeof(szEntryNameTmp),
pRasEntry,&lpInternetConfig->PhoneNum2,lpInternetConfig->pszUserName,
lpInternetConfig->pszPassword,IDS_DEF_CONNECTION_NAME_2);
dwErrCls = ERRCLS_RNA;
if (uErr == ERROR_SUCCESS)
{
if (!(lpInternetConfig->dwInputFlags & ICIF_DONTSETASINTERNETENTRY))
{
// set this number as the backup number used to autodial to the Internet
SetBackupInternetConnectoid(szEntryNameTmp);
}
}
}
exit:
// free memory
if (pRasEntry)
delete pRasEntry;
// display error message if error occurred
if (uErr != ERROR_SUCCESS && uErr != ERROR_ALREADY_DISPLAYED) {
DisplayErrorMessage(hwndParent,uErrMsgID,uErr,dwErrCls,MB_ICONEXCLAMATION);
}
// free RNA if need be. Note we must do this *after* the call to
// DisplayErrorMessage, because DisplayErrorMessage needs to call RNA
// to get error description if an RNA error was generated.
if (fNeedToDeInitRNA) {
DeInitRNA();
}
return (uErr == ERROR_SUCCESS);
}
/*******************************************************************
NAME: SetPhoneNumber
SYNOPSIS: Creates or modifies a connectoid with specified information
ENTRY: pszEntryName - name to use for the connectoid. If empty, the
default name stored in string resource specified by
uDefNameID will be used. On exit, this buffer is filled
in with the actual name used.
cbEntryName - size of buffer pointed to by szEntryName
pPhoneNum - pointer to struct with phone number
pszUserName - user name to populate connectoid with. Ignored
if NULL.
pszPassword - password to populate connectoid with. Ignored
if NULL.
uDefNameID - ID of string resource with default name to use
if pszEntryName is NULL.
EXIT: returns an RNA error code
NOTES: This is a wrapper to call CreateConnectoid, to avoid duplicating
code to load default name out of resource.
Since the pszEntryName buffer is filled at exit with the
actual name used, callers should be careful not to pass in buffers
from API callers, since apps using API won't expect their own
buffers to be modified.
********************************************************************/
DWORD SetPhoneNumber(LPTSTR pszEntryName,UINT cbEntryName,
LPRASENTRY lpRasEntry, PHONENUM * pPhoneNum,
LPCTSTR pszUserName,LPCTSTR pszPassword,UINT uDefNameID)
{
ASSERT(pszEntryName);
ASSERT(pPhoneNum);
ASSERT(lpRasEntry);
// (all other parameters may be NULL)
// if a connectoid name was specified, use it; if NULL, use a default
// name.
if (!lstrlen(pszEntryName))
{
LoadSz(uDefNameID,pszEntryName,cbEntryName);
}
// 96/06/04 markdu OSR BUG 7246
// If no area code was specified, turn off area code flag
if (lstrlen(pPhoneNum->szAreaCode))
{
lpRasEntry->dwfOptions |= RASEO_UseCountryAndAreaCodes;
}
else
{
lpRasEntry->dwfOptions &= ~RASEO_UseCountryAndAreaCodes;
}
// copy the phone number data
lpRasEntry->dwCountryID = pPhoneNum->dwCountryID;
lpRasEntry->dwCountryCode = pPhoneNum->dwCountryCode;
lstrcpyn (lpRasEntry->szAreaCode, pPhoneNum->szAreaCode,
ARRAYSIZE(lpRasEntry->szAreaCode));
lstrcpyn (lpRasEntry->szLocalPhoneNumber, pPhoneNum->szLocal,
ARRAYSIZE(lpRasEntry->szLocalPhoneNumber));
// create/update the connectoid
DWORD dwRet = CreateConnectoid(NULL, pszEntryName,lpRasEntry,
pszUserName,pszPassword);
return dwRet;
}
/*******************************************************************
NAME: InetPerformSecurityCheck
SYNOPSIS: Checks to make sure win 95 file/print sharing is not
bound to TCP/IP used for the internet
ENTRY: hWnd - parent window (if any)
pfNeedRestart - on exit, set to TRUE if restart is needed.
NOTES: If we warn user about file/print sharing and user tells us
to fix, then a reboot is necessary. Caller is responsible
for checking *pfNeedRestart on return and restarting system
if necessary.
********************************************************************/
VOID WINAPI InetPerformSecurityCheck(HWND hWnd,BOOL * pfNeedRestart)
{
ASSERT(pfNeedRestart);
*pfNeedRestart = FALSE;
// see if the server is bound to internet instance
BOOL fSharingOn;
HRESULT hr = lpIcfgIsFileSharingTurnedOn(INSTANCE_PPPDRIVER, &fSharingOn);
//
// 5/12/97 jmazner Olympus #3442 IE #30886
// TEMP TODO at the moment, icfgnt doesn't implement FileSharingTurnedOn
// Until it does, assume that on NT file sharing is always off.
//
if( IsNT() )
{
DEBUGMSG("Ignoring return code from IcfgIsFileSharingTurnedOn");
fSharingOn = FALSE;
}
if ((ERROR_SUCCESS == hr) && (TRUE == fSharingOn))
{
// ask user if we can disable file/print sharing on TCP/IP instance
// to the Internet
BOOL fRet=(BOOL)DialogBox(ghInstance,MAKEINTRESOURCE(IDD_SECURITY_CHECK),
hWnd,SecurityCheckDlgProc);
if (fRet) {
// user OK'd it, go ahead and unbind the server from the instance
// in question
HRESULT hr = lpIcfgTurnOffFileSharing(INSTANCE_PPPDRIVER, hWnd);
ASSERT(hr == ERROR_SUCCESS);
if (hr == ERROR_SUCCESS) {
// we need to restart for the changes to take effect
*pfNeedRestart = TRUE;
}
}
}
}
/*******************************************************************
NAME: SecurityCheckDlgProc
SYNOPSIS: Dialog proc for security check dialog
NOTES: This is basically just a yes/no dialog, so we could
almost just use MessageBox, except we also need a "don't
do this any more" checkbox.
********************************************************************/
INT_PTR CALLBACK SecurityCheckDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
LPARAM lParam)
{
switch (uMsg) {
case WM_INITDIALOG:
CenterWindow(hDlg,GetDesktopWindow());
SetFocus(GetDlgItem(hDlg,IDOK));
return TRUE;
break;
case WM_COMMAND:
switch (wParam) {
case IDOK:
// dismiss the dialog
EndDialog(hDlg,TRUE);
break;
case IDCANCEL:
// if "don't display this in the future" is checked, then
// turn off registry switch for security check
if (IsDlgButtonChecked(hDlg,IDC_DISABLE_CHECK)) {
RegEntry re(szRegPathInternetSettings,HKEY_CURRENT_USER);
ASSERT(re.GetError() == ERROR_SUCCESS);
if (re.GetError() == ERROR_SUCCESS) {
re.SetValue(szRegValEnableSecurityCheck,
(DWORD) 0 );
ASSERT(re.GetError() == ERROR_SUCCESS);
}
}
// dismiss the dialog
EndDialog(hDlg,FALSE);
break;
case IDC_DISABLE_CHECK:
// if "don't do this in the future" is checked, then
// disable 'OK' button
EnableDlgItem(hDlg,IDOK,!IsDlgButtonChecked(hDlg,
IDC_DISABLE_CHECK));
break;
}
break;
}
return FALSE;
}
/****************************************************************************
FUNCTION: CenterWindow (HWND, HWND)
PURPOSE: Center one window over another
COMMENTS:
Dialog boxes take on the screen position that they were designed at,
which is not always appropriate. Centering the dialog over a particular
window usually results in a better position.
****************************************************************************/
BOOL CenterWindow (HWND hwndChild, HWND hwndParent)
{
RECT rChild, rParent;
int wChild, hChild, wParent, hParent;
int wScreen, hScreen, xNew, yNew;
HDC hdc;
// Get the Height and Width of the child window
GetWindowRect (hwndChild, &rChild);
wChild = rChild.right - rChild.left;
hChild = rChild.bottom - rChild.top;
// Get the Height and Width of the parent window
GetWindowRect (hwndParent, &rParent);
wParent = rParent.right - rParent.left;
hParent = rParent.bottom - rParent.top;
// Get the display limits
hdc = GetDC (hwndChild);
wScreen = GetDeviceCaps (hdc, HORZRES);
hScreen = GetDeviceCaps (hdc, VERTRES);
ReleaseDC (hwndChild, hdc);
// Calculate new X position, then adjust for screen
xNew = rParent.left + ((wParent - wChild) /2);
if (xNew < 0) {
xNew = 0;
} else if ((xNew+wChild) > wScreen) {
xNew = wScreen - wChild;
}
// Calculate new Y position, then adjust for screen
yNew = rParent.top + ((hParent - hChild) /2);
if (yNew < 0) {
yNew = 0;
} else if ((yNew+hChild) > hScreen) {
yNew = hScreen - hChild;
}
// Set it, and return
return SetWindowPos (hwndChild, NULL,
xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
/*******************************************************************
NAME: DoDNSCheck
SYNOPSIS: Checks to see if DNS is configured statically in the
registry. If it is, then displays a dialog offering
to remove it, and removes it if user chooses.
ENTRY: hwndParent - parent window
pfNeedRestart - filled in on exit with TRUE if restart
is necessary, FALSE otherwise
NOTES: Need to do this to work around Win 95 bug where
dynamically assigned DNS servers are ignored if static
DNS servers are set.
Note that the UI is MSN specific and contains MSN
references!
********************************************************************/
BOOL DoDNSCheck(HWND hwndParent,BOOL * pfNeedRestart)
{
ASSERT(pfNeedRestart);
*pfNeedRestart = FALSE;
/******** ChrisK 10/24/96 Normandy 3722 - see bug for LONG discussion on this
// see if this warning has already been disabled
RegEntry re(szRegPathWarningFlags,HKEY_CURRENT_USER);
if (re.GetError() == ERROR_SUCCESS) {
if (re.GetNumber(szRegValDisableDNSWarning,0) > 0) {
// user has asked for warning to be disabled, nothing to do
return TRUE;
}
}
// if there are DNS servers set statically (e.g. in net setup),
// warn the user and ask if we should remove
BOOL fGlobalDNS;
HRESULT hr = lpIcfgIsGlobalDNS(&fGlobalDNS);
if ((ERROR_SUCCESS == hr) && (TRUE == fGlobalDNS))
{
WARNINGDLGINFO WarningDlgInfo;
ZeroMemory(&WarningDlgInfo,sizeof(WARNINGDLGINFO));
DialogBoxParam(ghInstance,MAKEINTRESOURCE(IDD_DNS_WARNING),
hwndParent,WarningDlgProc,(LPARAM) &WarningDlgInfo);
// one field or the other can be TRUE, but not both...
ASSERT(!(WarningDlgInfo.fResult && WarningDlgInfo.fDisableWarning));
if (WarningDlgInfo.fResult)
{
// remove static DNS servers from registry
HRESULT hr = lpIcfgRemoveGlobalDNS();
ASSERT(hr == ERROR_SUCCESS);
if (hr != ERROR_SUCCESS)
{
DisplayErrorMessage(hwndParent,IDS_ERRWriteDNS,hr,
ERRCLS_STANDARD,MB_ICONEXCLAMATION);
}
else
{
*pfNeedRestart = TRUE;
}
}
else if (WarningDlgInfo.fDisableWarning)
{
// disable warning switch in registry
re.SetValue(szRegValDisableDNSWarning,(DWORD) TRUE);
}
}
ChrisK 10/24/96 Normandy 3722 - see bug for LONG discussion on this ********/
return TRUE;
}
/*******************************************************************
NAME: WarningDlgProc
SYNOPSIS: Dialog proc for DNS warning dialog
********************************************************************/
BOOL CALLBACK WarningDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam,
LPARAM lParam)
{
WARNINGDLGINFO * pWarningDlgInfo;
switch (uMsg) {
case WM_INITDIALOG:
// center dialog on screen if we're not owned
if (!GetParent(hDlg)) {
CenterWindow(hDlg,GetDesktopWindow());
}
SetFocus(GetDlgItem(hDlg,IDOK));
// lParam should point to WARNINGDLGINFO struct
ASSERT(lParam);
if (!lParam)
return FALSE;
// store pointer in window data
SetWindowLongPtr(hDlg,DWLP_USER,lParam);
return TRUE;
break;
case WM_COMMAND:
pWarningDlgInfo = (WARNINGDLGINFO *) GetWindowLongPtr(hDlg,DWLP_USER);
ASSERT(pWarningDlgInfo);
switch (wParam) {
case IDOK:
pWarningDlgInfo->fResult=TRUE;
pWarningDlgInfo->fDisableWarning=FALSE;
EndDialog(hDlg,TRUE);
break;
case IDC_CANCEL:
pWarningDlgInfo->fResult=FALSE;
pWarningDlgInfo->fDisableWarning=
IsDlgButtonChecked(hDlg,IDC_DISABLE_WARNING);
EndDialog(hDlg,FALSE);
break;
case IDC_DISABLE_WARNING:
// when 'disable warning' is checked, disable the 'yes'
// button
EnableDlgItem(hDlg,IDOK,!IsDlgButtonChecked(hDlg,
IDC_DISABLE_WARNING));
break;
}
}
return FALSE;
}