//+--------------------------------------------------------------------------- // // 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 #include #include #include #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, 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; BOOL m_fNoPopupsDuringPnp : 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); HRESULT HrSetSecurityForNetSvcOnSubkeys(HKEY hkeyRoot, LPCWSTR strKeyName); HRESULT HrUpdateNt4RegistryPermission(); public: ADAPTER_INFO * GetConnectionAdapterInfo() { return m_pSecondMemoryAdapterInfo; }; ConnectionType GetConnectionType() { return m_ConnType; }; BOOL IsRasNotAdmin() { return m_fRasNotAdmin; } };