Reactos

[NETID] Implement DNS suffix and NetBIOS computer name support

- Load and store the non volatile host, domain and computer names instead of the volatile ones.
- Validate the domain name before it is stored.
- Update the full computer name whenever the host or domain name changes.

+334 -151
+1 -1
dll/win32/netid/CMakeLists.txt
··· 8 8 9 9 add_library(netid MODULE ${SOURCE}) 10 10 set_module_type(netid win32dll UNICODE) 11 - add_importlibs(netid user32 gdi32 comctl32 advapi32 netapi32 msvcrt kernel32 ntdll) 11 + add_importlibs(netid user32 gdi32 comctl32 advapi32 netapi32 dnsapi msvcrt kernel32 ntdll) 12 12 add_cd_file(TARGET netid DESTINATION reactos/system32 FOR all)
+333 -150
dll/win32/netid/netid.c
··· 14 14 #include <winbase.h> 15 15 #include <winuser.h> 16 16 #include <winreg.h> 17 + #include <windns.h> 17 18 #include <tchar.h> 18 19 #include <lm.h> 19 20 #include <prsht.h> ··· 23 24 24 25 #define MAX_COMPUTERDESCRIPTION_LENGTH 256 25 26 26 - static INT_PTR CALLBACK 27 - NetIDPageProc(IN HWND hwndDlg, 28 - IN UINT uMsg, 29 - IN WPARAM wParam, 30 - IN LPARAM lParam); 27 + typedef struct _NETIDDATA 28 + { 29 + WCHAR szHostName[256]; 30 + WCHAR szDomainName[256]; 31 + WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 32 + BOOL bHostNameChanged; 33 + BOOL bDomainNameChanged; 34 + BOOL bEnable; 35 + } NETIDDATA, *PNETIDDATA; 36 + 31 37 32 38 static HINSTANCE hDllInstance; 33 39 40 + static 41 + BOOL 42 + GetComputerNames( 43 + PNETIDDATA pNetIdData) 44 + { 45 + HKEY KeyHandle; 46 + DWORD dwSize; 47 + DWORD dwError; 48 + 49 + dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, 50 + L"SYSTEM\\CurrentControlSet\\Services\\TcpIp\\Parameters", 51 + 0, 52 + KEY_QUERY_VALUE, 53 + &KeyHandle); 54 + if (dwError == ERROR_SUCCESS) 55 + { 56 + dwSize = sizeof(pNetIdData->szHostName); 57 + RegQueryValueExW(KeyHandle, 58 + L"NV HostName", 59 + 0, 60 + NULL, 61 + (LPBYTE)&pNetIdData->szHostName, 62 + &dwSize); 63 + 64 + dwSize = sizeof(pNetIdData->szDomainName); 65 + RegQueryValueExW(KeyHandle, 66 + L"NV Domain", 67 + 0, 68 + NULL, 69 + (LPBYTE)&pNetIdData->szDomainName, 70 + &dwSize); 71 + 72 + RegCloseKey(KeyHandle); 73 + } 74 + 75 + dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE, 76 + L"SYSTEM\\CurrentControlSet\\Control\\ComputerName\\ComputerName", 77 + 0, 78 + KEY_QUERY_VALUE, 79 + &KeyHandle); 80 + if (dwError == ERROR_SUCCESS) 81 + { 82 + dwSize = sizeof(pNetIdData->szComputerName); 83 + RegQueryValueExW(KeyHandle, 84 + L"ComputerName", 85 + 0, 86 + NULL, 87 + (LPBYTE)&pNetIdData->szComputerName, 88 + &dwSize); 89 + 90 + RegCloseKey(KeyHandle); 91 + } 92 + 93 + return TRUE; 94 + } 95 + 96 + static 97 + BOOL 98 + IsValidDomainName( 99 + HWND hDlg, 100 + UINT uId) 101 + { 102 + WCHAR szDomainName[256]; 103 + DWORD dwError; 104 + 105 + GetDlgItemTextW(hDlg, uId, szDomainName, ARRAYSIZE(szDomainName)); 106 + dwError = DnsValidateName_W(szDomainName, DnsNameDomain); 107 + if (dwError != ERROR_SUCCESS) 108 + { 109 + /* FIXME: Show error message */ 110 + return FALSE; 111 + } 112 + 113 + return TRUE; 114 + } 34 115 35 116 static 36 117 INT_PTR CALLBACK 37 118 DNSSuffixPropDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) 38 119 { 120 + PNETIDDATA pNetIdData; 121 + 122 + pNetIdData = (PNETIDDATA)GetWindowLongPtr(hDlg, DWLP_USER); 123 + 39 124 switch (Msg) 40 125 { 126 + case WM_INITDIALOG: 127 + pNetIdData = (PNETIDDATA)lParam; 128 + if (pNetIdData != NULL) 129 + { 130 + SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pNetIdData); 131 + 132 + SetDlgItemTextW(hDlg, 1011, pNetIdData->szDomainName); 133 + 134 + SetDlgItemTextW(hDlg, 1013, pNetIdData->szComputerName); 135 + EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); 136 + } 137 + return TRUE; 138 + 41 139 case WM_COMMAND: 42 - { 43 140 switch (LOWORD(wParam)) 44 141 { 45 - case IDCANCEL: 142 + case 1011: 143 + if (HIWORD(wParam) == EN_CHANGE) 144 + { 145 + EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); 146 + } 147 + break; 148 + 46 149 case IDOK: 47 - EndDialog(hDlg, LOWORD(wParam)); 150 + if (!IsValidDomainName(hDlg, 1011)) 151 + { 152 + SetFocus(GetDlgItem(hDlg, 1011)); 153 + break; 154 + } 155 + 156 + GetDlgItemTextW(hDlg, 1011, pNetIdData->szDomainName, ARRAYSIZE(pNetIdData->szDomainName)); 157 + pNetIdData->bDomainNameChanged = TRUE; 158 + EndDialog(hDlg, TRUE); 159 + break; 160 + 161 + case IDCANCEL: 162 + EndDialog(hDlg, FALSE); 48 163 break; 49 164 } 50 - } 51 - break; 165 + break; 52 166 } 53 167 54 168 return FALSE; ··· 74 188 75 189 static 76 190 BOOL 77 - IsValidComputerName(LPCWSTR s) 191 + IsValidComputerName( 192 + HWND hDlg, 193 + UINT uId) 78 194 { 195 + WCHAR szMsgText[512], szText[256], s[256]; 79 196 int i; 197 + 198 + GetWindowText(GetDlgItem(hDlg, uId), s, ARRAYSIZE(s)); 80 199 81 200 for (i = 0; i <= wcslen(s); i++) 82 201 { ··· 88 207 || s[i] == L'<' || s[i] == L'>' || s[i] == L'?' || s[i] == L'[' 89 208 || s[i] == L']' || s[i] == L'`' || s[i] == L'%' || s[i] == L'_' 90 209 || s[i] == L'.') 210 + { 211 + LoadStringW(hDllInstance, 1030, szText, ARRAYSIZE(szText)); 212 + swprintf(szMsgText, szText, s); 213 + MessageBoxW(hDlg, szMsgText, NULL, MB_OK | MB_ICONERROR); 91 214 return FALSE; 215 + } 92 216 } 93 217 94 218 return TRUE; 95 219 } 96 220 97 221 static 98 - INT_PTR CALLBACK 99 - NetworkPropDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) 222 + VOID 223 + SetFullComputerName( 224 + HWND hDlg, 225 + UINT uId, 226 + PNETIDDATA pNetIdData) 227 + { 228 + WCHAR szFullComputerName[512]; 229 + 230 + swprintf(szFullComputerName, L"%s.%s", pNetIdData->szHostName, pNetIdData->szDomainName); 231 + SetDlgItemText(hDlg, uId, szFullComputerName); 232 + } 233 + 234 + static 235 + VOID 236 + UpdateFullComputerName( 237 + HWND hDlg, 238 + UINT uId, 239 + PNETIDDATA pNetIdData) 100 240 { 101 - switch (Msg) 241 + WCHAR szFullComputerName[512]; 242 + WCHAR szHostName[256]; 243 + 244 + GetWindowText(GetDlgItem(hDlg, 1002), szHostName, ARRAYSIZE(szHostName)); 245 + 246 + swprintf(szFullComputerName, L"%s.%s", szHostName, pNetIdData->szDomainName); 247 + SetDlgItemText(hDlg, uId, szFullComputerName); 248 + } 249 + 250 + static 251 + VOID 252 + NetworkDlg_OnInitDialog( 253 + HWND hDlg, 254 + PNETIDDATA pNetIdData) 255 + { 256 + LPWKSTA_INFO_101 wki = NULL; 257 + TCHAR MsgText[MAX_PATH * 2]; 258 + LPWSTR JoinName = NULL; 259 + NETSETUP_JOIN_STATUS JoinStatus; 260 + 261 + if (LoadString(hDllInstance, 25, MsgText, sizeof(MsgText) / sizeof(TCHAR))) 262 + SetDlgItemText(hDlg, 1017, MsgText); 263 + 264 + // SendMessage(GetDlgItem(hDlg, 1002), EM_SETLIMITTEXT, MAX_COMPUTERNAME_LENGTH, 0); 265 + 266 + SetDlgItemText(hDlg, 1002, pNetIdData->szHostName); 267 + SetFullComputerName(hDlg, 1001, pNetIdData); 268 + 269 + if (NetGetJoinInformation(NULL, &JoinName, &JoinStatus) != NERR_Success) 102 270 { 103 - case WM_INITDIALOG: 271 + SetRadioBtnState(hDlg, FALSE); 272 + 273 + if (NetWkstaGetInfo(NULL, 274 + 101, 275 + (LPBYTE*)&wki) == NERR_Success) 104 276 { 105 - LPWKSTA_INFO_101 wki = NULL; 106 - DWORD Size = MAX_COMPUTERNAME_LENGTH + 1; 107 - TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 108 - TCHAR MsgText[MAX_PATH * 2]; 109 - LPWSTR JoinName; 110 - NETSETUP_JOIN_STATUS JoinStatus; 277 + SetDlgItemText(hDlg, 278 + 1007, 279 + wki->wki101_langroup); 280 + } 281 + else 282 + { 283 + DisableControls(hDlg); 284 + } 111 285 112 - if (LoadString(hDllInstance, 25, MsgText, sizeof(MsgText) / sizeof(TCHAR))) 113 - SetDlgItemText(hDlg, 1017, MsgText); 286 + if (wki) 287 + NetApiBufferFree(wki); 288 + } 289 + else 290 + { 291 + switch (JoinStatus) 292 + { 293 + case NetSetupDomainName: 294 + SetDlgItemText(hDlg, 116, JoinName); 295 + SetRadioBtnState(hDlg, TRUE); 296 + break; 114 297 115 - SendMessage(GetDlgItem(hDlg, 1002), EM_SETLIMITTEXT, MAX_COMPUTERNAME_LENGTH, 0); 298 + case NetSetupWorkgroupName: 299 + SetDlgItemText(hDlg, 1007, JoinName); 300 + SetRadioBtnState(hDlg, FALSE); 301 + break; 116 302 117 - if (GetComputerName(ComputerName, &Size)) 118 - { 119 - SetDlgItemText(hDlg, 1002, ComputerName); 120 - SetDlgItemText(hDlg, 1001, ComputerName); 121 - } 303 + case NetSetupUnjoined: 304 + break; 122 305 123 - if (NetGetJoinInformation(NULL, &JoinName, &JoinStatus) != NERR_Success) 124 - { 306 + case NetSetupUnknownStatus: 307 + default: 125 308 SetRadioBtnState(hDlg, FALSE); 126 309 127 310 if (NetWkstaGetInfo(NULL, ··· 132 315 1007, 133 316 wki->wki101_langroup); 134 317 } 135 - else DisableControls(hDlg); 318 + else 319 + { 320 + DisableControls(hDlg); 321 + } 322 + 323 + if (wki) 324 + NetApiBufferFree(wki); 325 + break; 326 + } 327 + 328 + if (JoinName) 329 + NetApiBufferFree(JoinName); 330 + } 331 + } 332 + 333 + static 334 + BOOL 335 + NetworkDlg_OnOK( 336 + HWND hDlg, 337 + PNETIDDATA pNetIdData) 338 + { 339 + WCHAR szMsgText[MAX_PATH], szMsgTitle[MAX_PATH]; 340 + 341 + if (pNetIdData->bHostNameChanged) 342 + { 343 + if (!IsValidComputerName(hDlg, 1002)) 344 + { 345 + SetFocus(GetDlgItem(hDlg, 1002)); 346 + return FALSE; 347 + } 136 348 137 - if (wki) NetApiBufferFree(wki); 138 - } 139 - else 140 - { 141 - switch (JoinStatus) 142 - { 143 - case NetSetupDomainName: 144 - SetDlgItemText(hDlg, 116, JoinName); 145 - SetRadioBtnState(hDlg, TRUE); 146 - break; 349 + GetWindowText(GetDlgItem(hDlg, 1002), pNetIdData->szHostName, ARRAYSIZE(pNetIdData->szHostName)); 147 350 148 - case NetSetupWorkgroupName: 149 - SetDlgItemText(hDlg, 1007, JoinName); 150 - SetRadioBtnState(hDlg, FALSE); 151 - break; 351 + if (!SetComputerNameExW(ComputerNamePhysicalDnsHostname, pNetIdData->szHostName)) 352 + { 353 + LoadStringW(hDllInstance, 4001, szMsgText, ARRAYSIZE(szMsgText)); 354 + MessageBoxW(hDlg, szMsgText, NULL, MB_OK | MB_ICONERROR); 355 + return FALSE; 356 + } 357 + } 358 + 359 + if (pNetIdData->bDomainNameChanged) 360 + { 361 + if (!SetComputerNameExW(ComputerNamePhysicalDnsDomain, pNetIdData->szDomainName)) 362 + { 363 + /* FIXME: Show error message */ 364 + return FALSE; 365 + } 366 + } 152 367 153 - case NetSetupUnjoined: 154 - break; 368 + LoadStringW(hDllInstance, 4000, szMsgTitle, ARRAYSIZE(szMsgTitle)); 369 + LoadStringW(hDllInstance, 24, szMsgText, ARRAYSIZE(szMsgText)); 370 + MessageBoxW(hDlg, szMsgText, szMsgTitle, MB_OK | MB_ICONINFORMATION); 155 371 156 - case NetSetupUnknownStatus: 157 - default: 158 - { 159 - SetRadioBtnState(hDlg, FALSE); 372 + return TRUE; 373 + } 160 374 161 - if (NetWkstaGetInfo(NULL, 162 - 101, 163 - (LPBYTE*)&wki) == NERR_Success) 164 - { 165 - SetDlgItemText(hDlg, 166 - 1007, 167 - wki->wki101_langroup); 168 - } 169 - else DisableControls(hDlg); 375 + static 376 + INT_PTR CALLBACK 377 + NetworkPropDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) 378 + { 379 + PNETIDDATA pNetIdData; 170 380 171 - if (wki) NetApiBufferFree(wki); 172 - break; 173 - } 174 - } 381 + pNetIdData = (PNETIDDATA)GetWindowLongPtr(hDlg, DWLP_USER); 175 382 176 - if (JoinName) NetApiBufferFree(JoinName); 383 + switch (Msg) 384 + { 385 + case WM_INITDIALOG: 386 + pNetIdData = (PNETIDDATA)lParam; 387 + if (pNetIdData != NULL) 388 + { 389 + SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pNetIdData); 390 + NetworkDlg_OnInitDialog(hDlg, pNetIdData); 391 + EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); 177 392 } 178 - } 179 - break; 393 + return TRUE; 180 394 181 395 case WM_COMMAND: 182 - { 183 396 switch (LOWORD(wParam)) 184 397 { 185 398 case 1002: 186 399 if (HIWORD(wParam) == EN_CHANGE) 187 400 { 188 - TCHAR szText[MAX_COMPUTERNAME_LENGTH + 1]; 189 - 190 - GetWindowText(GetDlgItem(hDlg, 1002), szText, MAX_COMPUTERNAME_LENGTH + 1); 191 - SetDlgItemText(hDlg, 1001, szText); 401 + UpdateFullComputerName(hDlg, 1001, pNetIdData); 402 + pNetIdData->bHostNameChanged = TRUE; 403 + EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); 192 404 } 193 405 break; 194 406 ··· 201 413 break; 202 414 203 415 case 1003: 204 - DialogBox(hDllInstance, 205 - MAKEINTRESOURCE(IDD_PROPPAGEDNSANDNETBIOS), 206 - hDlg, 207 - DNSSuffixPropDlgProc); 208 - break; 209 - 210 - case IDOK: 211 - { 212 - DWORD Size = MAX_COMPUTERNAME_LENGTH + 1; 213 - TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 214 - TCHAR NewComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 215 - 216 - if (GetComputerName(ComputerName, &Size)) 416 + if (DialogBoxParam(hDllInstance, 417 + MAKEINTRESOURCE(IDD_PROPPAGEDNSANDNETBIOS), 418 + hDlg, 419 + DNSSuffixPropDlgProc, 420 + (LPARAM)pNetIdData)) 217 421 { 218 - if (GetWindowText(GetDlgItem(hDlg, 1002), 219 - NewComputerName, 220 - (MAX_COMPUTERNAME_LENGTH + 1))) 221 - { 222 - if (_tcscmp(ComputerName, NewComputerName) != 0) 223 - { 224 - if (!IsValidComputerName(NewComputerName)) 225 - { 226 - TCHAR szText[MAX_PATH], szMsgText[MAX_PATH]; 227 - 228 - LoadString(hDllInstance, 1030, szText, sizeof(szText) / sizeof(TCHAR)); 229 - 230 - swprintf(szMsgText, szText, NewComputerName); 231 - MessageBox(hDlg, szMsgText, NULL, MB_OK | MB_ICONERROR); 232 - SetFocus(GetDlgItem(hDlg, 1002)); 233 - break; 234 - } 235 - else if (!SetComputerNameExW(ComputerNamePhysicalDnsHostname, NewComputerName)) 236 - { 237 - TCHAR szMsgText[MAX_PATH]; 238 - 239 - LoadString(hDllInstance, 4001, szMsgText, sizeof(szMsgText) / sizeof(TCHAR)); 240 - 241 - MessageBox(hDlg, szMsgText, NULL, MB_OK | MB_ICONERROR); 242 - } 243 - else 244 - { 245 - TCHAR szMsgTitle[MAX_PATH], szMsgText[MAX_PATH]; 246 - 247 - LoadString(hDllInstance, 4000, szMsgTitle, sizeof(szMsgTitle) / sizeof(TCHAR)); 248 - LoadString(hDllInstance, 24, szMsgText, sizeof(szMsgText) / sizeof(TCHAR)); 249 - 250 - MessageBox(hDlg, szMsgText, szMsgTitle, MB_OK | MB_ICONINFORMATION); 251 - 252 - NetIDPageProc(GetParent(hDlg), WM_INITDIALOG, 0, 0); 253 - } 254 - } 255 - } 422 + UpdateFullComputerName(hDlg, 1001, pNetIdData); 423 + EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); 256 424 } 425 + break; 257 426 258 - EndDialog(hDlg, LOWORD(wParam)); 259 - } 260 - break; 427 + case IDOK: 428 + if (NetworkDlg_OnOK(hDlg, pNetIdData)) 429 + EndDialog(hDlg, TRUE); 430 + break; 261 431 262 432 case IDCANCEL: 263 - EndDialog(hDlg, LOWORD(wParam)); 433 + EndDialog(hDlg, FALSE); 264 434 break; 265 435 } 266 - } 267 - break; 436 + break; 268 437 } 269 438 270 439 return FALSE; ··· 273 442 static 274 443 VOID 275 444 NetIDPage_OnInitDialog( 276 - HWND hwndDlg) 445 + HWND hwndDlg, 446 + PNETIDDATA pNetIdData) 277 447 { 278 448 WCHAR ComputerDescription[MAX_COMPUTERDESCRIPTION_LENGTH + 1]; 279 - WCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 280 449 DWORD RegSize = sizeof(ComputerDescription); 281 - DWORD Size = MAX_COMPUTERNAME_LENGTH + 1; 282 450 HKEY KeyHandle; 283 451 LPWKSTA_INFO_101 wki; 284 452 LONG lError; ··· 306 474 } 307 475 308 476 RegCloseKey(KeyHandle); 309 - } 310 - 311 - if (GetComputerName(ComputerName, &Size)) 312 - { 313 - SetDlgItemText(hwndDlg, IDC_COMPUTERNAME, ComputerName); 314 477 } 315 478 316 479 if (NetWkstaGetInfo(NULL, 101, (LPBYTE*)&wki) == NERR_Success) ··· 383 546 IN WPARAM wParam, 384 547 IN LPARAM lParam) 385 548 { 386 - static BOOL bEnable = FALSE; 387 - INT_PTR Ret = 0; 549 + PNETIDDATA pNetIdData; 550 + 551 + pNetIdData = (PNETIDDATA)GetWindowLongPtr(hwndDlg, DWLP_USER); 388 552 389 553 switch (uMsg) 390 554 { 391 555 case WM_INITDIALOG: 392 - NetIDPage_OnInitDialog(hwndDlg); 393 - bEnable = TRUE; 394 - Ret = TRUE; 395 - break; 556 + pNetIdData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(NETIDDATA)); 557 + if (pNetIdData != NULL) 558 + { 559 + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pNetIdData); 560 + GetComputerNames(pNetIdData); 561 + SetFullComputerName(hwndDlg, IDC_COMPUTERNAME, pNetIdData); 562 + NetIDPage_OnInitDialog(hwndDlg, pNetIdData); 563 + pNetIdData->bEnable = TRUE; 564 + } 565 + return TRUE; 396 566 397 567 case WM_NOTIFY: 398 568 switch (((LPNMHDR)lParam)->code) ··· 407 577 switch (LOWORD(wParam)) 408 578 { 409 579 case IDC_COMPDESC: 410 - if (HIWORD(wParam) == EN_CHANGE && bEnable == TRUE) 580 + if (HIWORD(wParam) == EN_CHANGE && pNetIdData->bEnable == TRUE) 411 581 PropSheet_Changed(GetParent(hwndDlg), hwndDlg); 412 582 break; 413 583 414 584 case IDC_NETWORK_PROPERTY: 415 - DialogBox(hDllInstance, 416 - MAKEINTRESOURCE(IDD_PROPPAGECOMPNAMECHENGE), 417 - hwndDlg, 418 - NetworkPropDlgProc); 585 + if (DialogBoxParam(hDllInstance, 586 + MAKEINTRESOURCE(IDD_PROPPAGECOMPNAMECHENGE), 587 + hwndDlg, 588 + NetworkPropDlgProc, 589 + (LPARAM)pNetIdData)) 590 + { 591 + UpdateFullComputerName(hwndDlg, IDC_COMPUTERNAME, pNetIdData); 592 + } 419 593 break; 420 594 } 421 595 break; 596 + 597 + case WM_DESTROY: 598 + if (pNetIdData != NULL) 599 + { 600 + HeapFree(GetProcessHeap(), 0, pNetIdData); 601 + pNetIdData = NULL; 602 + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)NULL); 603 + } 604 + break; 422 605 } 423 606 424 - return Ret; 607 + return FALSE; 425 608 } 426 609 427 610 HPROPSHEETPAGE WINAPI