258 lines
10 KiB
C++
258 lines
10 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 2000.
|
|
//
|
|
// File: I C S U P G R D . H
|
|
//
|
|
// Contents: Functions that is related to
|
|
// o upgrade of ICS from Win98 SE, WinMe and Win2K to Whistler
|
|
// o unattended clean install of Homenet on Whistler or later
|
|
//
|
|
//
|
|
// Date: 20-Sept-2000
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
#pragma once
|
|
|
|
// entry point to upgrade ICS
|
|
BOOL FDoIcsUpgradeIfNecessary();
|
|
BOOL FIcsUpgrade(CWInfFile* pwifAnswerFile);
|
|
|
|
//----------------------ICS Upgrade const literals begin------------------
|
|
// Win2K ICS registry settings
|
|
const TCHAR c_wszRegKeySharedAccessParams[] = L"SYSTEM\\CurrentControlSet\\Services\\SharedAccess\\Parameters";
|
|
const TCHAR c_wszRegValSharedConnection[] = L"SharedConnection";
|
|
const TCHAR c_wszRegValSharedPrivateLan[] = L"SharedPrivateLan";
|
|
const WCHAR c_wszRegValBackupSharedConnection[] = L"BackupSharedConnection";
|
|
const WCHAR c_wszRegValBackupSharedPrivateLan[] = L"BackupSharedPrivateLan";
|
|
|
|
// ICS Upgrade named event
|
|
const WCHAR c_wszIcsUpgradeEventName[] = L"IcsUpgradeEventName_";
|
|
|
|
// Win2K ICS Application and Server PortMapping stuff
|
|
const WCHAR c_wszPhoneBookPath[] = L"\\Microsoft\\Network\\Connections\\Pbk\\";
|
|
const WCHAR c_wszFileSharedAccess[] = L"SharedAccess.ini";
|
|
const WCHAR c_wszContentsServer[] = L"Contents.Server";
|
|
const WCHAR c_wszContentsApplication[] = L"Contents.Application";
|
|
const WCHAR c_wszServerPrefix[] = L"Server.";
|
|
const WCHAR c_wszApplicationPrefix[] = L"Application.";
|
|
const WCHAR c_wszInternalName[] = L"InternalName";
|
|
const WCHAR c_wszTitle[] = L"Title";
|
|
const WCHAR c_wszInternalPort[] = L"InternalPort";
|
|
const WCHAR c_wszPort[] = L"Port";
|
|
const WCHAR c_wszReservedAddress[] = L"ReservedAddress";
|
|
const WCHAR c_wszProtocol[] = L"Protocol";
|
|
const WCHAR c_wszBuiltIn[] = L"BuiltIn";
|
|
const WCHAR c_wszTcpResponseList[] = L"TcpResponseList";
|
|
const WCHAR c_wszUdpResponseList[] = L"UdpResponseList";
|
|
const WCHAR c_wszTCP[] = L"TCP";
|
|
const WCHAR c_wszUDP[] = L"UDP";
|
|
|
|
// Tcp/Ip registry configuration
|
|
const WCHAR c_wszEnableDHCP[] = L"EnableDHCP";
|
|
const WCHAR c_wszInterfaces[] = L"Interfaces";
|
|
const WCHAR c_wszIPAddress[] = L"IPAddress";
|
|
const WCHAR c_wszSubnetMask[] = L"SubnetMask";
|
|
const WCHAR c_wszTcpipParametersKey[] = L"SYSTEM\\CurrentControlSet\\Services"
|
|
L"\\Tcpip\\Parameters";
|
|
const WCHAR c_mszScopeAddress[] = L"192.168.0.1\0"; // multi_sz
|
|
const WCHAR c_mszScopeMask[] = L"255.255.255.0\0"; // multi_sz
|
|
|
|
// These are constant for Homenet Answer-File
|
|
const WCHAR c_wszHomenetSection[] = L"Homenet"; // section name
|
|
const WCHAR c_wszExternalAdapter[] = L"ExternalAdapter";
|
|
const WCHAR c_wszExternalConnectionName[] = L"ExternalConnectionName";
|
|
const WCHAR c_wszInternalAdapter[] = L"InternalAdapter";
|
|
const WCHAR c_wszInternalAdapter2[] = L"InternalAdapter2";
|
|
const WCHAR c_wszDialOnDemand[] = L"DialOnDemand";
|
|
const WCHAR c_wszICSEnabled[] = L"EnableICS";
|
|
const WCHAR c_wszShowTrayIcon[] = L"ShowTrayIcon";
|
|
const WCHAR c_wszInternalIsBridge[] = L"InternalIsBridge";
|
|
const WCHAR c_wszPersonalFirewall[] = L"InternetConnectionFirewall"; // multi_sz key
|
|
const WCHAR c_wszBridge[] = L"Bridge"; // multi_sz key
|
|
|
|
// keys which are not published
|
|
const WCHAR c_wszIsW9xUpgrade[] = L"IsW9xUpgrade";
|
|
|
|
// ShFolder.dll imports
|
|
const WCHAR c_wszShFolder[] = L"SHFOLDER.DLL";
|
|
const CHAR c_szSHGetFolderPathW[] = "SHGetFolderPathW";
|
|
// hnetcfg.dll imports
|
|
const WCHAR c_wszHNetCfgDll[] = L"hnetcfg.dll";
|
|
const CHAR c_szHNetSetShareAndBridgeSettings[] = "HNetSetShareAndBridgeSettings";
|
|
|
|
//--------- ICS Upgrade const literals end---------------------------
|
|
|
|
|
|
//--------- ICS Upgrade helpers begin---------------------------
|
|
#define HTONS(s) ((UCHAR)((s) >> 8) | ((UCHAR)(s) << 8))
|
|
#define HTONL(l) ((HTONS(l) << 16) | HTONS((l) >> 16))
|
|
#define NTOHS(s) HTONS(s)
|
|
#define NTOHL(l) HTONL(l)
|
|
|
|
// note: we are using the tstring from config\inc\ncstlstr.h
|
|
|
|
// Application Protocol
|
|
class CSharedAccessApplication
|
|
{
|
|
public:
|
|
tstring m_szTitle;
|
|
tstring m_szProtocol;
|
|
WORD m_wPort;
|
|
tstring m_szTcpResponseList;
|
|
tstring m_szUdpResponseList;
|
|
BOOL m_bBuiltIn;
|
|
BOOL m_bSelected;
|
|
DWORD m_dwSectionNum;
|
|
};
|
|
|
|
// Server PortMapping Protocol
|
|
class CSharedAccessServer
|
|
{
|
|
public:
|
|
CSharedAccessServer();
|
|
tstring m_szTitle;
|
|
tstring m_szProtocol;
|
|
WORD m_wPort;
|
|
WORD m_wInternalPort;
|
|
tstring m_szInternalName;
|
|
tstring m_szReservedAddress;
|
|
BOOL m_bBuiltIn;
|
|
BOOL m_bSelected;
|
|
DWORD m_dwSectionNum;
|
|
|
|
};
|
|
|
|
// ICS upgrade settings
|
|
typedef struct _ICS_UPGRADE_SETTINGS
|
|
{
|
|
RASSHARECONN rscExternal;
|
|
list<CSharedAccessServer> listSvrPortmappings;
|
|
list<CSharedAccessApplication> listAppPortmappings;
|
|
list<GUID> listPersonalFirewall; // a list of interface guid to be firewall
|
|
list<GUID> listBridge; // a list of interface guid to form a bridge
|
|
|
|
GUID guidInternal; // internal interface guid of ICS
|
|
BOOL fInternalAdapterFound; // guidInternal is valid
|
|
BOOL fInternalIsBridge; // ICS private is a bridge
|
|
|
|
BOOL fEnableICS; // ICS enabled
|
|
BOOL fShowTrayIcon;
|
|
BOOL fDialOnDemand;
|
|
|
|
// flag to tell this is an upgrade from Win9x
|
|
BOOL fWin9xUpgrade;
|
|
// flag to tell at least one of the internal adapters couldn't be upgraded
|
|
BOOL fWin9xUpgradeAtLeastOneInternalAdapterBroken;
|
|
// flag to tell this is an upgrade from Windows 2000
|
|
BOOL fWin2KUpgrade;
|
|
// flag to tell this is an unattended Homenet clean setup on XP or later
|
|
BOOL fXpUnattended;
|
|
} ICS_UPGRADE_SETTINGS, *PICS_UPGRADE_SETTINGS;
|
|
|
|
|
|
HRESULT GetPhonebookDirectory(TCHAR* pszPathBuf);
|
|
HRESULT GetServerMappings(list<CSharedAccessServer> &lstSharedAccessServers);
|
|
HRESULT GetApplicationMappings(list<CSharedAccessApplication> &lstSharedAccessApplications);
|
|
HRESULT PutResponseStringIntoArray(CSharedAccessApplication& rsaaAppProt,
|
|
USHORT* pdwcResponse, HNET_RESPONSE_RANGE** pphnrrResponseRange);
|
|
HRESULT BuildIcsUpgradeSettingsFromWin2K(ICS_UPGRADE_SETTINGS* pIcsUpgrdSettings);
|
|
HRESULT UpgradeIcsSettings(ICS_UPGRADE_SETTINGS * pIcsUpgrdSettings);
|
|
HRESULT BackupAndDelIcsRegistryValuesOnWin2k();
|
|
HRESULT LoadIcsSettingsFromAnswerFile(CWInfFile* pwifAnswerFile,
|
|
PICS_UPGRADE_SETTINGS pSettings);
|
|
HRESULT ConvertAdapterStringListToGuidList(IN TStringList& rslAdapters,
|
|
IN OUT list<GUID>& rlistGuid);
|
|
void FreeIcsUpgradeSettings(ICS_UPGRADE_SETTINGS* pIcsUpgrdSettings);
|
|
void SetIcsDefaultSettings(ICS_UPGRADE_SETTINGS * pSettings);
|
|
BOOL FNeedIcsUpgradeFromWin2K();
|
|
BOOL FOsIsAdvServerOrHigher();
|
|
|
|
|
|
extern HRESULT HNetCreateBridge(
|
|
IN INetConnection * rgspNetConns[],
|
|
OUT IHNetBridge ** ppBridge);
|
|
extern HRESULT HrEnablePersonalFirewall(
|
|
IN INetConnection * rgspNetConns[] );
|
|
extern HRESULT HrCreateICS(
|
|
IN INetConnection * pPublicConnection,
|
|
IN INetConnection * pPrivateConnection);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//--------- ICS Upgrade helpers end---------------------------
|
|
|
|
//--------- HNet helpers begin---------------------------
|
|
class CIcsUpgrade
|
|
{
|
|
public:
|
|
CIcsUpgrade() : m_pIcsUpgradeSettings(0), m_spEnum(0),
|
|
m_fInited(FALSE), m_fICSCreated(FALSE),
|
|
m_hIcsUpgradeEvent(NULL), m_pExternalNetConn(0) {};
|
|
~CIcsUpgrade() {FinalRelease();};
|
|
HRESULT Init(ICS_UPGRADE_SETTINGS* pIcsUpgradeSettings);
|
|
HRESULT StartUpgrade();
|
|
private:
|
|
// disallow copy constructor and assignment
|
|
CIcsUpgrade(CIcsUpgrade&);
|
|
CIcsUpgrade& operator=(CIcsUpgrade&);
|
|
|
|
void FinalRelease();
|
|
HRESULT SetupHomenetConnections();
|
|
HRESULT CIcsUpgrade::GetINetConnectionArray(
|
|
IN list<GUID>& rlistGuid,
|
|
IN OUT INetConnection*** pprgINetConn,
|
|
IN OUT DWORD* pcINetConn);
|
|
HRESULT GetExternalINetConnection(INetConnection** ppNetCon);
|
|
HRESULT GetINetConnectionByGuid(GUID* pGuid, INetConnection** ppNetCon);
|
|
HRESULT GetINetConnectionByName(WCHAR* pwszConnName, INetConnection** ppNetCon);
|
|
|
|
HRESULT SetupApplicationProtocol();
|
|
HRESULT SetupServerPortMapping();
|
|
HRESULT SetupIcsMiscItems();
|
|
|
|
HRESULT FindMatchingPortMappingProtocol(
|
|
IHNetProtocolSettings* pHNetProtocolSettings,
|
|
UCHAR ucProtocol,
|
|
USHORT usPort,
|
|
IHNetPortMappingProtocol** ppHNetPortMappingProtocol);
|
|
HRESULT FindMatchingApplicationProtocol(
|
|
IHNetProtocolSettings* pHNetProtocolSettings,
|
|
UCHAR ucProtocol,
|
|
USHORT usPort,
|
|
IHNetApplicationProtocol** ppHNetApplicationProtocol);
|
|
|
|
// named event to let HNetCfg know that we're in GUI Mode Setup
|
|
HRESULT CreateIcsUpgradeNamedEvent();
|
|
|
|
// methods to fix IP configuration of private interface on Win9x Upgrade
|
|
HRESULT SetPrivateIpConfiguration(IN GUID& rInterfaceGuid);
|
|
HRESULT GetBridgeGuid(OUT GUID& rInterfaceGuid);
|
|
HRESULT GetBridgeINetConn(OUT INetConnection** ppINetConn);
|
|
HRESULT OpenTcpipInterfaceKey(
|
|
IN GUID& rGuid,
|
|
OUT PHKEY phKey);
|
|
|
|
// upgrade settings
|
|
ICS_UPGRADE_SETTINGS* m_pIcsUpgradeSettings;
|
|
|
|
// Init() called
|
|
BOOL m_fInited;
|
|
|
|
BOOL m_fICSCreated; // succeeded in creating ICS.
|
|
|
|
// named event in GUI Mode setup,
|
|
// hnetcfg will check this to avoid any problems in GUI Mode Setup
|
|
HANDLE m_hIcsUpgradeEvent;
|
|
|
|
// cached HNet stuff
|
|
CComPtr<IEnumNetConnection> m_spEnum;
|
|
INetConnection* m_pExternalNetConn;
|
|
};
|
|
//--------- HNet helpers end---------------------------
|