windows-nt/Source/XPSP1/NT/net/config/netcfg/srvrcfg/srvrdlg.cpp
2020-09-26 16:20:57 +08:00

296 lines
7.2 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: S R V R D L G . C P P
//
// Contents: Dialog box handling for the Server object.
//
// Notes:
//
// Author: danielwe 5 Mar 1997
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "srvrdlg.h"
#include "ncreg.h"
static const WCHAR c_szServerParams[] = L"System\\CurrentControlSet\\Services\\LanmanServer\\Parameters";
static const WCHAR c_szLmAnnounce[] = L"Lmannounce";
static const WCHAR c_szSize[] = L"Size";
static const WCHAR c_szMemoryManagement[] = L"System\\CurrentControlSet\\Control\\Session Manager\\Memory Management";
static const WCHAR c_szLargeCache[] = L"LargeSystemCache";
//+---------------------------------------------------------------------------
//
// Member: CSrvrcfg::HrSetupPropSheets
//
// Purpose: Inits the prop sheet page objects and creates the pages to be
// returned to the installer object.
//
// Arguments:
// pahpsp [out] Array of handles to property sheet pages.
// cPages [in] Number of pages.
//
// Returns: HRESULT, Error code.
//
// Author: danielwe 5 Mar 1997
//
// Notes:
//
HRESULT CSrvrcfg::HrSetupPropSheets(HPROPSHEETPAGE **pahpsp, INT cPages)
{
HRESULT hr = S_OK;
HPROPSHEETPAGE *ahpsp = NULL;
Assert(pahpsp);
*pahpsp = NULL;
// Allocate a buffer large enough to hold the handles to all of our
// property pages.
ahpsp = (HPROPSHEETPAGE *)CoTaskMemAlloc(sizeof(HPROPSHEETPAGE)
* cPages);
if (!ahpsp)
{
hr = E_OUTOFMEMORY;
goto err;
}
if (!m_apspObj[0])
{
// Allocate each of the CPropSheetPage objects
m_apspObj[0] = new CServerConfigDlg(this);
}
// Create the actual PROPSHEETPAGE for each object.
ahpsp[0] = m_apspObj[0]->CreatePage(DLG_ServerConfig, 0);
Assert(SUCCEEDED(hr));
*pahpsp = ahpsp;
cleanup:
TraceError("HrSetupPropSheets", hr);
return hr;
err:
CoTaskMemFree(ahpsp);
goto cleanup;
}
//+---------------------------------------------------------------------------
//
// Member: CSrvrcfg::CleanupPropPages
//
// Purpose: Loop thru each of the pages and free the objects associated
// with them.
//
// Arguments:
// (none)
//
// Returns: Nothing.
//
// Author: danielwe 5 Mar 1997
//
// Notes:
//
VOID CSrvrcfg::CleanupPropPages()
{
INT ipage;
for (ipage = 0; ipage < c_cPages; ipage++)
{
delete m_apspObj[ipage];
m_apspObj[ipage] = NULL;
}
}
//+---------------------------------------------------------------------------
//
// Member: CSrvrcfg::HrOpenRegKeys
//
// Purpose: Open the various registry keys we'll be working with for the
// lifetime of our object.
//
// Arguments: pnc - An INetCfg interface
//
// Returns: HRESULT, Error code.
//
// Author: danielwe 5 Mar 1997
//
// Notes:
//
HRESULT CSrvrcfg::HrOpenRegKeys(INetCfg *pnc)
{
HRESULT hr = S_OK;
hr = HrRegOpenKeyBestAccess(HKEY_LOCAL_MACHINE, c_szMemoryManagement,
&m_hkeyMM);
if (FAILED(hr))
goto err;
err:
TraceError("CSrvrcfg::HrOpenRegKeys", hr);
return hr;
}
//+---------------------------------------------------------------------------
//
// Member: CSrvrcfg::HrGetRegistryInfo
//
// Purpose: Fill our in-memory state with data from the registry.
//
// Arguments:
// fInstalling [in] TRUE if component is being installed, FALSE if
// it is just being initialized (already installed)
//
// Returns: HRESULT, Error code.
//
// Author: danielwe 5 Mar 1997
//
// Notes:
//
HRESULT CSrvrcfg::HrGetRegistryInfo(BOOL fInstalling)
{
HRESULT hr = S_OK;
HKEY hkeyParams;
// Set reasonable defaults in case the key is missing
m_sdd.fAnnounce = FALSE;
if (m_pf == PF_SERVER)
{
m_sdd.dwSize = 3;
m_sdd.fLargeCache = TRUE;
}
else
{
m_sdd.dwSize = 1;
m_sdd.fLargeCache = FALSE;
}
if (!m_fUpgradeFromWks)
{
hr = HrRegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szServerParams, KEY_READ,
&hkeyParams);
if (SUCCEEDED(hr))
{
DWORD dwSize;
hr = HrRegQueryDword(hkeyParams, c_szLmAnnounce,
(DWORD *)&m_sdd.fAnnounce);
if (FAILED(hr))
{
if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND))
{
hr = S_OK;
}
else
{
goto err;
}
}
hr = HrRegQueryDword(hkeyParams, c_szSize, &dwSize);
if (FAILED(hr))
{
if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND))
{
hr = S_OK;
}
else
{
goto err;
}
}
else
{
AssertSz(dwSize != 0, "This shouldn't be 0!");
m_sdd.dwSize = dwSize;
}
RegCloseKey(hkeyParams);
}
if (!fInstalling)
{
// RAID #94442
// Only read old value if this is not an initial install.
// We want our default to be written when this is a first time install.
AssertSz(m_hkeyMM, "No MM registry key??");
hr = HrRegQueryDword(m_hkeyMM, c_szLargeCache,
(DWORD *) &m_sdd.fLargeCache);
if (FAILED(hr))
{
if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND))
{
hr = S_OK;
}
else
{
goto err;
}
}
}
}
else
{
TraceTag(ttidSrvrCfg, "Upgrading from workstation product so we're "
"ignoring the registry read code.");
}
err:
TraceError("CSrvrcfg::HrGetRegistryInfo", hr);
return hr;
}
//+---------------------------------------------------------------------------
//
// Member: CSrvrcfg::HrSetRegistryInfo
//
// Purpose: Save out our in-memory state to the registry.
//
// Arguments:
// (none)
//
// Returns: HRESULT, Error code.
//
// Author: danielwe 5 Mar 1997
//
// Notes:
//
HRESULT CSrvrcfg::HrSetRegistryInfo()
{
HRESULT hr = S_OK;
HKEY hkeyParams;
hr = HrRegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szServerParams,
KEY_ALL_ACCESS, &hkeyParams);
if (SUCCEEDED(hr))
{
hr = HrRegSetDword(hkeyParams, c_szLmAnnounce, m_sdd.fAnnounce);
if (SUCCEEDED(hr))
{
hr = HrRegSetDword(hkeyParams, c_szSize, m_sdd.dwSize);
}
RegCloseKey(hkeyParams);
}
if (SUCCEEDED(hr))
{
AssertSz(m_hkeyMM, "Why is this not open?");
hr = HrRegSetDword(m_hkeyMM, c_szLargeCache, m_sdd.fLargeCache);
}
TraceError("CSrvrcfg::HrSetRegistryInfo", hr);
return hr;
}