1 /* 2 * PROJECT: ReactOS System Control Panel Applet 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: dll/win32/netid/netid.c 5 * PURPOSE: Network ID Page 6 * COPYRIGHT: Thomas Weidenmueller <w3seek@reactos.org> 7 * Dmitry Chapyshev <dmitry@reactos.org> 8 * 9 */ 10 11 #define WIN32_NO_STATUS 12 #include <stdarg.h> 13 #include <windef.h> 14 #include <winbase.h> 15 #include <winuser.h> 16 #include <tchar.h> 17 #include <lm.h> 18 #include <prsht.h> 19 20 #include "resource.h" 21 22 static INT_PTR CALLBACK 23 NetIDPageProc(IN HWND hwndDlg, 24 IN UINT uMsg, 25 IN WPARAM wParam, 26 IN LPARAM lParam); 27 28 static HINSTANCE hDllInstance; 29 30 31 static 32 INT_PTR CALLBACK 33 DNSSuffixPropDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) 34 { 35 switch (Msg) 36 { 37 case WM_COMMAND: 38 { 39 switch (LOWORD(wParam)) 40 { 41 case IDCANCEL: 42 case IDOK: 43 EndDialog(hDlg, LOWORD(wParam)); 44 break; 45 } 46 } 47 break; 48 } 49 50 return FALSE; 51 } 52 53 static VOID 54 SetRadioBtnState(HWND hDlg, BOOL IsDomain) 55 { 56 SendDlgItemMessage(hDlg, 1008, BM_SETCHECK, (WPARAM)IsDomain, 0); 57 SendDlgItemMessage(hDlg, 1004, BM_SETCHECK, (WPARAM)!IsDomain, 0); 58 EnableWindow(GetDlgItem(hDlg, 116), IsDomain); 59 EnableWindow(GetDlgItem(hDlg, 1007), !IsDomain); 60 } 61 62 static VOID 63 DisableControls(HWND hDlg) 64 { 65 EnableWindow(GetDlgItem(hDlg, 1008), FALSE); 66 EnableWindow(GetDlgItem(hDlg, 1004), FALSE); 67 EnableWindow(GetDlgItem(hDlg, 116), FALSE); 68 EnableWindow(GetDlgItem(hDlg, 1007), FALSE); 69 } 70 71 static 72 BOOL 73 IsValidComputerName(LPCWSTR s) 74 { 75 int i; 76 77 for (i = 0; i <= wcslen(s); i++) 78 { 79 if (s[i] == L'!' || s[i] == L'@' || s[i] == L'#' || s[i] == L'$' 80 || s[i] == L'^' || s[i] == L'&' || s[i] == L'\\' || s[i] == L'|' 81 || s[i] == L')' || s[i] == L'(' || s[i] == L'{' || s[i] == L'"' 82 || s[i] == L'}' || s[i] == L'~' || s[i] == L'/' || s[i] == L'\'' 83 || s[i] == L'=' || s[i] == L':' || s[i] == L';' || s[i] == L'+' 84 || s[i] == L'<' || s[i] == L'>' || s[i] == L'?' || s[i] == L'[' 85 || s[i] == L']' || s[i] == L'`' || s[i] == L'%' || s[i] == L'_' 86 || s[i] == L'.') 87 return FALSE; 88 } 89 90 return TRUE; 91 } 92 93 static 94 INT_PTR CALLBACK 95 NetworkPropDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) 96 { 97 switch (Msg) 98 { 99 case WM_INITDIALOG: 100 { 101 LPWKSTA_INFO_101 wki = NULL; 102 DWORD Size = MAX_COMPUTERNAME_LENGTH + 1; 103 TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 104 TCHAR MsgText[MAX_PATH * 2]; 105 LPWSTR JoinName; 106 NETSETUP_JOIN_STATUS JoinStatus; 107 108 if (LoadString(hDllInstance, 25, MsgText, sizeof(MsgText) / sizeof(TCHAR))) 109 SetDlgItemText(hDlg, 1017, MsgText); 110 111 SendMessage(GetDlgItem(hDlg, 1002), EM_SETLIMITTEXT, MAX_COMPUTERNAME_LENGTH, 0); 112 113 if (GetComputerName(ComputerName, &Size)) 114 { 115 SetDlgItemText(hDlg, 1002, ComputerName); 116 SetDlgItemText(hDlg, 1001, ComputerName); 117 } 118 119 if (NetGetJoinInformation(NULL, &JoinName, &JoinStatus) != NERR_Success) 120 { 121 SetRadioBtnState(hDlg, FALSE); 122 123 if (NetWkstaGetInfo(NULL, 124 101, 125 (LPBYTE*)&wki) == NERR_Success) 126 { 127 SetDlgItemText(hDlg, 128 1007, 129 wki->wki101_langroup); 130 } 131 else DisableControls(hDlg); 132 133 if (wki) NetApiBufferFree(wki); 134 } 135 else 136 { 137 switch (JoinStatus) 138 { 139 case NetSetupDomainName: 140 SetDlgItemText(hDlg, 116, JoinName); 141 SetRadioBtnState(hDlg, TRUE); 142 break; 143 144 case NetSetupWorkgroupName: 145 SetDlgItemText(hDlg, 1007, JoinName); 146 SetRadioBtnState(hDlg, FALSE); 147 break; 148 149 case NetSetupUnjoined: 150 break; 151 152 case NetSetupUnknownStatus: 153 default: 154 { 155 SetRadioBtnState(hDlg, FALSE); 156 157 if (NetWkstaGetInfo(NULL, 158 101, 159 (LPBYTE*)&wki) == NERR_Success) 160 { 161 SetDlgItemText(hDlg, 162 1007, 163 wki->wki101_langroup); 164 } 165 else DisableControls(hDlg); 166 167 if (wki) NetApiBufferFree(wki); 168 break; 169 } 170 } 171 172 if (JoinName) NetApiBufferFree(JoinName); 173 } 174 } 175 break; 176 177 case WM_COMMAND: 178 { 179 switch (LOWORD(wParam)) 180 { 181 case 1002: 182 if (HIWORD(wParam) == EN_CHANGE) 183 { 184 TCHAR szText[MAX_COMPUTERNAME_LENGTH + 1]; 185 186 GetWindowText(GetDlgItem(hDlg, 1002), szText, MAX_COMPUTERNAME_LENGTH + 1); 187 SetDlgItemText(hDlg, 1001, szText); 188 } 189 break; 190 191 case 1008: /* Domain radio button */ 192 case 1004: /* Workgroup radio button */ 193 if (SendDlgItemMessage(hDlg, 1008, BM_GETCHECK, 0, 0) == BST_CHECKED) 194 SetRadioBtnState(hDlg, TRUE); 195 else 196 SetRadioBtnState(hDlg, FALSE); 197 break; 198 199 case 1003: 200 DialogBox(hDllInstance, 201 MAKEINTRESOURCE(IDD_PROPPAGEDNSANDNETBIOS), 202 hDlg, 203 DNSSuffixPropDlgProc); 204 break; 205 206 case IDOK: 207 { 208 DWORD Size = MAX_COMPUTERNAME_LENGTH + 1; 209 TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 210 TCHAR NewComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 211 212 if (GetComputerName(ComputerName, &Size)) 213 { 214 if (GetWindowText(GetDlgItem(hDlg, 1002), 215 NewComputerName, 216 (MAX_COMPUTERNAME_LENGTH + 1))) 217 { 218 if (_tcscmp(ComputerName, NewComputerName) != 0) 219 { 220 if (!IsValidComputerName(NewComputerName)) 221 { 222 TCHAR szText[MAX_PATH], szMsgText[MAX_PATH]; 223 224 LoadString(hDllInstance, 1030, szText, sizeof(szText) / sizeof(TCHAR)); 225 226 swprintf(szMsgText, szText, NewComputerName); 227 MessageBox(hDlg, szMsgText, NULL, MB_OK | MB_ICONERROR); 228 SetFocus(GetDlgItem(hDlg, 1002)); 229 break; 230 } 231 else if (!SetComputerName(NewComputerName)) 232 { 233 TCHAR szMsgText[MAX_PATH]; 234 235 LoadString(hDllInstance, 4001, szMsgText, sizeof(szMsgText) / sizeof(TCHAR)); 236 237 MessageBox(hDlg, szMsgText, NULL, MB_OK | MB_ICONERROR); 238 } 239 else 240 { 241 TCHAR szMsgTitle[MAX_PATH], szMsgText[MAX_PATH]; 242 243 LoadString(hDllInstance, 4000, szMsgTitle, sizeof(szMsgTitle) / sizeof(TCHAR)); 244 LoadString(hDllInstance, 24, szMsgText, sizeof(szMsgText) / sizeof(TCHAR)); 245 246 MessageBox(hDlg, szMsgText, szMsgTitle, MB_OK | MB_ICONINFORMATION); 247 248 NetIDPageProc(GetParent(hDlg), WM_INITDIALOG, 0, 0); 249 } 250 } 251 } 252 } 253 254 EndDialog(hDlg, LOWORD(wParam)); 255 } 256 break; 257 258 case IDCANCEL: 259 EndDialog(hDlg, LOWORD(wParam)); 260 break; 261 } 262 } 263 break; 264 } 265 266 return FALSE; 267 } 268 269 static INT_PTR CALLBACK 270 NetIDPageProc(IN HWND hwndDlg, 271 IN UINT uMsg, 272 IN WPARAM wParam, 273 IN LPARAM lParam) 274 { 275 INT_PTR Ret = 0; 276 277 UNREFERENCED_PARAMETER(lParam); 278 279 switch (uMsg) 280 { 281 case WM_INITDIALOG: 282 { 283 /* Display computer name */ 284 LPWKSTA_INFO_101 wki = NULL; 285 DWORD Size = MAX_COMPUTERNAME_LENGTH + 1; 286 TCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1]; 287 if (GetComputerName(ComputerName,&Size)) 288 { 289 SetDlgItemText(hwndDlg, 290 IDC_COMPUTERNAME, 291 ComputerName); 292 } 293 if (NetWkstaGetInfo(NULL, 294 101, 295 (LPBYTE*)&wki) == NERR_Success) 296 { 297 SetDlgItemText(hwndDlg, 298 IDC_WORKGROUPDOMAIN_NAME, 299 wki->wki101_langroup); 300 } 301 302 if (wki) NetApiBufferFree(wki); 303 304 Ret = TRUE; 305 break; 306 } 307 308 case WM_COMMAND: 309 switch (LOWORD(wParam)) 310 { 311 case IDC_NETWORK_PROPERTY: 312 DialogBox(hDllInstance, 313 MAKEINTRESOURCE(IDD_PROPPAGECOMPNAMECHENGE), 314 hwndDlg, 315 NetworkPropDlgProc); 316 break; 317 } 318 break; 319 } 320 321 return Ret; 322 } 323 324 HPROPSHEETPAGE WINAPI 325 CreateNetIDPropertyPage(VOID) 326 { 327 PROPSHEETPAGE psp = {0}; 328 329 psp.dwSize = sizeof(psp); 330 psp.dwFlags = PSP_DEFAULT; 331 psp.hInstance = hDllInstance; 332 psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPPAGECOMPUTER); 333 psp.pfnDlgProc = NetIDPageProc; 334 335 return CreatePropertySheetPage(&psp); 336 } 337 338 BOOL WINAPI 339 DllMain(IN HINSTANCE hinstDLL, 340 IN DWORD dwReason, 341 IN LPVOID lpvReserved) 342 { 343 switch (dwReason) 344 { 345 case DLL_PROCESS_ATTACH: 346 hDllInstance = hinstDLL; 347 DisableThreadLibraryCalls(hinstDLL); 348 break; 349 } 350 351 return TRUE; 352 } 353