windows-nt/Source/XPSP1/NT/net/config/netcfg/tcpipcfg/tcpipobj.h
2020-09-26 16:20:57 +08:00

407 lines
14 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997.
//
// File: T C P I P O B J . H
//
// Contents: Declaration of CTcpipcfg and helper functions.
//
// Notes:
//
//
//----------------------------------------------------------------------------
#pragma once
#include <ncxbase.h>
#include <nceh.h>
#include <ncres.h>
#include <notifval.h>
#include "resource.h"
#include "tcpip.h"
#include "netconp.h"
extern "C"
{
#include "dhcpcapi.h"
};
/////////////////////////////////////////////////////////////////////////////
// Data types & Constants
struct REG_BACKUP_INFO
{
DWORD dwOptionId;
DWORD dwClassLen;
DWORD dwDataLen;
DWORD dwIsVendor;
DWORD dwExpiryTime;
DWORD dwData[1];
};
// when building the blob to be stored into the registry, the memory buffer
// that holds it is enlarged dynamically with chunks of the size below
// (for now, there are only 5 options of at most 2 dwords each - so prepare
// the chunk such that only one allocation is needed)
#define BUFFER_ENLARGEMENT_CHUNK 5*(sizeof(REG_BACKUP_INFO) + sizeof(DWORD))
// Max number of property sheet pages on tcpip's property sheet
static const INT c_cMaxTcpipPages = 6;
extern HICON g_hiconUpArrow;
extern HICON g_hiconDownArrow;
/////////////////////////////////////////////////////////////////////////////
// tcpipcfg
class ATL_NO_VTABLE CTcpipcfg :
public CComObjectRoot,
public CComCoClass<CTcpipcfg, &CLSID_CTcpipcfg>,
public INetCfgComponentControl,
public INetCfgComponentSetup,
public INetCfgComponentPropertyUi,
public INetCfgComponentNotifyBinding,
public INetCfgComponentUpperEdge,
public INetRasConnectionIpUiInfo,
public ITcpipProperties,
public INetCfgComponentSysPrep
{
public:
CTcpipcfg();
~CTcpipcfg() { FinalFree(); }
BEGIN_COM_MAP(CTcpipcfg)
COM_INTERFACE_ENTRY(INetCfgComponentControl)
COM_INTERFACE_ENTRY(INetCfgComponentSetup)
COM_INTERFACE_ENTRY(INetCfgComponentPropertyUi)
COM_INTERFACE_ENTRY(INetCfgComponentNotifyBinding)
COM_INTERFACE_ENTRY(INetCfgComponentUpperEdge)
COM_INTERFACE_ENTRY(INetRasConnectionIpUiInfo)
COM_INTERFACE_ENTRY(ITcpipProperties)
COM_INTERFACE_ENTRY(INetCfgComponentSysPrep)
END_COM_MAP()
// DECLARE_NOT_AGGREGATABLE(CTcpipcfg)
// Remove the comment from the line above if you don't want your object to
// support aggregation. The default is to support it
DECLARE_REGISTRY_RESOURCEID(IDR_REG_TCPIPCFG)
// INetCfgComponentControl
STDMETHOD (Initialize) (
IN INetCfgComponent* pIComp,
IN INetCfg* pINetCfg,
IN BOOL fInstalling);
STDMETHOD (ApplyRegistryChanges) ();
STDMETHOD (ApplyPnpChanges) (
IN INetCfgPnpReconfigCallback* pICallback);
STDMETHOD (CancelChanges) ();
STDMETHOD (Validate) ();
// INetCfgComponentSetup
STDMETHOD (Install) (DWORD dwSetupFlags);
STDMETHOD (Upgrade) (DWORD dwSetupFlags,
DWORD dwUpgradeFomBuildNo );
STDMETHOD (ReadAnswerFile) (PCWSTR pszAnswerFile,
PCWSTR pszAnswerSection);
STDMETHOD (Removing)();
// INetCfgProperties
STDMETHOD (QueryPropertyUi) (
IN IUnknown* pUnk) { return S_OK; }
STDMETHOD (SetContext) (
IN IUnknown* pUnk);
STDMETHOD (MergePropPages) (
IN OUT DWORD* pdwDefPages,
OUT LPBYTE* pahpspPrivate,
OUT UINT* pcPrivate,
IN HWND hwndParent,
OUT PCWSTR* pszStartPage);
STDMETHOD (ValidateProperties) (
HWND hwndSheet);
STDMETHOD (CancelProperties) ();
STDMETHOD (ApplyProperties) ();
// INetCfgNotifyBinding
STDMETHOD (QueryBindingPath) (DWORD dwChangeFlag, INetCfgBindingPath* pncbp);
STDMETHOD (NotifyBindingPath) (DWORD dwChangeFlag, INetCfgBindingPath* pncbp);
// INetCfgComponentUpperEdge
STDMETHOD (GetInterfaceIdsForAdapter) (
INetCfgComponent* pAdapter,
DWORD* pdwNumInterfaces,
GUID** ppguidInterfaceIds);
STDMETHOD (AddInterfacesToAdapter) (
INetCfgComponent* pAdapter,
DWORD dwNumInterfaces);
STDMETHOD (RemoveInterfacesFromAdapter) (
INetCfgComponent* pAdapter,
DWORD dwNumInterfaces,
const GUID* pguidInterfaceIds);
// INetRasConnectionIpUiInfo
STDMETHOD (GetUiInfo) (RASCON_IPUI* pInfo);
// ITcpipProperties
STDMETHOD (GetIpInfoForAdapter) (const GUID* pguidAdapter,
REMOTE_IPINFO** ppInfo);
STDMETHOD (SetIpInfoForAdapter) (const GUID* pguidAdapter,
REMOTE_IPINFO* pInfo);
// INetCfgComponentSysPrep
STDMETHOD (SaveAdapterParameters) (
INetCfgSysPrep* pncsp,
LPCWSTR pszwAnswerSections,
GUID* pAdapterInstanceGuid);
STDMETHOD (RestoreAdapterParameters) (
LPCWSTR pszwAnswerFile,
LPCWSTR pszwAnswerSection,
GUID* pAdapterInstanceGuid);
public:
GLOBAL_INFO m_glbSecondMemoryGlobalInfo;
// Place to keep pointer to INetCfg from Initialize
INetCfg * m_pnc;
// Place to keep the pointer to context
IUnknown * m_pUnkContext;
// Access methods to second memory state
const GLOBAL_INFO * GetConstGlobalInfo() { return &m_glbSecondMemoryGlobalInfo; };
GLOBAL_INFO * GetGlobalInfo() { return &m_glbSecondMemoryGlobalInfo; };
const VCARD * GetConstAdapterInfoVector() { return &m_vcardAdapterInfo; };
void SetReconfig() { m_fReconfig = TRUE; };
void SetSecondMemoryLmhostsFileReset() { m_fSecondMemoryLmhostsFileReset = TRUE; };
BOOL FIsSecondMemoryLmhostsFileReset() { return m_fSecondMemoryLmhostsFileReset; }
//IPSec is removed from connection UI
// void SetSecondMemoryIpsecPolicySet() { m_fSecondMemoryIpsecPolicySet = TRUE; };
void SetSecondMemoryModified() { m_fSecondMemoryModified = TRUE; };
private:
GLOBAL_INFO m_glbGlobalInfo;
VCARD m_vcardAdapterInfo;
ADAPTER_INFO* m_pSecondMemoryAdapterInfo;
VSTR m_vstrBindOrder;
class CTcpAddrPage* m_ipaddr;
INetCfgComponent* m_pnccTcpip;
INetCfgComponentPrivate* m_pTcpipPrivate;
INetCfgComponent* m_pnccWins;
tstring m_strDnsServerList;
tstring m_strUpgradeGlobalDnsDomain;
// Connection type
ConnectionType m_ConnType;
GUID m_guidCurrentConnection;
BOOL m_fSaveRegistry : 1;
BOOL m_fRemoving : 1;
BOOL m_fInstalling : 1;
BOOL m_fUpgradeCleanupDnsKey : 1;
BOOL m_fUpgradeGlobalDnsDomain : 1;
// whether reconfig notification should be sent
BOOL m_fReconfig : 1; // Call SendHandlePnpEvent
// Is there any bound physical card on Initialize
// This is needed for Add/Remove LmHosts service
// at apply time
BOOL m_fHasBoundCardOnInit : 1;
BOOL m_fLmhostsFileSet : 1;
BOOL m_fSecondMemoryLmhostsFileReset : 1;
BOOL m_fSecondMemoryModified : 1;
//IPSec is removed from connection UI
//BOOL m_fIpsecPolicySet : 1;
//BOOL m_fSecondMemoryIpsecPolicySet : 1;
// Fix 406630: Only used for RAS connection to identify whether the USER has
// write access to Global settings
BOOL m_fRasNotAdmin : 1;
private:
void FinalFree();
void ExitProperties();
BOOL FHasBoundCard();
ADAPTER_INFO* PAdapterFromInstanceGuid (const GUID* pGuid);
ADAPTER_INFO* PAdapterFromNetcfgComponent (INetCfgComponent* pncc);
HRESULT HrProcessAnswerFile(PCWSTR pszAnswerFile,
PCWSTR pszAnswerSection);
HRESULT HrLoadGlobalParamFromAnswerFile(HINF hinf,
PCWSTR pszAnswerSection);
HRESULT HrLoadAdapterParameterFromAnswerFile(HINF hinf,
PCWSTR mszAdapterList);
// Set router related parameters at install time
// HRESULT HrInitRouterParamsAtInstall();
// Initialize first in memory state
HRESULT HrGetNetCards();
// Load adapterinfo for bound cards from first memory to second memory
HRESULT HrLoadAdapterInfo();
// Save adapterinfo from second memory to first memory
HRESULT HrSaveAdapterInfo();
// Set connection context
HRESULT HrSetConnectionContext();
// Allocate and deallocate property pages
HRESULT HrSetupPropSheets(HPROPSHEETPAGE **pahpsp, INT *cPages);
VOID CleanupPropPages(VOID);
// Handle Add/Remove/Enable/Disable adapters on BindingPathNotify
HRESULT HrAdapterBindNotify(INetCfgComponent *pnccNetCard,
DWORD dwChangeFlag,
PCWSTR szInterfaceName);
HRESULT HrAddCard(INetCfgComponent * pnccNetCard,
PCWSTR szNetCardTcpipBindPath,
PCWSTR szInterfaceName);
HRESULT HrDeleteCard(const GUID* pguid);
HRESULT HrBindCard (const GUID* pguid, BOOL fInitialize = FALSE);
HRESULT HrUnBindCard(const GUID* pguid, BOOL fInitialize = FALSE);
// Help functions to interface methods
HRESULT MarkNewlyAddedCards(const HKEY hkeyTcpipParam);
HRESULT HrGetListOfAddedNdisWanCards(const HKEY hkeyTcpipParam,
VSTR * const pvstrAddedNdisWanCards);
HRESULT HrLoadSettings();
HRESULT HrLoadTcpipRegistry(const HKEY hkeyTcpipParam);
HRESULT HrLoadWinsRegistry(const HKEY hkeyWinsParam);
HRESULT HrSaveSettings();
HRESULT HrSaveTcpipRegistry(const HKEY hkeyTcpipParam);
HRESULT HrSaveMultipleInterfaceWanRegistry(const HKEY hkeyInterfaces, ADAPTER_INFO* pAdapter);
HRESULT HrSaveWinsMultipleInterfaceWanRegistry(const HKEY hkeyInterfaces, ADAPTER_INFO* pAdapter);
HRESULT HrSaveWinsRegistry(const HKEY hkeyWinsParam);
HRESULT HrSetMisc(const HKEY hkeyTcpipParam, const HKEY hkeyWinsParam);
HRESULT HrGetDhcpOptions(OUT VSTR * const GlobalOptions,
OUT VSTR * const PerAdapterOptions);
HRESULT HrSaveStaticWanRegistry(HKEY hkeyInterfaceParam);
HRESULT HrSaveStaticAtmRegistry(HKEY hkeyInterfaceParam);
// Dhcp functions
HRESULT HrNotifyDhcp();
HRESULT HrCallDhcpConfig(PWSTR ServerName,
PWSTR AdapterName,
GUID & guidAdapter,
BOOL IsNewIpAddress,
DWORD IpIndex,
DWORD IpAddress,
DWORD SubnetMask,
SERVICE_ENABLE DhcpServiceEnabled);
HRESULT HrCallDhcpHandlePnPEvent(ADAPTER_INFO * pAdapterInfo,
LPDHCP_PNP_CHANGE pDhcpPnpChange);
HRESULT HrDhcpRefreshFallbackParams(ADAPTER_INFO * pAdapterInfo);
// Call SendNdisHandlePnpEvent to notify tcpip and netbt of
// parameter changes
HRESULT HrReconfigAtmArp(ADAPTER_INFO* pAdapterInfo,
INetCfgPnpReconfigCallback* pICallback);
HRESULT HrReconfigDns(BOOL fDoReconfigWithoutCheckingParams = FALSE);
HRESULT HrReconfigIp(INetCfgPnpReconfigCallback* pICallback);
HRESULT HrReconfigNbt(INetCfgPnpReconfigCallback* pICallback);
HRESULT HrReconfigWanarp(ADAPTER_INFO* pAdapterInfo,
INetCfgPnpReconfigCallback* pICallback);
//IPSec is removed from connection UI
// HRESULT HrSetActiveIpsecPolicy();
//Some tcpip params are duplicated to the old Nt4 location to solve compatibility issues.
HRESULT HrDuplicateToNT4Location(HKEY hkeyInterface, ADAPTER_INFO * pAdapter);
//We need to clean it up when removing tcpip
HRESULT HrRemoveNt4DuplicateRegistry();
// Reinitialize internal state if Apply or Cancel is called
void ReInitializeInternalState();
// Upgrade registry in post pnp checkin cases
HRESULT HrUpgradePostPnpRegKeyChange();
// Add a new RAS fake GUID if the one set in context is not yet added.
HRESULT UpdateRasAdapterInfo(
const RASCON_IPUI& RasInfo);
HRESULT HrLoadBindingOrder(VSTR *pvstrBindOrder);
BOOL IsBindOrderChanged();
HRESULT HrCleanUpPerformRouterDiscoveryFromRegistry();
// Loads Fallback configuration from registry
HRESULT HrLoadBackupTcpSettings(HKEY hkeyInterfaceParam, ADAPTER_INFO * pAdapter);
// Loads one option from the registry blob into the BACKUP_CFG_INFO structure
HRESULT HrLoadBackupOption(REG_BACKUP_INFO *pOption, BACKUP_CFG_INFO *pBackupInfo);
// Saves Fallback configuration to registry
HRESULT HrSaveBackupTcpSettings(HKEY hkeyInterfaceParam, ADAPTER_INFO * pAdapter);
// Appends one option to the blob to be written into the registry
HRESULT HrSaveBackupDwordOption (
DWORD Option,
DWORD OptionData[],
DWORD OptionDataSz,
LPBYTE *ppBuffer,
LPDWORD pdwBlobSz,
LPDWORD pdwBufferSz);
HRESULT HrDeleteBackupSettingsInDhcp(LPCWSTR wszAdapterName);
HRESULT HrOpenTcpipInterfaceKey(
const GUID & guidInterface,
HKEY * phKey,
REGSAM sam);
HRESULT HrOpenNetBtInterfaceKey(
const GUID & guidInterface,
HKEY * phKey,
REGSAM sam);
HRESULT HrSetSecurityForNetConfigOpsOnSubkeys(HKEY hkeyRoot, LPCWSTR strKeyName);
public:
ADAPTER_INFO * GetConnectionAdapterInfo()
{
return m_pSecondMemoryAdapterInfo;
};
ConnectionType GetConnectionType()
{
return m_ConnType;
};
BOOL IsRasNotAdmin()
{
return m_fRasNotAdmin;
}
};