407 lines
14 KiB
C
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;
|
||
|
}
|
||
|
};
|