Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635/* * PROJECT: ReactOS Shell * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) * PURPOSE: ReactOS Networking Configuration * COPYRIGHT: Copyright 2016 Eric Kohl */
#include "precomp.h"
#include <syssetup/syssetup.h>
#define NETWORK_SETUP_MAGIC 0x50515253
typedef struct _NETWORKSETUPDATA{ DWORD dwMagic; PSETUPDATA pSetupData;
/* settings page data */ BOOL bInitialSetupRun; BOOL bTypicalNetworkSetup; HWND hwndPage;} NETWORKSETUPDATA, *PNETWORKSETUPDATA;
extern "C"{
typedef struct _NETWORKCOMPONENT{ LPWSTR pszDeviceId; const GUID *pClassGuid;} NETWORKCOMPONENT, PNETWORKCOMPONENT;
static NETWORKCOMPONENT NetworkComponents[] = { {(LPWSTR)L"MS_TCPIP", &GUID_DEVCLASS_NETTRANS}, {(LPWSTR)L"MS_NDISUIO", &GUID_DEVCLASS_NETTRANS}};
staticVOIDSetBoldText( HWND hwndDlg, INT control, PSETUPDATA pSetupData){ SendDlgItemMessageW(hwndDlg, control, WM_SETFONT, (WPARAM)pSetupData->hBoldFont, MAKELPARAM(TRUE, 0));}
staticHRESULTInstallNetworkComponent( LPWSTR pszComponentName, const GUID *pClassGuid){ INetCfg *pNetCfg = NULL; INetCfgLock *pNetCfgLock = NULL; INetCfgClassSetup *pNetCfgClassSetup = NULL; INetCfgComponent *pNetCfgComponent = NULL; BOOL fWriteLocked = FALSE, fInitialized = FALSE; OBO_TOKEN OboToken; HRESULT hr;
TRACE("InstallNetworkComponent(%S)\n", pszComponentName);
hr = CoInitialize(NULL); if (hr != S_OK) { ERR("CoInitialize failed\n"); goto exit; }
hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (PVOID*)&pNetCfg); if (hr != S_OK) { ERR("CoCreateInstance failed\n"); goto exit; }
/* Acquire the write-lock */ hr = pNetCfg->QueryInterface(IID_INetCfgLock, (PVOID*)&pNetCfgLock); if (hr != S_OK) { ERR("QueryInterface failed\n"); goto exit; }
hr = pNetCfgLock->AcquireWriteLock(5000, L"SysSetup", NULL); if (hr != S_OK) { ERR("AcquireWriteLock failed\n"); goto exit; }
fWriteLocked = TRUE;
/* Initialize the network configuration */ hr = pNetCfg->Initialize(NULL); if (hr != S_OK) { ERR("Initialize failed\n"); goto exit; }
fInitialized = TRUE;
hr = pNetCfg->QueryNetCfgClass(pClassGuid, IID_INetCfgClassSetup, (PVOID*)&pNetCfgClassSetup); if (hr != S_OK) { ERR("QueryNetCfgClass failed\n"); goto exit; }
ZeroMemory(&OboToken, sizeof(OboToken)); OboToken.Type = OBO_USER;
hr = pNetCfgClassSetup->Install(pszComponentName, &OboToken, 0, //NSF_PRIMARYINSTALL, 0, NULL, NULL, &pNetCfgComponent); if (hr == S_OK) { if (pNetCfgComponent != NULL) pNetCfgComponent->Release(); } else { ERR("Install failed\n"); goto exit; }
hr = pNetCfg->Apply(); if (hr != S_OK) { ERR("Apply failed\n"); goto exit; }
exit: if (pNetCfgClassSetup != NULL) pNetCfgClassSetup->Release();
if (fInitialized) pNetCfg->Uninitialize();
if (fWriteLocked) pNetCfgLock->ReleaseWriteLock();
if (pNetCfgLock != NULL) pNetCfgLock->Release();
if (pNetCfg != NULL) pNetCfg->Release();
CoUninitialize();
TRACE("InstallNetworkComponent() done!\n");
return hr;}
staticDWORDWINAPIInstallThreadProc( _In_ LPVOID lpParameter){ PNETWORKSETUPDATA pNetworkSetupData = (PNETWORKSETUPDATA)lpParameter; UINT i, count;
TRACE("InstallThreadProc()\n");
count = sizeof(NetworkComponents) / sizeof(NETWORKCOMPONENT); TRACE("Network Components: %u\n", count);
SendDlgItemMessage(pNetworkSetupData->hwndPage, IDC_INSTALL_PROGRESS, PBM_SETRANGE, 0, MAKELPARAM(0, count)); SendDlgItemMessage(pNetworkSetupData->hwndPage, IDC_INSTALL_PROGRESS, PBM_SETPOS, 0, 0);
for (i = 0; i < count; i++) { TRACE("Install Network Component: %S\n", NetworkComponents[i].pszDeviceId); InstallNetworkComponent(NetworkComponents[i].pszDeviceId, NetworkComponents[i].pClassGuid); SendDlgItemMessage(pNetworkSetupData->hwndPage, IDC_INSTALL_PROGRESS, PBM_SETPOS, i, 0); Sleep(500); }
TRACE("Done\n");
/* Done */ pNetworkSetupData->bInitialSetupRun = TRUE; PostMessage(pNetworkSetupData->hwndPage, WM_USER, 0, 0);
return 0;}
staticINT_PTRCALLBACKNetworkInitPageDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ PNETWORKSETUPDATA pNetworkSetupData; PSETUPDATA pSetupData; LPNMHDR lpnm;
/* Retrieve pointer to the global setup data */ pNetworkSetupData = (PNETWORKSETUPDATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if ((pNetworkSetupData != NULL) && (pNetworkSetupData->dwMagic == NETWORK_SETUP_MAGIC)) pSetupData = pNetworkSetupData->pSetupData;
switch (uMsg) { case WM_INITDIALOG: /* Save pointer to the global setup data */ pNetworkSetupData = (PNETWORKSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pNetworkSetupData); pSetupData = pNetworkSetupData->pSetupData;
if (pSetupData->UnattendSetup) { //... } break;
case WM_DESTROY: /* ATTENTION: Free pNetworkSetupData only in one of the page functions!!! */ //... break;
case WM_NOTIFY: lpnm = (LPNMHDR)lParam;
switch (lpnm->code) { case PSN_SETACTIVE: /* Disable the Back and Next buttons */ PropSheet_SetWizButtons(GetParent(hwndDlg), 0); TRACE("Starting install thread!\n"); pNetworkSetupData->hwndPage = hwndDlg; CreateThread(NULL, 0, InstallThreadProc, (LPVOID)pNetworkSetupData, 0, NULL); TRACE("Install thread done!\n"); break;
case PSN_WIZNEXT: break;
case PSN_WIZBACK: break; } break;
case WM_USER: TRACE("WM_USER!\n"); /* Enable the Next button and press it */ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT); PropSheet_PressButton(GetParent(hwndDlg), PSBTN_NEXT); break;
default: break; }
return FALSE;}
staticINT_PTRCALLBACKNetworkSettingsPageDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ PNETWORKSETUPDATA pNetworkSetupData; PSETUPDATA pSetupData; LPNMHDR lpnm;
/* Retrieve pointer to the global setup data */ pNetworkSetupData = (PNETWORKSETUPDATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if ((pNetworkSetupData != NULL) && (pNetworkSetupData->dwMagic == NETWORK_SETUP_MAGIC)) pSetupData = pNetworkSetupData->pSetupData;
switch (uMsg) { case WM_INITDIALOG: /* Save pointer to the global setup data */ pNetworkSetupData = (PNETWORKSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pNetworkSetupData); pSetupData = pNetworkSetupData->pSetupData;
/* Set the fonts of both the options to bold */ SetBoldText(hwndDlg, IDC_NETWORK_TYPICAL, pSetupData); SetBoldText(hwndDlg, IDC_NETWORK_CUSTOM, pSetupData);
/* Set the typical settings option as the default */ SendDlgItemMessage(hwndDlg, IDC_NETWORK_TYPICAL, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
if (pSetupData->UnattendSetup) { //... } break;
case WM_DESTROY: /* ATTENTION: Free pNetworkSetupData only in one of the page functions!!! */ //... break;
case WM_NOTIFY: lpnm = (LPNMHDR)lParam;
switch (lpnm->code) { case PSN_SETACTIVE: /* Enable the Next button only */ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_NEXT); if (pSetupData->UnattendSetup) { SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, IDD_NETWORKCOMPONENTPAGE); return TRUE; } break;
case PSN_WIZNEXT: pNetworkSetupData->bTypicalNetworkSetup = FALSE;
/* If the Typical Settings button is chosen, then skip to the Domain Page */ if (IsDlgButtonChecked(hwndDlg, IDC_NETWORK_TYPICAL) == BST_CHECKED) { pNetworkSetupData->bTypicalNetworkSetup = TRUE;
SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, IDD_NETWORKDOMAINPAGE); return TRUE; } break;
case PSN_WIZBACK: pSetupData->UnattendSetup = FALSE; break; } break;
default: break; }
return FALSE;}
staticINT_PTRCALLBACKNetworkComponentPageDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ PNETWORKSETUPDATA pNetworkSetupData; PSETUPDATA pSetupData; LPNMHDR lpnm;
/* Retrieve pointer to the global setup data */ pNetworkSetupData = (PNETWORKSETUPDATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if ((pNetworkSetupData != NULL) && (pNetworkSetupData->dwMagic == NETWORK_SETUP_MAGIC)) pSetupData = pNetworkSetupData->pSetupData;
switch (uMsg) { case WM_INITDIALOG: /* Save pointer to the global setup data */ pNetworkSetupData = (PNETWORKSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pNetworkSetupData); pSetupData = pNetworkSetupData->pSetupData;
SetBoldText(hwndDlg, IDC_NETWORK_DEVICE, pSetupData);
if (pSetupData->UnattendSetup) { //... } break;
case WM_DESTROY: /* ATTENTION: Free pNetworkSetupData only in one of the page functions!!! */ //... break;
case WM_NOTIFY: lpnm = (LPNMHDR)lParam;
switch (lpnm->code) { case PSN_SETACTIVE: /* Enable the Back and Next buttons */ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT); if (pSetupData->UnattendSetup) { SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, IDD_NETWORKDOMAINPAGE); return TRUE; } break;
case PSN_WIZBACK: pSetupData->UnattendSetup = FALSE; break; } break;
default: break; }
return FALSE;}
staticINT_PTRCALLBACKNetworkDomainPageDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ PNETWORKSETUPDATA pNetworkSetupData; PSETUPDATA pSetupData; WCHAR DomainName[51]; WCHAR Title[64]; WCHAR ErrorName[256]; LPNMHDR lpnm;
/* Retrieve pointer to the global setup data */ pNetworkSetupData = (PNETWORKSETUPDATA)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); if ((pNetworkSetupData != NULL) && (pNetworkSetupData->dwMagic == NETWORK_SETUP_MAGIC)) pSetupData = pNetworkSetupData->pSetupData;
switch (uMsg) { case WM_INITDIALOG: /* Save pointer to the global setup data */ pNetworkSetupData = (PNETWORKSETUPDATA)((LPPROPSHEETPAGE)lParam)->lParam; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR)pNetworkSetupData); pSetupData = pNetworkSetupData->pSetupData;
/* Set the workgroup option as the default */ SendDlgItemMessage(hwndDlg, IDC_SELECT_WORKGROUP, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
wcscpy(DomainName, L"WORKGROUP");
/* Display current computer name */ SetDlgItemTextW(hwndDlg, IDC_DOMAIN_NAME, DomainName);
/* Set focus to owner name */ SetFocus(GetDlgItem(hwndDlg, IDC_DOMAIN_NAME));
if (pSetupData->UnattendSetup) { //... } break;
case WM_DESTROY: //... /* ATTENTION: Free pNetworkSetupData only in one of the page functions!!! */ if (pNetworkSetupData != NULL) { if ((!IsBadReadPtr(pNetworkSetupData, sizeof(NETWORKSETUPDATA))) && (pNetworkSetupData->dwMagic == NETWORK_SETUP_MAGIC)) HeapFree(GetProcessHeap(), 0, pNetworkSetupData);
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (DWORD_PTR)NULL); } break;
case WM_NOTIFY: lpnm = (LPNMHDR)lParam;
switch (lpnm->code) { case PSN_SETACTIVE: /* Enable the Back and Next buttons */ PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_NEXT); if (pSetupData->UnattendSetup) { SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, pSetupData->uPostNetworkWizardPage); return TRUE; } break;
case PSN_WIZNEXT: DomainName[0] = 0; if (GetDlgItemTextW(hwndDlg, IDC_DOMAIN_NAME, DomainName, 50) == 0) { if (0 == LoadStringW(netshell_hInstance, IDS_REACTOS_SETUP, Title, sizeof(Title) / sizeof(Title[0]))) { wcscpy(Title, L"ReactOS Setup"); } if (0 == LoadStringW(netshell_hInstance, IDS_WZD_DOMAIN_NAME, ErrorName, sizeof(ErrorName) / sizeof(ErrorName[0]))) { wcscpy(ErrorName, L"Setup cannot continue until you\nenter the name of your domain/workgroup."); } MessageBoxW(hwndDlg, ErrorName, Title, MB_ICONERROR | MB_OK);
SetFocus(GetDlgItem(hwndDlg, IDC_DOMAIN_NAME)); SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, -1);
//TODO: Implement setting the Domain/Workgroup
return TRUE; } break;
case PSN_WIZBACK: pSetupData->UnattendSetup = FALSE;
/* If the Typical setup chosen, then skip back to the Settings Page */ if (pNetworkSetupData->bTypicalNetworkSetup == TRUE) { SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, IDD_NETWORKSETTINGSPAGE); return TRUE; } break; } break;
default: break; }
return FALSE;}
DWORDWINAPINetSetupRequestWizardPages( PDWORD pPageCount, HPROPSHEETPAGE *pPages, PSETUPDATA pSetupData){ PNETWORKSETUPDATA pNetworkSetupData; PROPSHEETPAGE psp = {0}; DWORD dwPageCount = 4; INT nPage = 0;
TRACE("NetSetupRequestWizardPages(%p %p %p)\n", pPageCount, pPages, pSetupData);
if (pPageCount == NULL) return ERROR_INVALID_PARAMETER;
if (pPages == NULL) { TRACE("Return %lu pages\n", dwPageCount); *pPageCount = dwPageCount; return ERROR_SUCCESS; }
if (*pPageCount < dwPageCount) return ERROR_BUFFER_OVERFLOW;
pSetupData->uFirstNetworkWizardPage = IDD_NETWORKINITPAGE;
pNetworkSetupData = (PNETWORKSETUPDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(NETWORKSETUPDATA)); if (pNetworkSetupData == NULL) return ERROR_OUTOFMEMORY;
pNetworkSetupData->dwMagic = NETWORK_SETUP_MAGIC; pNetworkSetupData->pSetupData = pSetupData;
/* Create the Network Settings page */ psp.dwSize = sizeof(PROPSHEETPAGE); psp.hInstance = netshell_hInstance; psp.lParam = (LPARAM)pNetworkSetupData;
psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_NETWORKINITTITLE); psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_NETWORKINITSUBTITLE); psp.pfnDlgProc = NetworkInitPageDlgProc; psp.pszTemplate = MAKEINTRESOURCE(IDD_NETWORKINITPAGE); pPages[nPage++] = CreatePropertySheetPage(&psp);
psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_NETWORKSETTINGSTITLE); psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_NETWORKSETTINGSSUBTITLE); psp.pfnDlgProc = NetworkSettingsPageDlgProc; psp.pszTemplate = MAKEINTRESOURCE(IDD_NETWORKSETTINGSPAGE); pPages[nPage++] = CreatePropertySheetPage(&psp);
/* Create the Network Components page */ psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_NETWORKCOMPONENTTITLE); psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_NETWORKCOMPONENTSUBTITLE); psp.pfnDlgProc = NetworkComponentPageDlgProc; psp.pszTemplate = MAKEINTRESOURCE(IDD_NETWORKCOMPONENTPAGE); pPages[nPage++] = CreatePropertySheetPage(&psp);
/* Create the Domain/Workgroup page */ psp.dwFlags = PSP_DEFAULT | PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; psp.pszHeaderTitle = MAKEINTRESOURCE(IDS_NETWORKDOMAINTITLE); psp.pszHeaderSubTitle = MAKEINTRESOURCE(IDS_NETWORKDOMAINSUBTITLE); psp.pfnDlgProc = NetworkDomainPageDlgProc; psp.pszTemplate = MAKEINTRESOURCE(IDD_NETWORKDOMAINPAGE); pPages[nPage++] = CreatePropertySheetPage(&psp);
TRACE("Return %lu pages\n", dwPageCount); *pPageCount = dwPageCount;
return ERROR_SUCCESS;}
} // extern "C"