mirror of
https://github.com/reactos/reactos.git
synced 2025-07-27 20:02:18 +00:00
[WINLOGON]
- 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
This commit is contained in:
parent
2a380017c9
commit
c633b79451
4 changed files with 123 additions and 8 deletions
|
@ -861,6 +861,11 @@ DoGenericAction(
|
||||||
{
|
{
|
||||||
Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
|
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;
|
break;
|
||||||
case WLX_SAS_ACTION_LOCK_WKSTA: /* 0x03 */
|
case WLX_SAS_ACTION_LOCK_WKSTA: /* 0x03 */
|
||||||
if (Session->Gina.Functions.WlxIsLockOk(Session->Gina.Context))
|
if (Session->Gina.Functions.WlxIsLockOk(Session->Gina.Context))
|
||||||
|
@ -922,10 +927,12 @@ DispatchSAS(
|
||||||
IN DWORD dwSasType)
|
IN DWORD dwSasType)
|
||||||
{
|
{
|
||||||
DWORD wlxAction = WLX_SAS_ACTION_NONE;
|
DWORD wlxAction = WLX_SAS_ACTION_NONE;
|
||||||
|
HWND hwnd;
|
||||||
|
|
||||||
/* Ignore SAS if we are already in an SAS state */
|
/* Ignore SAS if we are already in an SAS state */
|
||||||
if (Session->LogonState == STATE_LOGGED_OFF_SAS ||
|
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;
|
return;
|
||||||
|
|
||||||
if (Session->LogonState == STATE_LOGGED_ON)
|
if (Session->LogonState == STATE_LOGGED_ON)
|
||||||
|
@ -934,7 +941,16 @@ DispatchSAS(
|
||||||
wlxAction = (DWORD)Session->Gina.Functions.WlxLoggedOnSAS(Session->Gina.Context, dwSasType, NULL);
|
wlxAction = (DWORD)Session->Gina.Functions.WlxLoggedOnSAS(Session->Gina.Context, dwSasType, NULL);
|
||||||
}
|
}
|
||||||
else if (Session->LogonState == STATE_LOCKED)
|
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);
|
wlxAction = (DWORD)Session->Gina.Functions.WlxWkstaLockedSAS(Session->Gina.Context, dwSasType);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Display a new dialog (if necessary) */
|
/* Display a new dialog (if necessary) */
|
||||||
|
@ -948,7 +964,6 @@ DispatchSAS(
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
PSID LogonSid = NULL; /* FIXME */
|
PSID LogonSid = NULL; /* FIXME */
|
||||||
HWND hwnd;
|
|
||||||
|
|
||||||
hwnd = GetTopDialogWindow();
|
hwnd = GetTopDialogWindow();
|
||||||
if (hwnd != NULL)
|
if (hwnd != NULL)
|
||||||
|
|
|
@ -194,7 +194,7 @@ typedef enum _LOGON_STATE
|
||||||
STATE_LOGGED_ON_SAS,
|
STATE_LOGGED_ON_SAS,
|
||||||
STATE_SCREENSAVER, // not used yet
|
STATE_SCREENSAVER, // not used yet
|
||||||
STATE_LOCKED,
|
STATE_LOCKED,
|
||||||
STATE_LOCKED_SAS, // not used yet
|
STATE_LOCKED_SAS,
|
||||||
STATE_LOGGING_OFF, // not used yet
|
STATE_LOGGING_OFF, // not used yet
|
||||||
STATE_SHUTTING_DOWN, // not used yet
|
STATE_SHUTTING_DOWN, // not used yet
|
||||||
STATE_SHUT_DOWN // not used yet
|
STATE_SHUT_DOWN // not used yet
|
||||||
|
|
|
@ -282,6 +282,9 @@ OnInitSecurityDlg(HWND hwnd,
|
||||||
wsprintfW(Buffer4, Buffer1, Buffer2, Buffer3);
|
wsprintfW(Buffer4, Buffer1, Buffer2, Buffer3);
|
||||||
|
|
||||||
SetDlgItemTextW(hwnd, IDC_LOGONDATE, Buffer4);
|
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;
|
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
|
static INT
|
||||||
GUILockedSAS(
|
GUILockedSAS(
|
||||||
IN OUT PGINA_CONTEXT pgContext)
|
IN OUT PGINA_CONTEXT pgContext)
|
||||||
{
|
{
|
||||||
|
int result;
|
||||||
|
|
||||||
TRACE("GUILockedSAS()\n");
|
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;
|
WARN("GUILockedSAS() failed (0x%x)\n", result);
|
||||||
return WLX_SAS_ACTION_UNLOCK_WKSTA;
|
return WLX_SAS_ACTION_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -819,8 +819,6 @@ WlxDisplaySASNotice(
|
||||||
else
|
else
|
||||||
pgContext->AutoLogonState = AUTOLOGON_DISABLED;
|
pgContext->AutoLogonState = AUTOLOGON_DISABLED;
|
||||||
|
|
||||||
TRACE("pgContext->bDisableCAD: %lu\n", pgContext->bDisableCAD);
|
|
||||||
|
|
||||||
if (pgContext->bDisableCAD == TRUE)
|
if (pgContext->bDisableCAD == TRUE)
|
||||||
{
|
{
|
||||||
pgContext->pWlxFuncs->WlxSasNotify(pgContext->hWlx, WLX_SAS_TYPE_CTRL_ALT_DEL);
|
pgContext->pWlxFuncs->WlxSasNotify(pgContext->hWlx, WLX_SAS_TYPE_CTRL_ALT_DEL);
|
||||||
|
@ -902,6 +900,12 @@ WlxDisplayLockedNotice(PVOID pWlxContext)
|
||||||
|
|
||||||
TRACE("WlxDisplayLockedNotice()\n");
|
TRACE("WlxDisplayLockedNotice()\n");
|
||||||
|
|
||||||
|
if (pgContext->bDisableCAD == TRUE)
|
||||||
|
{
|
||||||
|
pgContext->pWlxFuncs->WlxSasNotify(pgContext->hWlx, WLX_SAS_TYPE_CTRL_ALT_DEL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
pGinaUI->DisplayLockedNotice(pgContext);
|
pGinaUI->DisplayLockedNotice(pgContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue