ReactOS 0.4.16-dev-334-g4d9f67c
sas.c File Reference
#include "winlogon.h"
#include <aclapi.h>
#include <mmsystem.h>
#include <userenv.h>
#include <ndk/setypes.h>
#include <ndk/sefuncs.h>
Include dependency graph for sas.c:

Go to the source code of this file.

Classes

struct  tagLOGOFF_SHUTDOWN_DATA
 

Macros

#define WIN32_LEAN_AND_MEAN
 
#define WINLOGON_SAS_CLASS   L"SAS Window class"
 
#define WINLOGON_SAS_TITLE   L"SAS window"
 
#define HK_CTRL_ALT_DEL   0
 
#define HK_CTRL_SHIFT_ESC   1
 
#define EWX_ACTION_MASK   0x5C0F
 

Typedefs

typedef struct tagLOGOFF_SHUTDOWN_DATA LOGOFF_SHUTDOWN_DATA
 
typedef struct tagLOGOFF_SHUTDOWN_DATAPLOGOFF_SHUTDOWN_DATA
 

Functions

static BOOL StartTaskManager (IN OUT PWLSESSION Session)
 
static BOOL StartUserShell (IN OUT PWLSESSION Session)
 
BOOL SetDefaultLanguage (IN PWLSESSION Session)
 
BOOL PlaySoundRoutine (IN LPCWSTR FileName, IN UINT bLogon, IN UINT Flags)
 
static BOOL IsFirstLogon (VOID)
 
DWORD WINAPI PlayLogonSoundThread (IN LPVOID lpParameter)
 
static VOID PlayLogonSound (IN OUT PWLSESSION Session)
 
static VOID PlayLogoffShutdownSound (_In_ PWLSESSION Session, _In_ BOOL bShutdown)
 
static BOOL PlayEventSound (_In_ PWLSESSION Session, _In_ LPCWSTR EventName)
 
static VOID RestoreAllConnections (PWLSESSION Session)
 
static BOOL HandleLogon (IN OUT PWLSESSION Session)
 
static DWORD WINAPI LogoffShutdownThread (LPVOID Parameter)
 
static DWORD WINAPI KillComProcesses (LPVOID Parameter)
 
static NTSTATUS CreateLogoffSecurityAttributes (OUT PSECURITY_ATTRIBUTES *ppsa)
 
static VOID DestroyLogoffSecurityAttributes (IN PSECURITY_ATTRIBUTES psa)
 
static NTSTATUS HandleLogoff (_Inout_ PWLSESSION Session, _In_ DWORD wlxAction)
 
static INT_PTR CALLBACK ShutdownComputerWindowProc (IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
 
static VOID UninitializeSAS (IN OUT PWLSESSION Session)
 
NTSTATUS HandleShutdown (IN OUT PWLSESSION Session, IN DWORD wlxAction)
 
static VOID DoGenericAction (IN OUT PWLSESSION Session, IN DWORD wlxAction)
 
static VOID DispatchSAS (IN OUT PWLSESSION Session, IN DWORD dwSasType)
 
static BOOL RegisterHotKeys (IN PWLSESSION Session, IN HWND hwndSAS)
 
static BOOL UnregisterHotKeys (IN PWLSESSION Session, IN HWND hwndSAS)
 
static BOOL HandleMessageBeep (_In_ PWLSESSION Session, _In_ UINT uType)
 
static LRESULT CALLBACK SASWindowProc (IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
 
BOOL InitializeSAS (IN OUT PWLSESSION Session)
 

Variables

static BOOL ExitReactOSInProgress = FALSE
 
LUID LuidNone = {0, 0}
 

Macro Definition Documentation

◆ EWX_ACTION_MASK

#define EWX_ACTION_MASK   0x5C0F

Definition at line 37 of file sas.c.

◆ HK_CTRL_ALT_DEL

#define HK_CTRL_ALT_DEL   0

Definition at line 29 of file sas.c.

◆ HK_CTRL_SHIFT_ESC

#define HK_CTRL_SHIFT_ESC   1

Definition at line 30 of file sas.c.

◆ WIN32_LEAN_AND_MEAN

#define WIN32_LEAN_AND_MEAN

Definition at line 17 of file sas.c.

◆ WINLOGON_SAS_CLASS

#define WINLOGON_SAS_CLASS   L"SAS Window class"

Definition at line 26 of file sas.c.

◆ WINLOGON_SAS_TITLE

#define WINLOGON_SAS_TITLE   L"SAS window"

Definition at line 27 of file sas.c.

Typedef Documentation

◆ LOGOFF_SHUTDOWN_DATA

◆ PLOGOFF_SHUTDOWN_DATA

Function Documentation

◆ CreateLogoffSecurityAttributes()

static NTSTATUS CreateLogoffSecurityAttributes ( OUT PSECURITY_ATTRIBUTES ppsa)
static

Definition at line 684 of file sas.c.

686{
687 /* The following code is not working yet and messy */
688 /* Still, it gives some ideas about data types and functions involved and */
689 /* required to set up a SECURITY_DESCRIPTOR for a SECURITY_ATTRIBUTES */
690 /* instance for a thread, to allow that thread to ImpersonateLoggedOnUser(). */
691 /* Specifically THREAD_SET_THREAD_TOKEN is required. */
694 BYTE* pMem;
695 PACL pACL;
696 EXPLICIT_ACCESS Access;
697 PSID pEveryoneSID = NULL;
699
700 *ppsa = NULL;
701
702 // Let's first try to enumerate what kind of data we need for this to ever work:
703 // 1. The Winlogon SID, to be able to give it THREAD_SET_THREAD_TOKEN.
704 // 2. The users SID (the user trying to logoff, or rather shut down the system).
705 // 3. At least two EXPLICIT_ACCESS instances:
706 // 3.1 One for Winlogon itself, giving it the rights
707 // required to THREAD_SET_THREAD_TOKEN (as it's needed to successfully call
708 // ImpersonateLoggedOnUser).
709 // 3.2 One for the user, to allow *that* thread to perform its work.
710 // 4. An ACL to hold the these EXPLICIT_ACCESS ACE's.
711 // 5. A SECURITY_DESCRIPTOR to hold the ACL, and finally.
712 // 6. A SECURITY_ATTRIBUTES instance to pull all of this required stuff
713 // together, to hand it to CreateThread.
714 //
715 // However, it seems struct LOGOFF_SHUTDOWN_DATA doesn't contain
716 // these required SID's, why they'd have to be added.
717 // The Winlogon's own SID should probably only be created once,
718 // while the user's SID obviously must be created for each new user.
719 // Might as well store it when the user logs on?
720
722 1,
724 0, 0, 0, 0, 0, 0, 0,
725 &pEveryoneSID))
726 {
727 ERR("Failed to initialize security descriptor for logoff thread!\n");
728 return STATUS_UNSUCCESSFUL;
729 }
730
731 /* set up the required security attributes to be able to shut down */
732 /* To save space and time, allocate a single block of memory holding */
733 /* both SECURITY_ATTRIBUTES and SECURITY_DESCRIPTOR */
734 pMem = HeapAlloc(GetProcessHeap(),
735 0,
736 sizeof(SECURITY_ATTRIBUTES) +
738 sizeof(ACL));
739 if (!pMem)
740 {
741 ERR("Failed to allocate memory for logoff security descriptor!\n");
742 return STATUS_NO_MEMORY;
743 }
744
745 /* Note that the security descriptor needs to be in _absolute_ format, */
746 /* meaning its members must be pointers to other structures, rather */
747 /* than the relative format using offsets */
751
752 // Initialize an EXPLICIT_ACCESS structure for an ACE.
753 // The ACE will allow this thread to log off (and shut down the system, currently).
754 ZeroMemory(&Access, sizeof(Access));
756 Access.grfAccessMode = SET_ACCESS; // GRANT_ACCESS?
760 Access.Trustee.ptstrName = pEveryoneSID;
761
762 if (SetEntriesInAcl(1, &Access, NULL, &pACL) != ERROR_SUCCESS)
763 {
764 ERR("Failed to set Access Rights for logoff thread. Logging out will most likely fail.\n");
765
766 HeapFree(GetProcessHeap(), 0, pMem);
767 return STATUS_UNSUCCESSFUL;
768 }
769
771 {
772 ERR("Failed to initialize security descriptor for logoff thread!\n");
773 HeapFree(GetProcessHeap(), 0, pMem);
774 return STATUS_UNSUCCESSFUL;
775 }
776
778 TRUE, // bDaclPresent flag
779 pACL,
780 FALSE)) // not a default DACL
781 {
782 ERR("SetSecurityDescriptorDacl Error %lu\n", GetLastError());
783 HeapFree(GetProcessHeap(), 0, pMem);
784 return STATUS_UNSUCCESSFUL;
785 }
786
787 psa->nLength = sizeof(SECURITY_ATTRIBUTES);
788 psa->lpSecurityDescriptor = SecurityDescriptor;
789 psa->bInheritHandle = FALSE;
790
791 *ppsa = psa;
792
793 return STATUS_SUCCESS;
794}
@ TRUSTEE_IS_SID
Definition: accctrl.h:189
@ TRUSTEE_IS_WELL_KNOWN_GROUP
Definition: accctrl.h:181
#define NO_INHERITANCE
Definition: accctrl.h:103
@ SET_ACCESS
Definition: accctrl.h:150
#define SetEntriesInAcl
Definition: aclapi.h:240
#define ERR(fmt,...)
Definition: precomp.h:57
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
BOOL WINAPI AllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, BYTE nSubAuthorityCount, DWORD nSubAuthority0, DWORD nSubAuthority1, DWORD nSubAuthority2, DWORD nSubAuthority3, DWORD nSubAuthority4, DWORD nSubAuthority5, DWORD nSubAuthority6, DWORD nSubAuthority7, PSID *pSid)
Definition: security.c:674
BOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD dwRevision)
Definition: security.c:929
#define GetProcessHeap()
Definition: compat.h:736
struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES
#define HeapAlloc
Definition: compat.h:733
struct _SECURITY_ATTRIBUTES * PSECURITY_ATTRIBUTES
#define HeapFree(x, y, z)
Definition: compat.h:735
static SID_IDENTIFIER_AUTHORITY WorldAuthority
Definition: security.c:14
#define THREAD_SET_THREAD_TOKEN
Definition: pstypes.h:151
static SCRIPT_CACHE SCRIPT_ANALYSIS * psa
Definition: usp10.c:64
struct _SECURITY_DESCRIPTOR * PSECURITY_DESCRIPTOR
Definition: security.c:98
struct _ACL * PACL
Definition: security.c:105
BYTE * PBYTE
Definition: pedump.c:66
BOOL WINAPI SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR pSecurityDescriptor, BOOL bDaclPresent, PACL pDacl, BOOL bDaclDefaulted)
Definition: sec.c:262
#define STATUS_SUCCESS
Definition: shellext.h:65
DWORD grfAccessPermissions
Definition: accctrl.h:332
TRUSTEE_A Trustee
Definition: accctrl.h:335
DWORD grfInheritance
Definition: accctrl.h:334
ACCESS_MODE grfAccessMode
Definition: accctrl.h:333
TRUSTEE_TYPE TrusteeType
Definition: accctrl.h:207
TRUSTEE_FORM TrusteeForm
Definition: accctrl.h:206
LPSTR ptstrName
Definition: accctrl.h:208
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define ZeroMemory
Definition: winbase.h:1737
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ USHORT _In_ ULONG _In_ PSOCKADDR _In_ PSOCKADDR _Reserved_ ULONG _In_opt_ PVOID _In_opt_ const WSK_CLIENT_CONNECTION_DISPATCH _In_opt_ PEPROCESS _In_opt_ PETHREAD _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor
Definition: wsk.h:191
#define SECURITY_WORLD_SID_AUTHORITY
Definition: setypes.h:527
#define SECURITY_WORLD_RID
Definition: setypes.h:541
#define SECURITY_DESCRIPTOR_REVISION
Definition: setypes.h:58
#define SECURITY_DESCRIPTOR_MIN_LENGTH
Definition: setypes.h:815
unsigned char BYTE
Definition: xxhash.c:193

Referenced by HandleLogoff().

◆ DestroyLogoffSecurityAttributes()

static VOID DestroyLogoffSecurityAttributes ( IN PSECURITY_ATTRIBUTES  psa)
static

Definition at line 798 of file sas.c.

800{
801 if (psa)
802 {
804 }
805}

Referenced by HandleLogoff().

◆ DispatchSAS()

static VOID DispatchSAS ( IN OUT PWLSESSION  Session,
IN DWORD  dwSasType 
)
static

Definition at line 1139 of file sas.c.

1142{
1143 DWORD wlxAction = WLX_SAS_ACTION_NONE;
1144 PSID LogonSid = NULL; /* FIXME */
1145 BOOL bSecure = TRUE;
1146
1147 switch (dwSasType)
1148 {
1150 switch (Session->LogonState)
1151 {
1152 case STATE_INIT:
1153 Session->LogonState = STATE_LOGGED_OFF;
1154 Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
1155 return;
1156
1157 case STATE_LOGGED_OFF:
1158 Session->LogonState = STATE_LOGGED_OFF_SAS;
1159
1161
1162 Session->Options = 0;
1163
1164 wlxAction = (DWORD)Session->Gina.Functions.WlxLoggedOutSAS(
1165 Session->Gina.Context,
1166 Session->SASAction,
1167 &Session->LogonId,
1168 LogonSid,
1169 &Session->Options,
1170 &Session->UserToken,
1171 &Session->MprNotifyInfo,
1172 (PVOID*)&Session->Profile);
1173 break;
1174
1176 /* Ignore SAS if we are already in an SAS state */
1177 return;
1178
1179 case STATE_LOGGED_ON:
1180 Session->LogonState = STATE_LOGGED_ON_SAS;
1181 wlxAction = (DWORD)Session->Gina.Functions.WlxLoggedOnSAS(Session->Gina.Context, dwSasType, NULL);
1182 break;
1183
1185 /* Ignore SAS if we are already in an SAS state */
1186 return;
1187
1188 case STATE_LOCKED:
1189 Session->LogonState = STATE_LOCKED_SAS;
1190
1192
1193 wlxAction = (DWORD)Session->Gina.Functions.WlxWkstaLockedSAS(Session->Gina.Context, dwSasType);
1194 break;
1195
1196 case STATE_LOCKED_SAS:
1197 /* Ignore SAS if we are already in an SAS state */
1198 return;
1199
1200 default:
1201 return;
1202 }
1203 break;
1204
1206 return;
1207
1209 if (!Session->Gina.Functions.WlxScreenSaverNotify(Session->Gina.Context, &bSecure))
1210 {
1211 /* Skip start of screen saver */
1212 SetEvent(Session->hEndOfScreenSaver);
1213 }
1214 else
1215 {
1216 StartScreenSaver(Session);
1217 if (bSecure)
1218 {
1219 wlxAction = WLX_SAS_ACTION_LOCK_WKSTA;
1220// DoGenericAction(Session, WLX_SAS_ACTION_LOCK_WKSTA);
1221 }
1222 }
1223 break;
1224
1226 SetEvent(Session->hUserActivity);
1227 break;
1228 }
1229
1230 DoGenericAction(Session, wlxAction);
1231}
VOID StartScreenSaver(IN PWLSESSION Session)
Definition: screensaver.c:257
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define DWORD
Definition: nt_native.h:44
static VOID DoGenericAction(IN OUT PWLSESSION Session, IN DWORD wlxAction)
Definition: sas.c:1048
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
@ STATE_LOGGED_ON
Definition: winlogon.h:206
@ STATE_LOGGED_OFF_SAS
Definition: winlogon.h:205
@ STATE_LOCKED_SAS
Definition: winlogon.h:209
@ STATE_INIT
Definition: winlogon.h:203
@ STATE_LOGGED_OFF
Definition: winlogon.h:204
@ STATE_LOGGED_ON_SAS
Definition: winlogon.h:207
@ STATE_LOCKED
Definition: winlogon.h:208
VOID CloseAllDialogWindows(VOID)
Definition: wlx.c:95
#define WLX_SAS_TYPE_TIMEOUT
Definition: winwlx.h:35
#define WLX_SAS_ACTION_NONE
Definition: winwlx.h:54
#define WLX_SAS_TYPE_CTRL_ALT_DEL
Definition: winwlx.h:36
#define WLX_SAS_TYPE_SCRNSVR_TIMEOUT
Definition: winwlx.h:37
#define WLX_SAS_TYPE_SCRNSVR_ACTIVITY
Definition: winwlx.h:38
#define WLX_SAS_ACTION_LOCK_WKSTA
Definition: winwlx.h:55

Referenced by SASWindowProc().

◆ DoGenericAction()

static VOID DoGenericAction ( IN OUT PWLSESSION  Session,
IN DWORD  wlxAction 
)
static

Definition at line 1048 of file sas.c.

1051{
1052 switch (wlxAction)
1053 {
1054 case WLX_SAS_ACTION_LOGON: /* 0x01 */
1055 if (Session->LogonState == STATE_LOGGED_OFF_SAS)
1056 {
1057 if (!HandleLogon(Session))
1058 {
1059 Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
1061 }
1062 }
1063 break;
1064 case WLX_SAS_ACTION_NONE: /* 0x02 */
1065 if (Session->LogonState == STATE_LOGGED_OFF_SAS)
1066 {
1067 Session->LogonState = STATE_LOGGED_OFF;
1068 Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
1069 }
1070 else if (Session->LogonState == STATE_LOGGED_ON_SAS)
1071 {
1072 Session->LogonState = STATE_LOGGED_ON;
1073 }
1074 else if (Session->LogonState == STATE_LOCKED_SAS)
1075 {
1076 Session->LogonState = STATE_LOCKED;
1077 Session->Gina.Functions.WlxDisplayLockedNotice(Session->Gina.Context);
1078 }
1079 break;
1080 case WLX_SAS_ACTION_LOCK_WKSTA: /* 0x03 */
1081 if (Session->Gina.Functions.WlxIsLockOk(Session->Gina.Context))
1082 {
1083 SwitchDesktop(Session->WinlogonDesktop);
1084 Session->LogonState = STATE_LOCKED;
1085 Session->Gina.Functions.WlxDisplayLockedNotice(Session->Gina.Context);
1087 }
1088 break;
1089 case WLX_SAS_ACTION_LOGOFF: /* 0x04 */
1090 case WLX_SAS_ACTION_SHUTDOWN: /* 0x05 */
1091 case WLX_SAS_ACTION_FORCE_LOGOFF: /* 0x09 */
1092 case WLX_SAS_ACTION_SHUTDOWN_POWER_OFF: /* 0x0a */
1093 case WLX_SAS_ACTION_SHUTDOWN_REBOOT: /* 0x0b */
1094 if (Session->LogonState != STATE_LOGGED_OFF)
1095 {
1096 if (!Session->Gina.Functions.WlxIsLogoffOk(Session->Gina.Context))
1097 break;
1098 if (!NT_SUCCESS(HandleLogoff(Session, wlxAction)))
1099 {
1100 RemoveStatusMessage(Session);
1101 break;
1102 }
1103 Session->Gina.Functions.WlxLogoff(Session->Gina.Context);
1104 }
1105 if (WLX_SHUTTINGDOWN(wlxAction))
1106 {
1107 // FIXME: WlxShutdown should be done from inside HandleShutdown,
1108 // after having displayed "ReactOS is shutting down" message.
1109 Session->Gina.Functions.WlxShutdown(Session->Gina.Context, wlxAction);
1110 if (!NT_SUCCESS(HandleShutdown(Session, wlxAction)))
1111 {
1112 RemoveStatusMessage(Session);
1113 Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
1114 }
1115 }
1116 else
1117 {
1118 RemoveStatusMessage(Session);
1119 Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
1120 }
1121 break;
1122 case WLX_SAS_ACTION_TASKLIST: /* 0x07 */
1123 SwitchDesktop(Session->ApplicationDesktop);
1124 Session->LogonState = STATE_LOGGED_ON;
1125 StartTaskManager(Session);
1126 break;
1127 case WLX_SAS_ACTION_UNLOCK_WKSTA: /* 0x08 */
1128 SwitchDesktop(Session->ApplicationDesktop);
1129 Session->LogonState = STATE_LOGGED_ON;
1131 break;
1132 default:
1133 WARN("Unknown SAS action 0x%lx\n", wlxAction);
1134 }
1135}
#define WARN(fmt,...)
Definition: precomp.h:61
VOID CallNotificationDlls(PWLSESSION pSession, NOTIFICATION_TYPE Type)
Definition: notify.c:390
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
NTSTATUS HandleShutdown(IN OUT PWLSESSION Session, IN DWORD wlxAction)
Definition: sas.c:960
static BOOL StartTaskManager(IN OUT PWLSESSION Session)
Definition: sas.c:52
static BOOL HandleLogon(IN OUT PWLSESSION Session)
Definition: sas.c:487
static NTSTATUS HandleLogoff(_Inout_ PWLSESSION Session, _In_ DWORD wlxAction)
Definition: sas.c:810
BOOL RemoveStatusMessage(IN PWLSESSION Session)
Definition: winlogon.c:370
#define WLX_SHUTTINGDOWN(Status)
Definition: winlogon.h:276
@ LogonHandler
Definition: winlogon.h:258
@ UnlockHandler
Definition: winlogon.h:261
@ LockHandler
Definition: winlogon.h:260
BOOL WINAPI SwitchDesktop(_In_ HDESK)
#define WLX_SAS_ACTION_FORCE_LOGOFF
Definition: winwlx.h:61
#define WLX_SAS_ACTION_UNLOCK_WKSTA
Definition: winwlx.h:60
#define WLX_SAS_ACTION_LOGON
Definition: winwlx.h:53
#define WLX_SAS_ACTION_TASKLIST
Definition: winwlx.h:59
#define WLX_SAS_ACTION_SHUTDOWN_POWER_OFF
Definition: winwlx.h:62
#define WLX_SAS_ACTION_SHUTDOWN
Definition: winwlx.h:57
#define WLX_SAS_ACTION_SHUTDOWN_REBOOT
Definition: winwlx.h:63
#define WLX_SAS_ACTION_LOGOFF
Definition: winwlx.h:56

Referenced by DispatchSAS(), and SASWindowProc().

◆ HandleLogoff()

static NTSTATUS HandleLogoff ( _Inout_ PWLSESSION  Session,
_In_ DWORD  wlxAction 
)
static

Definition at line 810 of file sas.c.

813{
817 DWORD exitCode;
819
820 /* Prepare data for logoff thread */
821 LSData = HeapAlloc(GetProcessHeap(), 0, sizeof(LOGOFF_SHUTDOWN_DATA));
822 if (!LSData)
823 {
824 ERR("Failed to allocate mem for thread data\n");
825 return STATUS_NO_MEMORY;
826 }
827
828 LSData->Flags = EWX_LOGOFF;
829 if (wlxAction == WLX_SAS_ACTION_FORCE_LOGOFF)
830 {
831 LSData->Flags |= EWX_FORCE;
832 }
833
834 LSData->Session = Session;
835
837 if (!NT_SUCCESS(Status))
838 {
839 ERR("Failed to create a required security descriptor. Status 0x%08lx\n", Status);
840 HeapFree(GetProcessHeap(), 0, LSData);
841 return Status;
842 }
843
844 /* Run logoff thread */
846 if (!hThread)
847 {
848 ERR("Unable to create logoff thread, error %lu\n", GetLastError());
850 HeapFree(GetProcessHeap(), 0, LSData);
851 return STATUS_UNSUCCESSFUL;
852 }
854 if (!GetExitCodeThread(hThread, &exitCode))
855 {
856 ERR("Unable to get exit code of logoff thread (error %lu)\n", GetLastError());
859 HeapFree(GetProcessHeap(), 0, LSData);
860 return STATUS_UNSUCCESSFUL;
861 }
863 if (exitCode == 0)
864 {
865 ERR("Logoff thread returned failure\n");
867 HeapFree(GetProcessHeap(), 0, LSData);
868 return STATUS_UNSUCCESSFUL;
869 }
870
871 SwitchDesktop(Session->WinlogonDesktop);
872
873 PlayLogoffShutdownSound(Session, WLX_SHUTTINGDOWN(wlxAction));
874
875 SetWindowStationUser(Session->InteractiveWindowStation,
876 &LuidNone, NULL, 0);
877
878 // DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_LOGGINGOFF);
879
880 // FIXME: Closing network connections!
881 // DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_CLOSINGNETWORKCONNECTIONS);
882
883 /* Kill remaining COM apps. Only at logoff! */
885 if (hThread)
886 {
889 }
890
891 /* We're done with the SECURITY_DESCRIPTOR */
893 psa = NULL;
894
895 HeapFree(GetProcessHeap(), 0, LSData);
896
897 DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_SAVEYOURSETTINGS);
898
899 UnloadUserProfile(Session->UserToken, Session->hProfileInfo);
900
902
903 CloseHandle(Session->UserToken);
905 Session->LogonState = STATE_LOGGED_OFF;
906 Session->UserToken = NULL;
907
908 return STATUS_SUCCESS;
909}
DWORD WINAPI UpdatePerUserSystemParameters(DWORD dw1, DWORD dw2)
LONG NTSTATUS
Definition: precomp.h:26
#define IDS_SAVEYOURSETTINGS
Definition: resource.h:34
#define CloseHandle
Definition: compat.h:739
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
BOOL WINAPI GetExitCodeThread(IN HANDLE hThread, OUT LPDWORD lpExitCode)
Definition: thread.c:541
BOOL WINAPI UnloadUserProfile(_In_ HANDLE hToken, _In_ HANDLE hProfile)
Definition: profile.c:2184
#define INFINITE
Definition: serial.h:102
Status
Definition: gdiplustypes.h:25
HANDLE hThread
Definition: wizard.c:28
static NTSTATUS CreateLogoffSecurityAttributes(OUT PSECURITY_ATTRIBUTES *ppsa)
Definition: sas.c:684
static DWORD WINAPI KillComProcesses(LPVOID Parameter)
Definition: sas.c:654
LUID LuidNone
Definition: sas.c:47
static VOID PlayLogoffShutdownSound(_In_ PWLSESSION Session, _In_ BOOL bShutdown)
Definition: sas.c:388
static VOID DestroyLogoffSecurityAttributes(IN PSECURITY_ATTRIBUTES psa)
Definition: sas.c:798
static DWORD WINAPI LogoffShutdownThread(LPVOID Parameter)
Definition: sas.c:609
PWLSESSION Session
Definition: sas.c:42
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
BOOL DisplayStatusMessage(IN PWLSESSION Session, IN HDESK hDesktop, IN UINT ResourceId)
Definition: winlogon.c:349
BOOL WINAPI SetWindowStationUser(IN HWINSTA hWindowStation, IN PLUID pluid, IN PSID psid OPTIONAL, IN DWORD size)
Definition: winsta.c:419
@ LogoffHandler
Definition: winlogon.h:259
#define EWX_LOGOFF
Definition: winuser.h:636
#define EWX_FORCE
Definition: winuser.h:635

Referenced by DoGenericAction().

◆ HandleLogon()

static BOOL HandleLogon ( IN OUT PWLSESSION  Session)
static

Definition at line 487 of file sas.c.

489{
490 PROFILEINFOW ProfileInfo;
491 BOOL ret = FALSE;
492
493 /* Loading personal settings */
494 DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_LOADINGYOURPERSONALSETTINGS);
495 ProfileInfo.hProfile = INVALID_HANDLE_VALUE;
496 if (0 == (Session->Options & WLX_LOGON_OPT_NO_PROFILE))
497 {
498 if (Session->Profile == NULL
499 || (Session->Profile->dwType != WLX_PROFILE_TYPE_V1_0
500 && Session->Profile->dwType != WLX_PROFILE_TYPE_V2_0))
501 {
502 ERR("WL: Wrong profile\n");
503 goto cleanup;
504 }
505
506 /* Load the user profile */
507 ZeroMemory(&ProfileInfo, sizeof(PROFILEINFOW));
508 ProfileInfo.dwSize = sizeof(PROFILEINFOW);
509 ProfileInfo.dwFlags = 0;
510 ProfileInfo.lpUserName = Session->MprNotifyInfo.pszUserName;
511 ProfileInfo.lpProfilePath = Session->Profile->pszProfile;
512 if (Session->Profile->dwType >= WLX_PROFILE_TYPE_V2_0)
513 {
514 ProfileInfo.lpDefaultPath = Session->Profile->pszNetworkDefaultUserProfile;
515 ProfileInfo.lpServerName = Session->Profile->pszServerName;
516 ProfileInfo.lpPolicyPath = Session->Profile->pszPolicy;
517 }
518
519 if (!LoadUserProfileW(Session->UserToken, &ProfileInfo))
520 {
521 ERR("WL: LoadUserProfileW() failed\n");
522 goto cleanup;
523 }
524 }
525
526 /* Create environment block for the user */
527 if (!CreateUserEnvironment(Session))
528 {
529 WARN("WL: SetUserEnvironment() failed\n");
530 goto cleanup;
531 }
532
534
535 DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_APPLYINGYOURPERSONALSETTINGS);
537
538 /* Set default user language */
539 if (!SetDefaultLanguage(Session))
540 {
541 WARN("WL: SetDefaultLanguage() failed\n");
542 goto cleanup;
543 }
544
545 /* Allow winsta and desktop access for this session */
546 if (!AllowAccessOnSession(Session))
547 {
548 WARN("WL: AllowAccessOnSession() failed to give winsta & desktop access for this session\n");
549 goto cleanup;
550 }
551
552 /* Connect remote resources */
553 RestoreAllConnections(Session);
554
555 if (!StartUserShell(Session))
556 {
557 //WCHAR StatusMsg[256];
558 WARN("WL: WlxActivateUserShell() failed\n");
559 //LoadStringW(hAppInstance, IDS_FAILEDACTIVATEUSERSHELL, StatusMsg, sizeof(StatusMsg) / sizeof(StatusMsg[0]));
560 //MessageBoxW(0, StatusMsg, NULL, MB_ICONERROR);
561 goto cleanup;
562 }
563
565
566 if (!InitializeScreenSaver(Session))
567 WARN("WL: Failed to initialize screen saver\n");
568
569 Session->hProfileInfo = ProfileInfo.hProfile;
570
571 /* Logon has succeeded. Play sound. */
572 PlayLogonSound(Session);
573
574 ret = TRUE;
575
576cleanup:
577 if (Session->Profile)
578 {
579 HeapFree(GetProcessHeap(), 0, Session->Profile->pszProfile);
580 HeapFree(GetProcessHeap(), 0, Session->Profile);
581 }
582 Session->Profile = NULL;
583 if (!ret && ProfileInfo.hProfile != INVALID_HANDLE_VALUE)
584 {
585 UnloadUserProfile(Session->UserToken, ProfileInfo.hProfile);
586 }
587 RemoveStatusMessage(Session);
588 if (!ret)
589 {
590 SetWindowStationUser(Session->InteractiveWindowStation,
591 &LuidNone, NULL, 0);
592 CloseHandle(Session->UserToken);
593 Session->UserToken = NULL;
594 }
595
596 if (ret)
597 {
598 SwitchDesktop(Session->ApplicationDesktop);
599 Session->LogonState = STATE_LOGGED_ON;
600 }
601
602 return ret;
603}
BOOL CreateUserEnvironment(IN PWLSESSION Session)
Definition: environment.c:128
#define IDS_APPLYINGYOURPERSONALSETTINGS
Definition: resource.h:26
#define IDS_LOADINGYOURPERSONALSETTINGS
Definition: resource.h:29
BOOL InitializeScreenSaver(IN OUT PWLSESSION Session)
Definition: screensaver.c:204
BOOL AllowAccessOnSession(_In_ PWLSESSION Session)
Assigns both window station and desktop access to the specific session currently active on the system...
Definition: security.c:1391
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
static void cleanup(void)
Definition: main.c:1335
BOOL WINAPI LoadUserProfileW(_In_ HANDLE hToken, _Inout_ LPPROFILEINFOW lpProfileInfo)
Definition: profile.c:2005
static VOID PlayLogonSound(IN OUT PWLSESSION Session)
Definition: sas.c:376
static BOOL StartUserShell(IN OUT PWLSESSION Session)
Definition: sas.c:80
BOOL SetDefaultLanguage(IN PWLSESSION Session)
Definition: sas.c:111
static VOID RestoreAllConnections(PWLSESSION Session)
Definition: sas.c:423
LPWSTR lpPolicyPath
Definition: userenv.h:42
LPWSTR lpServerName
Definition: userenv.h:41
LPWSTR lpProfilePath
Definition: userenv.h:39
DWORD dwFlags
Definition: userenv.h:37
DWORD dwSize
Definition: userenv.h:36
HANDLE hProfile
Definition: userenv.h:43
LPWSTR lpUserName
Definition: userenv.h:38
LPWSTR lpDefaultPath
Definition: userenv.h:40
struct _PROFILEINFOW PROFILEINFOW
int ret
@ StartShellHandler
Definition: winlogon.h:268
#define WLX_PROFILE_TYPE_V1_0
Definition: winwlx.h:50
#define WLX_PROFILE_TYPE_V2_0
Definition: winwlx.h:51
#define WLX_LOGON_OPT_NO_PROFILE
Definition: winwlx.h:48

Referenced by DoGenericAction().

◆ HandleMessageBeep()

static BOOL HandleMessageBeep ( _In_ PWLSESSION  Session,
_In_ UINT  uType 
)
static

Definition at line 1270 of file sas.c.

1273{
1274 LPWSTR EventName;
1275
1276 switch (uType)
1277 {
1278 case 0xFFFFFFFF:
1279 EventName = NULL;
1280 break;
1281 case MB_OK:
1282 EventName = L"SystemDefault";
1283 break;
1284 case MB_ICONASTERISK:
1285 EventName = L"SystemAsterisk";
1286 break;
1287 case MB_ICONEXCLAMATION:
1288 EventName = L"SystemExclamation";
1289 break;
1290 case MB_ICONHAND:
1291 EventName = L"SystemHand";
1292 break;
1293 case MB_ICONQUESTION:
1294 EventName = L"SystemQuestion";
1295 break;
1296 default:
1297 WARN("Unhandled type %d\n", uType);
1298 EventName = L"SystemDefault";
1299 }
1300
1301 return PlayEventSound(Session, EventName);
1302}
#define L(x)
Definition: ntvdm.h:50
static BOOL PlayEventSound(_In_ PWLSESSION Session, _In_ LPCWSTR EventName)
Definition: sas.c:405
#define MB_ICONHAND
Definition: winuser.h:791
#define MB_ICONEXCLAMATION
Definition: winuser.h:788
#define MB_OK
Definition: winuser.h:793
#define MB_ICONQUESTION
Definition: winuser.h:792
#define MB_ICONASTERISK
Definition: winuser.h:787
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by SASWindowProc().

◆ HandleShutdown()

NTSTATUS HandleShutdown ( IN OUT PWLSESSION  Session,
IN DWORD  wlxAction 
)

Definition at line 960 of file sas.c.

963{
966 DWORD exitCode;
967 BOOLEAN Old;
968
969 // SwitchDesktop(Session->WinlogonDesktop);
970
971 /* If the system is rebooting, show the appropriate string */
972 if (wlxAction == WLX_SAS_ACTION_SHUTDOWN_REBOOT)
973 DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_REACTOSISRESTARTING);
974 else
975 DisplayStatusMessage(Session, Session->WinlogonDesktop, IDS_REACTOSISSHUTTINGDOWN);
976
977 /* Prepare data for shutdown thread */
978 LSData = HeapAlloc(GetProcessHeap(), 0, sizeof(LOGOFF_SHUTDOWN_DATA));
979 if (!LSData)
980 {
981 ERR("Failed to allocate mem for thread data\n");
982 return STATUS_NO_MEMORY;
983 }
984 if (wlxAction == WLX_SAS_ACTION_SHUTDOWN_POWER_OFF)
985 LSData->Flags = EWX_POWEROFF;
986 else if (wlxAction == WLX_SAS_ACTION_SHUTDOWN_REBOOT)
987 LSData->Flags = EWX_REBOOT;
988 else
989 LSData->Flags = EWX_SHUTDOWN;
990 LSData->Session = Session;
991
992 // FIXME: We may need to specify this flag to really force application kill
993 // (we are shutting down ReactOS, not just logging off so no hangs, etc...
994 // should be allowed).
995 // LSData->Flags |= EWX_FORCE;
996
997 /* Run shutdown thread */
999 if (!hThread)
1000 {
1001 ERR("Unable to create shutdown thread, error %lu\n", GetLastError());
1002 HeapFree(GetProcessHeap(), 0, LSData);
1003 return STATUS_UNSUCCESSFUL;
1004 }
1006 HeapFree(GetProcessHeap(), 0, LSData);
1007 if (!GetExitCodeThread(hThread, &exitCode))
1008 {
1009 ERR("Unable to get exit code of shutdown thread (error %lu)\n", GetLastError());
1011 return STATUS_UNSUCCESSFUL;
1012 }
1014 if (exitCode == 0)
1015 {
1016 ERR("Shutdown thread returned failure\n");
1017 return STATUS_UNSUCCESSFUL;
1018 }
1019
1021
1022 /* Destroy SAS window */
1023 UninitializeSAS(Session);
1024
1025 /* Now we can shut down NT */
1026 ERR("Shutting down NT...\n");
1028 if (wlxAction == WLX_SAS_ACTION_SHUTDOWN_REBOOT)
1029 {
1031 }
1032 else
1033 {
1034 if (FALSE)
1035 {
1036 /* FIXME - only show this dialog if it's a shutdown and the computer doesn't support APM */
1039 }
1041 }
1043 return STATUS_SUCCESS;
1044}
unsigned char BOOLEAN
HINSTANCE hAppInstance
Definition: mmc.c:23
#define IDS_REACTOSISSHUTTINGDOWN
Definition: resource.h:31
#define IDD_SHUTDOWNCOMPUTER
Definition: resource.h:7
#define IDS_REACTOSISRESTARTING
Definition: resource.h:38
#define SE_SHUTDOWN_PRIVILEGE
Definition: security.c:673
@ ShutdownReboot
Definition: extypes.h:177
@ ShutdownNoReboot
Definition: extypes.h:176
NTSYSAPI NTSTATUS NTAPI RtlAdjustPrivilege(_In_ ULONG Privilege, _In_ BOOLEAN NewValue, _In_ BOOLEAN ForThread, _Out_ PBOOLEAN OldValue)
NTSTATUS NTAPI NtShutdownSystem(IN SHUTDOWN_ACTION Action)
Definition: shutdown.c:43
static INT_PTR CALLBACK ShutdownComputerWindowProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
Definition: sas.c:914
static VOID UninitializeSAS(IN OUT PWLSESSION Session)
Definition: sas.c:946
@ ShutdownHandler
Definition: winlogon.h:263
#define EWX_POWEROFF
Definition: winuser.h:637
#define EWX_SHUTDOWN
Definition: winuser.h:639
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:628
#define EWX_REBOOT
Definition: winuser.h:638
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define DialogBox
Definition: winuser.h:5773

Referenced by DoGenericAction(), and WinMain().

◆ InitializeSAS()

BOOL InitializeSAS ( IN OUT PWLSESSION  Session)

Definition at line 1507 of file sas.c.

1509{
1510 WNDCLASSEXW swc;
1511 BOOL ret = FALSE;
1512
1513 if (!SwitchDesktop(Session->WinlogonDesktop))
1514 {
1515 ERR("WL: Failed to switch to winlogon desktop\n");
1516 goto cleanup;
1517 }
1518
1519 /* Register SAS window class */
1520 swc.cbSize = sizeof(WNDCLASSEXW);
1521 swc.style = CS_SAVEBITS;
1523 swc.cbClsExtra = 0;
1524 swc.cbWndExtra = 0;
1525 swc.hInstance = hAppInstance;
1526 swc.hIcon = NULL;
1527 swc.hCursor = NULL;
1528 swc.hbrBackground = NULL;
1529 swc.lpszMenuName = NULL;
1531 swc.hIconSm = NULL;
1532 if (RegisterClassExW(&swc) == 0)
1533 {
1534 ERR("WL: Failed to register SAS window class\n");
1535 goto cleanup;
1536 }
1537
1538 /* Create invisible SAS window */
1539 Session->SASWindow = CreateWindowExW(
1540 0,
1543 WS_POPUP,
1544 0, 0, 0, 0, 0, 0,
1545 hAppInstance, Session);
1546 if (!Session->SASWindow)
1547 {
1548 ERR("WL: Failed to create SAS window\n");
1549 goto cleanup;
1550 }
1551
1552 /* Register SAS window to receive SAS notifications */
1553 if (!SetLogonNotifyWindow(Session->SASWindow))
1554 {
1555 ERR("WL: Failed to register SAS window\n");
1556 goto cleanup;
1557 }
1558
1560 return FALSE;
1561
1562 ret = TRUE;
1563
1564cleanup:
1565 if (!ret)
1566 UninitializeSAS(Session);
1567 return ret;
1568}
#define WS_POPUP
Definition: pedump.c:616
#define WINLOGON_SAS_TITLE
Definition: sas.c:27
#define WINLOGON_SAS_CLASS
Definition: sas.c:26
static LRESULT CALLBACK SASWindowProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
Definition: sas.c:1307
LPCWSTR lpszClassName
Definition: winuser.h:3229
LPCWSTR lpszMenuName
Definition: winuser.h:3228
HBRUSH hbrBackground
Definition: winuser.h:3227
WNDPROC lpfnWndProc
Definition: winuser.h:3221
UINT cbSize
Definition: winuser.h:3219
int cbWndExtra
Definition: winuser.h:3223
HCURSOR hCursor
Definition: winuser.h:3226
HICON hIconSm
Definition: winuser.h:3230
HINSTANCE hInstance
Definition: winuser.h:3224
UINT style
Definition: winuser.h:3220
int cbClsExtra
Definition: winuser.h:3222
HICON hIcon
Definition: winuser.h:3225
BOOL WINAPI SetLogonNotifyWindow(HWND Wnd)
Definition: logon.c:91
HWND WINAPI CreateWindowExW(_In_ DWORD dwExStyle, _In_opt_ LPCWSTR lpClassName, _In_opt_ LPCWSTR lpWindowName, _In_ DWORD dwStyle, _In_ int X, _In_ int Y, _In_ int nWidth, _In_ int nHeight, _In_opt_ HWND hWndParent, _In_opt_ HMENU hMenu, _In_opt_ HINSTANCE hInstance, _In_opt_ LPVOID lpParam)
ATOM WINAPI RegisterClassExW(_In_ CONST WNDCLASSEXW *)
#define CS_SAVEBITS
Definition: winuser.h:657
struct _WNDCLASSEXW WNDCLASSEXW

Referenced by WinMain().

◆ IsFirstLogon()

static BOOL IsFirstLogon ( VOID  )
static

Definition at line 290 of file sas.c.

291{
292 /* FIXME: All of this is a HACK, designed specifically for PlayLogonSoundThread.
293 * Don't call IsFirstLogon multiple times inside the same function. And please
294 * note that this function is not thread-safe. */
295 static BOOL bFirstLogon = TRUE;
296 if (bFirstLogon)
297 {
298 bFirstLogon = FALSE;
299 return TRUE;
300 }
301 return FALSE;
302}

Referenced by PlayLogonSoundThread().

◆ KillComProcesses()

static DWORD WINAPI KillComProcesses ( LPVOID  Parameter)
static

Definition at line 654 of file sas.c.

656{
657 DWORD ret = 1;
659
660 TRACE("In KillComProcesses\n");
661
662 if (LSData->Session->UserToken != NULL &&
664 {
665 ERR("ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError());
666 return 0;
667 }
668
669 /* Attempt to kill remaining processes. No notifications needed. */
671 {
672 ERR("Unable to kill COM apps, error %lu\n", GetLastError());
673 ret = 0;
674 }
675
676 if (LSData->Session->UserToken)
677 RevertToSelf();
678
679 return ret;
680}
BOOL WINAPI ImpersonateLoggedOnUser(HANDLE hToken)
Definition: misc.c:152
struct tagLOGOFF_SHUTDOWN_DATA * PLOGOFF_SHUTDOWN_DATA
#define TRACE(s)
Definition: solgame.cpp:4
HANDLE UserToken
Definition: winlogon.h:232
#define EWX_NONOTIFY
Definition: undocuser.h:135
#define EWX_CALLER_WINLOGON
Definition: undocuser.h:129
BOOL WINAPI RevertToSelf(void)
Definition: security.c:1608
BOOL WINAPI ExitWindowsEx(_In_ UINT, _In_ DWORD)
_Inout_opt_ PVOID Parameter
Definition: rtltypes.h:336

Referenced by HandleLogoff().

◆ LogoffShutdownThread()

static DWORD WINAPI LogoffShutdownThread ( LPVOID  Parameter)
static

Definition at line 609 of file sas.c.

611{
612 DWORD ret = 1;
614 UINT uFlags;
615
616 if (LSData->Session->UserToken != NULL &&
618 {
619 ERR("ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError());
620 return 0;
621 }
622
623 // FIXME: To be really fixed: need to check what needs to be kept and what needs to be removed there.
624 //
625 // uFlags = EWX_INTERNAL_KILL_USER_APPS | (LSData->Flags & EWX_FLAGS_MASK) |
626 // ((LSData->Flags & EWX_ACTION_MASK) == EWX_LOGOFF ? EWX_CALLER_WINLOGON_LOGOFF : 0);
627
628 uFlags = EWX_CALLER_WINLOGON | (LSData->Flags & 0x0F);
629
630 TRACE("In LogoffShutdownThread with uFlags == 0x%x; exit_in_progress == %s\n",
631 uFlags, ExitReactOSInProgress ? "true" : "false");
632
634
635 /* Close processes of the interactive user */
636 if (!ExitWindowsEx(uFlags, 0))
637 {
638 ERR("Unable to kill user apps, error %lu\n", GetLastError());
639 ret = 0;
640 }
641
642 /* Cancel all the user connections */
644
645 if (LSData->Session->UserToken)
646 RevertToSelf();
647
648 return ret;
649}
UINT uFlags
Definition: api.c:59
unsigned int UINT
Definition: ndis.h:50
static BOOL ExitReactOSInProgress
Definition: sas.c:45
DWORD WINAPI WNetClearConnections(HWND owner)
Definition: wnet.c:2827

Referenced by HandleLogoff(), and HandleShutdown().

◆ PlayEventSound()

static BOOL PlayEventSound ( _In_ PWLSESSION  Session,
_In_ LPCWSTR  EventName 
)
static

Definition at line 405 of file sas.c.

408{
409 BOOL bRet;
410
411 if (!ImpersonateLoggedOnUser(Session->UserToken))
412 return FALSE;
413
415
416 RevertToSelf();
417
418 return bRet;
419}
#define SND_ALIAS
Definition: mmsystem.h:160
#define SND_ASYNC
Definition: mmsystem.h:154
#define SND_NODEFAULT
Definition: mmsystem.h:155
BOOL PlaySoundRoutine(IN LPCWSTR FileName, IN UINT bLogon, IN UINT Flags)
Definition: sas.c:240

Referenced by HandleMessageBeep().

◆ PlayLogoffShutdownSound()

static VOID PlayLogoffShutdownSound ( _In_ PWLSESSION  Session,
_In_ BOOL  bShutdown 
)
static

Definition at line 388 of file sas.c.

391{
392 if (!ImpersonateLoggedOnUser(Session->UserToken))
393 return;
394
395 /* NOTE: Logoff and shutdown sounds play synchronously */
396 PlaySoundRoutine(bShutdown ? L"SystemExit" : L"WindowsLogoff",
397 FALSE,
399
400 RevertToSelf();
401}
volatile BOOL bShutdown
Definition: tcpsvcs.c:16

Referenced by HandleLogoff().

◆ PlayLogonSound()

static VOID PlayLogonSound ( IN OUT PWLSESSION  Session)
static

Definition at line 376 of file sas.c.

378{
380
381 hThread = CreateThread(NULL, 0, PlayLogonSoundThread, (PVOID)Session->UserToken, 0, NULL);
382 if (hThread)
384}
DWORD WINAPI PlayLogonSoundThread(IN LPVOID lpParameter)
Definition: sas.c:306

Referenced by HandleLogon().

◆ PlayLogonSoundThread()

DWORD WINAPI PlayLogonSoundThread ( IN LPVOID  lpParameter)

Definition at line 306 of file sas.c.

308{
311 ULONG Index = 0;
312 SC_HANDLE hSCManager, hService;
313
314 /* Open the service manager */
316 if (!hSCManager)
317 {
318 ERR("OpenSCManager failed (%x)\n", GetLastError());
319 return 0;
320 }
321
322 /* Open the wdmaud service */
323 hService = OpenServiceW(hSCManager, L"wdmaud", GENERIC_READ);
324 if (!hService)
325 {
326 /* The service is not installed */
327 TRACE("Failed to open wdmaud service (%x)\n", GetLastError());
329 return 0;
330 }
331
332 /* Wait for wdmaud to start */
333 do
334 {
336 {
337 TRACE("QueryServiceStatusEx failed (%x)\n", GetLastError());
338 break;
339 }
340
341 if (Info.dwCurrentState == SERVICE_RUNNING)
342 break;
343
344 Sleep(1000);
345
346 } while (Index++ < 20);
347
348 CloseServiceHandle(hService);
350
351 /* If wdmaud is not running exit */
352 if (Info.dwCurrentState != SERVICE_RUNNING)
353 {
354 WARN("wdmaud has not started!\n");
355 return 0;
356 }
357
358 /* Sound subsystem is running. Play logon sound. */
359 TRACE("Playing logon sound\n");
360 if (!ImpersonateLoggedOnUser((HANDLE)lpParameter))
361 {
362 ERR("ImpersonateLoggedOnUser failed (%x)\n", GetLastError());
363 }
364 else
365 {
366 PlaySoundRoutine(IsFirstLogon() ? L"SystemStart" : L"WindowsLogon",
367 TRUE,
369 RevertToSelf();
370 }
371 return 0;
372}
#define GENERIC_READ
Definition: compat.h:135
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static BOOL IsFirstLogon(VOID)
Definition: sas.c:290
SC_HANDLE hSCManager
Definition: sc.c:12
BOOL WINAPI QueryServiceStatusEx(SC_HANDLE hService, SC_STATUS_TYPE InfoLevel, LPBYTE lpBuffer, DWORD cbBufSize, LPDWORD pcbBytesNeeded)
Definition: scm.c:2887
SC_HANDLE WINAPI OpenServiceW(SC_HANDLE hSCManager, LPCWSTR lpServiceName, DWORD dwDesiredAccess)
Definition: scm.c:2160
BOOL WINAPI CloseServiceHandle(SC_HANDLE hSCObject)
Definition: scm.c:580
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
unsigned char * LPBYTE
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
Definition: wdfchildlist.h:690
_In_ WDFCOLLECTION _In_ ULONG Index
#define OpenSCManager
Definition: winsvc.h:575
@ SC_STATUS_PROCESS_INFO
Definition: winsvc.h:119
#define SC_MANAGER_CONNECT
Definition: winsvc.h:14
#define SERVICE_RUNNING
Definition: winsvc.h:24

Referenced by PlayLogonSound().

◆ PlaySoundRoutine()

BOOL PlaySoundRoutine ( IN LPCWSTR  FileName,
IN UINT  bLogon,
IN UINT  Flags 
)

Definition at line 240 of file sas.c.

244{
245 typedef BOOL (WINAPI *PLAYSOUNDW)(LPCWSTR,HMODULE,DWORD);
246 typedef UINT (WINAPI *WAVEOUTGETNUMDEVS)(VOID);
247 PLAYSOUNDW Play;
248 WAVEOUTGETNUMDEVS waveOutGetNumDevs;
249 UINT NumDevs;
251 BOOL Ret = FALSE;
252
253 hLibrary = LoadLibraryW(L"winmm.dll");
254 if (!hLibrary)
255 return FALSE;
256
257 waveOutGetNumDevs = (WAVEOUTGETNUMDEVS)GetProcAddress(hLibrary, "waveOutGetNumDevs");
258 Play = (PLAYSOUNDW)GetProcAddress(hLibrary, "PlaySoundW");
259
261 {
263 {
264 NumDevs = waveOutGetNumDevs();
265 if (!NumDevs)
266 {
267 if (!bLogon)
268 Beep(440, 125);
270 }
271 }
272
273 if (Play)
274 Ret = Play(FileName, NULL, Flags);
275 }
277 {
278 ERR("WL: Exception while playing sound '%S', Status 0x%08lx\n",
280 }
281 _SEH2_END;
282
284
285 return Ret;
286}
#define VOID
Definition: acefi.h:82
HMODULE hLibrary
Definition: odbccp32.c:12
BOOL WINAPI Beep(IN DWORD dwFreq, IN DWORD dwDuration)
Definition: deviceio.c:48
#define GetProcAddress(x, y)
Definition: compat.h:753
#define FreeLibrary(x)
Definition: compat.h:748
#define LoadLibraryW(x)
Definition: compat.h:747
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
#define BOOL
Definition: nt_native.h:43
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:165
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:66
#define _SEH2_END
Definition: pseh2_64.h:155
#define _SEH2_TRY
Definition: pseh2_64.h:55
#define _SEH2_LEAVE
Definition: pseh2_64.h:167
HANDLE HMODULE
Definition: typedefs.h:77
#define WINAPI
Definition: msvc.h:6
UINT WINAPI waveOutGetNumDevs(void)
Definition: winmm.c:2137
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by PlayEventSound(), PlayLogoffShutdownSound(), and PlayLogonSoundThread().

◆ RegisterHotKeys()

static BOOL RegisterHotKeys ( IN PWLSESSION  Session,
IN HWND  hwndSAS 
)
static

Definition at line 1235 of file sas.c.

1238{
1239 /* Register Ctrl+Alt+Del Hotkey */
1241 {
1242 ERR("WL: Unable to register Ctrl+Alt+Del hotkey!\n");
1243 return FALSE;
1244 }
1245
1246 /* Register Ctrl+Shift+Esc (optional) */
1248 if (!Session->TaskManHotkey)
1249 WARN("WL: Warning: Unable to register Ctrl+Alt+Esc hotkey!\n");
1250 return TRUE;
1251}
#define MOD_ALT
Definition: imm.h:184
#define MOD_SHIFT
Definition: imm.h:186
#define MOD_CONTROL
Definition: imm.h:185
HWND hwndSAS
Definition: winsta.c:24
#define HK_CTRL_SHIFT_ESC
Definition: sas.c:30
#define HK_CTRL_ALT_DEL
Definition: sas.c:29
BOOL WINAPI RegisterHotKey(_In_opt_ HWND, _In_ int, _In_ UINT, _In_ UINT)
#define VK_DELETE
Definition: winuser.h:2236
#define VK_ESCAPE
Definition: winuser.h:2217

Referenced by SASWindowProc().

◆ RestoreAllConnections()

static VOID RestoreAllConnections ( PWLSESSION  Session)
static

Definition at line 423 of file sas.c.

424{
425 DWORD dRet;
426 HANDLE hEnum;
427 LPNETRESOURCE lpRes;
428 DWORD dSize = 0x1000;
429 DWORD dCount = -1;
430 LPNETRESOURCE lpCur;
431 BOOL UserProfile;
432
433 UserProfile = (Session && Session->UserToken);
434 if (!UserProfile)
435 {
436 return;
437 }
438
439 if (!ImpersonateLoggedOnUser(Session->UserToken))
440 {
441 ERR("WL: ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError());
442 return;
443 }
444
446 if (dRet != WN_SUCCESS)
447 {
448 ERR("Failed to open enumeration: %lu\n", dRet);
449 goto quit;
450 }
451
452 lpRes = HeapAlloc(GetProcessHeap(), 0, dSize);
453 if (!lpRes)
454 {
455 ERR("Failed to allocate memory\n");
456 WNetCloseEnum(hEnum);
457 goto quit;
458 }
459
460 do
461 {
462 dSize = 0x1000;
463 dCount = -1;
464
465 memset(lpRes, 0, dSize);
466 dRet = WNetEnumResource(hEnum, &dCount, lpRes, &dSize);
467 if (dRet == WN_SUCCESS || dRet == WN_MORE_DATA)
468 {
469 lpCur = lpRes;
470 for (; dCount; dCount--)
471 {
473 lpCur++;
474 }
475 }
476 } while (dRet != WN_NO_MORE_ENTRIES);
477
478 HeapFree(GetProcessHeap(), 0, lpRes);
479 WNetCloseEnum(hEnum);
480
481quit:
482 RevertToSelf();
483}
void quit(int argc, const char *argv[])
Definition: cmds.c:1606
#define memset(x, y, z)
Definition: compat.h:39
LPSTR lpLocalName
Definition: winnetwk.h:171
LPSTR lpRemoteName
Definition: winnetwk.h:172
#define RESOURCETYPE_DISK
Definition: winnetwk.h:64
#define WN_MORE_DATA
Definition: winnetwk.h:117
#define WN_SUCCESS
Definition: winnetwk.h:111
#define RESOURCE_REMEMBERED
Definition: winnetwk.h:60
#define WNetEnumResource
Definition: winnetwk.h:599
#define WNetOpenEnum
Definition: winnetwk.h:598
#define WNetAddConnection
Definition: winnetwk.h:611
#define WN_NO_MORE_ENTRIES
Definition: winnetwk.h:146
DWORD WINAPI WNetCloseEnum(HANDLE hEnum)
Definition: wnet.c:1762

Referenced by HandleLogon().

◆ SASWindowProc()

static LRESULT CALLBACK SASWindowProc ( IN HWND  hwndDlg,
IN UINT  uMsg,
IN WPARAM  wParam,
IN LPARAM  lParam 
)
static

Definition at line 1307 of file sas.c.

1312{
1314
1315 switch (uMsg)
1316 {
1317 case WM_HOTKEY:
1318 {
1319 switch (lParam)
1320 {
1322 {
1323 TRACE("SAS: CONTROL+ALT+DELETE\n");
1324 if (!Session->Gina.UseCtrlAltDelete)
1325 break;
1327 return TRUE;
1328 }
1330 {
1331 TRACE("SAS: CONTROL+SHIFT+ESCAPE\n");
1332 if (Session->LogonState == STATE_LOGGED_ON)
1334 return TRUE;
1335 }
1336 }
1337 break;
1338 }
1339 case WM_CREATE:
1340 {
1341 /* Get the session pointer from the create data */
1342 Session = (PWLSESSION)((LPCREATESTRUCT)lParam)->lpCreateParams;
1343
1344 /* Save the Session pointer */
1345 SetWindowLongPtrW(hwndDlg, GWLP_USERDATA, (LONG_PTR)Session);
1346 if (GetSetupType())
1347 return TRUE;
1348 return RegisterHotKeys(Session, hwndDlg);
1349 }
1350 case WM_DESTROY:
1351 {
1352 if (!GetSetupType())
1353 UnregisterHotKeys(Session, hwndDlg);
1354 return TRUE;
1355 }
1356 case WM_SETTINGCHANGE:
1357 {
1358 UINT uiAction = (UINT)wParam;
1359 if (uiAction == SPI_SETSCREENSAVETIMEOUT
1360 || uiAction == SPI_SETSCREENSAVEACTIVE)
1361 {
1363 }
1364 return TRUE;
1365 }
1366 case WM_LOGONNOTIFY:
1367 {
1368 switch(wParam)
1369 {
1370 case LN_MESSAGE_BEEP:
1371 {
1372 return HandleMessageBeep(Session, lParam);
1373 }
1374 case LN_SHELL_EXITED:
1375 {
1376 /* lParam is the exit code */
1377 if (lParam != 1 &&
1378 Session->LogonState != STATE_LOGGED_OFF &&
1379 Session->LogonState != STATE_LOGGED_OFF_SAS)
1380 {
1381 SetTimer(hwndDlg, 1, 1000, NULL);
1382 }
1383 break;
1384 }
1386 {
1388 break;
1389 }
1391 {
1393 break;
1394 }
1395 case LN_LOGOFF:
1396 {
1397 UINT Flags = (UINT)lParam;
1399 DWORD wlxAction;
1400
1401 TRACE("\tFlags : 0x%lx\n", lParam);
1402
1403 /*
1404 * Our caller (USERSRV) should have added the shutdown flag
1405 * when setting also poweroff or reboot.
1406 */
1407 if (Action & (EWX_POWEROFF | EWX_REBOOT))
1408 {
1409 if ((Action & EWX_SHUTDOWN) == 0)
1410 {
1411 ERR("Missing EWX_SHUTDOWN flag for poweroff or reboot; action 0x%x\n", Action);
1413 }
1414
1415 /* Now we can locally remove it for performing checks */
1416 Action &= ~EWX_SHUTDOWN;
1417 }
1418
1419 /* Check parameters */
1420 if (Action & EWX_FORCE)
1421 {
1422 // FIXME!
1423 ERR("FIXME: EWX_FORCE present for Winlogon, what to do?\n");
1424 Action &= ~EWX_FORCE;
1425 }
1426 switch (Action)
1427 {
1428 case EWX_LOGOFF:
1429 wlxAction = WLX_SAS_ACTION_LOGOFF;
1430 break;
1431 case EWX_SHUTDOWN:
1432 wlxAction = WLX_SAS_ACTION_SHUTDOWN;
1433 break;
1434 case EWX_REBOOT:
1436 break;
1437 case EWX_POWEROFF:
1439 break;
1440
1441 default:
1442 {
1443 ERR("Invalid ExitWindows action 0x%x\n", Action);
1445 }
1446 }
1447
1448 TRACE("In LN_LOGOFF, exit_in_progress == %s\n",
1449 ExitReactOSInProgress ? "true" : "false");
1450
1451 /*
1452 * In case a parallel shutdown request is done (while we are
1453 * being to shut down) and it was not done by Winlogon itself,
1454 * then just stop here.
1455 */
1456#if 0
1457// This code is commented at the moment (even if it's correct) because
1458// our log-offs do not really work: the shell is restarted, no app is killed
1459// etc... and as a result you just get explorer opening "My Documents". And
1460// if you try now a shut down, it won't work because winlogon thinks it is
1461// still in the middle of a shutdown.
1462// Maybe we also need to reset ExitReactOSInProgress somewhere else??
1464 {
1465 break;
1466 }
1467#endif
1468 /* Now do the shutdown action proper */
1469 DoGenericAction(Session, wlxAction);
1470 return 1;
1471 }
1472 case LN_LOGOFF_CANCELED:
1473 {
1474 ERR("Logoff canceled!!, before: exit_in_progress == %s, after will be false\n",
1475 ExitReactOSInProgress ? "true" : "false");
1476
1478 return 1;
1479 }
1480 default:
1481 {
1482 ERR("WM_LOGONNOTIFY case %d is unimplemented\n", wParam);
1483 }
1484 }
1485 return 0;
1486 }
1487 case WM_TIMER:
1488 {
1489 if (wParam == 1)
1490 {
1491 KillTimer(hwndDlg, 1);
1492 StartUserShell(Session);
1493 }
1494 break;
1495 }
1496 case WLX_WM_SAS:
1497 {
1498 DispatchSAS(Session, (DWORD)wParam);
1499 return TRUE;
1500 }
1501 }
1502
1503 return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
1504}
DWORD GetSetupType(VOID)
Definition: setup.c:16
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
#define DefWindowProc
Definition: ros2win.h:31
static BOOL RegisterHotKeys(IN PWLSESSION Session, IN HWND hwndSAS)
Definition: sas.c:1235
static VOID DispatchSAS(IN OUT PWLSESSION Session, IN DWORD dwSasType)
Definition: sas.c:1139
static BOOL HandleMessageBeep(_In_ PWLSESSION Session, _In_ UINT uType)
Definition: sas.c:1270
#define EWX_ACTION_MASK
Definition: sas.c:37
static BOOL UnregisterHotKeys(IN PWLSESSION Session, IN HWND hwndSAS)
Definition: sas.c:1255
BOOL UseCtrlAltDelete
Definition: winlogon.h:131
HANDLE hScreenSaverParametersChanged
Definition: winlogon.h:243
LOGON_STATE LogonState
Definition: winlogon.h:234
HWND SASWindow
Definition: winlogon.h:225
GINAINSTANCE Gina
Definition: winlogon.h:221
#define GetWindowLongPtr
Definition: treelist.c:73
#define GWLP_USERDATA
Definition: treelist.c:63
#define MAKELONG(a, b)
Definition: typedefs.h:249
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define LN_SHELL_EXITED
Definition: undocuser.h:116
#define LN_LOCK_WORKSTATION
Definition: undocuser.h:118
#define WM_LOGONNOTIFY
Definition: undocuser.h:37
#define LN_START_SCREENSAVE
Definition: undocuser.h:121
#define LN_MESSAGE_BEEP
Definition: undocuser.h:120
#define LN_LOGOFF
Definition: undocuser.h:115
#define LN_LOGOFF_CANCELED
Definition: undocuser.h:122
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
Definition: wdfiotarget.h:510
struct _WLSESSION * PWLSESSION
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_CREATE
Definition: winuser.h:1611
#define SPI_SETSCREENSAVEACTIVE
Definition: winuser.h:1369
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define WM_SETTINGCHANGE
Definition: winuser.h:1632
#define WM_TIMER
Definition: winuser.h:1745
#define WM_HOTKEY
Definition: winuser.h:1882
#define WM_DESTROY
Definition: winuser.h:1612
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define SetWindowLongPtrW
Definition: winuser.h:5358
#define SPI_SETSCREENSAVETIMEOUT
Definition: winuser.h:1367
#define WLX_WM_SAS
Definition: winwlx.h:71

Referenced by InitializeSAS().

◆ SetDefaultLanguage()

BOOL SetDefaultLanguage ( IN PWLSESSION  Session)

Definition at line 111 of file sas.c.

113{
114 BOOL ret = FALSE;
115 BOOL UserProfile;
116 LONG rc;
117 HKEY UserKey, hKey = NULL;
118 LPCWSTR SubKey, ValueName;
119 DWORD dwType, dwSize;
120 LPWSTR Value = NULL;
121 UNICODE_STRING ValueString;
123 LCID Lcid;
124
125 UserProfile = (Session && Session->UserToken);
126
127 if (UserProfile && !ImpersonateLoggedOnUser(Session->UserToken))
128 {
129 ERR("WL: ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError());
130 return FALSE;
131 // FIXME: ... or use the default language of the system??
132 // UserProfile = FALSE;
133 }
134
135 if (UserProfile)
136 {
137 rc = RegOpenCurrentUser(MAXIMUM_ALLOWED, &UserKey);
138 if (rc != ERROR_SUCCESS)
139 {
140 TRACE("RegOpenCurrentUser() failed with error %lu\n", rc);
141 goto cleanup;
142 }
143
144 SubKey = L"Control Panel\\International";
145 ValueName = L"Locale";
146 }
147 else
148 {
149 UserKey = NULL;
150 SubKey = L"System\\CurrentControlSet\\Control\\Nls\\Language";
151 ValueName = L"Default";
152 }
153
154 rc = RegOpenKeyExW(UserKey ? UserKey : HKEY_LOCAL_MACHINE,
155 SubKey,
156 0,
157 KEY_READ,
158 &hKey);
159
160 if (UserKey)
161 RegCloseKey(UserKey);
162
163 if (rc != ERROR_SUCCESS)
164 {
165 TRACE("RegOpenKeyEx() failed with error %lu\n", rc);
166 goto cleanup;
167 }
168
170 ValueName,
171 NULL,
172 &dwType,
173 NULL,
174 &dwSize);
175 if (rc != ERROR_SUCCESS)
176 {
177 TRACE("RegQueryValueEx() failed with error %lu\n", rc);
178 goto cleanup;
179 }
180 else if (dwType != REG_SZ)
181 {
182 TRACE("Wrong type for %S\\%S registry entry (got 0x%lx, expected 0x%x)\n",
183 SubKey, ValueName, dwType, REG_SZ);
184 goto cleanup;
185 }
186
188 if (!Value)
189 {
190 TRACE("HeapAlloc() failed\n");
191 goto cleanup;
192 }
194 ValueName,
195 NULL,
196 NULL,
197 (LPBYTE)Value,
198 &dwSize);
199 if (rc != ERROR_SUCCESS)
200 {
201 TRACE("RegQueryValueEx() failed with error %lu\n", rc);
202 goto cleanup;
203 }
204
205 /* Convert Value to a Lcid */
206 ValueString.Length = ValueString.MaximumLength = (USHORT)dwSize;
207 ValueString.Buffer = Value;
208 Status = RtlUnicodeStringToInteger(&ValueString, 16, (PULONG)&Lcid);
209 if (!NT_SUCCESS(Status))
210 {
211 TRACE("RtlUnicodeStringToInteger() failed with status 0x%08lx\n", Status);
212 goto cleanup;
213 }
214
215 TRACE("%s language is 0x%08lx\n",
216 UserProfile ? "User" : "System", Lcid);
217 Status = NtSetDefaultLocale(UserProfile, Lcid);
218 if (!NT_SUCCESS(Status))
219 {
220 TRACE("NtSetDefaultLocale() failed with status 0x%08lx\n", Status);
221 goto cleanup;
222 }
223
224 ret = TRUE;
225
226cleanup:
227 if (Value)
229
230 if (hKey)
232
233 if (UserProfile)
234 RevertToSelf();
235
236 return ret;
237}
#define RegCloseKey(hKey)
Definition: registry.h:49
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegOpenCurrentUser(IN REGSAM samDesired, OUT PHKEY phkResult)
Definition: reg.c:3209
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
FxAutoRegKey hKey
#define REG_SZ
Definition: layer.c:22
#define KEY_READ
Definition: nt_native.h:1023
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger(PUNICODE_STRING String, ULONG Base, PULONG Value)
#define MAXIMUM_ALLOWED
Definition: nt_native.h:83
NTSTATUS NTAPI NtSetDefaultLocale(IN BOOLEAN UserProfile, IN LCID DefaultLocaleId)
Definition: locale.c:437
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
DWORD LCID
Definition: nls.h:13
USHORT MaximumLength
Definition: env_spec_w32.h:370
uint32_t * PULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
_In_ CONST DEVPROPKEY _In_ LCID Lcid
Definition: iofuncs.h:2415

Referenced by HandleLogon(), and InitializeSAS().

◆ ShutdownComputerWindowProc()

static INT_PTR CALLBACK ShutdownComputerWindowProc ( IN HWND  hwndDlg,
IN UINT  uMsg,
IN WPARAM  wParam,
IN LPARAM  lParam 
)
static

Definition at line 914 of file sas.c.

919{
921
922 switch (uMsg)
923 {
924 case WM_COMMAND:
925 {
926 switch (LOWORD(wParam))
927 {
930 return TRUE;
931 }
932 break;
933 }
934 case WM_INITDIALOG:
935 {
938 return TRUE;
939 }
940 }
941 return FALSE;
942}
#define IDC_BTNSHTDOWNCOMPUTER
Definition: resource.h:10
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:325
#define LOWORD(l)
Definition: pedump.c:82
#define MF_BYCOMMAND
Definition: winuser.h:202
#define WM_COMMAND
Definition: winuser.h:1743
#define WM_INITDIALOG
Definition: winuser.h:1742
HMENU WINAPI GetSystemMenu(_In_ HWND, _In_ BOOL)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
HWND WINAPI SetFocus(_In_opt_ HWND)
BOOL WINAPI RemoveMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
#define SC_CLOSE
Definition: winuser.h:2595
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)

Referenced by HandleShutdown().

◆ StartTaskManager()

static BOOL StartTaskManager ( IN OUT PWLSESSION  Session)
static

Definition at line 52 of file sas.c.

54{
55 LPVOID lpEnvironment;
56 BOOL ret;
57
58 if (!Session->Gina.Functions.WlxStartApplication)
59 return FALSE;
60
62 &lpEnvironment,
63 Session->UserToken,
64 TRUE))
65 {
66 return FALSE;
67 }
68
69 ret = Session->Gina.Functions.WlxStartApplication(
70 Session->Gina.Context,
71 L"Default",
72 lpEnvironment,
73 L"taskmgr.exe");
74
75 DestroyEnvironmentBlock(lpEnvironment);
76 return ret;
77}
BOOL WINAPI DestroyEnvironmentBlock(IN LPVOID lpEnvironment)
Definition: environment.c:725
BOOL WINAPI CreateEnvironmentBlock(OUT LPVOID *lpEnvironment, IN HANDLE hToken, IN BOOL bInherit)
Definition: environment.c:503

Referenced by DoGenericAction().

◆ StartUserShell()

static BOOL StartUserShell ( IN OUT PWLSESSION  Session)
static

Definition at line 80 of file sas.c.

82{
83 LPVOID lpEnvironment = NULL;
84 BOOLEAN Old;
85 BOOL ret;
86
87 /* Create environment block for the user */
88 if (!CreateEnvironmentBlock(&lpEnvironment, Session->UserToken, TRUE))
89 {
90 WARN("WL: CreateEnvironmentBlock() failed\n");
91 return FALSE;
92 }
93
94 /* Get privilege */
95 /* FIXME: who should do it? winlogon or gina? */
96 /* FIXME: reverting to lower privileges after creating user shell? */
98
99 ret = Session->Gina.Functions.WlxActivateUserShell(
100 Session->Gina.Context,
101 L"Default",
102 NULL, /* FIXME */
103 lpEnvironment);
104
105 DestroyEnvironmentBlock(lpEnvironment);
106 return ret;
107}
#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE
Definition: security.c:657

Referenced by HandleLogon(), and SASWindowProc().

◆ UninitializeSAS()

static VOID UninitializeSAS ( IN OUT PWLSESSION  Session)
static

Definition at line 946 of file sas.c.

948{
949 if (Session->SASWindow)
950 {
951 DestroyWindow(Session->SASWindow);
952 Session->SASWindow = NULL;
953 }
954 if (Session->hEndOfScreenSaverThread)
955 SetEvent(Session->hEndOfScreenSaverThread);
957}
BOOL WINAPI UnregisterClassW(_In_ LPCWSTR, HINSTANCE)
BOOL WINAPI DestroyWindow(_In_ HWND)

Referenced by HandleShutdown(), and InitializeSAS().

◆ UnregisterHotKeys()

static BOOL UnregisterHotKeys ( IN PWLSESSION  Session,
IN HWND  hwndSAS 
)
static

Definition at line 1255 of file sas.c.

1258{
1259 /* Unregister hotkeys */
1261
1262 if (Session->TaskManHotkey)
1264
1265 return TRUE;
1266}
BOOL WINAPI UnregisterHotKey(_In_opt_ HWND, _In_ int)

Referenced by SASWindowProc().

Variable Documentation

◆ ExitReactOSInProgress

BOOL ExitReactOSInProgress = FALSE
static

Definition at line 45 of file sas.c.

Referenced by LogoffShutdownThread(), and SASWindowProc().

◆ LuidNone

LUID LuidNone = {0, 0}