2 * PROJECT: ReactOS Shell
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: ReactOS Networking Configuration
5 * COPYRIGHT: Copyright 2016 Eric Kohl
10 #include <syssetup/syssetup.h>
13 #define NETWORK_SETUP_MAGIC 0x50515253
15 typedef struct _NETWORKSETUPDATA
18 BOOL bTypicalNetworkSetup
;
21 PSETUPDATA pSetupData
;
22 } NETWORKSETUPDATA
, *PNETWORKSETUPDATA
;
33 PSETUPDATA pSetupData
)
35 SendDlgItemMessageW(hwndDlg
, control
, WM_SETFONT
, (WPARAM
)pSetupData
->hBoldFont
, MAKELPARAM(TRUE
, 0));
41 InstallTypicalNetworkSettings(VOID
)
43 INetCfg
*pNetCfg
= NULL
;
44 INetCfgLock
*pNetCfgLock
= NULL
;
45 INetCfgComponent
*pTcpipComponent
= NULL
;
46 INetCfgComponent
*pNicComponent
= NULL
;
47 IEnumNetCfgComponent
*pEnumNicComponents
= NULL
;
49 BOOL fWriteLocked
= FALSE
, fInitialized
= FALSE
;
52 TRACE("InstallTypicalNetworkSettings()\n");
54 hr
= CoInitialize(NULL
);
57 ERR("CoInitialize failed\n");
61 hr
= CoCreateInstance(CLSID_CNetCfg
,
68 ERR("CoCreateInstance failed\n");
72 /* Acquire the write-lock */
73 hr
= pNetCfg
->QueryInterface(IID_INetCfgLock
,
74 (PVOID
*)&pNetCfgLock
);
77 ERR("QueryInterface failed\n");
81 hr
= pNetCfgLock
->AcquireWriteLock(5000,
86 ERR("AcquireWriteLock failed\n");
92 /* Initialize the network configuration */
93 hr
= pNetCfg
->Initialize(NULL
);
96 ERR("Initialize failed\n");
102 /* Find the TCP/IP driver */
103 hr
= pNetCfg
->FindComponent(L
"ms_tcpip",
107 FIXME("Found the TCP/IP driver!\n");
111 ERR("Initialize failed\n");
115 hr
= pNetCfg
->EnumComponents(&GUID_DEVCLASS_NET
,
116 &pEnumNicComponents
);
119 ERR("EnumComponents failed\n");
125 hr
= pEnumNicComponents
->Next(1,
130 TRACE("EnumNicComponents done!\n");
134 hr
= pNicComponent
->GetDisplayName(&pszNicName
);
137 FIXME("NIC name: %S\n", pszNicName
);
138 CoTaskMemFree(pszNicName
);
141 // FIXME Bind Tcpip to the NIC
143 pNicComponent
->Release();
144 pNicComponent
= NULL
;
149 if (pNicComponent
!= NULL
)
150 pNicComponent
->Release();
152 if (pEnumNicComponents
!= NULL
)
153 pEnumNicComponents
->Release();
155 if (pTcpipComponent
!= NULL
)
156 pTcpipComponent
->Release();
159 pNetCfg
->Uninitialize();
162 pNetCfgLock
->ReleaseWriteLock();
164 if (pNetCfgLock
!= NULL
)
165 pNetCfgLock
->Release();
172 TRACE("InstallTypicalNetworkSettings() done!\n");
181 NetworkSettingsPageDlgProc(
187 PNETWORKSETUPDATA pNetworkSetupData
;
188 PSETUPDATA pSetupData
;
191 /* Retrieve pointer to the global setup data */
192 pNetworkSetupData
= (PNETWORKSETUPDATA
)GetWindowLongPtr(hwndDlg
, GWLP_USERDATA
);
193 if ((pNetworkSetupData
!= NULL
) &&
194 (pNetworkSetupData
->dwMagic
== NETWORK_SETUP_MAGIC
))
195 pSetupData
= pNetworkSetupData
->pSetupData
;
200 /* Save pointer to the global setup data */
201 pNetworkSetupData
= (PNETWORKSETUPDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
202 SetWindowLongPtr(hwndDlg
, GWLP_USERDATA
, (DWORD_PTR
)pNetworkSetupData
);
203 pSetupData
= pNetworkSetupData
->pSetupData
;
205 /* Set the fonts of both the options to bold */
206 SetBoldText(hwndDlg
, IDC_NETWORK_TYPICAL
, pSetupData
);
207 SetBoldText(hwndDlg
, IDC_NETWORK_CUSTOM
, pSetupData
);
209 /* Set the typical settings option as the default */
210 SendDlgItemMessage(hwndDlg
, IDC_NETWORK_TYPICAL
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, 0);
212 if (pSetupData
->UnattendSetup
)
219 /* ATTENTION: Free pNetworkSetupData only in one of the page functions!!! */
224 lpnm
= (LPNMHDR
)lParam
;
229 /* Enable the Back and Next buttons */
230 PropSheet_SetWizButtons(GetParent(hwndDlg
), PSWIZB_BACK
| PSWIZB_NEXT
);
231 if (pSetupData
->UnattendSetup
)
233 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, IDD_NETWORKCOMPONENTPAGE
);
239 pNetworkSetupData
->bTypicalNetworkSetup
= FALSE
;
241 /* If the Typical Settings button is chosen, then skip to the Domain Page */
242 if (IsDlgButtonChecked(hwndDlg
, IDC_NETWORK_TYPICAL
) == BST_CHECKED
)
244 pNetworkSetupData
->bTypicalNetworkSetup
= TRUE
;
246 InstallTypicalNetworkSettings();
248 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, IDD_NETWORKDOMAINPAGE
);
254 pSetupData
->UnattendSetup
= FALSE
;
269 NetworkComponentPageDlgProc(
275 PNETWORKSETUPDATA pNetworkSetupData
;
276 PSETUPDATA pSetupData
;
279 /* Retrieve pointer to the global setup data */
280 pNetworkSetupData
= (PNETWORKSETUPDATA
)GetWindowLongPtr(hwndDlg
, GWLP_USERDATA
);
281 if ((pNetworkSetupData
!= NULL
) &&
282 (pNetworkSetupData
->dwMagic
== NETWORK_SETUP_MAGIC
))
283 pSetupData
= pNetworkSetupData
->pSetupData
;
288 /* Save pointer to the global setup data */
289 pNetworkSetupData
= (PNETWORKSETUPDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
290 SetWindowLongPtr(hwndDlg
, GWLP_USERDATA
, (DWORD_PTR
)pNetworkSetupData
);
291 pSetupData
= pNetworkSetupData
->pSetupData
;
293 SetBoldText(hwndDlg
, IDC_NETWORK_DEVICE
, pSetupData
);
295 if (pSetupData
->UnattendSetup
)
302 /* ATTENTION: Free pNetworkSetupData only in one of the page functions!!! */
307 lpnm
= (LPNMHDR
)lParam
;
312 /* Enable the Back and Next buttons */
313 PropSheet_SetWizButtons(GetParent(hwndDlg
), PSWIZB_BACK
| PSWIZB_NEXT
);
314 if (pSetupData
->UnattendSetup
)
316 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, IDD_NETWORKDOMAINPAGE
);
322 pSetupData
->UnattendSetup
= FALSE
;
337 NetworkDomainPageDlgProc(
343 PNETWORKSETUPDATA pNetworkSetupData
;
344 PSETUPDATA pSetupData
;
345 WCHAR DomainName
[51];
347 WCHAR ErrorName
[256];
350 /* Retrieve pointer to the global setup data */
351 pNetworkSetupData
= (PNETWORKSETUPDATA
)GetWindowLongPtr(hwndDlg
, GWLP_USERDATA
);
352 if ((pNetworkSetupData
!= NULL
) &&
353 (pNetworkSetupData
->dwMagic
== NETWORK_SETUP_MAGIC
))
354 pSetupData
= pNetworkSetupData
->pSetupData
;
359 /* Save pointer to the global setup data */
360 pNetworkSetupData
= (PNETWORKSETUPDATA
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
361 SetWindowLongPtr(hwndDlg
, GWLP_USERDATA
, (DWORD_PTR
)pNetworkSetupData
);
362 pSetupData
= pNetworkSetupData
->pSetupData
;
364 /* Set the workgroup option as the default */
365 SendDlgItemMessage(hwndDlg
, IDC_SELECT_WORKGROUP
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, 0);
367 wcscpy(DomainName
, L
"WORKGROUP");
369 /* Display current computer name */
370 SetDlgItemTextW(hwndDlg
, IDC_DOMAIN_NAME
, DomainName
);
372 /* Set focus to owner name */
373 SetFocus(GetDlgItem(hwndDlg
, IDC_DOMAIN_NAME
));
375 if (pSetupData
->UnattendSetup
)
383 /* ATTENTION: Free pNetworkSetupData only in one of the page functions!!! */
384 if (pNetworkSetupData
!= NULL
)
386 if ((!IsBadReadPtr(pNetworkSetupData
, sizeof(NETWORKSETUPDATA
))) &&
387 (pNetworkSetupData
->dwMagic
== NETWORK_SETUP_MAGIC
))
388 HeapFree(GetProcessHeap(), 0, pNetworkSetupData
);
390 SetWindowLongPtr(hwndDlg
, GWLP_USERDATA
, (DWORD_PTR
)NULL
);
395 lpnm
= (LPNMHDR
)lParam
;
400 /* Enable the Back and Next buttons */
401 PropSheet_SetWizButtons(GetParent(hwndDlg
), PSWIZB_BACK
| PSWIZB_NEXT
);
402 if (pSetupData
->UnattendSetup
)
404 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, pSetupData
->uPostNetworkWizardPage
);
411 if (GetDlgItemTextW(hwndDlg
, IDC_DOMAIN_NAME
, DomainName
, 50) == 0)
413 if (0 == LoadStringW(netshell_hInstance
, IDS_REACTOS_SETUP
, Title
, sizeof(Title
) / sizeof(Title
[0])))
415 wcscpy(Title
, L
"ReactOS Setup");
417 if (0 == LoadStringW(netshell_hInstance
, IDS_WZD_DOMAIN_NAME
, ErrorName
, sizeof(ErrorName
) / sizeof(ErrorName
[0])))
419 wcscpy(ErrorName
, L
"Setup cannot continue until you\nenter the name of your domain/workgroup.");
421 MessageBoxW(hwndDlg
, ErrorName
, Title
, MB_ICONERROR
| MB_OK
);
423 SetFocus(GetDlgItem(hwndDlg
, IDC_DOMAIN_NAME
));
424 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, -1);
426 //TODO: Implement setting the Domain/Workgroup
433 pSetupData
->UnattendSetup
= FALSE
;
435 /* If the Typical setup chosen, then skip back to the Settings Page */
436 if (pNetworkSetupData
->bTypicalNetworkSetup
== TRUE
)
438 SetWindowLongPtr(hwndDlg
, DWLP_MSGRESULT
, IDD_NETWORKSETTINGSPAGE
);
455 NetSetupRequestWizardPages(
457 HPROPSHEETPAGE
*pPages
,
458 PSETUPDATA pSetupData
)
460 PNETWORKSETUPDATA pNetworkSetupData
;
461 PROPSHEETPAGE psp
= {0};
462 DWORD dwPageCount
= 3;
465 if (pPageCount
== NULL
)
466 return ERROR_INVALID_PARAMETER
;
470 *pPageCount
= dwPageCount
;
471 return ERROR_SUCCESS
;
474 if (*pPageCount
< dwPageCount
)
475 return ERROR_BUFFER_OVERFLOW
;
477 pSetupData
->uFirstNetworkWizardPage
= IDD_NETWORKSETTINGSPAGE
;
479 pNetworkSetupData
= (PNETWORKSETUPDATA
)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(NETWORKSETUPDATA
));
480 if (pNetworkSetupData
== NULL
)
481 return ERROR_OUTOFMEMORY
;
483 pNetworkSetupData
->dwMagic
= NETWORK_SETUP_MAGIC
;
484 pNetworkSetupData
->pSetupData
= pSetupData
;
487 /* Create the Network Settings page */
488 psp
.dwSize
= sizeof(PROPSHEETPAGE
);
489 psp
.hInstance
= netshell_hInstance
;
490 psp
.lParam
= (LPARAM
)pNetworkSetupData
;
492 psp
.dwFlags
= PSP_DEFAULT
| PSP_USEHEADERTITLE
| PSP_USEHEADERSUBTITLE
;
493 psp
.pszHeaderTitle
= MAKEINTRESOURCE(IDS_NETWORKSETTINGSTITLE
);
494 psp
.pszHeaderSubTitle
= MAKEINTRESOURCE(IDS_NETWORKSETTINGSSUBTITLE
);
495 psp
.pfnDlgProc
= NetworkSettingsPageDlgProc
;
496 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_NETWORKSETTINGSPAGE
);
497 pPages
[nPage
++] = CreatePropertySheetPage(&psp
);
499 /* Create the Network Components page */
500 psp
.dwFlags
= PSP_DEFAULT
| PSP_USEHEADERTITLE
| PSP_USEHEADERSUBTITLE
;
501 psp
.pszHeaderTitle
= MAKEINTRESOURCE(IDS_NETWORKCOMPONENTTITLE
);
502 psp
.pszHeaderSubTitle
= MAKEINTRESOURCE(IDS_NETWORKCOMPONENTSUBTITLE
);
503 psp
.pfnDlgProc
= NetworkComponentPageDlgProc
;
504 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_NETWORKCOMPONENTPAGE
);
505 pPages
[nPage
++] = CreatePropertySheetPage(&psp
);
507 /* Create the Domain/Workgroup page */
508 psp
.dwFlags
= PSP_DEFAULT
| PSP_USEHEADERTITLE
| PSP_USEHEADERSUBTITLE
;
509 psp
.pszHeaderTitle
= MAKEINTRESOURCE(IDS_NETWORKDOMAINTITLE
);
510 psp
.pszHeaderSubTitle
= MAKEINTRESOURCE(IDS_NETWORKDOMAINSUBTITLE
);
511 psp
.pfnDlgProc
= NetworkDomainPageDlgProc
;
512 psp
.pszTemplate
= MAKEINTRESOURCE(IDD_NETWORKDOMAINPAGE
);
513 pPages
[nPage
++] = CreatePropertySheetPage(&psp
);
515 *pPageCount
= dwPageCount
;
517 return ERROR_SUCCESS
;