//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: S A P O B J . C P P // // Contents: Implementation of the CSAPCfg notify object // // Notes: // // Author: jeffspr 31 May 1997 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "sapobj.h" #include "ncreg.h" extern const WCHAR c_szInfId_MS_NWIPX[]; extern const WCHAR c_szRegKeyRefCounts[]; extern const WCHAR c_szRegValueComponentId[]; const WCHAR c_szProtoPath[] = L"System\\CurrentControlSet\\Control\\Network\\{4D36E975-E325-11CE-BFC1-08002BE10318}"; const WCHAR c_szOcSapRef[] = L"%Msft%nwsapagent"; CSAPCfg::CSAPCfg() { m_pnc = NULL; m_pncc = NULL; } CSAPCfg::~CSAPCfg() { ReleaseObj(m_pncc); ReleaseObj(m_pnc); } STDMETHODIMP CSAPCfg::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 CSAPCfg::Initialize"); AssertSz(m_pnc, "m_pnc NULL in CSAPCfg::Initialize"); // Addref the config objects // AddRefObj(m_pncc); AddRefObj(m_pnc); return S_OK; } STDMETHODIMP CSAPCfg::Validate() { return S_OK; } STDMETHODIMP CSAPCfg::CancelChanges() { return S_OK; } STDMETHODIMP CSAPCfg::ApplyRegistryChanges() { return S_OK; } STDMETHODIMP CSAPCfg::ReadAnswerFile ( PCWSTR pszAnswerFile, PCWSTR pszAnswerSection) { return S_OK; } STDMETHODIMP CSAPCfg::Upgrade(DWORD, DWORD) { // Raid 266650 - Need to clean up the registry as in Beta 2 SAP was an optional component. // Cleanup is done by deleting the NetOC OBO Install ref-count on IPX. // HRESULT hr; HKEY hkeyProto; // Open the protocol list // hr = HrRegOpenKeyEx(HKEY_LOCAL_MACHINE, c_szProtoPath, KEY_ALL_ACCESS, &hkeyProto); if (SUCCEEDED(hr)) { BOOL fDone = FALSE; WCHAR szValueName [_MAX_PATH]; DWORD cchBuffSize = _MAX_PATH; FILETIME ft; DWORD dwKeyIndex = 0; // Enum the keys children, search for ms_nwipx // while (SUCCEEDED(hr = HrRegEnumKeyEx(hkeyProto, dwKeyIndex, szValueName, &cchBuffSize, NULL, NULL, &ft)) && !fDone) { HKEY hkeyComponent; // Open the key that was enumerated // hr = HrRegOpenKeyEx(hkeyProto, szValueName, KEY_ALL_ACCESS, &hkeyComponent); if (SUCCEEDED(hr)) { tstring str; // Is this ms_nwipx? // hr = HrRegQueryString(hkeyComponent, c_szRegValueComponentId, &str); if (SUCCEEDED(hr) && (0 == _wcsicmp(str.c_str(), c_szInfId_MS_NWIPX))) { HKEY hkeyRefCounts; // Open the "RefCounts" subkey // hr = HrRegOpenKeyEx(hkeyComponent, c_szRegKeyRefCounts, KEY_ALL_ACCESS, &hkeyRefCounts); if (SUCCEEDED(hr)) { // Enumerate the values under here searching for %Msft%nwsapagent // for (DWORD dwIndex = 0; SUCCEEDED(hr); dwIndex++) { WCHAR pszValueName [_MAX_PATH]; DWORD cchValueName = celems (pszValueName); DWORD dwType; DWORD dwRefCount = 0; DWORD cbData = sizeof (dwRefCount); hr = HrRegEnumValue (hkeyRefCounts, dwIndex, pszValueName, &cchValueName, &dwType, (LPBYTE)&dwRefCount, &cbData); if (SUCCEEDED(hr) && (0 == _wcsicmp(pszValueName, c_szOcSapRef))) { // Delete the value and exit the loop // hr = HrRegDeleteValue (hkeyRefCounts, pszValueName); break; } } RegCloseKey(hkeyRefCounts); } fDone = TRUE; } RegCloseKey(hkeyComponent); } cchBuffSize = _MAX_PATH; dwKeyIndex++; } if (HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS) == hr) { hr = S_OK; } RegCloseKey(hkeyProto); } return S_OK; } STDMETHODIMP CSAPCfg::Install ( DWORD dw) { Validate_INetCfgNotify_Install(dw); // Install IPX // HRESULT hr = HrInstallComponentOboComponent(m_pnc, NULL, GUID_DEVCLASS_NETTRANS, c_szInfId_MS_NWIPX, m_pncc, NULL); TraceError("CSAPCfg::Install", hr); return hr; } STDMETHODIMP CSAPCfg::Removing() { // Remove IPX // HRESULT hr = HrRemoveComponentOboComponent (m_pnc, GUID_DEVCLASS_NETTRANS, c_szInfId_MS_NWIPX, m_pncc); // Normalize the HRESULT. (NETCFG_S_STILL_REFERENCED or NETCFG_S_REBOOT // may have been returned.) if (SUCCEEDED(hr)) { hr = S_OK; } Validate_INetCfgNotify_Removing_Return (hr); TraceError ("CSAPCfg::Removing", hr); return hr; }