mirror of
https://github.com/reactos/reactos.git
synced 2025-01-04 21:38:43 +00:00
[WINLOGON]
- Change state to STATE_LOGGED_ON_SAS while the security dialog is open. - Ignore an SAS while winlogon is already in an SAS state. [MSGINA] - Read AutoAdminLogon and DisableCAD settings when msgina is initialized. - LoggedOutWindowProc: Disable the Cancel button on the logon dialog if the DisableCAD option has been enabled. - GUILoggedOnSAS: Fix misuse of result variable which caused some really strange effects. svn path=/trunk/; revision=61592
This commit is contained in:
parent
486a9d1b95
commit
6d5ade5442
5 changed files with 118 additions and 8 deletions
|
@ -845,7 +845,11 @@ DoGenericAction(
|
|||
Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
|
||||
break;
|
||||
case WLX_SAS_ACTION_NONE: /* 0x02 */
|
||||
if (Session->LogonState == STATE_LOGGED_OFF)
|
||||
if (Session->LogonState == STATE_LOGGED_ON_SAS)
|
||||
{
|
||||
Session->LogonState = STATE_LOGGED_ON;
|
||||
}
|
||||
else if (Session->LogonState == STATE_LOGGED_OFF)
|
||||
{
|
||||
Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
|
||||
}
|
||||
|
@ -891,6 +895,7 @@ DoGenericAction(
|
|||
break;
|
||||
case WLX_SAS_ACTION_TASKLIST: /* 0x07 */
|
||||
SwitchDesktop(WLSession->ApplicationDesktop);
|
||||
Session->LogonState = STATE_LOGGED_ON;
|
||||
StartTaskManager(Session);
|
||||
break;
|
||||
case WLX_SAS_ACTION_UNLOCK_WKSTA: /* 0x08 */
|
||||
|
@ -910,8 +915,16 @@ DispatchSAS(
|
|||
{
|
||||
DWORD wlxAction = WLX_SAS_ACTION_NONE;
|
||||
|
||||
/* Ignore SAS if we are already in an SAS state */
|
||||
if (Session->LogonState == STATE_LOGGED_OFF_SAS ||
|
||||
Session->LogonState == STATE_LOGGED_ON_SAS)
|
||||
return;
|
||||
|
||||
if (Session->LogonState == STATE_LOGGED_ON)
|
||||
{
|
||||
Session->LogonState = STATE_LOGGED_ON_SAS;
|
||||
wlxAction = (DWORD)Session->Gina.Functions.WlxLoggedOnSAS(Session->Gina.Context, dwSasType, NULL);
|
||||
}
|
||||
else if (Session->LogonState == STATE_LOCKED)
|
||||
wlxAction = (DWORD)Session->Gina.Functions.WlxWkstaLockedSAS(Session->Gina.Context, dwSasType);
|
||||
else
|
||||
|
|
|
@ -193,7 +193,7 @@ typedef enum _LOGON_STATE
|
|||
STATE_LOGGED_OFF,
|
||||
STATE_LOGGED_OFF_SAS, // not used yet
|
||||
STATE_LOGGED_ON,
|
||||
STATE_LOGGED_ON_SAS, // not used yet
|
||||
STATE_LOGGED_ON_SAS,
|
||||
STATE_SCREENSAVER, // not used yet
|
||||
STATE_LOCKED,
|
||||
STATE_LOCKED_SAS, // not used yet
|
||||
|
|
|
@ -383,7 +383,7 @@ GUILoggedOnSAS(
|
|||
return WLX_SAS_ACTION_NONE;
|
||||
}
|
||||
|
||||
result = pgContext->pWlxFuncs->WlxSwitchDesktopToWinlogon(
|
||||
pgContext->pWlxFuncs->WlxSwitchDesktopToWinlogon(
|
||||
pgContext->hWlx);
|
||||
|
||||
result = pgContext->pWlxFuncs->WlxDialogBoxParam(
|
||||
|
@ -402,7 +402,7 @@ GUILoggedOnSAS(
|
|||
|
||||
if (result == WLX_SAS_ACTION_NONE)
|
||||
{
|
||||
result = pgContext->pWlxFuncs->WlxSwitchDesktopToUser(
|
||||
pgContext->pWlxFuncs->WlxSwitchDesktopToUser(
|
||||
pgContext->hWlx);
|
||||
}
|
||||
|
||||
|
@ -427,6 +427,10 @@ LoggedOutWindowProc(
|
|||
/* FIXME: take care of DontDisplayLastUserName, NoDomainUI, ShutdownWithoutLogon */
|
||||
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);
|
||||
|
|
|
@ -86,6 +86,28 @@ ReadRegSzKey(
|
|||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
static LONG
|
||||
ReadRegDwordKey(
|
||||
IN HKEY hKey,
|
||||
IN LPCWSTR pszKey,
|
||||
OUT LPDWORD pValue)
|
||||
{
|
||||
LONG rc;
|
||||
DWORD dwType;
|
||||
DWORD cbData;
|
||||
DWORD dwValue;
|
||||
|
||||
if (!pValue)
|
||||
return ERROR_INVALID_PARAMETER;
|
||||
|
||||
cbData = sizeof(DWORD);
|
||||
rc = RegQueryValueExW(hKey, pszKey, NULL, &dwType, (LPBYTE)&dwValue, &cbData);
|
||||
if (rc == ERROR_SUCCESS)
|
||||
*pValue = dwValue;
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
static VOID
|
||||
ChooseGinaUI(VOID)
|
||||
{
|
||||
|
@ -133,6 +155,59 @@ cleanup:
|
|||
HeapFree(GetProcessHeap(), 0, SystemStartOptions);
|
||||
}
|
||||
|
||||
|
||||
static
|
||||
BOOL
|
||||
GetRegistrySettings(PGINA_CONTEXT pgContext)
|
||||
{
|
||||
HKEY hKey = NULL;
|
||||
LPWSTR lpAutoAdminLogon = NULL;
|
||||
DWORD dwDisableCAD = 0;
|
||||
LONG rc;
|
||||
|
||||
rc = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
|
||||
L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon",
|
||||
0,
|
||||
KEY_QUERY_VALUE,
|
||||
&hKey);
|
||||
if (rc != ERROR_SUCCESS)
|
||||
{
|
||||
WARN("RegOpenKeyExW() failed with error %lu\n", rc);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
rc = ReadRegSzKey(hKey,
|
||||
L"AutoAdminLogon",
|
||||
&lpAutoAdminLogon);
|
||||
if (rc == ERROR_SUCCESS)
|
||||
{
|
||||
if (wcscmp(lpAutoAdminLogon, L"1") == 0)
|
||||
pgContext->bAutoAdminLogon = TRUE;
|
||||
}
|
||||
|
||||
TRACE("bAutoAdminLogon: %s\n", pgContext->bAutoAdminLogon ? "TRUE" : "FALSE");
|
||||
|
||||
rc = ReadRegDwordKey(hKey,
|
||||
L"DisableCAD",
|
||||
&dwDisableCAD);
|
||||
if (rc == ERROR_SUCCESS)
|
||||
{
|
||||
if (dwDisableCAD != 0)
|
||||
pgContext->bDisableCAD = TRUE;
|
||||
}
|
||||
|
||||
TRACE("bDisableCAD: %s\n", pgContext->bDisableCAD ? "TRUE" : "FALSE");
|
||||
|
||||
if (lpAutoAdminLogon != NULL)
|
||||
HeapFree(GetProcessHeap(), 0, lpAutoAdminLogon);
|
||||
|
||||
if (hKey != NULL)
|
||||
RegCloseKey(hKey);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
|
@ -155,6 +230,13 @@ WlxInitialize(
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if (!GetRegistrySettings(pgContext))
|
||||
{
|
||||
WARN("GetRegistrySettings() failed\n");
|
||||
LocalFree(pgContext);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Return the context to winlogon */
|
||||
*pWlxContext = (PVOID)pgContext;
|
||||
pgContext->hDllInstance = hDllInstance;
|
||||
|
@ -572,7 +654,7 @@ cleanup:
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
static
|
||||
BOOL
|
||||
CheckAutoAdminLogon(
|
||||
|
@ -611,7 +693,7 @@ cleanup:
|
|||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static BOOL
|
||||
DoAutoLogon(
|
||||
|
@ -726,7 +808,8 @@ WlxDisplaySASNotice(
|
|||
return;
|
||||
}
|
||||
|
||||
if (CheckAutoAdminLogon(pgContext))
|
||||
// if (CheckAutoAdminLogon(pgContext))
|
||||
if (pgContext->bAutoAdminLogon == TRUE)
|
||||
{
|
||||
/* Don't display the window, we want to do an automatic logon */
|
||||
pgContext->AutoLogonState = AUTOLOGON_ONCE;
|
||||
|
@ -736,6 +819,14 @@ 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);
|
||||
return;
|
||||
}
|
||||
|
||||
pGinaUI->DisplaySASNotice(pgContext);
|
||||
|
||||
TRACE("WlxDisplaySASNotice() done\n");
|
||||
|
|
|
@ -34,8 +34,10 @@ typedef struct
|
|||
HANDLE hDllInstance;
|
||||
HWND hStatusWindow;
|
||||
DWORD AutoLogonState;
|
||||
BOOL bDisableCAD;
|
||||
BOOL bAutoAdminLogon;
|
||||
|
||||
/* Informations to be filled during logon */
|
||||
/* Information to be filled during logon */
|
||||
WCHAR UserName[256];
|
||||
WCHAR Domain[256];
|
||||
SYSTEMTIME LogonTime;
|
||||
|
|
Loading…
Reference in a new issue