[WINLOGON]
authorEric Kohl <eric.kohl@reactos.org>
Mon, 13 Jan 2014 22:15:27 +0000 (22:15 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Mon, 13 Jan 2014 22:15:27 +0000 (22:15 +0000)
- Implement the STATE_LOCKED and STATE_LOCKED_SAS states and their transitions.

[MSGINA]
- Disable the logoff button of the security dialog if the AutoAdminLogon option is enabled.
- Implement the unlock computer dialog. The user name and password check is not implemented yet. Just press OK to unlock the computer.
- Simulate an SAS when the DisableCAD option is enabled and the computer is locked. The unlock dialog appears immediately.

svn path=/trunk/; revision=61622

reactos/base/system/winlogon/sas.c
reactos/base/system/winlogon/winlogon.h
reactos/dll/win32/msgina/gui.c
reactos/dll/win32/msgina/msgina.c

index e6612ce..708acd1 100644 (file)
@@ -861,6 +861,11 @@ DoGenericAction(
             {
                 Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
             }
+            else if (Session->LogonState == STATE_LOCKED_SAS)
+            {
+                Session->LogonState = STATE_LOCKED;
+                Session->Gina.Functions.WlxDisplayLockedNotice(Session->Gina.Context);
+            }
             break;
         case WLX_SAS_ACTION_LOCK_WKSTA: /* 0x03 */
             if (Session->Gina.Functions.WlxIsLockOk(Session->Gina.Context))
@@ -922,10 +927,12 @@ DispatchSAS(
     IN DWORD dwSasType)
 {
     DWORD wlxAction = WLX_SAS_ACTION_NONE;
+    HWND hwnd;
 
     /* Ignore SAS if we are already in an SAS state */
     if (Session->LogonState == STATE_LOGGED_OFF_SAS ||
-        Session->LogonState == STATE_LOGGED_ON_SAS)
+        Session->LogonState == STATE_LOGGED_ON_SAS ||
+        Session->LogonState == STATE_LOCKED_SAS)
         return;
 
     if (Session->LogonState == STATE_LOGGED_ON)
@@ -934,7 +941,16 @@ DispatchSAS(
         wlxAction = (DWORD)Session->Gina.Functions.WlxLoggedOnSAS(Session->Gina.Context, dwSasType, NULL);
     }
     else if (Session->LogonState == STATE_LOCKED)
+    {
+        hwnd = GetTopDialogWindow();
+        if (hwnd != NULL)
+        {
+            SendMessage(hwnd, WM_USER, 0, 0);
+        }
+
+        Session->LogonState = STATE_LOCKED_SAS;
         wlxAction = (DWORD)Session->Gina.Functions.WlxWkstaLockedSAS(Session->Gina.Context, dwSasType);
+    }
     else
     {
         /* Display a new dialog (if necessary) */
@@ -948,7 +964,6 @@ DispatchSAS(
             default:
             {
                 PSID LogonSid = NULL; /* FIXME */
-                HWND hwnd;
 
                 hwnd = GetTopDialogWindow();
                 if (hwnd != NULL)
index d489baa..2c45db9 100644 (file)
@@ -194,7 +194,7 @@ typedef enum _LOGON_STATE
     STATE_LOGGED_ON_SAS,
     STATE_SCREENSAVER,     // not used yet
     STATE_LOCKED,
-    STATE_LOCKED_SAS,      // not used yet
+    STATE_LOCKED_SAS,
     STATE_LOGGING_OFF,     // not used yet
     STATE_SHUTTING_DOWN,   // not used yet
     STATE_SHUT_DOWN        // not used yet
index 9609f06..7a4574a 100644 (file)
@@ -282,6 +282,9 @@ OnInitSecurityDlg(HWND hwnd,
     wsprintfW(Buffer4, Buffer1, Buffer2, Buffer3);
 
     SetDlgItemTextW(hwnd, IDC_LOGONDATE, Buffer4);
+
+    if (pgContext->bAutoAdminLogon == TRUE)
+        EnableWindow(GetDlgItem(hwnd, IDC_LOGOFF), FALSE);
 }
 
 
@@ -518,16 +521,109 @@ GUILoggedOutSAS(
     return WLX_SAS_ACTION_NONE;
 }
 
+
+static
+INT_PTR
+CALLBACK
+UnlockWindowProc(
+    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:
+            pgContext = (PGINA_CONTEXT)lParam;
+            SetWindowLongPtr(hwndDlg, GWL_USERDATA, (DWORD_PTR)pgContext);
+
+            if (pgContext->bDisableCAD == TRUE)
+                EnableWindow(GetDlgItem(hwndDlg, IDCANCEL), FALSE);
+
+            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:
+                {
+#if 0
+                    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);
+#endif
+                    EndDialog(hwndDlg, WLX_SAS_ACTION_UNLOCK_WKSTA);
+                    return TRUE;
+                }
+
+                case IDCANCEL:
+                    EndDialog(hwndDlg, WLX_SAS_ACTION_NONE);
+                    return TRUE;
+            }
+            break;
+    }
+
+    return FALSE;
+}
+
+
 static INT
 GUILockedSAS(
     IN OUT PGINA_CONTEXT pgContext)
 {
+    int result;
+
     TRACE("GUILockedSAS()\n");
 
-    UNREFERENCED_PARAMETER(pgContext);
+    result = pgContext->pWlxFuncs->WlxDialogBoxParam(
+        pgContext->hWlx,
+        pgContext->hDllInstance,
+        MAKEINTRESOURCEW(IDD_UNLOCK_DLG),
+        GetDesktopWindow(),
+        UnlockWindowProc,
+        (LPARAM)pgContext);
+    if (result >= WLX_SAS_ACTION_LOGON &&
+        result <= WLX_SAS_ACTION_SWITCH_CONSOLE)
+    {
+        WARN("GUILockedSAS() returns 0x%x\n", result);
+        return result;
+    }
 
-    UNIMPLEMENTED;
-    return WLX_SAS_ACTION_UNLOCK_WKSTA;
+    WARN("GUILockedSAS() failed (0x%x)\n", result);
+    return WLX_SAS_ACTION_NONE;
 }
 
 
index e898dd9..def10e8 100644 (file)
@@ -819,8 +819,6 @@ WlxDisplaySASNotice(
     else
         pgContext->AutoLogonState = AUTOLOGON_DISABLED;
 
-TRACE("pgContext->bDisableCAD: %lu\n", pgContext->bDisableCAD);
-
     if (pgContext->bDisableCAD == TRUE)
     {
         pgContext->pWlxFuncs->WlxSasNotify(pgContext->hWlx, WLX_SAS_TYPE_CTRL_ALT_DEL);
@@ -902,6 +900,12 @@ WlxDisplayLockedNotice(PVOID pWlxContext)
 
     TRACE("WlxDisplayLockedNotice()\n");
 
+    if (pgContext->bDisableCAD == TRUE)
+    {
+        pgContext->pWlxFuncs->WlxSasNotify(pgContext->hWlx, WLX_SAS_TYPE_CTRL_ALT_DEL);
+        return;
+    }
+
     pGinaUI->DisplayLockedNotice(pgContext);
 }