/*----------------------------------------------------------------------------- import.cpp This file contain all the functions that handle importing connection information from .DUN files Copyright (C) 1996 Microsoft Corporation All rights reserved. Authors: ChrisK ChrisKauffman History: Sat 10-Mar-1996 23:50:40 -by- Mark MacLin [mmaclin] this code started its life as ixport.c in RNAUI.DLL my thanks to viroont 7/22/96 ChrisK Cleaned and formatted -----------------------------------------------------------------------------*/ #include "pch.hpp" #include "resource.h" #include "inetcfg.h" #define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0])) #define IDS_DEFAULT_SCP 0 #define IDS_INI_SCRIPT_DIR 1 #define IDS_INI_SCRIPT_SHORTDIR 2 #define MAXLONGLEN 80 #define MAXNAME 80 //#ifdef __cplusplus //extern "C" { //#endif // __cplusplus //extern HINSTANCE g_hInstance; //#ifdef __cplusplus //} //#endif // __cplusplus #define MAXIPADDRLEN 20 #define SIZE_ReadBuf 0x00008000 // 32K buffer size #define AUTORUNSIGNUPWIZARDAPI "InetConfigClient" typedef HRESULT (CALLBACK *PFNAUTORUNSIGNUPWIZARD) (HWND hwndParent, LPCTSTR lpszPhoneBook, LPCTSTR lpszConnectoidName, LPRASENTRY lpRasEntry, LPCTSTR lpszUsername, LPCTSTR lpszPassword, LPCTSTR lpszProfileName, LPINETCLIENTINFO lpINetClientInfo, DWORD dwfOptions, LPBOOL lpfNeedsRestart); #pragma data_seg(".rdata") TCHAR cszEntrySection[] = TEXT("Entry"); TCHAR cszEntryName[] = TEXT("Entry_Name"); TCHAR cszAlias[] = TEXT("Import_Name"); TCHAR cszML[] = TEXT("Multilink"); TCHAR cszPhoneSection[] = TEXT("Phone"); TCHAR cszDialAsIs[] = TEXT("Dial_As_Is"); TCHAR cszPhone[] = TEXT("Phone_Number"); TCHAR cszAreaCode[] = TEXT("Area_Code"); TCHAR cszCountryCode[] = TEXT("Country_Code"); TCHAR cszCountryID[] = TEXT("Country_ID"); TCHAR cszDeviceSection[] = TEXT("Device"); TCHAR cszDeviceType[] = TEXT("Type"); TCHAR cszDeviceName[] = TEXT("Name"); TCHAR cszDevCfgSize[] = TEXT("Settings_Size"); TCHAR cszDevCfg[] = TEXT("Settings"); TCHAR cszServerSection[] = TEXT("Server"); TCHAR cszServerType[] = TEXT("Type"); TCHAR cszSWCompress[] = TEXT("SW_Compress"); TCHAR cszPWEncrypt[] = TEXT("PW_Encrypt"); TCHAR cszNetLogon[] = TEXT("Network_Logon"); TCHAR cszSWEncrypt[] = TEXT("SW_Encrypt"); TCHAR cszNetBEUI[] = TEXT("Negotiate_NetBEUI"); TCHAR cszIPX[] = TEXT("Negotiate_IPX/SPX"); TCHAR cszIP[] = TEXT("Negotiate_TCP/IP"); TCHAR cszIPSection[] = TEXT("TCP/IP"); TCHAR cszIPSpec[] = TEXT("Specify_IP_Address"); TCHAR cszIPAddress[] = TEXT("IP_address"); TCHAR cszServerSpec[] = TEXT("Specify_Server_Address"); TCHAR cszDNSAddress[] = TEXT("DNS_address"); TCHAR cszDNSAltAddress[] = TEXT("DNS_Alt_address"); TCHAR cszWINSAddress[] = TEXT("WINS_address"); TCHAR cszWINSAltAddress[]= TEXT("WINS_Alt_address"); TCHAR cszIPCompress[] = TEXT("IP_Header_Compress"); TCHAR cszWanPri[] = TEXT("Gateway_On_Remote"); TCHAR cszMLSection[] = TEXT("Multilink"); TCHAR cszLinkIndex[] = TEXT("Line_%s"); TCHAR cszScriptingSection[] = TEXT("Scripting"); TCHAR cszScriptName[] = TEXT("Name"); TCHAR cszScriptSection[] = TEXT("Script_File"); TCHAR cszYes[] = TEXT("yes"); TCHAR cszNo[] = TEXT("no"); TCHAR cszUserSection[] = TEXT("User"); TCHAR cszUserName[] = TEXT("Name"); TCHAR cszPassword[] = TEXT("Password"); TCHAR szNull[] = TEXT(""); #define DUN_NOPHONENUMBER TEXT("000000000000") struct { TCHAR *szType; DWORD dwType; DWORD dwfOptions; } aServerTypes[] = { {TEXT("PPP"), RASFP_Ppp, 0}, {TEXT("SLIP"), RASFP_Slip, 0}, {TEXT("CSLIP"), RASFP_Slip, RASEO_IpHeaderCompression}, {TEXT("RAS"), RASFP_Ras, 0} }; #pragma data_seg() //#define RASAPI_LIBRARY "RASAPI32.DLL" //#define RNAPH_LIBRARY "RNAPH.DLL" //typedef DWORD (WINAPI* PFNRASSETENTRYPROPERTIES)(LPSTR lpszPhonebook, LPSTR lpszEntry, LPBYTE lpbEntryInfo, DWORD dwEntryInfoSize, LPBYTE lpbDeviceInfo, DWORD dwDeviceInfoSize); //PreWriteConnectoid(LPSTR pszEntryName,RASENTRY *lpRasEntry) //{ // FARPROC fp = NULL; // HINSTANCE hRNADLL; // DWORD dwRasSize; // hRNADLL = LoadLibrary(RASAPI_LIBRARY); // fp = NULL; // if (hRNADLL) // { // fp = GetProcAddress(hRNADLL,"RasGetEntryProperties"); // } // if (!fp) // { // if (hRNADLL) FreeLibrary(hRNADLL); // hRNADLL = LoadLibrary(RNAPH_LIBRARY); // if (hRNADLL) fp = GetProcAddress(hRNADLL,"RasSetEntryProperties"); // } // if (fp) // { // dwRasSize = sizeof(RASENTRY); // ((PFNRASSETENTRYPROPERTIES)fp)(NULL,pszEntryName,(LPBYTE)lpRasEntry,dwRasSize,NULL,0); // } // if (hRNADLL) FreeLibrary(hRNADLL); //} //**************************************************************************** // DWORD NEAR PASCAL StrToip (LPSTR 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. //**************************************************************************** LPCTSTR NEAR PASCAL StrToSubip (LPCTSTR szIPAddress, BYTE *pVal) { LPCTSTR pszIP = szIPAddress; *pVal = (BYTE)Sz2W(pszIP); // skip over digits while (FIsDigit(*pszIP)) { ++pszIP; } // skip over one or more separators while (*pszIP && !FIsDigit(*pszIP)) { ++pszIP; } return pszIP; } DWORD NEAR PASCAL StrToip (LPCTSTR szIPAddress, RASIPADDR *ipAddr) { LPCTSTR 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, LPCTSTR szFileName) // // This function imports the phone number. // // History: // Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** DWORD NEAR PASCAL ImportPhoneInfo(LPRASENTRY lpRasEntry, LPCTSTR szFileName) { TCHAR szYesNo[MAXNAME]; GetPrivateProfileString(cszPhoneSection, cszPhone, DUN_NOPHONENUMBER, lpRasEntry->szLocalPhoneNumber, RAS_MaxPhoneNumber, szFileName); /**************** we need to accept entries w/o phone numbers if (GetPrivateProfileString(cszPhoneSection, cszPhone, szNull, lpRasEntry->szLocalPhoneNumber, sizeof(lpRasEntry->szLocalPhoneNumber), szFileName) == 0) { return ERROR_CORRUPT_PHONEBOOK; }; ****************/ lpRasEntry->dwfOptions &= ~RASEO_UseCountryAndAreaCodes; GetPrivateProfileString(cszPhoneSection, cszDialAsIs, cszYes, szYesNo, MAXNAME, 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); if (GetPrivateProfileString(cszPhoneSection, cszAreaCode, szNull, lpRasEntry->szAreaCode, RAS_MaxAreaCode, szFileName) != 0) { lpRasEntry->dwfOptions |= RASEO_UseCountryAndAreaCodes; } } } return ERROR_SUCCESS; } //**************************************************************************** // DWORD NEAR PASCAL ImportServerInfo(PSMMINFO psmmi, LPSTR szFileName) // // This function imports the server type name and settings. // // History: // Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** DWORD NEAR PASCAL ImportServerInfo(LPRASENTRY lpRasEntry, LPCTSTR szFileName) { TCHAR szYesNo[MAXNAME]; TCHAR szType[MAXNAME]; DWORD i; // Get the server type name // GetPrivateProfileString(cszServerSection, cszServerType, szNull, szType, MAXNAME, 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 < sizeof(aServerTypes)/sizeof(aServerTypes[0]); ++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, szNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_SwCompression; } else { lpRasEntry->dwfOptions |= RASEO_SwCompression; }; }; if (GetPrivateProfileString(cszServerSection, cszPWEncrypt, szNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_RequireEncryptedPw; } else { lpRasEntry->dwfOptions |= RASEO_RequireEncryptedPw; }; }; if (GetPrivateProfileString(cszServerSection, cszNetLogon, szNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_NetworkLogon; } else { lpRasEntry->dwfOptions |= RASEO_NetworkLogon; }; }; if (GetPrivateProfileString(cszServerSection, cszSWEncrypt, szNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_RequireDataEncryption; } else { lpRasEntry->dwfOptions |= RASEO_RequireDataEncryption; }; }; // Get the protocol settings // if (GetPrivateProfileString(cszServerSection, cszNetBEUI, szNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { //#ifdef _CHRISK lpRasEntry->dwfNetProtocols &= ~RASNP_NetBEUI; //#else // lpRasEntry->dwfNetProtocols &= ~RASNP_Netbeui; //#endif } else { //#ifdef _CHRISK lpRasEntry->dwfNetProtocols |= RASNP_NetBEUI; //#else // lpRasEntry->dwfNetProtocols |= RASNP_Netbeui; //#endif }; }; if (GetPrivateProfileString(cszServerSection, cszIPX, szNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfNetProtocols &= ~RASNP_Ipx; } else { lpRasEntry->dwfNetProtocols |= RASNP_Ipx; }; }; if (GetPrivateProfileString(cszServerSection, cszIP, szNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfNetProtocols &= ~RASNP_Ip; } else { lpRasEntry->dwfNetProtocols |= RASNP_Ip; }; }; return ERROR_SUCCESS; } //**************************************************************************** // DWORD NEAR PASCAL ImportIPInfo(LPSTR szEntryName, LPSTR szFileName) // // This function imports the TCP/IP information // // History: // Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** DWORD NEAR PASCAL ImportIPInfo(LPRASENTRY lpRasEntry, LPCTSTR szFileName) { TCHAR szIPAddr[MAXIPADDRLEN]; TCHAR szYesNo[MAXNAME]; // Import IP address information // if (GetPrivateProfileString(cszIPSection, cszIPSpec, szNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { // The import file has IP address specified, get the IP address // lpRasEntry->dwfOptions |= RASEO_SpecificIpAddr; if (GetPrivateProfileString(cszIPSection, cszIPAddress, szNull, szIPAddr, MAXIPADDRLEN, szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddr); }; } else { lpRasEntry->dwfOptions &= ~RASEO_SpecificIpAddr; }; }; // Import Server address information // if (GetPrivateProfileString(cszIPSection, cszServerSpec, szNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszYes)) { // The import file has server address specified, get the server address // lpRasEntry->dwfOptions |= RASEO_SpecificNameServers; if (GetPrivateProfileString(cszIPSection, cszDNSAddress, szNull, szIPAddr, MAXIPADDRLEN, szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddrDns); }; if (GetPrivateProfileString(cszIPSection, cszDNSAltAddress, szNull, szIPAddr, MAXIPADDRLEN, szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddrDnsAlt); }; if (GetPrivateProfileString(cszIPSection, cszWINSAddress, szNull, szIPAddr, MAXIPADDRLEN, szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddrWins); }; if (GetPrivateProfileString(cszIPSection, cszWINSAltAddress, szNull, szIPAddr, MAXIPADDRLEN, szFileName)) { StrToip (szIPAddr, &lpRasEntry->ipaddrWinsAlt); }; } else { lpRasEntry->dwfOptions &= ~RASEO_SpecificNameServers; }; }; // Header compression and the gateway settings // if (GetPrivateProfileString(cszIPSection, cszIPCompress, szNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_IpHeaderCompression; } else { lpRasEntry->dwfOptions |= RASEO_IpHeaderCompression; }; }; if (GetPrivateProfileString(cszIPSection, cszWanPri, szNull, szYesNo, MAXNAME, szFileName)) { if (!lstrcmpi(szYesNo, cszNo)) { lpRasEntry->dwfOptions &= ~RASEO_RemoteDefaultGateway; } else { lpRasEntry->dwfOptions |= RASEO_RemoteDefaultGateway; }; }; return ERROR_SUCCESS; } //**************************************************************************** // HANDLE NEAR PASCAL CreateUniqueFile(LPSTR szPath, LPSTR szFile) // // This function creates a unique file. If the file already exists, it will // try to create a file with similar name and return the name. // // History: // Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** HANDLE NEAR PASCAL CreateUniqueFile(LPTSTR szPath, LPTSTR szScript) { HANDLE hFile; LPTSTR pszSuffix, lpsz; UINT uSuffix; pszSuffix = szPath + lstrlen(szPath); lpsz = CharPrev(szPath, pszSuffix); if (*lpsz != '\\') { *pszSuffix = '\\'; pszSuffix++; }; lstrcpy(pszSuffix, szScript); // Try the specified filename // hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // If the file exists // if ((hFile == INVALID_HANDLE_VALUE) && (GetLastError() == ERROR_FILE_EXISTS)) { TCHAR szNewName[MAX_PATH]; // Need to copy it to another name in the same directory // if (LoadString(g_hInstance, IDS_DEFAULT_SCP, szNewName, MAX_PATH)) { // Increment the file index until a non-duplicated file can be created // uSuffix = 0; do { wsprintf(pszSuffix, szNewName, uSuffix); uSuffix++; hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); } while ((hFile == INVALID_HANDLE_VALUE) && (GetLastError() == ERROR_FILE_EXISTS) && (uSuffix < 0x0000FFFF)); }; }; // If we do not have the file, reserve the pathname // if (hFile == INVALID_HANDLE_VALUE) { *pszSuffix = '\0'; }; return hFile; } //**************************************************************************** // HANDLE NEAR PASCAL CreateScriptFile(LPTSTR szScript, LPTSTR szImportFile) // // This function creates the script file // // History: // Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** HANDLE NEAR PASCAL CreateScriptFile(LPTSTR szScript, LPCTSTR szImportFile) { LPTSTR pszPath, pszShortName; LPTSTR pszDir; DWORD cb; HANDLE hFile; // Assume failure // hFile = INVALID_HANDLE_VALUE; // Allocate a buffer for pathname // if ((pszPath = (LPTSTR)GlobalAlloc(LMEM_FIXED, 2*MAX_PATH)) == NULL) { TraceMsg(TF_GENERAL, "CONNECT:CreateScriptFile(): Local Alloc failed\n"); return INVALID_HANDLE_VALUE; } pszShortName = pszPath+MAX_PATH; // Get the default directory // if (GetWindowsDirectory(pszPath, MAX_PATH) != 0) { // Get the Windows drive // pszDir = pszPath; while((*pszDir != '\\') && (*pszDir != '\0')) { pszDir = CharNext(pszDir); }; // Did we find Windows drive? // if (*pszDir != '\0') { // Prepare the drive // cb = (DWORD)(pszDir - pszPath); MyMemCpy(szScript, pszPath, cb); pszDir = szScript + cb; // Get the script filename // if (GetPrivateProfileString(cszScriptingSection, cszScriptName, szNull, pszShortName, MAX_PATH, szImportFile) != 0) { // Try the favorite script directory // if (LoadString(g_hInstance, IDS_INI_SCRIPT_DIR, pszDir, MAX_PATH - cb) != 0) { // Try creating the file // hFile = CreateUniqueFile(szScript, pszShortName); }; // If we do not have the file yet, try the second favorite // if (hFile == INVALID_HANDLE_VALUE) { if (LoadString(g_hInstance, IDS_INI_SCRIPT_SHORTDIR, pszDir, MAX_PATH - cb)) { // Try creating the file // hFile = CreateUniqueFile(szScript, pszShortName); }; }; // If we do not have the file yet, try Windows directory // if (hFile == INVALID_HANDLE_VALUE) { // Get original Windows directory // lstrcpy(szScript, pszPath); // Try one more time // hFile = CreateUniqueFile(szScript, pszShortName); }; }; }; }; GlobalFree((HLOCAL)pszPath); return hFile; } //**************************************************************************** // DWORD NEAR PASCAL ImportScriptFile(LPTSTR szEntryName, LPTSTR szImportFile) // // This function imports the script file // // History: // Mon 18-Dec-1995 10:07:02 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** DWORD NEAR PASCAL ImportScriptFile(LPRASENTRY lpRasEntry, LPCTSTR szImportFile) { HANDLE hfScript; LPTSTR pszLine; LPTSTR pszFile; int i, iMaxLine; UINT cbSize, cbRet; TCHAR szTmp[4]; DWORD dwRet; dwRet=ERROR_SUCCESS; // If a script section does not exist, do nothing // if (GetPrivateProfileString(cszScriptingSection, cszScriptName, szNull, szTmp, 4, szImportFile) == 0) { return ERROR_SUCCESS; }; // Allocate a buffer for the script lines // if ((pszLine = (LPTSTR)GlobalAlloc(LMEM_FIXED, SIZE_ReadBuf+MAX_PATH)) == NULL) { TraceMsg(TF_GENERAL, "CONNECT:ImportScriptFile(): Local Alloc failed\n"); return ERROR_OUTOFMEMORY; } // Look for script // if (GetPrivateProfileString(cszScriptSection, NULL, szNull, pszLine, SIZE_ReadBuf, szImportFile) != 0) { // Get the maximum line number // pszFile = pszLine; iMaxLine = -1; while (*pszFile) { i = Sz2W(pszFile); iMaxLine = max(iMaxLine, i); pszFile += lstrlen(pszFile)+1; }; // If we have at least one line, we will import the script file // if (iMaxLine >= 0) { pszFile = pszLine+SIZE_ReadBuf; // Create the script file // //DebugBreak(); hfScript = CreateScriptFile(pszFile, szImportFile); TraceMsg(TF_GENERAL, "CONNECT:ImportScriptFile(): CreateScriptFile hfScript %d, %s, %s\n",hfScript,pszFile,szImportFile); if (hfScript != INVALID_HANDLE_VALUE) { TCHAR szLineNum[MAXLONGLEN+1]; // From The first line to the last line // for (i = 0; i <= iMaxLine; i++) { // Read the script line // wsprintf(szLineNum, TEXT("%d"), i); if ((cbSize = GetPrivateProfileString(cszScriptSection, szLineNum, szNull, pszLine, SIZE_ReadBuf, szImportFile)) != 0) { // Write to the script file // lstrcat(pszLine, TEXT("\x0d\x0a")); WriteFile(hfScript, pszLine, cbSize+2, (LPDWORD)&cbRet, NULL); }; }; CloseHandle(hfScript); // Associate it with the phonebook entry // lstrcpyn(lpRasEntry->szScript, pszFile, RAS_MaxEntryName); } else { dwRet = GetLastError(); }; } else { dwRet = ERROR_PATH_NOT_FOUND; }; } else { dwRet = ERROR_PATH_NOT_FOUND; }; GlobalFree((HLOCAL)pszLine); return dwRet; } //**************************************************************************** // DWORD WINAPI RnaValidateImportEntry (LPTSTR) // // This function is called to validate an importable file // // History: // Wed 03-Jan-1996 09:45:01 -by- Viroon Touranachun [viroont] // Created. //**************************************************************************** DWORD WINAPI RnaValidateImportEntry (LPCTSTR szFileName) { TCHAR szTmp[4]; // Get the alias entry name // return (GetPrivateProfileString(cszEntrySection, cszEntryName, szNull, szTmp, 4, szFileName) > 0 ? ERROR_SUCCESS : ERROR_CORRUPT_PHONEBOOK); } //**************************************************************************** // HRESULT ImportConnection (LPCTSTR szFileName, LPTSTR pszEntryName, LPTSTR pszUserName, LPTSTR pszPassword) // // 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. // Sat 16-Mar-1996 10:01:00 -by- Chris Kauffman [chrisk] // Modified to return HRESULT and load DLL dynamically //**************************************************************************** HRESULT ImportConnection (LPCTSTR szFileName, LPTSTR pszEntryName, LPTSTR pszUserName, LPTSTR pszPassword) { LPRASENTRY lpRasEntry; DWORD dwRet; HINSTANCE hinetcfg; FARPROC fp; BOOL fNeedsRestart; //#ifdef DEBUG // char szDebug[256]; //#endif //char szEntryName[RAS_MaxEntryName+1]; //char szUserName[UNLEN+1]; //char szPassword[PWLEN+1]; //BOOL fNeedsRestart; // Get the size of device configuration // This also validates an exported file // if ((dwRet = RnaValidateImportEntry(szFileName)) != ERROR_SUCCESS) { return dwRet; }; // Allocate a buffer for entry and device config // if ((lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR, sizeof(RASENTRY))) == NULL) { return ERROR_OUTOFMEMORY; }; // Get the entry name // Need to find a good name for it and remember it as an alias // GetPrivateProfileString(cszEntrySection, cszEntryName, szNull, pszEntryName, RAS_MaxEntryName+1, szFileName); GetPrivateProfileString(cszUserSection, cszUserName, szNull, pszUserName, UNLEN+1, szFileName); GetPrivateProfileString(cszUserSection, cszPassword, szNull, pszPassword, PWLEN+1, szFileName); if ((dwRet = ImportPhoneInfo(lpRasEntry, szFileName)) == ERROR_SUCCESS) { // Get device name, type and config // GetPrivateProfileString(cszDeviceSection, cszDeviceType, szNull, lpRasEntry->szDeviceType, RAS_MaxDeviceType, szFileName); // Get Server Type settings // ImportServerInfo(lpRasEntry, szFileName); // Get IP address // ImportIPInfo(lpRasEntry, szFileName); // Import the script file // if ((dwRet = ImportScriptFile(lpRasEntry, szFileName)) != ERROR_SUCCESS) { TraceMsg(TF_GENERAL, "CONNECT:ImportScriptFile Failed with the error %d,%s,%s",dwRet,szFileName,lpRasEntry->szScript); } lpRasEntry->dwSize = sizeof(RASENTRY); // Load and Locate AutoRunSignUpWizard entry point // hinetcfg = LoadLibrary(TEXT("INETCFG.DLL")); AssertMsg(hinetcfg,"Cannot find INETCFG.DLL"); if (!hinetcfg) { dwRet = GetLastError(); goto ImportConnectionExit; } fp = GetProcAddress(hinetcfg,AUTORUNSIGNUPWIZARDAPI); AssertMsg(fp,"Cannot find AutoRunSignupWizard entry point"); if (!fp) { dwRet = GetLastError(); goto ImportConnectionExit; } // Insert Autodialer // lstrcpy(lpRasEntry->szAutodialDll,TEXT("ICWDIAL.DLL")); lstrcpy(lpRasEntry->szAutodialFunc,TEXT("AutoDialHandler")); TraceMsg(TF_GENERAL, "CONNECT:Autodialer installed at %s, %s.\n",lpRasEntry->szAutodialDll,lpRasEntry->szAutodialFunc); // Call InetClientConfig // // PreWriteConnectoid(pszEntryName,lpRasEntry); dwRet = ((PFNAUTORUNSIGNUPWIZARD)fp)( NULL, NULL, pszEntryName, lpRasEntry, pszUserName, pszPassword, NULL, NULL, INETCFG_SETASAUTODIAL | INETCFG_INSTALLRNA | INETCFG_INSTALLTCP | INETCFG_OVERWRITEENTRY, &fNeedsRestart); #if !defined(WIN16) RasSetEntryPropertiesScriptPatch(lpRasEntry->szScript,pszEntryName); #endif //!Win16 //RestoreDeskTopInternetCommand(); TraceMsg(TF_GENERAL, "CONNECT:EntryName %s, User %s, Password %s, Number %s\n",pszEntryName,pszUserName,pszPassword,lpRasEntry->szLocalPhoneNumber); AssertMsg(!fNeedsRestart,"We have to reboot AGAIN!!"); } // Exit and cleanup // ImportConnectionExit: if (hinetcfg) FreeLibrary(hinetcfg); GlobalFree((HLOCAL)lpRasEntry); return dwRet; } // ############################################################################ HRESULT CreateEntryFromDUNFile(PTSTR pszDunFile) { TCHAR szFileName[MAX_PATH]; //char szEntryName[RAS_MaxEntryName+1]; TCHAR szUserName[UNLEN+1]; TCHAR szPassword[PWLEN+1]; LPTSTR pszTemp; HRESULT hr; hr = ERROR_SUCCESS; // Get fully qualified path name // if (!SearchPath(GIGetAppDir(),pszDunFile,NULL,MAX_PATH,&szFileName[0],&pszTemp)) { //MsgBox(IDS_CANTREADDUNFILE,MB_APPLMODAL | MB_ICONERROR); hr = ERROR_FILE_NOT_FOUND; goto CreateEntryFromDUNFileExit; } // save current DUN file name in global (for ourself) SetCurrentDUNFile(&szFileName[0]); hr = ImportConnection (&szFileName[0], g_szEntryName, szUserName, szPassword); //if (hr != ERROR_SUCCESS) //{ // MsgBox(IDS_CANTREADDUNFILE,MB_APPLMODAL | MB_ICONERROR); // goto CreateEntryFromDUNFileExit; //}// else { // // // place the name of the connectoid in the registry // // if (ERROR_SUCCESS != (StoreInSignUpReg((LPBYTE)g_szEntryName, lstrlen(g_szEntryName), REG_SZ, RASENTRYVALUENAME))) { MsgBox(IDS_CANTSAVEKEY,MB_MYERROR); goto CreateEntryFromDUNFileExit; } // } CreateEntryFromDUNFileExit: return hr; } // ############################################################################ BOOL FSz2Dw(PCTSTR pSz,DWORD *dw) { DWORD val = 0; while (*pSz && *pSz != '.') { if (*pSz >= '0' && *pSz <= '9') { val *= 10; val += *pSz++ - '0'; } else { return FALSE; //bad number } } *dw = val; return (TRUE); } // ############################################################################ BOOL BreakUpPhoneNumber(RASENTRY *prasentry, LPTSTR pszPhone) { PTSTR pszStart,pszNext, pszLim; // LPPHONENUM ppn; if (!pszPhone) return FALSE; // skip if no number pszLim = pszPhone + lstrlen(pszPhone); // find end of string //ppn = (fMain) ? &(pic->PhoneNum) : &(pic->PhoneNum2); ////Get the country ID... //ppn->dwCountryID = PBKDWCountryId(); // Get Country Code from phone number... pszStart = _tcschr(pszPhone,'+'); if(!pszStart) goto error; // bad format // get country code pszStart = GetNextNumericChunk(pszStart, pszLim, &pszNext); if(!pszStart || !pszNext) goto error; // bad format //ppn->dwCountryCode = Sz2Dw(pszStart); FSz2Dw(pszStart,&prasentry->dwCountryCode); pszStart = pszNext; //Now get the area code pszStart = GetNextNumericChunk(pszStart, pszLim, &pszNext); if(!pszStart || !pszNext) goto error; // bad format //lstrcpy(ppn->szAreaCode, pszStart); lstrcpyn(prasentry->szAreaCode,pszStart,ARRAYSIZE(prasentry->szAreaCode)); pszStart = pszNext; //now the local phone number (everything from here to : or end) pszNext = _tcschr(pszStart, ':'); if(pszNext) *pszNext='\0'; //lstrcpy(ppn->szLocal,pszStart); lstrcpyn(prasentry->szLocalPhoneNumber,pszStart,RAS_MaxPhoneNumber); //no extension. what is extension? //ppn->szExtension[0] = '\0'; //GlobalFree(pszPhone); return TRUE; error: // This means number is not canonical. Set it as local number anyway! // memset(ppn, 0, sizeof(*ppn)); // Bug#422: need to strip stuff after : or dial fails!! pszNext = _tcschr(pszPhone, ':'); if(pszNext) *pszNext='\0'; //lstrcpy(ppn->szLocal,pszPhone); lstrcpy(prasentry->szLocalPhoneNumber,pszPhone); //GlobalFree(pszPhone); return TRUE; } // ############################################################################ int Sz2W (LPCTSTR szBuf) { DWORD dw; if (FSz2Dw(szBuf,&dw)) { return (WORD)dw; } return 0; } // ############################################################################ int FIsDigit( int c ) { TCHAR szIn[2]; WORD rwOut[2]; szIn[0] = (TCHAR)c; szIn[1] = '\0'; GetStringTypeEx(LOCALE_USER_DEFAULT,CT_CTYPE1,szIn,-1,rwOut); return rwOut[0] & C1_DIGIT; } // ############################################################################ void *MyMemCpy(void *dest,const void *src, size_t count) { LPBYTE pbDest = (LPBYTE)dest; LPBYTE pbSrc = (LPBYTE)src; LPBYTE pbEnd = (LPBYTE)((DWORD_PTR)src + count); while (pbSrc < pbEnd) { *pbDest = *pbSrc; pbSrc++; pbDest++; } return dest; } // ############################################################################ HRESULT ReadSignUpReg(LPBYTE lpbData, DWORD *pdwSize, DWORD dwType, LPCTSTR pszKey) { HRESULT hr = ERROR_ACCESS_DENIED; HKEY hKey = 0; hr = RegOpenKey(HKEY_LOCAL_MACHINE,SIGNUPKEY,&hKey); if (hr != ERROR_SUCCESS) goto ReadSignUpRegExit; hr = RegQueryValueEx(hKey,pszKey,0,&dwType,lpbData,pdwSize); ReadSignUpRegExit: if (hKey) RegCloseKey (hKey); return hr; } // ############################################################################ HRESULT StoreInSignUpReg(LPBYTE lpbData, DWORD dwSize, DWORD dwType, LPCTSTR pszKey) { HRESULT hr = ERROR_ACCESS_DENIED; HKEY hKey = 0; hr = RegOpenKey(HKEY_LOCAL_MACHINE,SIGNUPKEY,&hKey); if (hr != ERROR_SUCCESS) goto ReadSignUpRegExit; hr = RegSetValueEx(hKey,pszKey,0,dwType,lpbData,sizeof(TCHAR)*dwSize); ReadSignUpRegExit: if (hKey) RegCloseKey (hKey); return hr; } // ############################################################################ PTSTR GetNextNumericChunk(PTSTR psz, PTSTR pszLim, PTSTR* ppszNext) { PTSTR pszEnd; // init for error case *ppszNext = NULL; // skip non numerics if any to start of next numeric chunk while(*psz<'0' || *psz>'9') { if(psz >= pszLim) return NULL; psz++; } // skip all numerics to end of country code for(pszEnd=psz; *pszEnd>='0' && *pszEnd<='9' && pszEnd