1580 lines
38 KiB
C++
1580 lines
38 KiB
C++
//--------------------------------------------------------------
|
|
//
|
|
// 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 <common.hxx>
|
|
#include <stdlib.h>
|
|
#include <winsock.h>
|
|
#include <objerror.h>
|
|
#include <loadstate.hxx>
|
|
#include <bothchar.hxx>
|
|
#include <winnetwk.h>
|
|
#include <ras.h>
|
|
#include <raserror.h>
|
|
|
|
#include <loadras.hxx>
|
|
|
|
extern "C" {
|
|
#include "tstr.h"
|
|
#include <pbk.h> // 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;
|
|
}
|
|
|
|
|