static BOOL ExitReactOSInProgress = FALSE;
+LUID LuidNone = {0, 0};
+
/* FUNCTIONS ****************************************************************/
static BOOL
CloseHandle(hThread);
}
+static BOOL
+AllowWinstaAccess(PWLSESSION Session)
+{
+ BOOL bSuccess = FALSE;
+ DWORD dwIndex;
+ DWORD dwLength = 0;
+ PTOKEN_GROUPS ptg = NULL;
+ PSID psid;
+ TOKEN_STATISTICS Stats;
+ DWORD cbStats;
+ DWORD ret;
+
+ // Get required buffer size and allocate the TOKEN_GROUPS buffer.
+
+ if (!GetTokenInformation(Session->UserToken,
+ TokenGroups,
+ ptg,
+ 0,
+ &dwLength))
+ {
+ if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ return FALSE;
+
+ ptg = (PTOKEN_GROUPS)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwLength);
+ if (ptg == NULL)
+ return FALSE;
+ }
+
+ // Get the token group information from the access token.
+ if (!GetTokenInformation(Session->UserToken,
+ TokenGroups,
+ ptg,
+ dwLength,
+ &dwLength))
+ {
+ goto Cleanup;
+ }
+
+ // Loop through the groups to find the logon SID.
+
+ for (dwIndex = 0; dwIndex < ptg->GroupCount; dwIndex++)
+ {
+ if ((ptg->Groups[dwIndex].Attributes & SE_GROUP_LOGON_ID)
+ == SE_GROUP_LOGON_ID)
+ {
+ psid = ptg->Groups[dwIndex].Sid;
+ break;
+ }
+ }
+
+ dwLength = GetLengthSid(psid);
+
+ if (!GetTokenInformation(Session->UserToken,
+ TokenStatistics,
+ &Stats,
+ sizeof(TOKEN_STATISTICS),
+ &cbStats))
+ {
+ WARN("Couldn't get Authentication id from user token!\n");
+ goto Cleanup;
+ }
+
+ AddAceToWindowStation(Session->InteractiveWindowStation, psid);
+
+ ret = SetWindowStationUser(Session->InteractiveWindowStation,
+ &Stats.AuthenticationId,
+ psid,
+ dwLength);
+ TRACE("SetWindowStationUser returned 0x%x\n", ret);
+
+ bSuccess = TRUE;
+
+Cleanup:
+
+ // Free the buffer for the token groups.
+ if (ptg != NULL)
+ HeapFree(GetProcessHeap(), 0, (LPVOID)ptg);
+
+ return bSuccess;
+}
+
static
BOOL
HandleLogon(
goto cleanup;
}
+ AllowWinstaAccess(Session);
+
if (!StartUserShell(Session))
{
//WCHAR StatusMsg[256];
Session->hProfileInfo = ProfileInfo.hProfile;
- /* Logon has successed. Play sound. */
+ /* Logon has succeeded. Play sound. */
PlayLogonSound(Session);
ret = TRUE;
RemoveStatusMessage(Session);
if (!ret)
{
+ SetWindowStationUser(Session->InteractiveWindowStation,
+ &LuidNone, NULL, 0);
CloseHandle(Session->UserToken);
Session->UserToken = NULL;
}
ret = 0;
}
+ /* Cancel all the user connections */
+ WNetClearConnections(0);
+
if (LSData->Session->UserToken)
RevertToSelf();
SwitchDesktop(Session->WinlogonDesktop);
+ // TODO: Play logoff sound!
+
+ SetWindowStationUser(Session->InteractiveWindowStation,
+ &LuidNone, NULL, 0);
+
// DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_LOGGINGOFF);
// FIXME: Closing network connections!
}
}
-DWORD WINAPI SetWindowStationUser(HWINSTA hWinSta, LUID* pluid, PSID psid, DWORD sidSize);
-
-BOOL
-AddAceToWindowStation(
- IN HWINSTA WinSta,
- IN PSID Sid);
-
-static
-BOOL AllowWinstaAccess(PWLSESSION Session)
-{
- BOOL bSuccess = FALSE;
- DWORD dwIndex;
- DWORD dwLength = 0;
- PTOKEN_GROUPS ptg = NULL;
- PSID psid;
- TOKEN_STATISTICS Stats;
- DWORD cbStats;
- DWORD ret;
-
- // Get required buffer size and allocate the TOKEN_GROUPS buffer.
-
- if (!GetTokenInformation(Session->UserToken,
- TokenGroups,
- ptg,
- 0,
- &dwLength))
- {
- if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
- return FALSE;
-
- ptg = (PTOKEN_GROUPS)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwLength);
- if (ptg == NULL)
- return FALSE;
- }
-
- // Get the token group information from the access token.
- if (!GetTokenInformation(Session->UserToken,
- TokenGroups,
- ptg,
- dwLength,
- &dwLength))
- {
- goto Cleanup;
- }
-
- // Loop through the groups to find the logon SID.
-
- for (dwIndex = 0; dwIndex < ptg->GroupCount; dwIndex++)
- {
- if ((ptg->Groups[dwIndex].Attributes & SE_GROUP_LOGON_ID)
- == SE_GROUP_LOGON_ID)
- {
- psid = ptg->Groups[dwIndex].Sid;
- break;
- }
- }
-
- dwLength = GetLengthSid(psid);
-
- if (!GetTokenInformation(Session->UserToken,
- TokenStatistics,
- &Stats,
- sizeof(TOKEN_STATISTICS),
- &cbStats))
- {
- WARN("Couldn't get Authentication id from user token!\n");
- goto Cleanup;
- }
-
- AddAceToWindowStation(Session->InteractiveWindowStation, psid);
-
- ret = SetWindowStationUser(Session->InteractiveWindowStation,
- &Stats.AuthenticationId,
- psid,
- dwLength);
- TRACE("SetWindowStationUser returned 0x%x\n", ret);
-
- bSuccess = TRUE;
-
-Cleanup:
-
- // Free the buffer for the token groups.
- if (ptg != NULL)
- HeapFree(GetProcessHeap(), 0, (LPVOID)ptg);
-
- return bSuccess;
-}
-
static
VOID
DispatchSAS(
&Session->UserToken,
&Session->MprNotifyInfo,
(PVOID*)&Session->Profile);
-
- AllowWinstaAccess(Session);
break;
case STATE_LOGGED_OFF_SAS:
case MAKELONG(MOD_CONTROL | MOD_SHIFT, VK_ESCAPE):
{
TRACE("SAS: CONTROL+SHIFT+ESCAPE\n");
- DoGenericAction(Session, WLX_SAS_ACTION_TASKLIST);
+ if (Session->LogonState == STATE_LOGGED_ON)
+ DoGenericAction(Session, WLX_SAS_ACTION_TASKLIST);
return TRUE;
}
}