https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0d308f4b6e6b64d0ecb37…
commit 0d308f4b6e6b64d0ecb37d825165531350fef857
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Mon May 21 16:29:02 2018 +0200
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Mon May 21 16:29:02 2018 +0200
[MSGINA] Simplify the auto logon code path
- Get rid of DoAutoLogon() and the AutoLogonState variable.
- Handle the auto logon in the normal logon code path instead.
- Set bAutoAdminLogon to FALSE on a successful login. This will prevent another
automatic logon after a logoff.
- The IgnoreShiftOverride feature got lost by this change but I will add it again.
---
dll/win32/msgina/gui.c | 16 ++++--
dll/win32/msgina/msgina.c | 131 +++-------------------------------------------
dll/win32/msgina/msgina.h | 1 -
3 files changed, 21 insertions(+), 127 deletions(-)
diff --git a/dll/win32/msgina/gui.c b/dll/win32/msgina/gui.c
index 6d0840c368..46110df992 100644
--- a/dll/win32/msgina/gui.c
+++ b/dll/win32/msgina/gui.c
@@ -873,6 +873,8 @@ DoLogon(
ZeroMemory(pgContext->Password, sizeof(pgContext->Password));
wcscpy(pgContext->Password, Password);
+ pgContext->bAutoAdminLogon = FALSE;
+
result = TRUE;
done:
@@ -944,21 +946,29 @@ LoggedOutWindowProc(
pgContext = (PGINA_CONTEXT)lParam;
SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)pgContext);
- if (!pgContext->bDontDisplayLastUserName)
+ if (pgContext->bAutoAdminLogon ||
+ !pgContext->bDontDisplayLastUserName)
SetDlgItemTextW(hwndDlg, IDC_USERNAME, pgContext->UserName);
+ if (pgContext->bAutoAdminLogon)
+ SetDlgItemTextW(hwndDlg, IDC_PASSWORD, pgContext->Password);
+
+ SetDomainComboBox(GetDlgItem(hwndDlg, IDC_LOGON_TO), pgContext);
+
if (pgContext->bDisableCAD)
EnableWindow(GetDlgItem(hwndDlg, IDCANCEL), FALSE);
if (!pgContext->bShutdownWithoutLogon)
EnableWindow(GetDlgItem(hwndDlg, IDC_SHUTDOWN), FALSE);
- SetDomainComboBox(GetDlgItem(hwndDlg, IDC_LOGON_TO), pgContext);
-
SetFocus(GetDlgItem(hwndDlg, pgContext->bDontDisplayLastUserName ?
IDC_USERNAME : IDC_PASSWORD));
/* Draw the logo bitmap */
pgContext->hBitmap = LoadImageW(pgContext->hDllInstance,
MAKEINTRESOURCEW(IDI_ROSLOGO), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
+
+ if (pgContext->bAutoAdminLogon)
+ PostMessage(GetDlgItem(hwndDlg, IDOK), BM_CLICK, 0, 0);
+
return TRUE;
}
diff --git a/dll/win32/msgina/msgina.c b/dll/win32/msgina/msgina.c
index 013c8bce44..8772df7dc1 100644
--- a/dll/win32/msgina/msgina.c
+++ b/dll/win32/msgina/msgina.c
@@ -242,6 +242,14 @@ GetRegistrySettings(PGINA_CONTEXT pgContext)
(LPBYTE)&pgContext->Domain,
&dwSize);
+ dwSize = sizeof(pgContext->Password);
+ rc = RegQueryValueExW(hKey,
+ L"DefaultPassword",
+ NULL,
+ NULL,
+ (LPBYTE)&pgContext->Password,
+ &dwSize);
+
if (lpShutdownWithoutLogon != NULL)
HeapFree(GetProcessHeap(), 0, lpShutdownWithoutLogon);
@@ -333,9 +341,6 @@ WlxInitialize(
/* Locates the authentication package */
//LsaRegisterLogonProcess(...);
- /* Check autologon settings the first time */
- pgContext->AutoLogonState = AUTOLOGON_CHECK_REGISTRY;
-
pgContext->nShutdownAction = WLX_SAS_ACTION_SHUTDOWN_POWER_OFF;
ChooseGinaUI();
@@ -868,115 +873,6 @@ cleanup:
}
-static BOOL
-DoAutoLogon(
- IN PGINA_CONTEXT pgContext)
-{
- HKEY WinLogonKey = NULL;
- LPWSTR AutoLogon = NULL;
- LPWSTR AutoCount = NULL;
- LPWSTR IgnoreShiftOverride = NULL;
- LPWSTR UserName = NULL;
- LPWSTR Domain = NULL;
- LPWSTR Password = NULL;
- BOOL result = FALSE;
- LONG rc;
- NTSTATUS Status;
- NTSTATUS SubStatus = STATUS_SUCCESS;
-
- 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 = ReadRegSzValue(WinLogonKey, L"AutoAdminLogon", &AutoLogon);
- if (rc != ERROR_SUCCESS)
- goto cleanup;
- if (wcscmp(AutoLogon, L"1") != 0)
- goto cleanup;
-
- rc = ReadRegSzValue(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 = ReadRegSzValue(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 = ReadRegSzValue(WinLogonKey, L"DefaultUserName", &UserName);
- if (rc != ERROR_SUCCESS)
- goto cleanup;
- rc = ReadRegSzValue(WinLogonKey, L"DefaultDomain", &Domain);
- if (rc != ERROR_SUCCESS && rc != ERROR_FILE_NOT_FOUND)
- goto cleanup;
- rc = ReadRegSzValue(WinLogonKey, L"DefaultPassword", &Password);
- if (rc != ERROR_SUCCESS)
- goto cleanup;
-
- Status = DoLoginTasks(pgContext, UserName, Domain, Password, &SubStatus);
- if (!NT_SUCCESS(Status))
- {
- /* FIXME: Handle errors!!! */
- result = FALSE;
- goto cleanup;
- }
-
- result = CreateProfile(pgContext, UserName, Domain, Password);
- if (result)
- {
- ZeroMemory(pgContext->Password, sizeof(pgContext->Password));
- wcscpy(pgContext->Password, Password);
-
- NotifyBootConfigStatus(TRUE);
- }
- }
-
-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, Domain);
- HeapFree(GetProcessHeap(), 0, Password);
- TRACE("DoAutoLogon(): AutoLogonState = %lu, returning %d\n",
- pgContext->AutoLogonState, result);
- return result;
-}
-
/*
* @implemented
*/
@@ -998,12 +894,9 @@ WlxDisplaySASNotice(
if (pgContext->bAutoAdminLogon)
{
/* Don't display the window, we want to do an automatic logon */
- pgContext->AutoLogonState = AUTOLOGON_ONCE;
pgContext->pWlxFuncs->WlxSasNotify(pgContext->hWlx,
WLX_SAS_TYPE_CTRL_ALT_DEL);
return;
}
- else
- pgContext->AutoLogonState = AUTOLOGON_DISABLED;
if (pgContext->bDisableCAD)
{
@@ -1043,14 +936,6 @@ WlxLoggedOutSAS(
pgContext->pMprNotifyInfo = pMprNotifyInfo;
pgContext->pProfile = pProfile;
- if (0 == GetSystemMetrics(SM_REMOTESESSION) &&
- DoAutoLogon(pgContext))
- {
- /* User is local and registry contains information
- * to log on him automatically */
- *phToken = pgContext->UserToken;
- return WLX_SAS_ACTION_LOGON;
- }
res = pGinaUI->LoggedOutSAS(pgContext);
*phToken = pgContext->UserToken;
diff --git a/dll/win32/msgina/msgina.h b/dll/win32/msgina/msgina.h
index 44ea5c3d02..38c975eb89 100644
--- a/dll/win32/msgina/msgina.h
+++ b/dll/win32/msgina/msgina.h
@@ -42,7 +42,6 @@ typedef struct
HWND hStatusWindow;
HANDLE LsaHandle;
ULONG AuthenticationPackage;
- DWORD AutoLogonState;
BOOL bDisableCAD;
BOOL bAutoAdminLogon;
BOOL bDontDisplayLastUserName;