409 lines
10 KiB
C++
409 lines
10 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997.
|
|
//
|
|
// File: R A S S R V . C P P
|
|
//
|
|
// Contents: Implementation of RAS Server configuration object.
|
|
//
|
|
// Notes:
|
|
//
|
|
// Author: shaunco 21 Mar 1997
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "pch.h"
|
|
#pragma hdrstop
|
|
#include <ncreg.h>
|
|
#include <mprapip.h>
|
|
#include "rasobj.h"
|
|
#include "ncnetcfg.h"
|
|
|
|
|
|
extern const WCHAR c_szInfId_MS_Steelhead[];
|
|
|
|
//+---------------------------------------------------------------------------
|
|
// HrMprConfigServerUnattendedInstall
|
|
//
|
|
// This function dynamically links to the mprsnap.dll and calls the
|
|
// utility function for unattended install of RAS/Routing.
|
|
//
|
|
|
|
typedef HRESULT (APIENTRY *PFNMPRINSTALL)(PCWSTR, BOOL);
|
|
typedef DWORD (APIENTRY *PFSETPORTUSAGE)(IN DWORD dwUsage);
|
|
const WCHAR g_pszNotificationPackages[] = L"Notification Packages";
|
|
|
|
HRESULT HrMprConfigServerUnattendedInstall(PCWSTR pszServer, BOOL fInstall)
|
|
{
|
|
HINSTANCE hLib = NULL;
|
|
PFNMPRINSTALL pMprConfigServerUnattendedInstall = NULL;
|
|
HRESULT hr = S_OK;
|
|
DWORD dwErr;
|
|
|
|
hLib = LoadLibrary(L"mprsnap.dll");
|
|
if (hLib == NULL)
|
|
{
|
|
dwErr = GetLastError();
|
|
hr = HRESULT_FROM_WIN32( dwErr );
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
pMprConfigServerUnattendedInstall = (PFNMPRINSTALL) GetProcAddress(hLib,
|
|
"MprConfigServerUnattendedInstall");
|
|
if (pMprConfigServerUnattendedInstall == NULL)
|
|
{
|
|
dwErr = GetLastError();
|
|
hr = HRESULT_FROM_WIN32( dwErr );
|
|
}
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
hr = pMprConfigServerUnattendedInstall(pszServer, fInstall);
|
|
}
|
|
|
|
if (hLib)
|
|
{
|
|
FreeLibrary(hLib);
|
|
}
|
|
|
|
TraceError("HrMprConfigServerUnattendedInstall", hr);
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
// HrSetUsageOnAllRasPorts
|
|
//
|
|
// This function dynamically links to rtrupg.dll and calls the
|
|
// utility function for setting port usage.
|
|
//
|
|
|
|
HRESULT HrSetUsageOnAllRasPorts(IN DWORD dwUsage)
|
|
{
|
|
HINSTANCE hLib = NULL;
|
|
PFSETPORTUSAGE pSetPortUsage = NULL;
|
|
HRESULT hr = S_OK;
|
|
DWORD dwErr;
|
|
|
|
hLib = ::LoadLibrary(L"mprapi.dll");
|
|
if (hLib == NULL)
|
|
{
|
|
dwErr = ::GetLastError();
|
|
hr = HRESULT_FROM_WIN32( dwErr );
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
pSetPortUsage = (PFSETPORTUSAGE) ::GetProcAddress(hLib,
|
|
"MprPortSetUsage");
|
|
if (pSetPortUsage == NULL)
|
|
{
|
|
dwErr = ::GetLastError();
|
|
hr = HRESULT_FROM_WIN32( dwErr );
|
|
}
|
|
}
|
|
|
|
if (SUCCEEDED(hr))
|
|
hr = pSetPortUsage(dwUsage);
|
|
|
|
if (hLib)
|
|
::FreeLibrary(hLib);
|
|
|
|
TraceError("HrSetUsageOnAllRasPorts", hr);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
// HrSetLsaNotificationPackage
|
|
//
|
|
// Installs the given package as an LSA notification package if it is not
|
|
// already installed.
|
|
//
|
|
|
|
HRESULT
|
|
HrSetLsaNotificationPackage(
|
|
IN PWCHAR pszPackage)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HKEY hkLsa = NULL;
|
|
DWORD dwErr = NO_ERROR, dwType, dwSize, dwLen, dwTotalLen;
|
|
WCHAR pszPackageList[1024];
|
|
PWCHAR pszCur = NULL;
|
|
BOOL bFound = FALSE;
|
|
|
|
do
|
|
{
|
|
// Open the Lsa key
|
|
//
|
|
hr = HrRegOpenKeyEx (
|
|
HKEY_LOCAL_MACHINE,
|
|
L"System\\CurrentControlSet\\Control\\Lsa",
|
|
KEY_ALL_ACCESS,
|
|
&hkLsa);
|
|
if (FAILED(hr))
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Query the value for the notification packages
|
|
//
|
|
dwType = REG_MULTI_SZ;
|
|
dwSize = sizeof(pszPackageList);
|
|
hr = HrRegQueryValueEx(
|
|
hkLsa,
|
|
g_pszNotificationPackages,
|
|
&dwType,
|
|
(LPBYTE)pszPackageList,
|
|
&dwSize);
|
|
if (FAILED(hr))
|
|
{
|
|
break;
|
|
}
|
|
|
|
// See if the given package is already installed
|
|
//
|
|
pszCur = (PWCHAR)pszPackageList;
|
|
dwTotalLen = 0;
|
|
while (*pszCur)
|
|
{
|
|
if (lstrcmpi(pszCur, pszPackage) == 0)
|
|
{
|
|
bFound = TRUE;
|
|
}
|
|
dwLen = (wcslen(pszCur) + 1);
|
|
pszCur += dwLen;
|
|
dwTotalLen += dwLen;
|
|
}
|
|
|
|
// If the package isn't already installed, add it.
|
|
//
|
|
if (!bFound)
|
|
{
|
|
dwLen = wcslen(pszPackage) + 1;
|
|
wcscpy(pszCur, pszPackage);
|
|
pszCur[dwLen] = L'\0';
|
|
dwTotalLen += (dwLen + 1);
|
|
|
|
hr = HrRegSetValueEx(
|
|
hkLsa,
|
|
g_pszNotificationPackages,
|
|
REG_MULTI_SZ,
|
|
(CONST BYTE*)pszPackageList,
|
|
dwTotalLen * sizeof(WCHAR));
|
|
if (FAILED(hr))
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
} while (FALSE);
|
|
|
|
// Cleanup
|
|
{
|
|
if (hkLsa)
|
|
{
|
|
RegCloseKey(hkLsa);
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
CRasSrv::CRasSrv () : CRasBindObject ()
|
|
{
|
|
m_pnccMe = NULL;
|
|
m_fRemoving = FALSE;
|
|
m_fNt4ServerUpgrade = FALSE;
|
|
m_fSaveAfData = FALSE;
|
|
}
|
|
|
|
CRasSrv::~CRasSrv ()
|
|
{
|
|
ReleaseObj (m_pnccMe);
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
// INetCfgComponentControl
|
|
//
|
|
STDMETHODIMP
|
|
CRasSrv::Initialize (
|
|
INetCfgComponent* pncc,
|
|
INetCfg* pnc,
|
|
BOOL fInstalling)
|
|
{
|
|
Validate_INetCfgNotify_Initialize (pncc, pnc, fInstalling);
|
|
|
|
// Hold on to our the component representing us and our host
|
|
// INetCfg object.
|
|
AddRefObj (m_pnccMe = pncc);
|
|
AddRefObj (m_pnc = pnc);
|
|
|
|
m_fInstalling = fInstalling;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRasSrv::Validate ()
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRasSrv::CancelChanges ()
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRasSrv::ApplyRegistryChanges ()
|
|
{
|
|
if (!m_fRemoving)
|
|
{
|
|
if (m_fSaveAfData)
|
|
{
|
|
m_AfData.SaveToRegistry ();
|
|
m_fSaveAfData = FALSE;
|
|
|
|
if (m_AfData.m_fRouterTypeSpecified)
|
|
{
|
|
HRESULT hr = HrMprConfigServerUnattendedInstall(NULL, TRUE);
|
|
TraceError("CRasSrv::ApplyRegistryChanges unattend inst (ignoring)", hr);
|
|
|
|
if (m_AfData.m_dataSrvCfg.dwRouterType & 4)
|
|
{
|
|
hr = HrSetUsageOnAllRasPorts(MPRFLAG_PORT_Router);
|
|
TraceError("CRasSrv::ApplyRegistryChanges set router usage (ignoring)", hr);
|
|
}
|
|
}
|
|
|
|
// pmay: 251736
|
|
//
|
|
// On NTS, we set all usage to dialin
|
|
//
|
|
if (m_fNt4ServerUpgrade)
|
|
{
|
|
HRESULT hr = HrSetUsageOnAllRasPorts(MPRFLAG_PORT_Dialin);
|
|
TraceError("CRasSrv::ApplyRegistryChanges set dialin usage (ignoring)", hr);
|
|
}
|
|
|
|
// On professional, we set non-vpn port usage to to dialin if
|
|
// a flag in the af tells us to do so.
|
|
//
|
|
else if (m_AfData.m_fSetUsageToDialin)
|
|
{
|
|
HRESULT hr = HrSetUsageOnAllRasPorts(MPRFLAG_PORT_NonVpnDialin);
|
|
TraceError("CRasSrv::ApplyRegistryChanges set dialin usage (ignoring)", hr);
|
|
}
|
|
}
|
|
|
|
if (m_fInstalling)
|
|
{
|
|
NT_PRODUCT_TYPE ProductType;
|
|
|
|
if (RtlGetNtProductType (&ProductType))
|
|
{
|
|
// Upgrade local RAS user objects. Do not do this if we are
|
|
// a domain controller as local RAS user objects translates to
|
|
// all domain users. For the domain controller case, Dcpromo
|
|
// handles upgrading the objects in a much more efficient
|
|
// manner.
|
|
//
|
|
if (NtProductLanManNt != ProductType)
|
|
{
|
|
DWORD dwErr = MprAdminUpgradeUsers (NULL, TRUE);
|
|
TraceError ("MprAdminUpgradeUsers", HRESULT_FROM_WIN32(dwErr));
|
|
}
|
|
|
|
// pmay: 407019
|
|
//
|
|
// Make sure that rassfm is installed as a notification package on all
|
|
// flavors of nt servers
|
|
//
|
|
if ((NtProductServer == ProductType) || (NtProductLanManNt == ProductType))
|
|
{
|
|
HRESULT hr = HrSetLsaNotificationPackage(L"RASSFM");
|
|
TraceError("CRasSrv::ApplyRegistryChanges set lsa not package usage (ignoring)", hr);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
// INetCfgComponentSetup
|
|
//
|
|
STDMETHODIMP
|
|
CRasSrv::ReadAnswerFile (
|
|
PCWSTR pszAnswerFile,
|
|
PCWSTR pszAnswerSection)
|
|
{
|
|
Validate_INetCfgNotify_ReadAnswerFile (pszAnswerFile, pszAnswerSection);
|
|
|
|
// Read data from the answer file.
|
|
// Don't let this affect the HRESULT we return.
|
|
//
|
|
if (SUCCEEDED(m_AfData.HrOpenAndRead (pszAnswerFile, pszAnswerSection)))
|
|
{
|
|
m_fSaveAfData = TRUE;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRasSrv::Install (DWORD dwSetupFlags)
|
|
{
|
|
HRESULT hr;
|
|
|
|
Validate_INetCfgNotify_Install (dwSetupFlags);
|
|
|
|
if (NSF_WINNT_SVR_UPGRADE & dwSetupFlags)
|
|
{
|
|
m_fNt4ServerUpgrade = TRUE;
|
|
}
|
|
|
|
// Install Steelhead.
|
|
//
|
|
hr = HrInstallComponentOboComponent (m_pnc, NULL,
|
|
GUID_DEVCLASS_NETSERVICE,
|
|
c_szInfId_MS_Steelhead,
|
|
m_pnccMe,
|
|
NULL);
|
|
|
|
TraceHr (ttidError, FAL, hr, FALSE, "CRasSrv::Install");
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRasSrv::Removing ()
|
|
{
|
|
HRESULT hr;
|
|
|
|
m_fRemoving = TRUE;
|
|
|
|
// Remove Steelhead.
|
|
//
|
|
hr = HrRemoveComponentOboComponent (m_pnc,
|
|
GUID_DEVCLASS_NETSERVICE,
|
|
c_szInfId_MS_Steelhead,
|
|
m_pnccMe);
|
|
|
|
TraceHr (ttidError, FAL, hr, FALSE, "CRasSrv::Removing");
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CRasSrv::Upgrade (
|
|
DWORD dwSetupFlags,
|
|
DWORD dwUpgradeFromBuildNo)
|
|
{
|
|
return S_FALSE;
|
|
}
|