//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: R A S A F . C P P // // Contents: RAS Answer File objects. // // Notes: // // Author: shaunco 19 Apr 1997 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "ncipaddr.h" #include "ncmisc.h" #include "ncreg.h" #include "ncsetup.h" #include "rasaf.h" #include "rasobj.h" extern const WCHAR c_szAfAppleTalk[]; extern const WCHAR c_szAfAutoNetworkNumbers[]; extern const WCHAR c_szAfClientCanReqIpaddr[]; extern const WCHAR c_szAfClientReqNodeNumber[]; extern const WCHAR c_szAfDialinProtocols[]; extern const WCHAR c_szAfForceEncryptedData[]; extern const WCHAR c_szAfForceStrongEncryption[]; extern const WCHAR c_szAfForceEncryptedPassword[]; extern const WCHAR c_szAfWanNetPoolSize[]; extern const WCHAR c_szAfIpAddressStart[]; extern const WCHAR c_szAfIpAddressEnd[]; extern const WCHAR c_szAfIpxClientAccess[]; extern const WCHAR c_szAfIpx[]; extern const WCHAR c_szAfL2tpMaxVcs[]; extern const WCHAR c_szAfL2tpEndpoints[]; extern const WCHAR c_szAfMultilink[]; extern const WCHAR c_szAfNetNumberFrom[]; extern const WCHAR c_szAfNetbeuiClientAccess[]; extern const WCHAR c_szAfNetbeui[]; extern const WCHAR c_szAfNetwork[]; extern const WCHAR c_szAfParamsSection[]; extern const WCHAR c_szAfPptpEndpoints[]; extern const WCHAR c_szAfRouterType[]; extern const WCHAR c_szAfSecureVPN[]; extern const WCHAR c_szAfSetDialinUsage[]; extern const WCHAR c_szAfSameNetworkNumber[]; extern const WCHAR c_szAfTcpipClientAccess[]; extern const WCHAR c_szAfTcpip[]; extern const WCHAR c_szAfThisComputer[]; extern const WCHAR c_szAfUseDhcp[]; extern const WCHAR c_szInfId_MS_L2tpMiniport[]; extern const WCHAR c_szInfId_MS_PptpMiniport[]; extern const WCHAR c_szInfId_MS_PppoeMiniport[]; //+--------------------------------------------------------------------------- // CRasSrvAnswerFileData // HRESULT CRasSrvAnswerFileData::HrOpenAndRead ( PCWSTR pszAnswerFile, PCWSTR pszAnswerSection) { // Open the answer file. It will close itself in it's destructor. CSetupInfFile inf; UINT unErrorLine; HRESULT hr = inf.HrOpen ( pszAnswerFile, NULL, INF_STYLE_OLDNT | INF_STYLE_WIN4, &unErrorLine); if (SUCCEEDED(hr)) { m_fRouterTypeSpecified = FALSE; m_fSetUsageToDialin = FALSE; // Prepare the default values for use when we fail to read. // Initializing with defaults also helps to gaurantee that bogus // values aren't used when we add items to the structure but fail // to provide answer file support for them. // m_dataSrvCfg.GetDefault (); m_dataSrvIp .GetDefault (); m_dataSrvIpx.GetDefault (); m_dataSrvNbf.GetDefault (); DATA_SRV_CFG defSrvCfg = m_dataSrvCfg; DATA_SRV_IP defSrvIp = m_dataSrvIp; DATA_SRV_IPX defSrvIpx = m_dataSrvIpx; DATA_SRV_NBF defSrvNbf = m_dataSrvNbf; // Get the real parameter section. // tstring strSection; hr = inf.HrGetString (pszAnswerSection, c_szAfParamsSection, &strSection); if (FAILED(hr)) { // If we failed to find the parameter section, just try // this one. // strSection = pszAnswerSection; } static const MAP_SZ_DWORD c_mapProtocols [] = { { c_szAfTcpip, RPI_IP }, { c_szAfIpx, RPI_IPX }, { c_szAfNetbeui, RPI_NBF }, { c_szAfAppleTalk, RPI_ATALK }, }; // Read the list of dial-in protocols. // hr = inf.HrGetMultiSzMapToDword (strSection.c_str(), c_szAfDialinProtocols, c_mapProtocols, celems (c_mapProtocols), &m_dwDialInProtocolIds); if (FAILED(hr) || !m_dwDialInProtocolIds) { // If its not there, use all possible. m_dwDialInProtocolIds = RPI_ALL; } hr = inf.HrGetStringAsBool (strSection.c_str(), c_szAfMultilink, &m_dataSrvCfg.fMultilink); if (FAILED(hr)) { m_dataSrvCfg.fMultilink = defSrvCfg.fMultilink; } hr = inf.HrGetDword(strSection.c_str(), c_szAfRouterType, (DWORD*)&m_dataSrvCfg.dwRouterType); if (FAILED(hr)) { m_dataSrvCfg.dwRouterType = defSrvCfg.dwRouterType; } else { m_fRouterTypeSpecified = TRUE; } hr = inf.HrGetDword (strSection.c_str(), c_szAfForceEncryptedPassword, &m_dataSrvCfg.dwAuthLevel); if (FAILED(hr)) { m_dataSrvCfg.dwAuthLevel = defSrvCfg.dwAuthLevel; } hr = inf.HrGetStringAsBool (strSection.c_str(), c_szAfForceEncryptedData, &m_dataSrvCfg.fDataEnc); if (FAILED(hr)) { m_dataSrvCfg.fDataEnc = defSrvCfg.fDataEnc; } hr = inf.HrGetStringAsBool (strSection.c_str(), c_szAfForceStrongEncryption, &m_dataSrvCfg.fStrongDataEnc); if (FAILED(hr)) { m_dataSrvCfg.fStrongDataEnc = defSrvCfg.fStrongDataEnc; } hr = inf.HrGetDword (strSection.c_str(), c_szAfSecureVPN, &m_dataSrvCfg.dwSecureVPN); if (FAILED(hr)) { m_dataSrvCfg.dwSecureVPN = defSrvCfg.dwSecureVPN; } // pmay: 251736 // Discover whether we are to set all port usage to 'dialin' // DWORD dwSetUsageToDialin; hr = inf.HrGetDword(strSection.c_str(), c_szAfSetDialinUsage, &dwSetUsageToDialin); if (SUCCEEDED(hr)) { m_fSetUsageToDialin = !!dwSetUsageToDialin; } static const MAP_SZ_DWORD c_mapNetworkAccess [] = { { c_szAfNetwork, TRUE }, { c_szAfThisComputer, FALSE }, }; // Read the IP values. // m_dataSrvIp.fEnableIn = (m_dwDialInProtocolIds & RPI_IP) ? TRUE : FALSE; hr = inf.HrGetStringMapToDword (strSection.c_str(), c_szAfTcpipClientAccess, c_mapNetworkAccess, celems (c_mapNetworkAccess), (DWORD*)&m_dataSrvIp.fAllowNetworkAccess); if (FAILED(hr)) { m_dataSrvIp.fAllowNetworkAccess = defSrvIp.fAllowNetworkAccess; } hr = inf.HrGetStringAsBool (strSection.c_str(), c_szAfUseDhcp, &m_dataSrvIp.fUseDhcp); if (FAILED(hr)) { m_dataSrvIp.fUseDhcp = defSrvIp.fUseDhcp; } hr = inf.HrGetStringAsBool (strSection.c_str(), c_szAfClientCanReqIpaddr, &m_dataSrvIp.fAllowClientAddr); if (FAILED(hr)) { m_dataSrvIp.fAllowClientAddr = defSrvIp.fAllowClientAddr; } tstring strIpAddress; hr = inf.HrGetString (strSection.c_str(), c_szAfIpAddressStart, &strIpAddress); if (SUCCEEDED(hr)) { m_dataSrvIp.dwIpStart = IpPszToHostAddr(strIpAddress.c_str()); } else { m_dataSrvIp.dwIpStart = defSrvIp.dwIpStart; } hr = inf.HrGetString (strSection.c_str(), c_szAfIpAddressEnd, &strIpAddress); if (SUCCEEDED(hr)) { m_dataSrvIp.dwIpEnd = IpPszToHostAddr(strIpAddress.c_str()); } else { m_dataSrvIp.dwIpEnd = defSrvIp.dwIpEnd; } // Read the IPX values. // m_dataSrvIpx.fEnableIn = (m_dwDialInProtocolIds & RPI_IPX) ? TRUE : FALSE; hr = inf.HrGetStringMapToDword (strSection.c_str(), c_szAfIpxClientAccess, c_mapNetworkAccess, celems (c_mapNetworkAccess), (DWORD*)&m_dataSrvIpx.fAllowNetworkAccess); if (FAILED(hr)) { m_dataSrvIpx.fAllowNetworkAccess = defSrvIpx.fAllowNetworkAccess; } hr = inf.HrGetStringAsBool (strSection.c_str(), c_szAfAutoNetworkNumbers, &m_dataSrvIpx.fUseAutoAddr); if (FAILED(hr)) { m_dataSrvIpx.fUseAutoAddr = defSrvIpx.fUseAutoAddr; } hr = inf.HrGetStringAsBool (strSection.c_str(), c_szAfSameNetworkNumber, &m_dataSrvIpx.fUseSameNetNum); if (FAILED(hr)) { m_dataSrvIpx.fUseSameNetNum = defSrvIpx.fUseSameNetNum; } hr = inf.HrGetStringAsBool (strSection.c_str(), c_szAfClientReqNodeNumber, &m_dataSrvIpx.fAllowClientNetNum); if (FAILED(hr)) { m_dataSrvIpx.fAllowClientNetNum = defSrvIpx.fAllowClientNetNum; } hr = inf.HrGetDword (strSection.c_str(), c_szAfNetNumberFrom, &m_dataSrvIpx.dwIpxNetFirst); if (FAILED(hr)) { m_dataSrvIpx.dwIpxNetFirst = defSrvIpx.dwIpxNetFirst; } hr = inf.HrGetDword (strSection.c_str(), c_szAfWanNetPoolSize, &m_dataSrvIpx.dwIpxWanPoolSize); if (FAILED(hr)) { m_dataSrvIpx.dwIpxWanPoolSize = defSrvIpx.dwIpxWanPoolSize; } // Read the NBF values. // m_dataSrvNbf.fEnableIn = (m_dwDialInProtocolIds & RPI_NBF) ? TRUE : FALSE; hr = inf.HrGetStringMapToDword (strSection.c_str(), c_szAfNetbeuiClientAccess, c_mapNetworkAccess, celems (c_mapNetworkAccess), (DWORD*)&m_dataSrvNbf.fAllowNetworkAccess); if (FAILED(hr)) { m_dataSrvNbf.fAllowNetworkAccess = defSrvNbf.fAllowNetworkAccess; } // Default anything bogus. // m_dataSrvCfg.CheckAndDefault (); m_dataSrvIp .CheckAndDefault (); m_dataSrvIpx.CheckAndDefault (); m_dataSrvNbf.CheckAndDefault (); hr = S_OK; } TraceError ("CRasSrvAnswerFileData::HrOpenAndRead", hr); return hr; } VOID CRasSrvAnswerFileData::SaveToRegistry ( VOID) const { m_dataSrvCfg.SaveToReg(); m_dataSrvIp .SaveToReg(); m_dataSrvIpx.SaveToReg(); m_dataSrvNbf.SaveToReg(); } //+--------------------------------------------------------------------------- // CL2tpAnswerFileData // const DWORD c_MaxMaxVcs = 1000; const DWORD c_DefMaxVcs = 1000; const DWORD c_MaxEndpoints = 1000; const DWORD c_DefEndpoints = 5; VOID CL2tpAnswerFileData::CheckAndDefault () { if (m_cMaxVcs > c_MaxMaxVcs) { m_cMaxVcs = c_DefMaxVcs; } if (m_cEndpoints > c_MaxEndpoints) { m_cEndpoints = c_DefEndpoints; } } HRESULT CL2tpAnswerFileData::HrOpenAndRead ( PCWSTR pszAnswerFile, PCWSTR pszAnswerSection) { ZeroMemory (this, sizeof(*this)); // Open the answer file. It will close itself in it's destructor. CSetupInfFile inf; UINT unErrorLine; HRESULT hr = inf.HrOpen ( pszAnswerFile, NULL, INF_STYLE_OLDNT | INF_STYLE_WIN4, &unErrorLine); if (SUCCEEDED(hr)) { // Read the number of VPNs. // hr = inf.HrGetDword (pszAnswerSection, c_szAfL2tpMaxVcs, &m_cMaxVcs); if (FAILED(hr)) { m_cMaxVcs = c_DefMaxVcs; } hr = inf.HrGetDword (pszAnswerSection, c_szAfL2tpEndpoints, &m_cEndpoints); if (FAILED(hr)) { m_cEndpoints = c_DefEndpoints; m_fWriteEndpoints = FALSE; } else { m_fWriteEndpoints = TRUE; } // Default anything bogus. // CheckAndDefault (); hr = S_OK; } TraceError ("CL2tpAnswerFileData::HrOpenAndRead", hr); return hr; } VOID CL2tpAnswerFileData::SaveToRegistry ( INetCfg* pnc) const { Assert (pnc); HKEY hkey; HRESULT hr; // Update the L2TP miniport's parameter key. // hr = HrOpenComponentParamKey ( pnc, GUID_DEVCLASS_NET, c_szInfId_MS_L2tpMiniport, &hkey); if (S_OK == hr) { (VOID) HrRegSetDword (hkey, L"MaxVcs", m_cMaxVcs); if (m_fWriteEndpoints) { (VOID) HrRegSetDword (hkey, L"WanEndpoints", m_cEndpoints); } RegCloseKey (hkey); } } //+--------------------------------------------------------------------------- // CPptpAnswerFileData // // Minimum and maximum number of Virtual Private Networks // allowed by PPTP. const DWORD c_cPptpVpnsMin = 0; const DWORD c_cPptpVpnsMax = 1000; static const DWORD c_cDefPptpVpnsWorkstation = 2; static const DWORD c_cDefPptpVpnsServer = 5; DWORD CPptpAnswerFileData::GetDefaultNumberOfVpns () { PRODUCT_FLAVOR pf; GetProductFlavor(NULL, &pf); DWORD cVpns; // On the server product, default to 5 VPNs, otherwise, default to 2 VPNs. // if (PF_SERVER == pf) { cVpns = c_cDefPptpVpnsServer; } else { cVpns = c_cDefPptpVpnsWorkstation; } return cVpns; } #pragma warning(push) #pragma warning(disable:4296) VOID CPptpAnswerFileData::CheckAndDefault () { if ((m_cVpns < c_cPptpVpnsMin) || (m_cVpns > c_cPptpVpnsMax)) { m_cVpns = GetDefaultNumberOfVpns (); } } #pragma warning(pop) HRESULT CPptpAnswerFileData::HrOpenAndRead ( PCWSTR pszAnswerFile, PCWSTR pszAnswerSection) { ZeroMemory (this, sizeof(*this)); // Open the answer file. It will close itself in it's destructor. CSetupInfFile inf; UINT unErrorLine; HRESULT hr = inf.HrOpen ( pszAnswerFile, NULL, INF_STYLE_OLDNT | INF_STYLE_WIN4, &unErrorLine); if (SUCCEEDED(hr)) { // Read the number of VPNs. // hr = inf.HrGetDword (pszAnswerSection, c_szAfPptpEndpoints, &m_cVpns); if (FAILED(hr)) { m_cVpns = GetDefaultNumberOfVpns (); } // Default anything bogus. // CheckAndDefault (); hr = S_OK; } TraceError ("CPptpAnswerFileData::HrOpenAndRead", hr); return hr; } VOID CPptpAnswerFileData::SaveToRegistry ( INetCfg* pnc) const { Assert (pnc); HKEY hkey; HRESULT hr; // Update the PPTP miniport's parameter key. // hr = HrOpenComponentParamKey ( pnc, GUID_DEVCLASS_NET, c_szInfId_MS_PptpMiniport, &hkey); if (S_OK == hr) { (VOID) HrRegSetDword (hkey, L"WanEndpoints", m_cVpns); RegCloseKey (hkey); } } VOID CPppoeAnswerFileData::CheckAndDefault () { m_cVpns = 1; } HRESULT CPppoeAnswerFileData::HrOpenAndRead ( PCWSTR pszAnswerFile, PCWSTR pszAnswerSection) { ZeroMemory (this, sizeof(*this)); // Open the answer file. It will close itself in it's destructor. CSetupInfFile inf; UINT unErrorLine; HRESULT hr = inf.HrOpen ( pszAnswerFile, NULL, INF_STYLE_OLDNT | INF_STYLE_WIN4, &unErrorLine); if (SUCCEEDED(hr)) { // Read the number of VPNs. // hr = inf.HrGetDword (pszAnswerSection, c_szAfL2tpEndpoints, &m_cVpns); if (FAILED(hr)) { m_cVpns = 1; } // Default anything bogus. // CheckAndDefault (); hr = S_OK; } TraceError ("CPppoeAnswerFileData::HrOpenAndRead", hr); return hr; } VOID CPppoeAnswerFileData::SaveToRegistry ( INetCfg* pnc) const { Assert (pnc); HKEY hkey; HRESULT hr; // Update the PPTP miniport's parameter key. // hr = HrOpenComponentParamKey ( pnc, GUID_DEVCLASS_NET, c_szInfId_MS_PppoeMiniport, &hkey); if (S_OK == hr) { (VOID) HrRegSetDword (hkey, L"WanEndpoints", m_cVpns); RegCloseKey (hkey); } }