|
|
//
// S F N O B J . C P P
//
// Implementation of the CSFNCfg notify object model
//
#include "pch.h"
#pragma hdrstop
#include "sfnobj.h"
#include "ncatlui.h"
#include "ncui.h"
#include "ncreg.h"
#include "ncmisc.h"
extern const WCHAR c_szFPNWVolumes[]; extern const WCHAR c_szSys[]; extern const WCHAR c_szPath[]; extern const WCHAR c_szBackslash[];
extern const WCHAR c_szInfId_MS_NwSapAgent[];
static const WCHAR c_szSysVolRoot[] = L"C:\\SysVol";
//---[ Prototypes ]-----------------------------------------------------------
HRESULT HrCopySysVolFiles(INetCfgComponent * pncc);
//
// Destructor
//
CSFNCfg::CSFNCfg() { // Initialize member variables.
m_pnc = NULL; m_pncc = NULL; m_eInstallAction = eActUnknown; m_fDirty = FALSE; m_fAlreadyInstalled = FALSE;
// Config lib stuff
m_hlibConfig = NULL; m_pfnIsSpoolerRunning = NULL; m_pfnRunNcpDlg = NULL; m_pfnRemoveNcpServer = NULL; m_pfnCommitNcpDlg = NULL;
// Propsheet pages
m_apspObj[0] = NULL; m_apspObj[1] = NULL;
m_dwTuning = c_dwDefaultTuning; m_szSysVol[0] = L'\0'; m_szFPNWServerName[0] = L'\0';
m_pNcpInfoHandle = NULL;
}
CSFNCfg::~CSFNCfg() { ReleaseObj(m_pncc); ReleaseObj(m_pnc); }
//
// INetCfgNotify
//
STDMETHODIMP CSFNCfg::Initialize( INetCfgComponent * pnccItem, INetCfg* pnc, BOOL fInstalling) { Validate_INetCfgNotify_Initialize(pnccItem, pnc, fInstalling);
m_pncc = pnccItem; m_pnc = pnc;
AssertSz(m_pncc, "m_pncc NULL in CSFNCfg::Initialize"); AssertSz(m_pnc, "m_pnc NULL in CSFNCfg::Initialize");
// Determine if already installed. Don't trust the fInstalling, because
// this component is a have disk component and we don't want to do
// much if already installed.
//
// Addref the config objects
//
AddRefObj(m_pncc); AddRefObj(m_pnc);
return S_OK; }
STDMETHODIMP CSFNCfg::Upgrade(DWORD dwSetupFlags, DWORD dwUpgradeFromBuildNo) {
// during first time install, perform some basic tasks that aren't related
// to bindings
if (dwSetupFlags & NSF_POSTSYSINSTALL) { HRESULT hr = HrCodeFromOldINF(); if (SUCCEEDED(hr)) { m_fDirty = TRUE; } }
return S_OK; }
STDMETHODIMP CSFNCfg::ReadAnswerFile(PCWSTR pszAnswerFile, PCWSTR pszAnswerSection) { return S_OK; }
STDMETHODIMP CSFNCfg::Install(DWORD dw) { HRESULT hr = S_OK; NT_PRODUCT_TYPE pt;
Validate_INetCfgNotify_Install(dw);
m_eInstallAction = eActInstall;
RtlGetNtProductType (&pt); if (NtProductLanManNt != pt) { // Return a warning instead of an error so the UI won't popup an
// error dialog after we've already notified the user of why the
// install failed.
//
// Tell the user that they can't install on this platform.
//
NcMsgBox(GetActiveWindow(), IDS_FPNW_CAPTION, IDS_WKS_ONLY, MB_OK | MB_ICONINFORMATION);
hr = E_FAIL; TraceTag(ttidSFNCfg, "User tried to install on machine other than a DC, this is not allowed."); goto Error; }
// Install SAP, which should install nwlnkipx
//
hr = HrInstallComponentOboComponent(m_pnc, NULL, GUID_DEVCLASS_NETSERVICE, c_szInfId_MS_NwSapAgent, m_pncc, NULL); if (FAILED(hr)) { goto Error; }
// Write the sysvol info if not already present
//
hr = HrWriteDefaultSysVol(); if (FAILED(hr)) { goto Error; }
// Call the fpnw configuration code and have it do it's stuff
//
hr = HrCodeFromOldINF(); if (FAILED(hr)) { goto Error; }
// Copy files to the location the user specified in the fpnw dialog
//
hr = HrCopySysVolFiles(m_pncc); if (SUCCEEDED(hr)) { m_fDirty = TRUE; }
Error: // Validate_INetCfgNotify_Install_Return(hr);
TraceError("CSFNCfg::Install", hr); return hr; }
HRESULT CSFNCfg::HrWriteDefaultSysVol() { HRESULT hr; PWSTR pszValue = NULL; tstring str;
str = c_szFPNWVolumes; str += c_szBackslash; str += c_szSys; hr = HrRegQueryMultiSzWithAlloc(HKEY_LOCAL_MACHINE, str.c_str(), &pszValue); if (HRESULT_FROM_WIN32 (ERROR_FILE_NOT_FOUND) == hr) { // Not found is ok, we need to write the default value
//
str = c_szPath; str += c_szSysVolRoot; hr = HrRegAddStringToMultiSz(str.c_str(), HKEY_LOCAL_MACHINE, c_szFPNWVolumes, c_szSys, STRING_FLAG_ENSURE_AT_END, 0); } else if (S_OK == hr) { // Just clean up
MemFree(pszValue); }
TraceError("CSFNCfg::HrWriteDefaultSysVol", hr); return hr; }
STDMETHODIMP CSFNCfg::Removing() { m_eInstallAction = eActInstall;
HRESULT hr = HrLoadConfigDLL(); if (SUCCEEDED(hr)) { m_fDirty = TRUE;
// Remove the SAP Agent service
hr = HrRemoveComponentOboComponent(m_pnc, GUID_DEVCLASS_NETSERVICE, c_szInfId_MS_NwSapAgent, m_pncc); if (hr == NETCFG_S_STILL_REFERENCED) { // If services are still in use, that's OK, I just needed to make
// sure that I released my reference.
//
hr = S_OK; } }
Validate_INetCfgNotify_Removing_Return(hr);
TraceError("CSFNCfg::Removing", hr); return hr; }
STDMETHODIMP CSFNCfg::Validate() { return S_OK; }
STDMETHODIMP CSFNCfg::CancelChanges() { return S_OK; }
STDMETHODIMP CSFNCfg::ApplyRegistryChanges() { HRESULT hr = S_OK; BOOL fResult = TRUE;
if (m_fDirty) { if (eActInstall == m_eInstallAction) { Assert(m_pfnCommitNcpDlg); Assert(m_pNcpInfoHandle);
// The TRUE below means that we're installing.
//
fResult = m_pfnCommitNcpDlg(NULL, TRUE, m_pNcpInfoHandle); if (FALSE == fResult) { hr = E_FAIL; } } else if (eActRemove == m_eInstallAction) { // Removing
Assert(m_pfnRemoveNcpServer); if (FALSE == m_pfnRemoveNcpServer(NULL)) { hr = E_FAIL; } } } else { hr = S_FALSE; }
Validate_INetCfgNotify_Apply_Return(hr);
TraceError("CSFNCfg::ApplyRegistryChanges", (hr == S_FALSE) ? S_OK : hr); return hr; }
|