[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:
Eric Kohl 2014-01-12 10:57:02 +00:00
parent 486a9d1b95
commit 6d5ade5442
5 changed files with 118 additions and 8 deletions

View file

@ -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

View file

@ -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

View file

@ -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);

View file

@ -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");

View file

@ -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;