https://git.reactos.org/?p=reactos.git;a=commitdiff;h=0d308f4b6e6b64d0ecb37d825165531350fef857

commit 0d308f4b6e6b64d0ecb37d825165531350fef857
Author:     Eric Kohl <[email protected]>
AuthorDate: Mon May 21 16:29:02 2018 +0200
Commit:     Eric Kohl <[email protected]>
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;

Reply via email to