223 lines
5.7 KiB
C++
223 lines
5.7 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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;
|
|
}
|