//---------------------------------------------------------------------------- // // Copyright (c) 1997-1999 Microsoft Corporation // All rights reserved. // // File Name: // loadfile.c // // Description: // // This file implements ReadSettingsFromAnswerFile(). It is called // from load.c only if the user chose to edit an existing answer file. // // We call GetPrivateProfileString repeatedly to figure out how to // initialize GenSettings WizGlobals and NetSettings global vars. // // WARNING: // This function is called after reset.c in the case we're editting // an answer file. Be very careful how you call GetPrivateProfileString() // because if the setting is not present, you do not want to change // the default already set in reset.c. Numerous examples below. // //---------------------------------------------------------------------------- #include "pch.h" #include "allres.h" // // Misc constants (declared as vars to save space) // static WCHAR *StrConstYes = _T("Yes"); static WCHAR *StrConstNo = _T("No"); static WCHAR *StrConstStar = _T("*"); extern BOOL GetCommaDelimitedEntry( OUT TCHAR szIPString[], IN OUT TCHAR **pBuffer ); // ISSUE-2002/02/28-stelo- make constants for each key and use them both in the save file and in this load file const TCHAR c_szFAVORITESEX[] = _T("FavoritesEx"); // // Local prototypes // static VOID ReadRegionalSettings( VOID ); static VOID ReadTapiSettings( VOID ); static VOID ReadIeSettings( VOID ); static VOID ReadIeFavorites( VOID ); static VOID ParseAddressAndPort( LPTSTR pszBufferForProxyAddressAndPort, LPTSTR pszAddress, DWORD cbAddressLen, LPTSTR pszPort, DWORD cbPortLen); // // Call out to loadnet.c to load the network settings // extern VOID ReadNetworkSettings( HWND ); //---------------------------------------------------------------------------- // // Function: ReadSettingsFromAnswerFile // // Purpose: This function does all of the GetPrivateProfile*() stuff // to load up our in-memory settings. // // Arguments: VOID // // Returns: VOID // //---------------------------------------------------------------------------- BOOL ReadSettingsFromAnswerFile(HWND hwnd) { INT temp; TCHAR Buffer[MAX_INILINE_LEN]; // // Get the UnattendMode. In case there is garbage in the answer file, // let the answer be UMODE_PROVIDE_DEFAULT. // temp = StrBuffSize(Buffer); GetPrivateProfileString(_T("Unattended"), _T("UnattendMode"), _T(""), Buffer, temp, FixedGlobals.ScriptName); if ( LSTRCMPI(Buffer, _T("GuiAttended")) == 0 ) GenSettings.iUnattendMode = UMODE_GUI_ATTENDED; else if ( LSTRCMPI(Buffer, _T("DefaultHide")) == 0 ) GenSettings.iUnattendMode = UMODE_DEFAULT_HIDE; else if ( LSTRCMPI(Buffer, _T("Readonly")) == 0 ) GenSettings.iUnattendMode = UMODE_READONLY; else if ( LSTRCMPI(Buffer, _T("FullUnattended")) == 0 ) GenSettings.iUnattendMode = UMODE_FULL_UNATTENDED; else GenSettings.iUnattendMode = UMODE_PROVIDE_DEFAULT; // // Get the HAL // GetPrivateProfileString(_T("Unattended"), _T("ComputerType"), _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); // // Have to read in HAL and SCSI drivers a little // differently because of the quotes on the left for the SCSI drivers // and the different formatting with the HAL // { HINF hUnattendTxt; INFCONTEXT UnattendTxtContext; BOOL bKeepReading = TRUE; BOOL bHalFound = FALSE; TCHAR szTempBuffer[MAX_INILINE_LEN]; hUnattendTxt = SetupOpenInfFile( FixedGlobals.ScriptName, NULL, INF_STYLE_OLDNT | INF_STYLE_WIN4, NULL ); if( hUnattendTxt == INVALID_HANDLE_VALUE ) { // ISSUE-2002/02/28-stelo - alert an error that we couldn't open the file or just // skip over in this case? //return; } UnattendTxtContext.Inf = hUnattendTxt; UnattendTxtContext.CurrentInf = hUnattendTxt; bKeepReading = SetupFindFirstLine( hUnattendTxt, _T("Unattended"), NULL, &UnattendTxtContext ); // // Look for the ComputerType key to set which HAL to use // while( bKeepReading && ! bHalFound ) { SetupGetStringField( &UnattendTxtContext, 0, szTempBuffer, MAX_INILINE_LEN, NULL ); if( LSTRCMPI( szTempBuffer, _T("ComputerType") ) == 0 ) { SetupGetStringField( &UnattendTxtContext, 1, GenSettings.szHalFriendlyName, MAX_INILINE_LEN, NULL ); bHalFound = TRUE; } // // move to the next line of the answer file // bKeepReading = SetupFindNextLine( &UnattendTxtContext, &UnattendTxtContext ); } // // Read in the SCSI drivers // bKeepReading = SetupFindFirstLine( hUnattendTxt, _T("MassStorageDrivers"), NULL, &UnattendTxtContext ); // // For each MassStorageDriver entry, add it to the MassStorageDriver // namelist // while( bKeepReading ) { TCHAR szScsiFriendlyName[MAX_INILINE_LEN]; SetupGetStringField( &UnattendTxtContext, 0, szScsiFriendlyName, MAX_INILINE_LEN, NULL ); // // Don't allow the adding of a blank name (protection against a bad input file) // if( szScsiFriendlyName[0] != _T('\0') ) { AddNameToNameList( &GenSettings.MassStorageDrivers, szScsiFriendlyName ); } // // move to the next line of the answer file // bKeepReading = SetupFindNextLine( &UnattendTxtContext, &UnattendTxtContext ); } SetupCloseInfFile( hUnattendTxt ); } // // Not reading from the [OEMBootFiles] section because this gets // generated from whatever SCSI and HAL selections they make so // it is not necessary to read it in. // // // Get OEM Ads data // GetPrivateProfileString(_T("OEM_Ads"), _T("Logo"), GenSettings.lpszLogoBitmap, GenSettings.lpszLogoBitmap, StrBuffSize(GenSettings.lpszLogoBitmap), FixedGlobals.ScriptName); GetPrivateProfileString(_T("OEM_Ads"), _T("Background"), GenSettings.lpszBackgroundBitmap, GenSettings.lpszBackgroundBitmap, StrBuffSize(GenSettings.lpszBackgroundBitmap), FixedGlobals.ScriptName); // // Get the product ID // { TCHAR *pStart = Buffer, *pEnd; BOOL bStop = FALSE; int CurField = 0; GetPrivateProfileString(_T("UserData"), _T("ProductKey"), NULLSTR, Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); // We did not have a ProductKey, check for the old ProductID // if ( Buffer[0] == NULLCHR ) { GetPrivateProfileString(_T("UserData"), _T("ProductID"), _T("-"), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); } // // Have to parse out the pid1-pid2-pid3-pid4-pid5. // do { if ( (pEnd = wcschr(pStart, _T('-'))) == NULL ) bStop = TRUE; else *pEnd++ = _T('\0'); lstrcpyn(GenSettings.ProductId[CurField++], pStart, MAX_PID_FIELD + 1); pStart = pEnd; } while ( ! bStop && CurField < NUM_PID_FIELDS ); } // // Get the license mode for server. If we find this section, we // force on iProductInstall to be Server. // GetPrivateProfileString(_T("LicenseFilePrintData"), _T("AutoMode"), _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); if ( Buffer[0] != _T('\0') ) { WizGlobals.iProductInstall = PRODUCT_UNATTENDED_INSTALL; WizGlobals.iPlatform = PLATFORM_SERVER; if ( LSTRCMPI(Buffer, _T("PerSeat")) == 0 ) { GenSettings.bPerSeat = TRUE; } else { GenSettings.bPerSeat = FALSE; GenSettings.NumConnections = GetPrivateProfileInt(_T("LicenseFilePrintData"), _T("AutoUsers"), GenSettings.NumConnections, FixedGlobals.ScriptName); } } // // Get name&org // GetPrivateProfileString(_T("UserData"), _T("FullName"), GenSettings.UserName, GenSettings.UserName, StrBuffSize(GenSettings.UserName), FixedGlobals.ScriptName); GetPrivateProfileString(_T("UserData"), _T("OrgName"), GenSettings.Organization, GenSettings.Organization, StrBuffSize(GenSettings.Organization), FixedGlobals.ScriptName); // // Get the computer names. It can be: // 1. ComputerName=* // 2. ComputerName=some_name // 3. not specified at all // 4. multiple computer names // // In case #4, we wrote out a .UDF, but we won't read the .UDF. Instead, // we get the list from here: // // [SetupMgr] // ComputerName0=some_name // ComputerName1=another_name // { ResetNameList(&GenSettings.ComputerNames); GetPrivateProfileString(_T("UserData"), _T("ComputerName"), _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); if( Buffer[0] != _T('\0') ) { if( lstrcmpi(Buffer, StrConstStar) == 0 ) { // // if ComputerName=*, it is either the auto generate case // or the UDF case // GetPrivateProfileString(_T("SetupMgr"), _T("ComputerName0"), _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); if( Buffer[0] == _T('\0') ) { GenSettings.bAutoComputerName = TRUE; } else { int i; TCHAR Buffer2[MAX_INILINE_LEN]; HRESULT hrPrintf; GenSettings.bAutoComputerName = FALSE; for( i = 0; TRUE; i++ ) { hrPrintf=StringCchPrintf(Buffer2, AS(Buffer2),_T("ComputerName%d"), i); GetPrivateProfileString(_T("SetupMgr"), Buffer2, _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); if ( Buffer[0] == _T('\0') ) break; AddNameToNameList(&GenSettings.ComputerNames, Buffer); } } } else { GenSettings.bAutoComputerName = FALSE; AddNameToNameList(&GenSettings.ComputerNames, Buffer); } } } // // Get the IE settings // ReadIeSettings(); // // Get the targetpath // GetPrivateProfileString(_T("Unattended"), _T("TargetPath"), _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); if ( lstrcmpi(Buffer, StrConstStar) == 0 ) { GenSettings.iTargetPath = TARGPATH_AUTO; GenSettings.TargetPath[0] = _T('\0'); } else if ( lstrcmpi(Buffer, _T("")) == 0 ) { GenSettings.iTargetPath = TARGPATH_WINNT; GenSettings.TargetPath[0] = _T('\0'); } else { GenSettings.iTargetPath = TARGPATH_SPECIFY; lstrcpyn(GenSettings.TargetPath, Buffer, MAX_TARGPATH + 1); } // // Get the administrator password. // // AdminPassword == * means bSpecifyPassword to blank // AdminPassword[0] == '\0' means !bSpecifyPassword // // Always set ConfirmPassword == AdminPassword on an edit so that // the user can breeze past this page. // // Check to see if the password is encrypted GetPrivateProfileString(_T("GuiUnattended"), _T("EncryptedAdminPassword"), _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); if (lstrcmpi(Buffer, StrConstYes) == 0) { // If it is encrypted, don't bother reading it, just blank it out GenSettings.AdminPassword[0] = _T('\0'); GenSettings.bSpecifyPassword = TRUE; } else { GetPrivateProfileString(_T("GuiUnattended"), _T("AdminPassword"), GenSettings.AdminPassword, GenSettings.AdminPassword, StrBuffSize(GenSettings.AdminPassword), FixedGlobals.ScriptName); if ( GenSettings.AdminPassword[0] == _T('\0') ) GenSettings.bSpecifyPassword = FALSE; else GenSettings.bSpecifyPassword = TRUE; if ( lstrcmpi(GenSettings.AdminPassword, StrConstStar) == 0 ) GenSettings.AdminPassword[0] = _T('\0'); } lstrcpyn(GenSettings.ConfirmPassword, GenSettings.AdminPassword, AS(GenSettings.ConfirmPassword)); GetPrivateProfileString(_T("GuiUnattended"), _T("AutoLogon"), _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); if ( lstrcmpi(Buffer, StrConstYes) == 0 ) GenSettings.bAutoLogon = TRUE; else GenSettings.bAutoLogon = FALSE; GenSettings.nAutoLogonCount = GetPrivateProfileInt(_T("GuiUnattended"), _T("AutoLogonCount"), GenSettings.nAutoLogonCount, FixedGlobals.ScriptName); GetPrivateProfileString(_T("GuiUnattended"), _T("OEMDuplicatorstring"), GenSettings.szOemDuplicatorString, GenSettings.szOemDuplicatorString, StrBuffSize(GenSettings.szOemDuplicatorString), FixedGlobals.ScriptName); // // Get the display settings. // GenSettings.DisplayColorBits = GetPrivateProfileInt( _T("Display"), _T("BitsPerPel"), GenSettings.DisplayColorBits, FixedGlobals.ScriptName); GenSettings.DisplayXResolution = GetPrivateProfileInt( _T("Display"), _T("XResolution"), GenSettings.DisplayXResolution, FixedGlobals.ScriptName); GenSettings.DisplayYResolution = GetPrivateProfileInt( _T("Display"), _T("YResolution"), GenSettings.DisplayYResolution, FixedGlobals.ScriptName); GenSettings.DisplayRefreshRate = GetPrivateProfileInt( _T("Display"), _T("Vrefresh"), GenSettings.DisplayRefreshRate, FixedGlobals.ScriptName); // // Get the runonce commands. They are listed like this: // // [GuiRunOnce] // Command0=some_cmd // Command0=another_cmd // // ISSUE-2002/02/28-stelo -Need to investigate this biz about running these commands // in sequence or in parrallel. // { int i; TCHAR Buffer2[MAX_INILINE_LEN]; HRESULT hrPrintf; ResetNameList(&GenSettings.RunOnceCmds); for ( i=0; TRUE; i++ ) { hrPrintf=StringCchPrintf(Buffer2, AS(Buffer2),_T("Command%d"), i); GetPrivateProfileString(_T("GuiRunOnce"), Buffer2, _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); if ( Buffer[0] == _T('\0') ) break; AddNameToNameList(&GenSettings.RunOnceCmds, Buffer); } } // // Loop through the commands and parse out any add printer commands // // // NOTE: This code works if the user never edits the commands. // However, the user might want to modify it and put // different switches on it on the RunOnce page. The // parsing below could be more robust. // // If /n means 'name', then it should parse for /n then // the next arg is the printer name no matter what switches // the user added or re-ordered. // { int i, NumCmds; TCHAR *pName; TCHAR PrinterName[MAX_PRINTERNAME + 1]; NumCmds = GetNameListSize(&GenSettings.RunOnceCmds); for ( i=0; i 0 ) && ( PrinterName[0] ) ) { AddNameToNameList(&GenSettings.PrinterNames, PrinterName); } } } // // Get the timezone // GetPrivateProfileString( _T("GuiUnattended"), _T("TimeZone"), _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName ); if ( LSTRCMPI(Buffer, _T("%TIMEZONE%")) == 0 ) { GenSettings.TimeZoneIdx = TZ_IDX_SETSAMEASSERVER; } else if ( ( Buffer[0] == _T('\0') ) || ( swscanf(Buffer, _T("%d"), &GenSettings.TimeZoneIdx) <= 0 ) ) { GenSettings.TimeZoneIdx = TZ_IDX_DONOTSPECIFY; } // // Init the settings for the 2 Distribution Folder pages. OemPreInstall // indicates whether the script is stand-alone or not. The others are // saved in the [SetupMgr] section. // GetPrivateProfileString(_T("Unattended"), _T("OemPreInstall"), _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName ); if ( lstrcmpi(Buffer, StrConstYes) == 0 ) WizGlobals.bStandAloneScript = FALSE; else WizGlobals.bStandAloneScript = TRUE; GetPrivateProfileString(_T("SetupMgr"), _T("DistFolder"), WizGlobals.DistFolder, WizGlobals.DistFolder, StrBuffSize(WizGlobals.DistFolder), FixedGlobals.ScriptName); GetPrivateProfileString(_T("SetupMgr"), _T("DistShare"), WizGlobals.DistShareName, WizGlobals.DistShareName, StrBuffSize(WizGlobals.DistShareName), FixedGlobals.ScriptName); WizGlobals.bCreateNewDistFolder = FALSE; // // Get tapi & regional settings // ReadTapiSettings(); ReadRegionalSettings(); // // Purposely grabbing the JoinWorkgroup key twice. Once to determine if // there a value for the key and once to set the value for the global // NetSettings.WorkGroupName string. // GetPrivateProfileString(_T("Identification"), _T("JoinWorkgroup"), _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); GetPrivateProfileString(_T("Identification"), _T("JoinWorkgroup"), NetSettings.WorkGroupName, NetSettings.WorkGroupName, StrBuffSize(NetSettings.WorkGroupName), FixedGlobals.ScriptName); GetPrivateProfileString(_T("Identification"), _T("JoinDomain"), NetSettings.DomainName, NetSettings.DomainName, StrBuffSize(NetSettings.DomainName), FixedGlobals.ScriptName); // // If they didn't specify a workgroup in the answerfile and they did // specify a domain, chose to Join a Domain (i.e. not join a workgroup) // if( Buffer[0] == _T('\0') && NetSettings.DomainName[0] != _T('\0') ) { NetSettings.bWorkgroup = FALSE; } if( lstrcmp( NetSettings.DomainName, _T("%MACHINEDOMAIN%") ) == 0 ) { WizGlobals.iProductInstall = PRODUCT_REMOTEINSTALL; } GetPrivateProfileString(_T("Identification"), _T("DomainAdmin"), NetSettings.DomainAccount, NetSettings.DomainAccount, StrBuffSize(NetSettings.DomainAccount), FixedGlobals.ScriptName); GetPrivateProfileString(_T("Identification"), _T("DomainAdminPassword"), NetSettings.DomainPassword, NetSettings.DomainPassword, StrBuffSize(NetSettings.DomainPassword), FixedGlobals.ScriptName); if( NetSettings.DomainAccount[0] == _T('\0') ) { NetSettings.bCreateAccount = FALSE; } else { NetSettings.bCreateAccount = TRUE; } // // Make the domain password and the confirm the same so user can // breeze past the page if they want to // lstrcpyn( NetSettings.ConfirmPassword, NetSettings.DomainPassword ,AS(NetSettings.ConfirmPassword)); // // Read in the Network settings // ReadNetworkSettings( hwnd ); return( TRUE ); } //---------------------------------------------------------------------------- // // Function: ReadTapiSettings // // Purpose: Read the tapi settings keys from the answerfile. // // Arguments: VOID // // Returns: VOID // //---------------------------------------------------------------------------- static VOID ReadTapiSettings( VOID ) { TCHAR Buffer[MAX_INILINE_LEN] = _T(""); // // Note: if it doesn't find the CountryCode key then it defaults to // "Don't specify setting" // GenSettings.dwCountryCode = GetPrivateProfileInt(_T("TapiLocation"), _T("CountryCode"), DONTSPECIFYSETTING, FixedGlobals.ScriptName); GetPrivateProfileString(_T("TapiLocation"), _T("Dialing"), _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); if ( LSTRCMPI(Buffer, _T("Tone")) == 0 ) GenSettings.iDialingMethod = TONE; else if ( LSTRCMPI(Buffer, _T("Pulse")) == 0 ) GenSettings.iDialingMethod = PULSE; else GenSettings.iDialingMethod = DONTSPECIFYSETTING; GetPrivateProfileString(_T("TapiLocation"), _T("AreaCode"), GenSettings.szAreaCode, GenSettings.szAreaCode, StrBuffSize(GenSettings.szAreaCode), FixedGlobals.ScriptName); GetPrivateProfileString(_T("TapiLocation"), _T("LongDistanceAccess"), GenSettings.szOutsideLine, GenSettings.szOutsideLine, StrBuffSize(GenSettings.szOutsideLine), FixedGlobals.ScriptName); } //---------------------------------------------------------------------------- // // Function: ReadRegionalSettings // // Purpose: Read the regional settings keys from the answerfile. // // Arguments: VOID // // Returns: VOID // //---------------------------------------------------------------------------- static VOID ReadRegionalSettings( VOID ) { TCHAR Buffer[MAX_INILINE_LEN] = _T(""); TCHAR OemSkipBuffer[MAX_INILINE_LEN] = _T(""); TCHAR szLanguageGroup[MAX_INILINE_LEN] = _T(""); TCHAR *pLanguageGroup = NULL; DWORD dwOemSkipSize = 0; DWORD dwLanguageSize = 0; DWORD dwSystemSize = 0; DWORD dwNumberSize = 0; DWORD dwKeyboardSize = 0; dwOemSkipSize = GetPrivateProfileString(_T("RegionalSettings"), _T("OEMSkipRegionalSettings"), _T(""), OemSkipBuffer, StrBuffSize(OemSkipBuffer), FixedGlobals.ScriptName); GetPrivateProfileString(_T("RegionalSettings"), _T("LanguageGroup"), _T(""), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); // // Loop grabbing the Language Groups and inserting them into // the NameList // pLanguageGroup = Buffer; while( GetCommaDelimitedEntry( szLanguageGroup, &pLanguageGroup ) ) { AddNameToNameList( &GenSettings.LanguageGroups, szLanguageGroup ); } dwLanguageSize = GetPrivateProfileString(_T("RegionalSettings"), _T("Language"), _T(""), GenSettings.szLanguage, StrBuffSize(GenSettings.szLanguage), FixedGlobals.ScriptName); dwSystemSize = GetPrivateProfileString(_T("RegionalSettings"), _T("SystemLocale"), _T(""), GenSettings.szMenuLanguage, StrBuffSize(GenSettings.szMenuLanguage), FixedGlobals.ScriptName); dwNumberSize = GetPrivateProfileString(_T("RegionalSettings"), _T("UserLocale"), _T(""), GenSettings.szNumberLanguage, StrBuffSize(GenSettings.szNumberLanguage), FixedGlobals.ScriptName); dwKeyboardSize = GetPrivateProfileString(_T("RegionalSettings"), _T("InputLocale"), _T(""), GenSettings.szKeyboardLayout, StrBuffSize(GenSettings.szKeyboardLayout), FixedGlobals.ScriptName); // // If the OEMSkipRegionalSettings was specified in the answerfile, set // its value and return. Else set the language locales appropriately. // if( dwOemSkipSize > 0 ) { if( lstrcmp( OemSkipBuffer, _T("0") ) == 0 ) { GenSettings.iRegionalSettings = REGIONAL_SETTINGS_SKIP; } else if( lstrcmp( OemSkipBuffer, _T("1") ) == 0 ) { GenSettings.iRegionalSettings = REGIONAL_SETTINGS_DEFAULT; } else { // if it was set to some strange settings, just set it to use default GenSettings.iRegionalSettings = REGIONAL_SETTINGS_DEFAULT; } } else { if( dwLanguageSize != 0 ) { GenSettings.iRegionalSettings = REGIONAL_SETTINGS_SPECIFY; } else if( dwSystemSize != 0 || dwNumberSize != 0 || dwKeyboardSize != 0 ) { GenSettings.iRegionalSettings = REGIONAL_SETTINGS_SPECIFY; GenSettings.bUseCustomLocales = TRUE; } else { // // If no keys were specified, set it to not specified // GenSettings.iRegionalSettings = REGIONAL_SETTINGS_NOT_SPECIFIED; } } } //---------------------------------------------------------------------------- // // Function: ReadIeSettings // // Purpose: Read the IE settings keys from the answerfile and store them in // the global structs. // // Arguments: VOID // // Returns: VOID // //---------------------------------------------------------------------------- static VOID ReadIeSettings( VOID ) { TCHAR szBufferForProxyAddressAndPort[2048 + 1]; TCHAR szAddress[MAX_PROXY_LEN]; TCHAR szPort[MAX_PROXY_PORT_LEN]; TCHAR Buffer[MAX_INILINE_LEN]; TCHAR *pLocalString; GetPrivateProfileString(_T("Branding"), _T("IEBrandingFile"), GenSettings.szInsFile, GenSettings.szInsFile, StrBuffSize(GenSettings.szInsFile), FixedGlobals.ScriptName); if( GenSettings.szInsFile[0] != _T('\0') ) { GenSettings.IeCustomizeMethod = IE_USE_BRANDING_FILE; } else { GenSettings.IeCustomizeMethod = IE_SPECIFY_SETTINGS; } GetPrivateProfileString(_T("URL"), _T("AutoConfig"), _T("1"), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); if( lstrcmpi( Buffer, _T("1") ) == 0 ) { GenSettings.bUseAutoConfigScript = TRUE; } else { GenSettings.bUseAutoConfigScript = FALSE; } GetPrivateProfileString(_T("URL"), _T("AutoConfigURL"), GenSettings.szAutoConfigUrl, GenSettings.szAutoConfigUrl, StrBuffSize(GenSettings.szAutoConfigUrl), FixedGlobals.ScriptName); GetPrivateProfileString(_T("URL"), _T("AutoConfigJSURL"), GenSettings.szAutoConfigUrlJscriptOrPac, GenSettings.szAutoConfigUrlJscriptOrPac, StrBuffSize(GenSettings.szAutoConfigUrlJscriptOrPac), FixedGlobals.ScriptName); if( GenSettings.szAutoConfigUrl[0] != _T('\0') || GenSettings.szAutoConfigUrlJscriptOrPac[0] != _T('\0') ) { GenSettings.bUseAutoConfigScript = TRUE; } else { GenSettings.bUseAutoConfigScript = FALSE; } GetPrivateProfileString(_T("Proxy"), _T("Use_Same_Proxy"), _T("0"), Buffer, StrBuffSize(Buffer), FixedGlobals.ScriptName); if( lstrcmpi( Buffer, _T("1") ) == 0 ) { GenSettings.bUseSameProxyForAllProtocols = TRUE; } else { GenSettings.bUseSameProxyForAllProtocols = FALSE; } // // Get the HTTP Proxy server // GetPrivateProfileString(_T("Proxy"), _T("HTTP_Proxy_Server"), _T(""), szBufferForProxyAddressAndPort, StrBuffSize(szBufferForProxyAddressAndPort), FixedGlobals.ScriptName); ParseAddressAndPort( szBufferForProxyAddressAndPort, szAddress, AS(szAddress), szPort, AS(szPort)); lstrcpyn( GenSettings.szHttpProxyAddress, szAddress, AS(GenSettings.szHttpProxyAddress) ); lstrcpyn( GenSettings.szHttpProxyPort, szPort, AS(GenSettings.szHttpProxyPort) ); if( GenSettings.szHttpProxyAddress[0] != _T('\0') ) { GenSettings.bUseProxyServer = TRUE; } else { GenSettings.bUseProxyServer = FALSE; } // // Get the Secure Proxy server // GetPrivateProfileString(_T("Proxy"), _T("Secure_Proxy_Server"), _T(""), szBufferForProxyAddressAndPort, StrBuffSize(szBufferForProxyAddressAndPort), FixedGlobals.ScriptName); ParseAddressAndPort( szBufferForProxyAddressAndPort, szAddress, AS(szAddress), szPort, AS(szAddress) ); lstrcpyn( GenSettings.szSecureProxyAddress, szAddress, AS(GenSettings.szSecureProxyAddress) ); lstrcpyn( GenSettings.szSecureProxyPort, szPort, AS(GenSettings.szSecureProxyPort) ); // // Get the FTP Proxy server // GetPrivateProfileString(_T("Proxy"), _T("FTP_Proxy_Server"), _T(""), szBufferForProxyAddressAndPort, StrBuffSize(szBufferForProxyAddressAndPort), FixedGlobals.ScriptName); ParseAddressAndPort( szBufferForProxyAddressAndPort, szAddress, AS(szAddress), szPort, AS(szPort) ); lstrcpyn( GenSettings.szFtpProxyAddress, szAddress, AS(GenSettings.szFtpProxyAddress) ); lstrcpyn( GenSettings.szFtpProxyPort, szPort, AS(GenSettings.szFtpProxyPort) ); // // Get the Gopher Proxy server // GetPrivateProfileString(_T("Proxy"), _T("Gopher_Proxy_Server"), _T(""), szBufferForProxyAddressAndPort, StrBuffSize(szBufferForProxyAddressAndPort), FixedGlobals.ScriptName); ParseAddressAndPort( szBufferForProxyAddressAndPort, szAddress, AS(szAddress), szPort, AS(szPort) ); lstrcpyn( GenSettings.szGopherProxyAddress, szAddress, AS(GenSettings.szGopherProxyAddress) ); lstrcpyn( GenSettings.szGopherProxyPort, szPort, AS(GenSettings.szGopherProxyPort) ); // // Get the Socks Proxy server // GetPrivateProfileString(_T("Proxy"), _T("Socks_Proxy_Server"), _T(""), szBufferForProxyAddressAndPort, StrBuffSize(szBufferForProxyAddressAndPort), FixedGlobals.ScriptName); ParseAddressAndPort( szBufferForProxyAddressAndPort, szAddress, AS(szAddress), szPort, AS(szPort) ); lstrcpyn( GenSettings.szSocksProxyAddress, szAddress, AS(GenSettings.szSocksProxyAddress) ); lstrcpyn( GenSettings.szSocksProxyPort, szPort, AS(GenSettings.szSocksProxyPort) ); GetPrivateProfileString(_T("Proxy"), _T("Proxy_Override"), _T(""), GenSettings.szProxyExceptions, StrBuffSize(GenSettings.szProxyExceptions), FixedGlobals.ScriptName); pLocalString = _tcsstr( GenSettings.szProxyExceptions, _T("") ); // Initialize the GenSettings Proxy Bypass boolean value... // GenSettings.bBypassProxyForLocalAddresses = FALSE; if( pLocalString != NULL ) { TCHAR *pChar; TCHAR *pEndLocal; LPTSTR lpszExceptionBuffer; DWORD cbExceptionBufferLen; // // Remove the false entry, so it doesn't get added to the exception edit box // pEndLocal = pLocalString + lstrlen( _T("") ); // // Allocate the exception buffer... // cbExceptionBufferLen= lstrlen(pEndLocal)+1; lpszExceptionBuffer = MALLOC( cbExceptionBufferLen * sizeof(TCHAR) ); if ( lpszExceptionBuffer ) { GenSettings.bBypassProxyForLocalAddresses = TRUE; // // strcpy is undefined if source and dest overlap so I have to go through // an intermediate buffer // lstrcpyn( lpszExceptionBuffer, pEndLocal, cbExceptionBufferLen); lstrcpyn( pLocalString, lpszExceptionBuffer, AS(GenSettings.szProxyExceptions)- (int)(pLocalString-GenSettings.szProxyExceptions) ); // // If the first or last char is a semicolon(;) then remove it. // pChar = GenSettings.szProxyExceptions; if( *pChar == _T(';') ) { lstrcpyn( lpszExceptionBuffer, GenSettings.szProxyExceptions, cbExceptionBufferLen); pChar = lpszExceptionBuffer; pChar++; lstrcpyn( GenSettings.szProxyExceptions, pChar, AS(GenSettings.szProxyExceptions) ); } pChar = GenSettings.szProxyExceptions + lstrlen( GenSettings.szProxyExceptions ); pChar--; if( *pChar == _T(';') ) { *pChar = _T('\0'); } FREE( lpszExceptionBuffer ); } } GetPrivateProfileString(_T("URL"), _T("Home_Page"), _T(""), GenSettings.szHomePage, StrBuffSize(GenSettings.szHomePage), FixedGlobals.ScriptName); GetPrivateProfileString(_T("URL"), _T("Help_Page"), _T(""), GenSettings.szHelpPage, StrBuffSize(GenSettings.szHelpPage), FixedGlobals.ScriptName); GetPrivateProfileString(_T("URL"), _T("Search_Page"), _T(""), GenSettings.szSearchPage, StrBuffSize(GenSettings.szSearchPage), FixedGlobals.ScriptName); ReadIeFavorites(); } //---------------------------------------------------------------------------- // // Function: ReadIeFavorites // // Purpose: // // Arguments: VOID // // Returns: VOID // //---------------------------------------------------------------------------- static VOID ReadIeFavorites( VOID ) { const TCHAR c_szTITLE[] = _T("Title"); const TCHAR c_szURL[] = _T("URL"); const INT c_nMAX_URLS = 1000; INT i = 1; TCHAR szTitle[MAX_INILINE_LEN + 1]; TCHAR szUrl[MAX_INILINE_LEN + 1]; TCHAR szNumberBuffer[10]; TCHAR szFavoriteFriendlyName[MAX_INILINE_LEN + 1]; TCHAR szFavoriteAddress[MAX_INILINE_LEN + 1]; TCHAR *pszDotUrl; HRESULT hrCat; // // We really always should hit the break to exit the loop. The max count // is just to avoid a infinite loop for some strange reason. // while( i < c_nMAX_URLS ) { _itot( i, szNumberBuffer, 10 ); i++; lstrcpyn( szTitle, c_szTITLE, AS(szTitle) ); hrCat=StringCchCat( szTitle, AS(szTitle), szNumberBuffer); lstrcpyn( szUrl, c_szURL, AS(szUrl) ); hrCat=StringCchCat( szUrl, AS(szUrl), szNumberBuffer ); GetPrivateProfileString( c_szFAVORITESEX, szTitle, _T(""), szFavoriteFriendlyName, StrBuffSize( szFavoriteFriendlyName ), FixedGlobals.ScriptName ); if( szFavoriteFriendlyName[0] != _T('\0') ) { // // Strip off the .url portion of the title // pszDotUrl = _tcsstr( szFavoriteFriendlyName, _T(".url") ); if( pszDotUrl != NULL ) { *pszDotUrl = _T('\0'); } else { // skip it if it is a malformed title continue; } GetPrivateProfileString( c_szFAVORITESEX, szUrl, _T(""), szFavoriteAddress, StrBuffSize( szFavoriteAddress ), FixedGlobals.ScriptName ); AddNameToNameList( &GenSettings.Favorites, szFavoriteFriendlyName ); AddNameToNameList( &GenSettings.Favorites, szFavoriteAddress ); } else { break; } } } //---------------------------------------------------------------------------- // // Function: ParseAddressAndPort // // Purpose: LPTCSTR pszBufferForProxyAddressAndPort - the string to parse the // web address and port from // LPTSTR pszAddress - web address returned in this string // DWORD cbAddressLen - length of adress buffer // LPTSTR pszPort - web port returned in this string // DWORD cbPortLen - length of port buffer // // Arguments: VOID // // Returns: VOID // //---------------------------------------------------------------------------- static VOID ParseAddressAndPort( LPTSTR pszBufferForProxyAddressAndPort, LPTSTR pszAddress, DWORD cbAddressLen, LPTSTR pszPort, DWORD cbPortLen) { INT i; INT iStrLen; BOOL bColonFound = FALSE; lstrcpyn( pszAddress, _T(""), cbAddressLen); lstrcpyn( pszPort, _T(""), cbPortLen); iStrLen = lstrlen( pszBufferForProxyAddressAndPort ); for( i = 0; i < iStrLen; i++ ) { if( pszBufferForProxyAddressAndPort[i] == _T(':') ) { // // We have found the colon(:) separating the address and the port // if the next char is a digit. This prevents the colon in // http://www.someaddress.com from looking like the port. // if( _istdigit( pszBufferForProxyAddressAndPort[i + 1] ) ) { bColonFound = TRUE; break; } } } if( bColonFound ) { LPTSTR pPortSection; pszBufferForProxyAddressAndPort[i] = _T('\0'); pPortSection = &( pszBufferForProxyAddressAndPort[i + 1] ); lstrcpyn( pszAddress, pszBufferForProxyAddressAndPort, cbAddressLen); lstrcpyn( pszPort, pPortSection, cbPortLen); } else { // // it doesn't contain a colon so it doesn't have a port, the whole // string is the address // lstrcpyn( pszAddress, pszBufferForProxyAddressAndPort, cbAddressLen); } }