//-------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1999 - 2000. // // // File: loadras // // Contents: Load system settings. // // chrisab 24-Mar-00 Created // //--------------------------------------------------------------- #include "loadhead.cxx" #pragma hdrstop #undef WINVER #define WINVER 0x0500 #include #include #include #include #include #include #include #include #include #include extern "C" { #include "tstr.h" #include // Ras phone book include } #define PRIVATE_RAS // Access the RAS phone book directly instead of using // the public RAS APIs. #define SIZEOF_STRUCT(structname, uptomember) ((int)((LPBYTE)(&((structname*)0)->uptomember) - ((LPBYTE)((structname*)0)))) // // TRUE when rasman.dll has been // successfully loaded and initailized. // See LoadRasmanDllAndInit(). // DWORD FRasInitialized = FALSE; BOOL g_FRunningInAppCompatMode = FALSE; DWORD DwRasInitializeError; CRITICAL_SECTION PhonebookLock; // Debugging only #ifdef NEVER DWORD RasDumpEntry(TCHAR *strEntryName, RASENTRY *pInRasEntry) { DWORD dwErr = ERROR_SUCCESS; DWORD dwSize = sizeof(RASENTRY); RASENTRY RasEntry, *pRasEntry; RASDIALPARAMS RasDialParams; // If no name passed in, print what pInRasEntry pts to if( strEntryName == NULL ) { if( pInRasEntry == NULL ) { return ERROR_INVALID_HANDLE; } pRasEntry = pInRasEntry; } // Otherwise, if there's a buffer passed in, use that. else { if( pInRasEntry == NULL ) { pRasEntry = &RasEntry; } else { pRasEntry = pInRasEntry; } ZeroMemory( pRasEntry, sizeof(RASENTRY) ); pRasEntry->dwSize = sizeof(RASENTRY); dwErr = RasGetEntryPropertiesW(NULL, strEntryName, pRasEntry, &dwSize, NULL, NULL); if( dwErr ) return dwErr; } if( strEntryName ) { printf( "--- Dumping Ras entry %ls ---\n", strEntryName); } else { printf( "--- Dumping Ras entry at %p ---\n", pRasEntry); } printf( "dwfOptions = %x\n", pRasEntry->dwfOptions); printf( "dwFramingProtocol = %d\n", pRasEntry->dwFramingProtocol); printf( " Win2k Extended Info\n"); printf( "dwType = %d\n", pRasEntry->dwType); printf( "dwEncryptionType = %d\n", pRasEntry->dwEncryptionType); printf( "dwCustomAuthKey = %d\n", pRasEntry->dwCustomAuthKey); printf( "szCustomDialDll = [%ls]\n", pRasEntry->szCustomDialDll); printf( "dwVpnStrategy = %d\n", pRasEntry->dwVpnStrategy); printf( "\n\n"); return dwErr; } DWORD RasDumpPhoneBookEntry(TCHAR *tszEntryName, PBENTRY *pEntry) { DWORD dwErr; PBFILE pbfile; DTLNODE *pdtlnode; BOOL fCreated; if( !pEntry && !tszEntryName ) return ERROR_INVALID_PARAMETER; if( tszEntryName ) { // Check and see if the entry name already exists in the phone book dwErr = GetPbkAndEntryName(NULL, tszEntryName, 0, &pbfile, &pdtlnode); // if failed for some other reason than the entry doesn't exist, bail. if( (dwErr != SUCCESS) && (dwErr != ERROR_CANNOT_FIND_PHONEBOOK_ENTRY) ) { return dwErr; } if( pdtlnode == NULL ) { dwErr = ERROR_NOT_ENOUGH_MEMORY; return dwErr; } pEntry = (PBENTRY *) DtlGetData(pdtlnode); printf( "--- Dumping Phonebook Entry %ls ---\n", tszEntryName); } else { printf( "--- Dumping Phonebook Entry at %p ---\n", pEntry); } printf( " pszEntryName = %ls\n", pEntry->pszEntryName); printf( " dwType = %d\n", pEntry->dwType); printf( " fSharedPhoneNum = %d\n", pEntry->fSharedPhoneNumbers); printf( " dwDataEncryption = 0x%x\n", pEntry->dwDataEncryption); printf( " dwAuthRestrictions = 0x%x\n", pEntry->dwAuthRestrictions); printf( " dwTypicalAuth = 0x%x\n", pEntry->dwTypicalAuth); printf( " dwCustomAuthKey = 0x%x\n", pEntry->dwCustomAuthKey); printf( " fAutoLogon = %d\n", pEntry->fAutoLogon); printf( " fPreviewUserPw = %d\n", pEntry->fPreviewUserPw); printf( " fPreviewDomain = %d\n", pEntry->fPreviewDomain); printf( "\n\n"); return 0; } #endif // NEVER - Debugging only DWORD InitializeLoadRAS(DWORD dwReason) { DWORD dwErr = ERROR_SUCCESS; if( dwReason == DLL_PROCESS_ATTACH ) { InitializeCriticalSection(&PhonebookLock); if( InitializePbk() != 0 ) return FALSE; } else if( dwReason == DLL_PROCESS_DETACH ) { TerminatePbk(); } return dwErr; } BOOL FRunningInAppCompatMode() { BOOL fResult = FALSE; TCHAR *pszCommandLine = NULL; TCHAR *psz; pszCommandLine = StrDup(GetCommandLine()); if(NULL == pszCommandLine) { goto done; } psz = pszCommandLine + lstrlen(pszCommandLine); while( (TEXT('\\') != *psz) && (psz != pszCommandLine)) { psz--; } if(TEXT('\\') == *psz) { psz++; } if( (0 == lstrcmpi(psz, TEXT("INETINFO.EXE"))) || (0 == lstrcmpi(psz, TEXT("WSPSRV.EXE")))) { fResult = TRUE; } done: if(NULL != pszCommandLine) { Free(pszCommandLine); } return fResult; } DWORD LoadRasmanDllAndInit() { if (FRasInitialized) { return 0; } if (LoadRasmanDll()) { return GetLastError(); } // // Success is returned if RasInitialize fails, in which // case none of the APIs will ever do anything but report // that RasInitialize failed. All this is to avoid the // ugly system popup if RasMan service can't start. // if ((DwRasInitializeError = g_pRasInitialize()) != 0) { return DwRasInitializeError; } FRasInitialized = TRUE; g_FRunningInAppCompatMode = FRunningInAppCompatMode(); // pmay: 300166 // // We don't start rasauto automatically anymore. // // g_pRasStartRasAutoIfRequired(); return 0; } DWORD IpAddrToString( IN RASIPADDR* pipaddr, OUT LPTSTR* ppszIpAddr ) { DWORD dwErr; PCHAR psz; LPTSTR pszIpAddr; PULONG pul = (PULONG)pipaddr; struct in_addr in_addr; pszIpAddr = (TCHAR *) Malloc(17 * sizeof(TCHAR)); if (pszIpAddr == NULL) { return ERROR_NOT_ENOUGH_MEMORY; } in_addr.s_addr = *pul; psz = inet_ntoa(in_addr); if (psz == NULL) { DbgPrint("IpAddrToString: inet_ntoa failed!\n"); Free(pszIpAddr); return WSAGetLastError(); } strcpyAtoT(pszIpAddr, psz); *ppszIpAddr = pszIpAddr; return 0; } VOID GetDevicePortName( IN TCHAR *pszDevicePortName, OUT TCHAR *pszDeviceName, OUT TCHAR *pszPortName ) { DWORD i, dwStart; // // Copy the device name. // lstrcpy(pszDeviceName, pszDevicePortName); // // Check to see if there is a NULL // within MAX_PORT_NAME characters // after the device name's NULL.If // there is, the copy the characters // between the NULLs as the port name. // *pszPortName = TEXT('\0'); dwStart = lstrlen(pszDeviceName) + 1; for (i = 0; i < MAX_PORT_NAME; i++) { if (pszDevicePortName[dwStart + i] == TEXT('\0')) { lstrcpy( pszPortName, &pszDevicePortName[dwStart]); break; } } } DWORD CreateAndInitializePhone( LPTSTR lpszAreaCode, DWORD dwCountryCode, DWORD dwCountryID, LPTSTR lpszPhoneNumber, BOOL fUseDialingRules, LPTSTR lpszComment, DTLNODE** ppdtlnode) { DWORD dwRetCode = ERROR_SUCCESS; PBPHONE* pPhone; DTLNODE* pdtlnode; pdtlnode = CreatePhoneNode(); if (pdtlnode == NULL) { dwRetCode = ERROR_NOT_ENOUGH_MEMORY; goto done; } pPhone = (PBPHONE *) DtlGetData(pdtlnode); if(lpszAreaCode) { pPhone->pszAreaCode = StrDup(lpszAreaCode); if(NULL == pPhone->pszAreaCode) { dwRetCode = ERROR_NOT_ENOUGH_MEMORY; goto done; } } else { pPhone->pszAreaCode = NULL; } pPhone->dwCountryCode = dwCountryCode; pPhone->dwCountryID = dwCountryID; pPhone->fUseDialingRules = fUseDialingRules; if(lpszPhoneNumber) { pPhone->pszPhoneNumber = StrDup(lpszPhoneNumber); if(NULL == pPhone->pszPhoneNumber) { dwRetCode = ERROR_NOT_ENOUGH_MEMORY; goto done; } } else { pPhone->pszPhoneNumber = NULL; } if(pPhone->pszComment) { pPhone->pszComment = StrDup(lpszComment); if(NULL == pPhone->pszComment) { dwRetCode = ERROR_NOT_ENOUGH_MEMORY; goto done; } } else { pPhone->pszComment = NULL; } *ppdtlnode = pdtlnode; done: return dwRetCode; } void SetBogusPortInformation(PBLINK *pLink, DWORD dwType) { PBPORT *pPort = &pLink->pbport; if (dwType == RASET_Phone) { pPort->pszMedia = StrDup( TEXT(SERIAL_TXT) ); pPort->pbdevicetype = PBDT_Modem; pPort->dwFlags |= PBP_F_BogusDevice; } else if (dwType == RASET_Vpn) { pPort->pszMedia = StrDup( TEXT("rastapi") ); pPort->pbdevicetype = PBDT_Vpn; } else { pPort->pszMedia = StrDup( TEXT(SERIAL_TXT) ); pPort->pbdevicetype = PBDT_Null; pPort->dwFlags |= PBP_F_BogusDevice; } } DWORD WinState_RasEntryToPhonebookEntry( IN LPCTSTR lpszEntry, IN LPRASENTRY lpRasEntry, IN DWORD dwcb, IN LPBYTE lpbDeviceConfig, IN DWORD dwcbDeviceConfig, OUT PBENTRY *pEntry ) { DWORD dwErr, dwcbStr; DTLNODE *pdtlnode; PBDEVICETYPE pbdevicetype; PBLINK *pLink; DTLLIST *pdtllistPorts; PBPORT *pPort; DWORD i, cwDevices; RASMAN_DEVICE *pDevices; TCHAR szDeviceName[RAS_MaxDeviceName + 1]; TCHAR szPortName[MAX_PORT_NAME]; DTLNODE *pNodePhone; LPTSTR pszAreaCode; PBPHONE *pPhone; BOOL fScriptBefore; BOOL fScriptBeforeTerminal = FALSE; LPTSTR pszScriptBefore; BOOL fNewEntry = FALSE; // // Set up to access information for the first link. // pdtlnode = DtlGetFirstNode(pEntry->pdtllistLinks); pLink = (PBLINK *)DtlGetData(pdtlnode); ASSERT(NULL != pLink); fScriptBefore = pLink->pbport.fScriptBeforeTerminal; pszScriptBefore = pLink->pbport.pszScriptBefore; if(NULL == pEntry->pszEntryName) { fNewEntry = TRUE; } // // Get entry name. // Free0( pEntry->pszEntryName ); pEntry->pszEntryName = StrDup(lpszEntry); // // Get dwfOptions. // pEntry->dwIpAddressSource = lpRasEntry->dwfOptions & RASEO_SpecificIpAddr ? ASRC_RequireSpecific : ASRC_ServerAssigned; pEntry->dwIpNameSource = lpRasEntry->dwfOptions & RASEO_SpecificNameServers ? ASRC_RequireSpecific : ASRC_ServerAssigned; switch (lpRasEntry->dwFramingProtocol) { case RASFP_Ppp: // // Get PPP-based information. // pEntry->dwBaseProtocol = BP_Ppp; #if AMB pEntry->dwAuthentication = AS_PppThenAmb; #endif pEntry->fIpHeaderCompression = (BOOL)lpRasEntry->dwfOptions & RASEO_IpHeaderCompression; pEntry->fIpPrioritizeRemote = (BOOL)lpRasEntry->dwfOptions & RASEO_RemoteDefaultGateway; // // Get specified IP addresses. // if (pEntry->dwIpAddressSource == ASRC_RequireSpecific) { dwErr = IpAddrToString( &lpRasEntry->ipaddr, &pEntry->pszIpAddress); if (dwErr) return dwErr; } else { pEntry->pszIpAddress = NULL; } if (pEntry->dwIpNameSource == ASRC_RequireSpecific) { dwErr = IpAddrToString( &lpRasEntry->ipaddrDns, &pEntry->pszIpDnsAddress); if (dwErr) { return dwErr; } dwErr = IpAddrToString( &lpRasEntry->ipaddrDnsAlt, &pEntry->pszIpDns2Address); if (dwErr) { return dwErr; } dwErr = IpAddrToString( &lpRasEntry->ipaddrWins, &pEntry->pszIpWinsAddress); if (dwErr) { return dwErr; } dwErr = IpAddrToString( &lpRasEntry->ipaddrWinsAlt, &pEntry->pszIpWins2Address); if (dwErr) { return dwErr; } } else { pEntry->pszIpDnsAddress = NULL; pEntry->pszIpDns2Address = NULL; pEntry->pszIpWinsAddress = NULL; pEntry->pszIpWins2Address = NULL; } // // Get protocol information. // pEntry->dwfExcludedProtocols = 0; if (!(lpRasEntry->dwfNetProtocols & RASNP_NetBEUI)) { pEntry->dwfExcludedProtocols |= NP_Nbf; } if (!(lpRasEntry->dwfNetProtocols & RASNP_Ipx)) { pEntry->dwfExcludedProtocols |= NP_Ipx; } if (!(lpRasEntry->dwfNetProtocols & RASNP_Ip)) { pEntry->dwfExcludedProtocols |= NP_Ip; } break; case RASFP_Slip: // // Get SLIP-based information. // pEntry->dwBaseProtocol = BP_Slip; #if AMB pEntry->dwAuthentication = AS_PppThenAmb; #endif pEntry->dwFrameSize = lpRasEntry->dwFrameSize; pEntry->fIpHeaderCompression = (BOOL)lpRasEntry->dwfOptions & RASEO_IpHeaderCompression; pEntry->fIpPrioritizeRemote = (BOOL)lpRasEntry->dwfOptions & RASEO_RemoteDefaultGateway; // // Get protocol information. // pEntry->dwfExcludedProtocols = (NP_Nbf|NP_Ipx); if (pEntry->dwIpAddressSource == ASRC_RequireSpecific) { dwErr = IpAddrToString( &lpRasEntry->ipaddr, &pEntry->pszIpAddress); if (dwErr) { return dwErr; } } else { pEntry->pszIpAddress = NULL; } if (pEntry->dwIpNameSource == ASRC_RequireSpecific) { dwErr = IpAddrToString( &lpRasEntry->ipaddrDns, &pEntry->pszIpDnsAddress); if (dwErr) { return dwErr; } dwErr = IpAddrToString( &lpRasEntry->ipaddrDnsAlt, &pEntry->pszIpDns2Address); if (dwErr) { return dwErr; } dwErr = IpAddrToString( &lpRasEntry->ipaddrWins, &pEntry->pszIpWinsAddress); if (dwErr) { return dwErr; } dwErr = IpAddrToString( &lpRasEntry->ipaddrWinsAlt, &pEntry->pszIpWins2Address); if (dwErr) { return dwErr; } } else { pEntry->pszIpDnsAddress = NULL; pEntry->pszIpDns2Address = NULL; pEntry->pszIpWinsAddress = NULL; pEntry->pszIpWins2Address = NULL; } break; case RASFP_Ras: // // Get AMB-based information. // pEntry->dwBaseProtocol = BP_Ras; #if AMB pEntry->dwAuthentication = AS_AmbOnly; #endif break; } pEntry->fLcpExtensions = (BOOL)!(lpRasEntry->dwfOptions & RASEO_DisableLcpExtensions); // // If terminal before/after dial options are set, // then update the entry. Otherwise, leave it as it // is. // if(lpRasEntry->dwfOptions & RASEO_TerminalBeforeDial) { fScriptBeforeTerminal = TRUE; } if(lpRasEntry->dwfOptions & RASEO_TerminalAfterDial) { pEntry->fScriptAfterTerminal = TRUE; } else { pEntry->fScriptAfterTerminal = FALSE; } pEntry->fShowMonitorIconInTaskBar = (BOOL) (lpRasEntry->dwfOptions & RASEO_ModemLights); pEntry->fSwCompression = (BOOL)(lpRasEntry->dwfOptions & RASEO_SwCompression); if (lpRasEntry->dwfOptions & RASEO_RequireMsEncryptedPw) { pEntry->dwAuthRestrictions = AR_F_AuthMSCHAP; } else if (lpRasEntry->dwfOptions & RASEO_RequireEncryptedPw) { pEntry->dwAuthRestrictions = AR_F_AuthSPAP | AR_F_AuthMD5CHAP | AR_F_AuthMSCHAP; } else { pEntry->dwAuthRestrictions = AR_F_TypicalUnsecure; } pEntry->dwDataEncryption = (lpRasEntry->dwfOptions & RASEO_RequireDataEncryption) ? DE_Mppe40bit : DE_None; pEntry->fAutoLogon = (BOOL)(lpRasEntry->dwfOptions & RASEO_UseLogonCredentials); pLink->fPromoteAlternates = (BOOL)(lpRasEntry->dwfOptions & RASEO_PromoteAlternates); pEntry->fShareMsFilePrint = pEntry->fBindMsNetClient = (BOOL) !(lpRasEntry->dwfOptions & RASEO_SecureLocalFiles); // // Make sure that the network components section in the // phonebook correspond to the values user is setting. // EnableOrDisableNetComponent( pEntry, TEXT("ms_msclient"), pEntry->fBindMsNetClient); EnableOrDisableNetComponent( pEntry, TEXT("ms_server"), pEntry->fShareMsFilePrint); if (*lpRasEntry->szAreaCode != TEXT('\0')) { // // Make sure the area code does not contain // non-numeric characters. // if (!ValidateAreaCode(lpRasEntry->szAreaCode)) { return ERROR_INVALID_PARAMETER; } pszAreaCode = StrDup(lpRasEntry->szAreaCode); } else { pszAreaCode = NULL; } // // Get script information. // if (lpRasEntry->szScript[0] == TEXT('[')) { // // Verify the switch is valid. // dwErr = GetRasSwitches(NULL, &pDevices, &cwDevices); if (!dwErr) { CHAR szScriptA[MAX_PATH]; strcpyTtoA(szScriptA, lpRasEntry->szScript); for (i = 0; i < cwDevices; i++) { if (!_stricmp(pDevices[i].D_Name, &szScriptA[1])) { pEntry->fScriptAfter = TRUE; pEntry->pszScriptAfter = StrDup(&lpRasEntry->szScript[1]); if (pEntry->pszScriptAfter == NULL) { dwErr = GetLastError(); } break; } } Free(pDevices); if (dwErr) { return dwErr; } } } else if (lpRasEntry->szScript[0] != TEXT('\0')) { pEntry->fScriptAfter = TRUE; pEntry->pszScriptAfter = StrDup(lpRasEntry->szScript); if (pEntry->pszScriptAfter == NULL) { return GetLastError(); } } else { if(pEntry->pszScriptAfter) { Free(pEntry->pszScriptAfter); pEntry->pszScriptAfter = NULL; } pEntry->fScriptAfter = FALSE; if(pLink->pbport.pszScriptBefore) { Free(pLink->pbport.pszScriptBefore); pLink->pbport.pszScriptBefore = NULL; pszScriptBefore = NULL; } pLink->pbport.fScriptBefore = FALSE; fScriptBefore = FALSE; } // // Get X.25 information. // pEntry->pszX25Network = NULL; if (*lpRasEntry->szX25PadType != TEXT('\0')) { // // Verify the X25 network is valid. // dwErr = GetRasPads(&pDevices, &cwDevices); if (!dwErr) { CHAR szX25PadTypeA[RAS_MaxPadType + 1]; strcpyTtoA(szX25PadTypeA, lpRasEntry->szX25PadType); for (i = 0; i < cwDevices; i++) { if (!_stricmp(pDevices[i].D_Name, szX25PadTypeA)) { pEntry->pszX25Network = StrDup(lpRasEntry->szX25PadType); break; } } Free(pDevices); } } pEntry->pszX25Address = lstrlen(lpRasEntry->szX25Address) ? StrDup(lpRasEntry->szX25Address) : NULL; pEntry->pszX25Facilities = lstrlen(lpRasEntry->szX25Facilities) ? StrDup(lpRasEntry->szX25Facilities) : NULL; pEntry->pszX25UserData = lstrlen(lpRasEntry->szX25UserData) ? StrDup(lpRasEntry->szX25UserData) : NULL; // // Get custom dial UI information. // pEntry->pszCustomDialDll = lstrlen(lpRasEntry->szAutodialDll) ? StrDup(lpRasEntry->szAutodialDll) : NULL; pEntry->pszCustomDialFunc = lstrlen(lpRasEntry->szAutodialFunc) ? StrDup(lpRasEntry->szAutodialFunc) : NULL; // // Get primary phone number. Clear out any existing // numbers. // DtlDestroyList(pLink->pdtllistPhones, DestroyPhoneNode); pLink->pdtllistPhones = DtlCreateList(0); if(NULL == pLink->pdtllistPhones) { return ERROR_NOT_ENOUGH_MEMORY; } if (*lpRasEntry->szLocalPhoneNumber != '\0') { if(CreateAndInitializePhone( pszAreaCode, lpRasEntry->dwCountryCode, lpRasEntry->dwCountryID, lpRasEntry->szLocalPhoneNumber, !!(lpRasEntry->dwfOptions & RASEO_UseCountryAndAreaCodes), lpRasEntry->szDeviceName, &pdtlnode)) { return ERROR_NOT_ENOUGH_MEMORY; } DtlAddNodeFirst(pLink->pdtllistPhones, pdtlnode); } // // Get the alternate phone numbers. // if (lpRasEntry->dwAlternateOffset) { PTCHAR UNALIGNED pszPhoneNumber = (PTCHAR)((ULONG_PTR)lpRasEntry + lpRasEntry->dwAlternateOffset); while (*pszPhoneNumber != TEXT('\0')) { if(CreateAndInitializePhone( pszAreaCode, lpRasEntry->dwCountryCode, lpRasEntry->dwCountryID, pszPhoneNumber, !!(lpRasEntry->dwfOptions & RASEO_UseCountryAndAreaCodes), lpRasEntry->szDeviceName, &pdtlnode)) { return ERROR_NOT_ENOUGH_MEMORY; } DtlAddNodeLast(pLink->pdtllistPhones, pdtlnode); pszPhoneNumber += lstrlen(pszPhoneNumber) + 1; } } // // Get device information. // dwErr = LoadPortsList(&pdtllistPorts); if (dwErr) { return ERROR_INVALID_PARAMETER; } // // Get the encoded device name/port // and check for a match. // GetDevicePortName( lpRasEntry->szDeviceName, szDeviceName, szPortName); pPort = PpbportFromPortAndDeviceName( pdtllistPorts, szPortName, ((szDeviceName[ 0 ]) ? szDeviceName : NULL) ); if (pPort != NULL) { if (CopyToPbport(&pLink->pbport, pPort)) { pPort = NULL; } } // // Search for a device name match. // if (pPort == NULL) { for (pdtlnode = DtlGetFirstNode(pdtllistPorts); pdtlnode != NULL; pdtlnode = DtlGetNextNode(pdtlnode)) { PBPORT *pPortTmp = (PBPORT *)DtlGetData(pdtlnode); if ( (pPortTmp->pszDevice != NULL) && (!lstrcmpi(pPortTmp->pszDevice, szDeviceName)) && (!CopyToPbport(&pLink->pbport, pPortTmp))) { pPort = pPortTmp; break; } } } // // If we don't have a match, then // pick the first device of the // same type. // if (pPort == NULL) { pbdevicetype = PbdevicetypeFromPszType( lpRasEntry->szDeviceType ); // // Initialize dwErr in case // we fall through the loop // without finding a match. // // dwErr = ERROR_INVALID_PARAMETER; // // Look for a port with the same // device type. // for (pdtlnode = DtlGetFirstNode(pdtllistPorts); pdtlnode != NULL; pdtlnode = DtlGetNextNode(pdtlnode)) { pPort = (PBPORT *)DtlGetData(pdtlnode); if (pPort->pbdevicetype == pbdevicetype) { dwErr = CopyToPbport(&pLink->pbport, pPort); break; } } if( (NULL == pdtlnode) && (fNewEntry)) { // // Hack to make CM connections work. // Remove this code after beta // and just return an error in this case. The api // should not be setting bogus information. // SetBogusPortInformation(pLink, pEntry->dwType); } // // If the device is a modem, // then set the default modem settings. // if (pbdevicetype == PBDT_Modem) { SetDefaultModemSettings(pLink); } } // pmay: 401682 // // Update the preferred device. Whenever this api is called, // we can assume that the user wants the given device to // be sticky. // if (pPort) { Free0(pEntry->pszPreferredDevice); pEntry->pszPreferredDevice = StrDup(pPort->pszDevice); Free0(pEntry->pszPreferredPort); pEntry->pszPreferredPort = StrDup(pPort->pszPort);; } // // Copy the remembered values // pLink->pbport.fScriptBefore = fScriptBefore; pLink->pbport.fScriptBeforeTerminal = fScriptBeforeTerminal; pLink->pbport.pszScriptBefore = pszScriptBefore; DtlDestroyList(pdtllistPorts, DestroyPortNode); if (dwErr) { return dwErr; } // // Copy the TAPI configuration blob. // if (lpbDeviceConfig != NULL && dwcbDeviceConfig) { Free0(pLink->pTapiBlob); pLink->pTapiBlob = (unsigned char *) Malloc(dwcbDeviceConfig); if (pLink->pTapiBlob == NULL) { return ERROR_NOT_ENOUGH_MEMORY; } memcpy(pLink->pTapiBlob, lpbDeviceConfig, dwcbDeviceConfig); pLink->cbTapiBlob = dwcbDeviceConfig; } // // Copy the following fields over only for // a V401 structure or above. // // Winstate only supporting NT5 and above. // if ( lpRasEntry->dwSize == sizeof (RASENTRY) ) { // // Get multilink and idle timeout information. // pEntry->dwDialMode = lpRasEntry->dwDialMode == RASEDM_DialAsNeeded ? RASEDM_DialAsNeeded : RASEDM_DialAll; pEntry->dwDialPercent = lpRasEntry->dwDialExtraPercent; pEntry->dwDialSeconds = lpRasEntry->dwDialExtraSampleSeconds; pEntry->dwHangUpPercent = lpRasEntry->dwHangUpExtraPercent; pEntry->dwHangUpSeconds = lpRasEntry->dwHangUpExtraSampleSeconds; // // Get idle disconnect information. // pEntry->lIdleDisconnectSeconds = lpRasEntry->dwIdleDisconnectSeconds; // // if the user is setting the dwIdleDisconnect // Seconds through apis then override the user // preferences. // if (pEntry->lIdleDisconnectSeconds) { pEntry->dwfOverridePref |= RASOR_IdleDisconnectSeconds; } // // CustomScript // pEntry->dwCustomScript = !!( RASEO_CustomScript & lpRasEntry->dwfOptions); } if(RASET_Phone != lpRasEntry->dwType) { pEntry->fPreviewPhoneNumber = FALSE; pEntry->fSharedPhoneNumbers = FALSE; } // // Copy the following information only if its nt5 // if(lpRasEntry->dwSize == sizeof(RASENTRY)) { // // Connection type // pEntry->dwType = lpRasEntry->dwType; // // Clear the Encryption type. We set it below // for nt5 - default to Mppe40Bit. // pEntry->dwDataEncryption = 0; /* if( (ET_40Bit & lpRasEntry->dwEncryptionType) || ( (0 == lpRasEntry->dwEncryptionType) && ( RASEO_RequireDataEncryption & lpRasEntry->dwfOptions))) { pEntry->dwDataEncryption |= DE_Mppe40bit; } if(ET_128Bit & lpRasEntry->dwEncryptionType) { pEntry->dwDataEncryption |= DE_Mppe128bit; } */ if( (ET_Require == lpRasEntry->dwEncryptionType) || ( (0 == lpRasEntry->dwEncryptionType) && ( RASEO_RequireDataEncryption & lpRasEntry->dwfOptions))) { pEntry->dwDataEncryption = DE_Require; } else if (ET_RequireMax == lpRasEntry->dwEncryptionType) { pEntry->dwDataEncryption = DE_RequireMax; } else if (ET_Optional == lpRasEntry->dwEncryptionType) { pEntry->dwDataEncryption = DE_IfPossible; } // // Clear the authrestrictions for nt5 if the user didn't // specify any authentication protocol. // if( (!(lpRasEntry->dwfOptions & RASEO_RequireMsEncryptedPw)) && (!(lpRasEntry->dwfOptions & RASEO_RequireEncryptedPw))) { pEntry->dwAuthRestrictions = 0; } // // Set the new authentication bits based on options defined // in NT5. // if(RASEO_RequireCHAP & lpRasEntry->dwfOptions) { pEntry->dwAuthRestrictions |= AR_F_AuthMD5CHAP; } if(RASEO_RequireMsCHAP & lpRasEntry->dwfOptions) { pEntry->dwAuthRestrictions |= AR_F_AuthMSCHAP; } if(RASEO_RequireMsCHAP2 & lpRasEntry->dwfOptions) { pEntry->dwAuthRestrictions |= AR_F_AuthMSCHAP2; } if(RASEO_RequireW95MSCHAP & lpRasEntry->dwfOptions) { pEntry->dwAuthRestrictions |= (AR_F_AuthW95MSCHAP | AR_F_AuthCustom); } if(RASEO_RequirePAP & lpRasEntry->dwfOptions) { pEntry->dwAuthRestrictions |= AR_F_AuthPAP; } if(RASEO_RequireSPAP & lpRasEntry->dwfOptions) { pEntry->dwAuthRestrictions |= AR_F_AuthSPAP; } if(RASEO_RequireEAP & lpRasEntry->dwfOptions) { pEntry->dwAuthRestrictions |= AR_F_AuthEAP; if( (0 != lpRasEntry->dwCustomAuthKey) && (-1 != lpRasEntry->dwCustomAuthKey)) { pEntry->dwCustomAuthKey = lpRasEntry->dwCustomAuthKey; } } if(RASEO_Custom & lpRasEntry->dwfOptions) { pEntry->dwAuthRestrictions |= AR_F_AuthCustom; } if(0 == pEntry->dwAuthRestrictions) { pEntry->dwAuthRestrictions = AR_F_TypicalUnsecure; } // // Get custom dial UI information. // pEntry->pszCustomDialerName = lstrlen(lpRasEntry->szCustomDialDll) ? StrDup(lpRasEntry->szCustomDialDll) : NULL; // // Set fSharedPhoneNumbers/fPreviewPhoneNumbers // pEntry->fSharedPhoneNumbers = !!( RASEO_SharedPhoneNumbers & lpRasEntry->dwfOptions); pEntry->fPreviewPhoneNumber = !!( RASEO_PreviewPhoneNumber & lpRasEntry->dwfOptions); pEntry->fPreviewUserPw = !!( RASEO_PreviewUserPw & lpRasEntry->dwfOptions); pEntry->fPreviewDomain = !!( RASEO_PreviewDomain & lpRasEntry->dwfOptions); pEntry->fShowDialingProgress = !!( RASEO_ShowDialingProgress & lpRasEntry->dwfOptions); // // Vpn strategy // pEntry->dwVpnStrategy = lpRasEntry->dwVpnStrategy; } // // The following are "adjustments" made for State Migration. // chrisab 2-Apr-00 // // Bug 90555 and 90561 // if( (lpRasEntry->dwfOptions & RASEO_RequireEncryptedPw) || (lpRasEntry->dwfOptions & RASEO_RequireMsEncryptedPw) ) { pEntry->dwTypicalAuth = TA_Secure; } else { pEntry->dwTypicalAuth = TA_Unsecure; } // // Bug #90554 // Set log on to network option // if( lpRasEntry->dwfOptions & RASEO_NetworkLogon ) { pEntry->fPreviewDomain = TRUE; } // // Set dirty bit so this entry will get written out. // pEntry->fDirty = TRUE; return 0; } // // WinState_RasSetEntryProperties() // // This function replaces the Win32 RAS API RasSetEntryProperties(). // If the define PRIvATE_RAS // DWORD WinState_RasSetEntryPropertiesW( IN LPCWSTR lpszPhonebook, IN LPCWSTR lpszEntry, IN LPRASENTRYW lpRasEntry, IN DWORD dwcbRasEntry, IN LPBYTE lpbDeviceConfig, IN DWORD dwcbDeviceConfig ) { #ifndef PRIVATE_RAS return RasSetEntryProperties(lpszPhonebook, lpszEntry, lpRasEntry, dwcbRasEntry, lpbDeviceConfig, dwcbDeviceConfig); #else DWORD dwErr; PBFILE pbfile; DTLNODE *pdtlnode; PBENTRY *pEntry; BOOL fCreated; // Initialize RASMAN.DLL for stuff needed by phonebook APIs. dwErr = LoadRasmanDllAndInit(); if( dwErr ) { return dwErr; } if( DwRasInitializeError ) { return DwRasInitializeError; } // Parameter validation. if( lpRasEntry == NULL ) { return ERROR_INVALID_PARAMETER; } // WinState only supporting NT5 and above. if ( (lpRasEntry->dwSize != sizeof (RASENTRYW)) && (lpRasEntry->dwSize != SIZEOF_STRUCT (RASENTRYW, dwType)) && (lpRasEntry->dwSize != SIZEOF_STRUCT (RASENTRYW, dwSubEntries))) { return ERROR_INVALID_SIZE; } if (dwcbRasEntry < lpRasEntry->dwSize) { return ERROR_BUFFER_TOO_SMALL; } // // Load the phonebook file. // EnterCriticalSection(&PhonebookLock); // Check and see if the entry name already exists in the phone book dwErr = GetPbkAndEntryName(lpszPhonebook, lpszEntry, 0, &pbfile, &pdtlnode); // if failed for some other reason than the entry doesn't exist, bail. if( (dwErr != SUCCESS) && (dwErr != ERROR_CANNOT_FIND_PHONEBOOK_ENTRY) ) { return dwErr; } // If the entry already exists... if( pdtlnode != NULL ) { DTLNODE *pdtlnodeNew = DuplicateEntryNode(pdtlnode); DtlRemoveNode(pbfile.pdtllistEntries, pdtlnode); DestroyEntryNode(pdtlnode); pdtlnode = pdtlnodeNew; } // New Entry else { dwErr = ReadPhonebookFile(lpszPhonebook, NULL, NULL, 0, &pbfile); if( dwErr ) { return ERROR_CANNOT_OPEN_PHONEBOOK; } pdtlnode = CreateEntryNode(TRUE); fCreated = TRUE; } if( pdtlnode == NULL ) { dwErr = ERROR_NOT_ENOUGH_MEMORY; goto cleanup; } // // Add the node to the list of entries // DtlAddNodeLast(pbfile.pdtllistEntries, pdtlnode); pEntry = (PBENTRY *) DtlGetData(pdtlnode); // // Convert the RASENTRY to a PBENTRY // (Call our private version of this) // dwErr = WinState_RasEntryToPhonebookEntry( lpszEntry, lpRasEntry, dwcbRasEntry, lpbDeviceConfig, dwcbDeviceConfig, pEntry); if( dwErr ) { goto cleanup; } // // Write out the phonebook file // dwErr = WritePhonebookFile(&pbfile, NULL); if( dwErr == ERROR_SUCCESS ) { dwErr = DwSendRasNotification( (fCreated) ? ENTRY_ADDED : ENTRY_MODIFIED, pEntry, pbfile.pszPath); dwErr = ERROR_SUCCESS; } cleanup: ClosePhonebookFile(&pbfile); LeaveCriticalSection(&PhonebookLock); return dwErr; #endif } // // DllMain() // BOOL DllMain( HANDLE hinstDll, DWORD fdwReason, LPVOID lpReserved ) { if( InitializeLoadRAS(fdwReason) == ERROR_SUCCESS ) return TRUE; return FALSE; }