17 #define WIN32_LEAN_AND_MEAN 26 #define WINLOGON_SAS_CLASS L"SAS Window class" 27 #define WINLOGON_SAS_TITLE L"SAS window" 29 #define HK_CTRL_ALT_DEL 0 30 #define HK_CTRL_SHIFT_ESC 1 37 #define EWX_ACTION_MASK 0x5C0F 58 if (!Session->Gina.Functions.WlxStartApplication)
69 ret = Session->Gina.Functions.WlxStartApplication(
70 Session->Gina.Context,
90 WARN(
"WL: CreateEnvironmentBlock() failed\n");
99 ret = Session->Gina.Functions.WlxActivateUserShell(
100 Session->Gina.Context,
125 UserProfile = (Session && Session->UserToken);
129 ERR(
"WL: ImpersonateLoggedOnUser() failed with error %lu\n",
GetLastError());
140 TRACE(
"RegOpenCurrentUser() failed with error %lu\n", rc);
144 SubKey =
L"Control Panel\\International";
150 SubKey =
L"System\\CurrentControlSet\\Control\\Nls\\Language";
165 TRACE(
"RegOpenKeyEx() failed with error %lu\n", rc);
177 TRACE(
"RegQueryValueEx() failed with error %lu\n", rc);
180 else if (dwType !=
REG_SZ)
182 TRACE(
"Wrong type for %S\\%S registry entry (got 0x%lx, expected 0x%x)\n",
190 TRACE(
"HeapAlloc() failed\n");
201 TRACE(
"RegQueryValueEx() failed with error %lu\n", rc);
211 TRACE(
"RtlUnicodeStringToInteger() failed with status 0x%08lx\n",
Status);
215 TRACE(
"%s language is 0x%08lx\n",
216 UserProfile ?
"User" :
"System",
Lcid);
220 TRACE(
"NtSetDefaultLocale() failed with status 0x%08lx\n",
Status);
287 BYTE TokenUserBuffer[256];
309 sizeof(TokenUserBuffer),
313 ERR(
"NtQueryInformationToken failed: %x!\n",
Status);
318 RtlInitEmptyUnicodeString(&SidString, wszBuffer,
sizeof(wszBuffer));
322 ERR(
"RtlConvertSidToUnicodeString failed: %x!\n",
Status);
329 sizeof(wszBuffer) - SidString.
Length,
330 L"\\AppEvents\\Schemes\\Apps\\.Default\\WindowsLogon\\.Current")))
333 ERR(
"StringCbCopyW failed!\n");
340 ERR(
"RegOpenKeyExW(%ls) failed!\n", wszBuffer);
348 ERR(
"RegQueryValueExW failed!\n");
358 ERR(
"No sound has been set\n");
365 ERR(
"ExpandEnvironmentStringsW failed!\n");
401 }
while (
Index++ < 20);
409 WARN(
"wdmaud has not started!\n");
414 TRACE(
"Playing logon sound: %ls\n", wszDest);
438 DWORD dSize = 0x1000;
443 UserProfile = (Session && Session->
UserToken);
451 ERR(
"WL: ImpersonateLoggedOnUser() failed with error %lu\n",
GetLastError());
458 ERR(
"Failed to open enumeration: %lu\n", dRet);
465 ERR(
"Failed to allocate memory\n");
480 for (; dCount; dCount--)
508 if (Session->Profile ==
NULL 512 ERR(
"WL: Wrong profile\n");
520 ProfileInfo.
lpUserName = Session->MprNotifyInfo.pszUserName;
524 ProfileInfo.
lpDefaultPath = Session->Profile->pszNetworkDefaultUserProfile;
525 ProfileInfo.
lpServerName = Session->Profile->pszServerName;
531 ERR(
"WL: LoadUserProfileW() failed\n");
539 WARN(
"WL: SetUserEnvironment() failed\n");
551 WARN(
"WL: SetDefaultLanguage() failed\n");
558 WARN(
"WL: AllowAccessOnSession() failed to give winsta & desktop access for this session\n");
568 WARN(
"WL: WlxActivateUserShell() failed\n");
577 WARN(
"WL: Failed to initialize screen saver\n");
579 Session->hProfileInfo = ProfileInfo.
hProfile;
587 if (Session->Profile)
592 Session->Profile =
NULL;
603 Session->UserToken =
NULL;
629 ERR(
"ImpersonateLoggedOnUser() failed with error %lu\n",
GetLastError());
640 TRACE(
"In LogoffShutdownThread with uFlags == 0x%x; exit_in_progress == %s\n",
670 TRACE(
"In KillComProcesses\n");
675 ERR(
"ImpersonateLoggedOnUser() failed with error %lu\n",
GetLastError());
737 ERR(
"Failed to initialize security descriptor for logoff thread!\n");
751 ERR(
"Failed to allocate memory for logoff security descriptor!\n");
774 ERR(
"Failed to set Access Rights for logoff thread. Logging out will most likely fail.\n");
782 ERR(
"Failed to initialize security descriptor for logoff thread!\n");
834 ERR(
"Failed to allocate mem for thread data\n");
843 ERR(
"Failed to create a required security descriptor. Status 0x%08lx\n",
Status);
860 ERR(
"Unable to get exit code of logoff thread (error %lu)\n",
GetLastError());
869 ERR(
"Logoff thread returned failure\n");
910 Session->UserToken =
NULL;
953 if (Session->SASWindow)
956 Session->SASWindow =
NULL;
958 if (Session->hEndOfScreenSaverThread)
959 SetEvent(Session->hEndOfScreenSaverThread);
985 ERR(
"Failed to allocate mem for thread data\n");
1013 ERR(
"Unable to get exit code of shutdown thread (error %lu)\n",
GetLastError());
1020 ERR(
"Shutdown thread returned failure\n");
1030 ERR(
"Shutting down NT...\n");
1063 Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
1072 Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
1081 Session->Gina.Functions.WlxDisplayLockedNotice(Session->Gina.Context);
1085 if (Session->Gina.Functions.WlxIsLockOk(Session->Gina.Context))
1089 Session->Gina.Functions.WlxDisplayLockedNotice(Session->Gina.Context);
1099 if (!Session->Gina.Functions.WlxIsLogoffOk(Session->Gina.Context))
1106 Session->Gina.Functions.WlxLogoff(Session->Gina.Context);
1112 Session->Gina.Functions.WlxShutdown(Session->Gina.Context, wlxAction);
1116 Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
1122 Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
1136 WARN(
"Unknown SAS action 0x%lx\n", wlxAction);
1153 switch (Session->LogonState)
1157 Session->Gina.Functions.WlxDisplaySASNotice(Session->Gina.Context);
1165 Session->Options = 0;
1167 wlxAction = (
DWORD)Session->Gina.Functions.WlxLoggedOutSAS(
1168 Session->Gina.Context,
1173 &Session->UserToken,
1174 &Session->MprNotifyInfo,
1175 (
PVOID*)&Session->Profile);
1184 wlxAction = (
DWORD)Session->Gina.Functions.WlxLoggedOnSAS(Session->Gina.Context, dwSasType,
NULL);
1196 wlxAction = (
DWORD)Session->Gina.Functions.WlxWkstaLockedSAS(Session->Gina.Context, dwSasType);
1212 if (!Session->Gina.Functions.WlxScreenSaverNotify(Session->Gina.Context, &bSecure))
1215 SetEvent(Session->hEndOfScreenSaver);
1245 ERR(
"WL: Unable to register Ctrl+Alt+Del hotkey!\n");
1251 if (!Session->TaskManHotkey)
1252 WARN(
"WL: Warning: Unable to register Ctrl+Alt+Esc hotkey!\n");
1265 if (Session->TaskManHotkey)
1283 EventName =
L"SystemDefault";
1286 EventName =
L"SystemAsterisk";
1289 EventName =
L"SystemExclamation";
1292 EventName =
L"SystemHand";
1295 EventName =
L"SystemQuestion";
1298 WARN(
"Unhandled type %d\n", uType);
1299 EventName =
L"SystemDefault";
1324 TRACE(
"SAS: CONTROL+ALT+DELETE\n");
1332 TRACE(
"SAS: CONTROL+SHIFT+ESCAPE\n");
1412 ERR(
"Missing EWX_SHUTDOWN flag for poweroff or reboot; action 0x%x\n",
Action);
1424 ERR(
"FIXME: EWX_FORCE present for Winlogon, what to do?\n");
1444 ERR(
"Invalid ExitWindows action 0x%x\n",
Action);
1449 TRACE(
"In LN_LOGOFF, exit_in_progress == %s\n",
1475 ERR(
"Logoff canceled!!, before: exit_in_progress == %s, after will be false\n",
1483 ERR(
"WM_LOGONNOTIFY case %d is unimplemented\n",
wParam);
1516 ERR(
"WL: Failed to switch to winlogon desktop\n");
1535 ERR(
"WL: Failed to register SAS window class\n");
1547 if (!Session->SASWindow)
1549 ERR(
"WL: Failed to create SAS window\n");
1556 ERR(
"WL: Failed to register SAS window\n");
struct _SECURITY_DESCRIPTOR * PSECURITY_DESCRIPTOR
BOOL DisplayStatusMessage(IN PWLSESSION Session, IN HDESK hDesktop, IN UINT ResourceId)
#define WLX_SAS_ACTION_SHUTDOWN
BOOL RemoveStatusMessage(IN PWLSESSION Session)
#define IDS_APPLYINGYOURPERSONALSETTINGS
#define WLX_SAS_ACTION_LOCK_WKSTA
BOOL WINAPI SetWindowStationUser(IN HWINSTA hWindowStation, IN PLUID pluid, IN PSID psid OPTIONAL, IN DWORD size)
struct _WLSESSION * PWLSESSION
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
#define LN_LOGOFF_CANCELED
HANDLE hScreenSaverParametersChanged
_In_ ULONG _In_ ULONG _In_ ULONG Length
BOOL WINAPI SetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR pSecurityDescriptor, BOOL bDaclPresent, PACL pDacl, BOOL bDaclDefaulted)
ACCESS_MODE grfAccessMode
struct tagLOGOFF_SHUTDOWN_DATA LOGOFF_SHUTDOWN_DATA
_In_ CONST DEVPROPKEY _In_ LCID Lcid
#define SC_MANAGER_CONNECT
BOOL WINAPI UnregisterClassW(_In_ LPCWSTR, HINSTANCE)
#define WNetAddConnection
#define SECURITY_DESCRIPTOR_MIN_LENGTH
BOOL WINAPI HandleMessageBeep(UINT uType)
static DWORD WINAPI KillComProcesses(LPVOID Parameter)
#define WLX_SAS_TYPE_SCRNSVR_ACTIVITY
#define UNREFERENCED_PARAMETER(P)
_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
#define STATUS_INVALID_PARAMETER
BOOL WINAPI RevertToSelf(VOID)
BOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD dwRevision)
BOOL WINAPI SetLogonNotifyWindow(HWND Wnd)
void quit(int argc, const char *argv[])
BOOL InitializeSAS(IN OUT PWLSESSION Session)
VOID StartScreenSaver(IN PWLSESSION Session)
BOOL PlaySoundRoutine(IN LPCWSTR FileName, IN UINT bLogon, IN UINT Flags)
static SID_IDENTIFIER_AUTHORITY WorldAuthority
static BOOL RegisterHotKeys(IN PWLSESSION Session, IN HWND hwndSAS)
static LRESULT CALLBACK SASWindowProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
#define INVALID_HANDLE_VALUE
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
DWORD WINAPI GetLastError(VOID)
NTSYSAPI NTSTATUS NTAPI RtlAdjustPrivilege(_In_ ULONG Privilege, _In_ BOOLEAN NewValue, _In_ BOOLEAN ForThread, _Out_ PBOOLEAN OldValue)
#define WLX_SAS_TYPE_TIMEOUT
static BOOL StartTaskManager(IN OUT PWLSESSION Session)
HWND WINAPI SetFocus(_In_opt_ HWND)
static VOID DestroyLogoffSecurityAttributes(IN PSECURITY_ATTRIBUTES psa)
struct _WNDCLASSEXW WNDCLASSEXW
static BOOL UnregisterHotKeys(IN PWLSESSION Session, IN HWND hwndSAS)
static VOID DoGenericAction(IN OUT PWLSESSION Session, IN DWORD wlxAction)
BOOL WINAPI QueryServiceStatusEx(SC_HANDLE hService, SC_STATUS_TYPE InfoLevel, LPBYTE lpBuffer, DWORD cbBufSize, LPDWORD pcbBytesNeeded)
NTSTATUS HandleShutdown(IN OUT PWLSESSION Session, IN DWORD wlxAction)
static VOID UninitializeSAS(IN OUT PWLSESSION Session)
BOOL WINAPI CreateEnvironmentBlock(OUT LPVOID *lpEnvironment, IN HANDLE hToken, IN BOOL bInherit)
DWORD WINAPI PlayLogonSoundThread(IN LPVOID lpParameter)
BOOL CreateUserEnvironment(IN PWLSESSION Session)
BOOL WINAPI DestroyWindow(_In_ HWND)
#define THREAD_SET_THREAD_TOKEN
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
BOOL WINAPI UnloadUserProfile(_In_ HANDLE hToken, _In_ HANDLE hProfile)
BOOL WINAPI UnregisterHotKey(_In_opt_ HWND, _In_ int)
static DWORD WINAPI LogoffShutdownThread(LPVOID Parameter)
static NTSTATUS CreateLogoffSecurityAttributes(OUT PSECURITY_ATTRIBUTES *ppsa)
#define EWX_CALLER_WINLOGON
#define WLX_SAS_TYPE_SCRNSVR_TIMEOUT
#define MB_ICONEXCLAMATION
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
#define SECURITY_DESCRIPTOR_REVISION
ATOM WINAPI RegisterClassExW(_In_ CONST WNDCLASSEXW *)
#define IDS_SAVEYOURSETTINGS
BOOL WINAPI GetExitCodeThread(IN HANDLE hThread, OUT LPDWORD lpExitCode)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
static INT_PTR CALLBACK ShutdownComputerWindowProc(IN HWND hwndDlg, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
#define WINLOGON_SAS_CLASS
#define IDS_REACTOSISSHUTTINGDOWN
SC_HANDLE WINAPI OpenServiceW(SC_HANDLE hSCManager, LPCWSTR lpServiceName, DWORD dwDesiredAccess)
#define LN_START_SCREENSAVE
BOOL WINAPI CloseServiceHandle(SC_HANDLE hSCObject)
#define WLX_SAS_ACTION_LOGOFF
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)
HMENU WINAPI GetSystemMenu(_In_ HWND, _In_ BOOL)
#define WLX_SAS_ACTION_UNLOCK_WKSTA
HWND WINAPI GetDesktopWindow(void)
static BOOL HandleLogon(IN OUT PWLSESSION Session)
static VOID DispatchSAS(IN OUT PWLSESSION Session, IN DWORD dwSasType)
BOOL WINAPI ImpersonateLoggedOnUser(HANDLE hToken)
UINT WINAPI waveOutGetNumDevs(void)
#define SE_SHUTDOWN_PRIVILEGE
#define WLX_SHUTTINGDOWN(Status)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define LN_LOCK_WORKSTATION
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_Must_inspect_result_ __kernel_entry NTSTATUS NTAPI NtQueryInformationToken(_In_ HANDLE TokenHandle, _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, _Out_writes_bytes_to_opt_(TokenInformationLength, *ReturnLength) PVOID TokenInformation, _In_ ULONG TokenInformationLength, _Out_ PULONG ReturnLength)
Queries a specific type of information in regard of an access token based upon the information class....
static VOID RestoreAllConnections(PWLSESSION Session)
BOOL AllowAccessOnSession(_In_ PWLSESSION Session)
Assigns both window station and desktop access to the specific session currently active on the system...
_Must_inspect_result_ _In_ ULONG Flags
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define NT_SUCCESS(StatCode)
#define SECURITY_WORLD_SID_AUTHORITY
_In_ WDFCOLLECTION _In_ ULONG Index
NTSTATUS NTAPI NtSetDefaultLocale(IN BOOLEAN UserProfile, IN LCID DefaultLocaleId)
BOOL InitializeScreenSaver(IN OUT PWLSESSION Session)
static BOOL ExitReactOSInProgress
BOOL WINAPI SwitchDesktop(_In_ HDESK)
#define SECURITY_WORLD_RID
NTSYSAPI NTSTATUS NTAPI RtlConvertSidToUnicodeString(OUT PUNICODE_STRING DestinationString, IN PVOID Sid, IN BOOLEAN AllocateDestinationString)
BOOL SetDefaultLanguage(IN PWLSESSION Session)
#define WLX_SAS_ACTION_LOGON
#define STATUS_UNSUCCESSFUL
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
#define SPI_SETSCREENSAVEACTIVE
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define IDC_BTNSHTDOWNCOMPUTER
#define WLX_SAS_ACTION_SHUTDOWN_POWER_OFF
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)
BOOL WINAPI DestroyEnvironmentBlock(IN LPVOID lpEnvironment)
#define WLX_SAS_TYPE_CTRL_ALT_DEL
NTSTATUS NTAPI NtShutdownSystem(IN SHUTDOWN_ACTION Action)
#define WLX_LOGON_OPT_NO_PROFILE
DWORD WINAPI WNetCloseEnum(HANDLE hEnum)
BOOL WINAPI ExitWindowsEx(_In_ UINT, _In_ DWORD)
struct _PROFILEINFOW PROFILEINFOW
#define RESOURCETYPE_DISK
#define IDD_SHUTDOWNCOMPUTER
#define RESOURCE_REMEMBERED
static BOOL StartUserShell(IN OUT PWLSESSION Session)
VOID CallNotificationDlls(PWLSESSION pSession, NOTIFICATION_TYPE Type)
VOID CloseAllDialogWindows(VOID)
static VOID PlayLogonSound(IN OUT PWLSESSION Session)
struct tagLOGOFF_SHUTDOWN_DATA * PLOGOFF_SHUTDOWN_DATA
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
#define WLX_SAS_ACTION_NONE
BOOL WINAPI RemoveMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
#define WINLOGON_SAS_TITLE
DWORD grfAccessPermissions
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
#define WN_NO_MORE_ENTRIES
static SCRIPT_CACHE SCRIPT_ANALYSIS * psa
struct _SECURITY_ATTRIBUTES * PSECURITY_ATTRIBUTES
#define WLX_SAS_ACTION_TASKLIST
LONG WINAPI RegOpenCurrentUser(IN REGSAM samDesired, OUT PHKEY phkResult)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WLX_SAS_ACTION_SHUTDOWN_REBOOT
BOOL WINAPI LoadUserProfileW(_In_ HANDLE hToken, _Inout_ LPPROFILEINFOW lpProfileInfo)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger(PUNICODE_STRING String, ULONG Base, PULONG Value)
BOOL WINAPI Beep(IN DWORD dwFreq, IN DWORD dwDuration)
#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
#define HK_CTRL_SHIFT_ESC
char * cleanup(char *str)
#define GetProcAddress(x, y)
#define IDS_REACTOSISRESTARTING
#define SetWindowLongPtrW
BOOL WINAPI RegisterHotKey(_In_opt_ HWND, _In_ int, _In_ UINT, _In_ UINT)
DWORD WINAPI UpdatePerUserSystemParameters(DWORD dw1, DWORD dw2)
DWORD WINAPI WNetClearConnections(HWND owner)
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
#define WLX_PROFILE_TYPE_V2_0
static NTSTATUS HandleLogoff(IN OUT PWLSESSION Session, IN UINT Flags)
#define HeapFree(x, y, z)
#define WLX_PROFILE_TYPE_V1_0
#define RegCloseKey(hKey)
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
#define SPI_SETSCREENSAVETIMEOUT
#define IDS_LOADINGYOURPERSONALSETTINGS
struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES
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)
#define HKEY_LOCAL_MACHINE