static INT TUILoggedOutSAS( IN OUT PGINA_CONTEXT pgContext) { WCHAR UserName[256]; WCHAR Password[256]; NTSTATUS Status; NTSTATUS SubStatus = STATUS_SUCCESS; TRACE("TUILoggedOutSAS()\n"); /* Ask the user for credentials */ if (!ReadString(IDS_ASKFORUSER, UserName, _countof(UserName), TRUE)) return WLX_SAS_ACTION_NONE; if (!ReadString(IDS_ASKFORPASSWORD, Password, _countof(Password), FALSE)) return WLX_SAS_ACTION_NONE; Status = DoLoginTasks(pgContext, UserName, NULL, Password, &SubStatus); if (Status == STATUS_SUCCESS) { if (CreateProfile(pgContext, UserName, NULL, Password)) return WLX_SAS_ACTION_LOGON; } return WLX_SAS_ACTION_NONE; }
static INT TUILoggedOutSAS( IN OUT PGINA_CONTEXT pgContext) { WCHAR UserName[256]; WCHAR Password[256]; TRACE("TUILoggedOutSAS()\n"); /* Ask the user for credentials */ if (!ReadString(IDS_ASKFORUSER, UserName, 256, TRUE)) return WLX_SAS_ACTION_NONE; if (!ReadString(IDS_ASKFORPASSWORD, Password, 256, FALSE)) return WLX_SAS_ACTION_NONE; if (DoLoginTasks(pgContext, UserName, NULL, Password)) return WLX_SAS_ACTION_LOGON; else return WLX_SAS_ACTION_NONE; }
static INT_PTR CALLBACK LoggedOutWindowProc( IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam) { PGINA_CONTEXT pgContext; pgContext = (PGINA_CONTEXT)GetWindowLongPtr(hwndDlg, GWL_USERDATA); switch (uMsg) { case WM_INITDIALOG: { /* FIXME: take care of DontDisplayLastUserName, NoDomainUI, ShutdownWithoutLogon */ pgContext = (PGINA_CONTEXT)lParam; SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)pgContext); SetFocus(GetDlgItem(hwndDlg, IDC_USERNAME)); pgContext->hBitmap = LoadImage(hDllInstance, MAKEINTRESOURCE(IDI_ROSLOGO), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR); return TRUE; } case WM_PAINT: { PAINTSTRUCT ps; HDC hdc; if (pgContext->hBitmap) { hdc = BeginPaint(hwndDlg, &ps); DrawStateW(hdc, NULL, NULL, (LPARAM)pgContext->hBitmap, (WPARAM)0, 0, 0, 0, 0, DST_BITMAP); EndPaint(hwndDlg, &ps); } return TRUE; } case WM_DESTROY: { DeleteObject(pgContext->hBitmap); return TRUE; } case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: { LPWSTR UserName = NULL, Password = NULL; INT result = WLX_SAS_ACTION_NONE; if (GetTextboxText(hwndDlg, IDC_USERNAME, &UserName) && *UserName == '\0') break; if (GetTextboxText(hwndDlg, IDC_PASSWORD, &Password) && DoLoginTasks(pgContext, UserName, NULL, Password)) { result = WLX_SAS_ACTION_LOGON; } HeapFree(GetProcessHeap(), 0, UserName); HeapFree(GetProcessHeap(), 0, Password); EndDialog(hwndDlg, result); return TRUE; } case IDCANCEL: { EndDialog(hwndDlg, WLX_SAS_ACTION_NONE); return TRUE; } case IDC_SHUTDOWN: { EndDialog(hwndDlg, WLX_SAS_ACTION_SHUTDOWN); return TRUE; } } break; } } return FALSE; }
static BOOL DoLogon( IN HWND hwndDlg, IN OUT PGINA_CONTEXT pgContext) { LPWSTR UserName = NULL; LPWSTR Password = NULL; LPWSTR Domain = NULL; BOOL result = FALSE; NTSTATUS Status, SubStatus = STATUS_SUCCESS; if (GetTextboxText(hwndDlg, IDC_USERNAME, &UserName) && *UserName == '\0') goto done; if (GetTextboxText(hwndDlg, IDC_LOGON_TO, &Domain) && *Domain == '\0') goto done; if (!GetTextboxText(hwndDlg, IDC_PASSWORD, &Password)) goto done; Status = DoLoginTasks(pgContext, UserName, Domain, Password, &SubStatus); if (Status == STATUS_LOGON_FAILURE) { ResourceMessageBox(pgContext, hwndDlg, MB_OK | MB_ICONEXCLAMATION, IDS_LOGONTITLE, IDS_LOGONWRONGUSERORPWD); goto done; } else if (Status == STATUS_ACCOUNT_RESTRICTION) { TRACE("DoLoginTasks failed! Status 0x%08lx SubStatus 0x%08lx\n", Status, SubStatus); if (SubStatus == STATUS_ACCOUNT_DISABLED) { ResourceMessageBox(pgContext, hwndDlg, MB_OK | MB_ICONEXCLAMATION, IDS_LOGONTITLE, IDS_LOGONUSERDISABLED); goto done; } else if (SubStatus == STATUS_ACCOUNT_LOCKED_OUT) { TRACE("Account locked!\n"); pgContext->pWlxFuncs->WlxMessageBox(pgContext->hWlx, hwndDlg, L"Account locked!", L"Logon error", MB_OK | MB_ICONERROR); goto done; } else if ((SubStatus == STATUS_PASSWORD_MUST_CHANGE) || (SubStatus == STATUS_PASSWORD_EXPIRED)) { if (SubStatus == STATUS_PASSWORD_MUST_CHANGE) ResourceMessageBox(pgContext, hwndDlg, MB_OK | MB_ICONSTOP, IDS_LOGONTITLE, IDS_PASSWORDMUSTCHANGE); else ResourceMessageBox(pgContext, hwndDlg, MB_OK | MB_ICONSTOP, IDS_LOGONTITLE, IDS_PASSWORDEXPIRED); if (!OnChangePassword(hwndDlg, pgContext)) goto done; Status = DoLoginTasks(pgContext, pgContext->UserName, pgContext->Domain, pgContext->Password, &SubStatus); if (!NT_SUCCESS(Status)) { TRACE("Login after password change failed! (Status 0x%08lx)\n", Status); goto done; } } else { TRACE("Other error!\n"); pgContext->pWlxFuncs->WlxMessageBox(pgContext->hWlx, hwndDlg, L"Other error!", L"Logon error", MB_OK | MB_ICONERROR); goto done; } } else if (!NT_SUCCESS(Status)) { TRACE("DoLoginTasks failed! Status 0x%08lx\n", Status); goto done; } if (!CreateProfile(pgContext, UserName, Domain, Password)) { ERR("Failed to create the profile!\n"); goto done; } ZeroMemory(pgContext->Password, 256 * sizeof(WCHAR)); wcscpy(pgContext->Password, Password); result = TRUE; done: if (UserName != NULL) HeapFree(GetProcessHeap(), 0, UserName); if (Password != NULL) HeapFree(GetProcessHeap(), 0, Password); if (Domain != NULL) HeapFree(GetProcessHeap(), 0, Domain); return result; }
static BOOL DoAutoLogon( IN PGINA_CONTEXT pgContext) { HKEY WinLogonKey = NULL; LPWSTR AutoLogon = NULL; LPWSTR AutoCount = NULL; LPWSTR IgnoreShiftOverride = NULL; LPWSTR UserName = NULL; LPWSTR DomainName = NULL; LPWSTR Password = NULL; BOOL result = FALSE; LONG rc; TRACE("DoAutoLogon(): AutoLogonState = %lu\n", pgContext->AutoLogonState); if (pgContext->AutoLogonState == AUTOLOGON_DISABLED) return FALSE; rc = RegOpenKeyExW( HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\WinLogon", 0, KEY_QUERY_VALUE, &WinLogonKey); if (rc != ERROR_SUCCESS) goto cleanup; if (pgContext->AutoLogonState == AUTOLOGON_CHECK_REGISTRY) { /* Set it by default to disabled, we might reenable it again later */ pgContext->AutoLogonState = AUTOLOGON_DISABLED; rc = ReadRegSzKey(WinLogonKey, L"AutoAdminLogon", &AutoLogon); if (rc != ERROR_SUCCESS) goto cleanup; if (wcscmp(AutoLogon, L"1") != 0) goto cleanup; rc = ReadRegSzKey(WinLogonKey, L"AutoLogonCount", &AutoCount); if (rc == ERROR_SUCCESS && wcscmp(AutoCount, L"0") == 0) goto cleanup; else if (rc != ERROR_FILE_NOT_FOUND) goto cleanup; rc = ReadRegSzKey(WinLogonKey, L"IgnoreShiftOverride", &UserName); if (rc == ERROR_SUCCESS) { if (wcscmp(AutoLogon, L"1") != 0 && GetKeyState(VK_SHIFT) < 0) goto cleanup; } else if (GetKeyState(VK_SHIFT) < 0) { /* User pressed SHIFT */ goto cleanup; } pgContext->AutoLogonState = AUTOLOGON_ONCE; result = TRUE; } else /* pgContext->AutoLogonState == AUTOLOGON_ONCE */ { pgContext->AutoLogonState = AUTOLOGON_DISABLED; rc = ReadRegSzKey(WinLogonKey, L"DefaultUserName", &UserName); if (rc != ERROR_SUCCESS) goto cleanup; rc = ReadRegSzKey(WinLogonKey, L"DefaultDomainName", &DomainName); if (rc != ERROR_SUCCESS && rc != ERROR_FILE_NOT_FOUND) goto cleanup; rc = ReadRegSzKey(WinLogonKey, L"DefaultPassword", &Password); if (rc != ERROR_SUCCESS) goto cleanup; result = DoLoginTasks(pgContext, UserName, DomainName, Password); } cleanup: if (WinLogonKey != NULL) RegCloseKey(WinLogonKey); HeapFree(GetProcessHeap(), 0, AutoLogon); HeapFree(GetProcessHeap(), 0, AutoCount); HeapFree(GetProcessHeap(), 0, IgnoreShiftOverride); HeapFree(GetProcessHeap(), 0, UserName); HeapFree(GetProcessHeap(), 0, DomainName); HeapFree(GetProcessHeap(), 0, Password); TRACE("DoAutoLogon(): AutoLogonState = %lu, returning %d\n", pgContext->AutoLogonState, result); return result; }