Leaked source code of windows server 2003
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.

546 lines
17 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1997.
  5. //
  6. // File: T C P I P . C P P
  7. //
  8. // Contents: Tcpip config memory structure member functions
  9. //
  10. // Notes:
  11. //
  12. // Author: tongl 13 Nov, 1997
  13. //
  14. //----------------------------------------------------------------------------
  15. #include "pch.h"
  16. #pragma hdrstop
  17. #define _PNP_POWER_
  18. #include "ntddip.h"
  19. #undef _PNP_POWER_
  20. #include "ncstl.h"
  21. #include "tcpip.h"
  22. #include "tcpconst.h"
  23. #include "ncmisc.h"
  24. void CopyVstr(VSTR * vstrDest, const VSTR & vstrSrc)
  25. {
  26. FreeCollectionAndItem(*vstrDest);
  27. vstrDest->reserve(vstrSrc.size());
  28. for(VSTR_CONST_ITER iter = vstrSrc.begin(); iter != vstrSrc.end(); ++iter)
  29. vstrDest->push_back(new tstring(**iter));
  30. }
  31. //+---------------------------------------------------------------------------
  32. //
  33. // Name: ADAPTER_INFO::~ADAPTER_INFO
  34. //
  35. // Purpose: Destructor
  36. //
  37. // Arguments:
  38. // Returns:
  39. //
  40. // Author: tongl 11 Nov, 1997
  41. //
  42. ADAPTER_INFO::~ADAPTER_INFO()
  43. {
  44. FreeCollectionAndItem(m_vstrIpAddresses);
  45. FreeCollectionAndItem(m_vstrOldIpAddresses);
  46. FreeCollectionAndItem(m_vstrSubnetMask);
  47. FreeCollectionAndItem(m_vstrOldSubnetMask);
  48. FreeCollectionAndItem(m_vstrDefaultGateway);
  49. FreeCollectionAndItem(m_vstrOldDefaultGateway);
  50. FreeCollectionAndItem(m_vstrDefaultGatewayMetric);
  51. FreeCollectionAndItem(m_vstrOldDefaultGatewayMetric);
  52. FreeCollectionAndItem(m_vstrDnsServerList);
  53. FreeCollectionAndItem(m_vstrOldDnsServerList);
  54. FreeCollectionAndItem(m_vstrWinsServerList);
  55. FreeCollectionAndItem(m_vstrOldWinsServerList);
  56. FreeCollectionAndItem(m_vstrARPServerList);
  57. FreeCollectionAndItem(m_vstrOldARPServerList);
  58. FreeCollectionAndItem(m_vstrMARServerList);
  59. FreeCollectionAndItem(m_vstrOldMARServerList);
  60. FreeCollectionAndItem(m_vstrTcpFilterList);
  61. FreeCollectionAndItem(m_vstrOldTcpFilterList);
  62. FreeCollectionAndItem(m_vstrUdpFilterList);
  63. FreeCollectionAndItem(m_vstrOldUdpFilterList);
  64. FreeCollectionAndItem(m_vstrIpFilterList);
  65. FreeCollectionAndItem(m_vstrOldIpFilterList);
  66. }
  67. //+---------------------------------------------------------------------------
  68. //
  69. // Name: ADAPTER_INFO::HrSetDefaults
  70. //
  71. // Purpose: Function to set all the default values of the ADAPTER_INFO
  72. // structure. This is done whenever a new netcard is added
  73. // to the list of netcards before any real information is
  74. // added to the structure so that any missing parameters
  75. // are defaulted
  76. //
  77. // Arguments: pguidInstanceId
  78. // pszNetCardDescription
  79. // pszNetCardBindName
  80. // pszNetCardTcpipBindPath
  81. // Returns:
  82. //
  83. // Author: tongl 11 Nov, 1997
  84. //
  85. HRESULT ADAPTER_INFO::HrSetDefaults(const GUID* pguidInstanceId,
  86. PCWSTR pszNetCardDescription,
  87. PCWSTR pszNetCardBindName,
  88. PCWSTR pszNetCardTcpipBindPath )
  89. {
  90. Assert (pguidInstanceId);
  91. m_BackupInfo.m_fAutoNet = TRUE;
  92. m_BackupInfo.m_strIpAddr = c_szEmpty;
  93. m_BackupInfo.m_strSubnetMask = c_szEmpty;
  94. m_BackupInfo.m_strPreferredDns = c_szEmpty;
  95. m_BackupInfo.m_strAlternateDns = c_szEmpty;
  96. m_BackupInfo.m_strPreferredWins = c_szEmpty;
  97. m_BackupInfo.m_strAlternateWins = c_szEmpty;
  98. m_BindingState = BINDING_UNSET;
  99. m_InitialBindingState= BINDING_UNSET;
  100. m_guidInstanceId = *pguidInstanceId;
  101. m_strBindName = pszNetCardBindName;
  102. m_strTcpipBindPath = pszNetCardTcpipBindPath;
  103. m_strDescription = pszNetCardDescription;
  104. // Create the "Services\NetBt\Adapters\<netcard bind path>" key
  105. // $REVIEW Since we don't have a
  106. // notification object for NetBt and NetBt has just been changed
  107. // to bind to Tcpip. For first checkin we hard code the netcard's
  108. // bindpath to be "Tcpip_"+<Bind path to Tcpip>
  109. m_strNetBtBindPath = c_szTcpip_;
  110. m_strNetBtBindPath += m_strTcpipBindPath;
  111. // $REVIEW(tongl 5/17): behaviour change: enable Dhcp is now the default
  112. m_fEnableDhcp = TRUE;
  113. m_fOldEnableDhcp = TRUE;
  114. FreeCollectionAndItem(m_vstrIpAddresses);
  115. FreeCollectionAndItem(m_vstrOldIpAddresses);
  116. FreeCollectionAndItem(m_vstrSubnetMask);
  117. FreeCollectionAndItem(m_vstrOldSubnetMask);
  118. FreeCollectionAndItem(m_vstrDefaultGateway);
  119. FreeCollectionAndItem(m_vstrOldDefaultGateway);
  120. FreeCollectionAndItem(m_vstrDefaultGatewayMetric);
  121. FreeCollectionAndItem(m_vstrOldDefaultGatewayMetric);
  122. m_strDnsDomain = c_szEmpty;
  123. m_strOldDnsDomain = c_szEmpty;
  124. m_fDisableDynamicUpdate = FALSE;
  125. m_fOldDisableDynamicUpdate = FALSE;
  126. m_fEnableNameRegistration = FALSE;
  127. m_fOldEnableNameRegistration = FALSE;
  128. FreeCollectionAndItem(m_vstrDnsServerList);
  129. FreeCollectionAndItem(m_vstrOldDnsServerList);
  130. FreeCollectionAndItem(m_vstrWinsServerList);
  131. FreeCollectionAndItem(m_vstrOldWinsServerList);
  132. m_dwNetbiosOptions = c_dwUnsetNetbios;
  133. m_dwOldNetbiosOptions = c_dwUnsetNetbios;
  134. m_dwInterfaceMetric = c_dwDefaultIfMetric;
  135. m_dwOldInterfaceMetric = c_dwDefaultIfMetric;
  136. // Filtering list
  137. FreeCollectionAndItem(m_vstrTcpFilterList);
  138. m_vstrTcpFilterList.push_back(new tstring(c_szDisableFiltering));
  139. FreeCollectionAndItem(m_vstrOldTcpFilterList);
  140. m_vstrOldTcpFilterList.push_back(new tstring(c_szDisableFiltering));
  141. FreeCollectionAndItem(m_vstrUdpFilterList);
  142. m_vstrUdpFilterList.push_back(new tstring(c_szDisableFiltering));
  143. FreeCollectionAndItem(m_vstrOldUdpFilterList);
  144. m_vstrOldUdpFilterList.push_back(new tstring(c_szDisableFiltering));
  145. FreeCollectionAndItem(m_vstrIpFilterList);
  146. m_vstrIpFilterList.push_back(new tstring(c_szDisableFiltering));
  147. FreeCollectionAndItem(m_vstrOldIpFilterList);
  148. m_vstrOldIpFilterList.push_back(new tstring(c_szDisableFiltering));
  149. // list of ARP server addresses
  150. FreeCollectionAndItem(m_vstrARPServerList);
  151. m_vstrARPServerList.push_back(new tstring(c_szDefaultAtmArpServer));
  152. FreeCollectionAndItem(m_vstrOldARPServerList);
  153. m_vstrOldARPServerList.push_back(new tstring(c_szDefaultAtmArpServer));
  154. // list of MAR server addresses
  155. FreeCollectionAndItem(m_vstrMARServerList);
  156. m_vstrMARServerList.push_back(new tstring(c_szDefaultAtmMarServer));
  157. FreeCollectionAndItem(m_vstrOldMARServerList);
  158. m_vstrOldMARServerList.push_back(new tstring(c_szDefaultAtmMarServer));
  159. // default is no support for mulitiple interfaces
  160. m_fIsMultipleIfaceMode = FALSE;
  161. m_IfaceIds.clear ();
  162. m_fBackUpSettingChanged = FALSE;
  163. // MTU
  164. m_dwMTU = c_dwDefaultAtmMTU;
  165. m_dwOldMTU = c_dwDefaultAtmMTU;
  166. // PVC only
  167. m_fPVCOnly = FALSE;
  168. m_fOldPVCOnly = FALSE;
  169. // RAS connection special parameters
  170. m_fUseRemoteGateway = TRUE;
  171. m_fUseIPHeaderCompression = TRUE;
  172. m_dwFrameSize = 1006;
  173. m_fIsDemandDialInterface = FALSE;
  174. // Set all special flags to FALSE
  175. m_fIsFromAnswerFile = FALSE;
  176. m_fIsAtmAdapter = FALSE;
  177. m_fIsWanAdapter = FALSE;
  178. m_fIs1394Adapter = FALSE;
  179. m_fIsRasFakeAdapter = FALSE;
  180. m_fDeleted = FALSE;
  181. m_fNewlyChanged = FALSE;
  182. return S_OK;
  183. }
  184. //+---------------------------------------------------------------------------
  185. //
  186. // Name: ADAPTER_INFO & ADAPTER_INFO::operator=
  187. //
  188. // Purpose: Copy operator
  189. //
  190. // Arguments:
  191. // Returns:
  192. //
  193. // Author: tongl 11 Nov, 1997
  194. //
  195. ADAPTER_INFO & ADAPTER_INFO::operator=(const ADAPTER_INFO & info)
  196. {
  197. Assert(this != &info);
  198. if (this == &info)
  199. return *this;
  200. m_BackupInfo = info.m_BackupInfo;
  201. m_BindingState = info.m_BindingState;
  202. m_InitialBindingState = info.m_InitialBindingState;
  203. m_guidInstanceId = info.m_guidInstanceId;
  204. m_strDescription = info.m_strDescription;
  205. m_strBindName = info.m_strBindName;
  206. m_strTcpipBindPath = info.m_strTcpipBindPath;
  207. m_strNetBtBindPath = info.m_strNetBtBindPath;
  208. m_fEnableDhcp = info.m_fEnableDhcp;
  209. m_fOldEnableDhcp = info.m_fOldEnableDhcp;
  210. CopyVstr(&m_vstrIpAddresses, info.m_vstrIpAddresses);
  211. CopyVstr(&m_vstrOldIpAddresses, info.m_vstrOldIpAddresses);
  212. CopyVstr(&m_vstrSubnetMask, info.m_vstrSubnetMask);
  213. CopyVstr(&m_vstrOldSubnetMask, info.m_vstrOldSubnetMask);
  214. CopyVstr(&m_vstrDefaultGateway, info.m_vstrDefaultGateway);
  215. CopyVstr(&m_vstrOldDefaultGateway, info.m_vstrOldDefaultGateway);
  216. CopyVstr(&m_vstrDefaultGatewayMetric, info.m_vstrDefaultGatewayMetric);
  217. CopyVstr(&m_vstrOldDefaultGatewayMetric, info.m_vstrOldDefaultGatewayMetric);
  218. m_strDnsDomain = info.m_strDnsDomain;
  219. m_strOldDnsDomain = info.m_strOldDnsDomain;
  220. m_fDisableDynamicUpdate = info.m_fDisableDynamicUpdate;
  221. m_fOldDisableDynamicUpdate = info.m_fOldDisableDynamicUpdate;
  222. m_fEnableNameRegistration = info.m_fEnableNameRegistration;
  223. m_fOldEnableNameRegistration = info.m_fOldEnableNameRegistration;
  224. CopyVstr(&m_vstrDnsServerList, info.m_vstrDnsServerList);
  225. CopyVstr(&m_vstrOldDnsServerList, info.m_vstrOldDnsServerList);
  226. CopyVstr(&m_vstrWinsServerList, info.m_vstrWinsServerList);
  227. CopyVstr(&m_vstrOldWinsServerList, info.m_vstrOldWinsServerList);
  228. m_dwNetbiosOptions = info.m_dwNetbiosOptions;
  229. m_dwOldNetbiosOptions = info.m_dwOldNetbiosOptions;
  230. m_dwInterfaceMetric = info.m_dwInterfaceMetric;
  231. m_dwOldInterfaceMetric = info.m_dwOldInterfaceMetric;
  232. CopyVstr(&m_vstrTcpFilterList, info.m_vstrTcpFilterList);
  233. CopyVstr(&m_vstrOldTcpFilterList, info.m_vstrOldTcpFilterList);
  234. CopyVstr(&m_vstrUdpFilterList, info.m_vstrUdpFilterList);
  235. CopyVstr(&m_vstrOldUdpFilterList, info.m_vstrOldUdpFilterList);
  236. CopyVstr(&m_vstrIpFilterList, info.m_vstrIpFilterList);
  237. CopyVstr(&m_vstrOldIpFilterList, info.m_vstrOldIpFilterList);
  238. m_fIsAtmAdapter = info.m_fIsAtmAdapter;
  239. if (m_fIsAtmAdapter)
  240. {
  241. CopyVstr(&m_vstrARPServerList, info.m_vstrARPServerList);
  242. CopyVstr(&m_vstrOldARPServerList, info.m_vstrOldARPServerList);
  243. CopyVstr(&m_vstrMARServerList, info.m_vstrMARServerList);
  244. CopyVstr(&m_vstrOldMARServerList, info.m_vstrOldMARServerList);
  245. m_dwMTU = info.m_dwMTU;
  246. m_dwOldMTU = info.m_dwOldMTU;
  247. m_fPVCOnly = info.m_fPVCOnly;
  248. m_fOldPVCOnly = info.m_fOldPVCOnly;
  249. }
  250. m_fIs1394Adapter = info.m_fIs1394Adapter;
  251. if (m_fIs1394Adapter)
  252. {
  253. // TODO currently no thing more to copy.
  254. }
  255. m_fIsRasFakeAdapter = info.m_fIsRasFakeAdapter;
  256. if (m_fIsRasFakeAdapter)
  257. {
  258. m_fUseRemoteGateway = info.m_fUseRemoteGateway;
  259. m_fUseIPHeaderCompression = info.m_fUseIPHeaderCompression;
  260. m_dwFrameSize = info.m_dwFrameSize;
  261. m_fIsDemandDialInterface = info.m_fIsDemandDialInterface;
  262. }
  263. m_fNewlyChanged = info.m_fNewlyChanged;
  264. m_fBackUpSettingChanged = info.m_fBackUpSettingChanged;
  265. return *this;
  266. }
  267. //+---------------------------------------------------------------------------
  268. //
  269. // Name: ADAPTER_INFO::ResetOldValues
  270. //
  271. // Purpose: This is for initializing the "old" values after the current values
  272. // are first loaded from registry, also for resetting the "old" values
  273. // to current ones when "Apply"(instead of "ok") is hit.
  274. //
  275. // Arguments:
  276. // Returns:
  277. //
  278. // Author: tongl 11 Nov, 1997
  279. //
  280. void ADAPTER_INFO::ResetOldValues()
  281. {
  282. m_fOldEnableDhcp = m_fEnableDhcp ;
  283. CopyVstr(&m_vstrOldIpAddresses, m_vstrIpAddresses);
  284. CopyVstr(&m_vstrOldSubnetMask, m_vstrSubnetMask);
  285. CopyVstr(&m_vstrOldDefaultGateway, m_vstrDefaultGateway);
  286. CopyVstr(&m_vstrOldDefaultGatewayMetric, m_vstrDefaultGatewayMetric);
  287. m_strOldDnsDomain = m_strDnsDomain;
  288. m_fOldDisableDynamicUpdate = m_fDisableDynamicUpdate;
  289. m_fOldEnableNameRegistration = m_fEnableNameRegistration;
  290. CopyVstr(&m_vstrOldDnsServerList, m_vstrDnsServerList);
  291. CopyVstr(&m_vstrOldWinsServerList, m_vstrWinsServerList);
  292. m_dwOldNetbiosOptions = m_dwNetbiosOptions;
  293. m_dwOldInterfaceMetric = m_dwInterfaceMetric;
  294. CopyVstr(&m_vstrOldTcpFilterList, m_vstrTcpFilterList);
  295. CopyVstr(&m_vstrOldUdpFilterList, m_vstrUdpFilterList);
  296. CopyVstr(&m_vstrOldIpFilterList, m_vstrIpFilterList);
  297. if (m_fIsAtmAdapter)
  298. {
  299. CopyVstr(&m_vstrOldARPServerList, m_vstrARPServerList);
  300. CopyVstr(&m_vstrOldMARServerList, m_vstrMARServerList);
  301. m_dwOldMTU = m_dwMTU;
  302. m_fOldPVCOnly = m_fPVCOnly;
  303. }
  304. }
  305. //+---------------------------------------------------------------------------
  306. //
  307. // Name: GLOBAL_INFO::~GLOBAL_INFO
  308. //
  309. // Purpose: Destructor
  310. //
  311. // Arguments:
  312. // Returns:
  313. //
  314. // Author: tongl 11 Nov, 1997
  315. //
  316. GLOBAL_INFO::~GLOBAL_INFO()
  317. {
  318. FreeCollectionAndItem(m_vstrDnsSuffixList);
  319. FreeCollectionAndItem(m_vstrOldDnsSuffixList);
  320. }
  321. //+---------------------------------------------------------------------------
  322. //
  323. // Name: GLOBAL_INFO::HrSetDefaults
  324. //
  325. // Purpose: Function to set all the default values of the GLOBAL_INFO
  326. // structure. This is done to the system's GLOBAL_INFO
  327. // before reading the Registry so that any missing
  328. // parameters are defaulted
  329. //
  330. // Arguments:
  331. // Returns:
  332. //
  333. // Author: tongl 11 Nov, 1997
  334. //
  335. HRESULT GLOBAL_INFO::HrSetDefaults()
  336. {
  337. HRESULT hr = S_OK;
  338. // Get the ComputerName -> used for default HostName
  339. WCHAR szComputerName [MAX_COMPUTERNAME_LENGTH + 1];
  340. szComputerName[0] = L'\0';
  341. DWORD dwCch = celems(szComputerName);
  342. BOOL fOk = ::GetComputerName(szComputerName, &dwCch);
  343. Assert(szComputerName[dwCch] == 0);
  344. //
  345. // 398325: DNS hostnames should be lower case whenever possible.
  346. //
  347. LowerCaseComputerName(szComputerName);
  348. m_strHostName = szComputerName;
  349. // Set defaults
  350. FreeCollectionAndItem(m_vstrDnsSuffixList);
  351. FreeCollectionAndItem(m_vstrOldDnsSuffixList);
  352. //Bug #265732: per SKwan, the default of m_fUseDomainNameDevolution should be TRUE
  353. m_fUseDomainNameDevolution = TRUE;
  354. m_fOldUseDomainNameDevolution = TRUE;
  355. m_fEnableLmHosts = TRUE;
  356. m_fOldEnableLmHosts = TRUE;
  357. m_fEnableRouter = FALSE;
  358. m_fEnableIcmpRedirect = TRUE;
  359. m_fDeadGWDetectDefault = TRUE;
  360. m_fDontAddDefaultGatewayDefault = FALSE;
  361. m_fEnableFiltering = FALSE;
  362. m_fOldEnableFiltering = FALSE;
  363. //IPSec is removed from connection UI
  364. //m_strIpsecPol = c_szIpsecUnset;
  365. return hr;
  366. }
  367. //+---------------------------------------------------------------------------
  368. //
  369. // Name: GLOBAL_INFO::operator=
  370. //
  371. // Purpose: Copy operator
  372. //
  373. // Arguments:
  374. // Returns:
  375. //
  376. // Author: tongl 11 Nov, 1997
  377. //
  378. GLOBAL_INFO& GLOBAL_INFO::operator=(GLOBAL_INFO& info)
  379. {
  380. Assert(this != &info);
  381. if (this == &info)
  382. return *this;
  383. CopyVstr(&m_vstrDnsSuffixList, info.m_vstrDnsSuffixList);
  384. CopyVstr(&m_vstrOldDnsSuffixList, info.m_vstrOldDnsSuffixList);
  385. m_fUseDomainNameDevolution = info.m_fUseDomainNameDevolution;
  386. m_fOldUseDomainNameDevolution = info.m_fOldUseDomainNameDevolution;
  387. m_fEnableLmHosts = info.m_fEnableLmHosts;
  388. m_fOldEnableLmHosts = info.m_fOldEnableLmHosts;
  389. m_fEnableRouter = info.m_fEnableRouter;
  390. m_fEnableIcmpRedirect = info.m_fEnableIcmpRedirect;
  391. m_fDeadGWDetectDefault = info.m_fDeadGWDetectDefault;
  392. m_fDontAddDefaultGatewayDefault = info.m_fDontAddDefaultGatewayDefault;
  393. m_fEnableFiltering = info.m_fEnableFiltering;
  394. m_fOldEnableFiltering = info.m_fOldEnableFiltering;
  395. //IPSec is removed from connection UI
  396. /*
  397. m_guidIpsecPol = info.m_guidIpsecPol;
  398. m_strIpsecPol = info.m_strIpsecPol;
  399. */
  400. return *this;
  401. }
  402. //+---------------------------------------------------------------------------
  403. //
  404. // Name: GLOBAL_INFO::ResetOldValues()
  405. //
  406. // Purpose: This is for initializing the "old" values after the current values
  407. // are first loaded from registry, also for resetting the "old" values
  408. // to current ones when "Apply"(instead of "ok") is hit.
  409. //
  410. // Arguments:
  411. // Returns:
  412. //
  413. // Author: tongl 11 Nov, 1997
  414. //
  415. void GLOBAL_INFO::ResetOldValues()
  416. {
  417. CopyVstr(&m_vstrOldDnsSuffixList, m_vstrDnsSuffixList);
  418. m_fOldEnableLmHosts = m_fEnableLmHosts;
  419. m_fOldEnableFiltering = m_fEnableFiltering;
  420. m_fOldUseDomainNameDevolution = m_fUseDomainNameDevolution;
  421. }