Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

257 lines
10 KiB

//+---------------------------------------------------------------------------
//
// 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---------------------------