26 #if !defined(SHUTDOWN_SYSTEMCONTEXT) && !defined(SHUTDOWN_OTHERCONTEXT) 27 #define SHUTDOWN_SYSTEMCONTEXT CsrShutdownSystem 28 #define SHUTDOWN_OTHERCONTEXT CsrShutdownOther 32 #define MY_DPRINT DPRINT1 33 #define MY_DPRINT2 DPRINT 52 #define QUERY_RESULT_ABORT 0 53 #define QUERY_RESULT_CONTINUE 1 54 #define QUERY_RESULT_TIMEOUT 2 55 #define QUERY_RESULT_ERROR 3 56 #define QUERY_RESULT_FORCE 4 86 if (InitProc ==
NULL)
return;
155 MY_DPRINT(
"Closing progress dlg by hand\n");
209 if (NotifyContext->Dlg ==
NULL)
235 DPRINT(
"Called WM_CLIENTSHUTDOWN with wParam == 0 ...\n");
268 DPRINT(
"SendClientShutdown -- Return == %s\n",
273 DPRINT1(
"SendClientShutdown -- Error == %s\n",
299 MessageContext.
Wnd = Wnd;
300 MessageContext.
Msg = NotifyContext->
Msg;
308 if (Passed < MessageContext.
Timeout)
310 MessageContext.
Timeout -= Passed;
313 if (MessageThread ==
NULL)
338 Threads[0] = MessageThread;
339 Threads[1] = NotifyContext->
UIThread;
421 MY_DPRINT(
"GetWindow(TopWnd, GW_OWNER) not returned NULL...\n");
424 if (TopWnd != tmpWnd)
MY_DPRINT(
"(TopWnd = %x) != (tmpWnd = %x)\n", TopWnd, tmpWnd);
433 ENDSESSION_LOGOFF : 0);
440 #if 0 // Obviously, switching desktops like that from within WINSRV doesn't work... 449 MY_DPRINT(
"After switching to desktop (Success = %s ; last error = %d); going to notify top-level...\n",
460 MY_DPRINT(
"Context->UIThread != NULL\n");
463 MY_DPRINT(
"Sending WM_CLOSE because Dlg is != NULL\n");
468 MY_DPRINT(
"Terminating UIThread thread with QUERY_RESULT_ERROR\n");
510 MY_DPRINT2(
"Sending the QUERYENDSESSION messages...\n");
519 NextEntry = NextEntry->
Flink;
550 QueryResult =
Context.QueryResult;
555 MY_DPRINT2(
"Now sending the ENDSESSION messages...\n");
564 NextEntry = NextEntry->
Flink;
618 DPRINT1(
"SrvExitWindowsEx(ClientId: %lx.%lx, Flags: 0x%x)\n",
630 DPRINT1(
"SrvExitWindowsEx call not from Winlogon\n");
649 DPRINT1(
"Unable to get caller LUID, Status = 0x%08x\n",
Status);
667 DPRINT1(
"NtUserSetInformationThread returned STATUS_CANT_WAIT\n");
672 DPRINT1(
"NtUserSetInformationThread returned STATUS_PENDING\n");
678 DPRINT1(
"NtUserSetInformationThread returned STATUS_RETRY\n");
711 DPRINT1(
"Failed to shutdown processes, Status = 0x%08x\n",
Status);
738 DPRINT(
"UserClientShutdown(0x%p, 0x%x, %s) - [0x%x, 0x%x], ShutdownFlags: %lu\n",
751 DPRINT(
"Do not kill a system process in a logoff request!\n");
758 DPRINT(
"Not killing Winlogon; CsrProcess->ShutdownFlags = %lu\n",
814 DPRINT1(
"Failed to set thread desktop!\n");
834 DPRINT1(
"SrvEndTask is HACKPLEMENTED!!\n");
842 DPRINT1(
"Failed to set thread desktop!\n");
851 if (EndTaskRequest->
Force)
#define SHUTDOWN_OTHERCONTEXT
static BOOLEAN IsConsoleMode(VOID)
#define MCSR_GOODFORSHUTDOWN
DWORD WINAPI WaitForSingleObjectEx(IN HANDLE hHandle, IN DWORD dwMilliseconds, IN BOOL bAlertable)
CSR_API(SrvExitWindowsEx)
#define CsrGetClientThread()
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ProcessId
BOOL WINAPI TranslateMessage(_In_ const MSG *)
#define MCSR_DONOTSHUTDOWN
#define STATUS_BAD_IMPERSONATION_LEVEL
static ULONG NotifyUserProcessForShutdown(PCSR_PROCESS CsrProcess, PSHUTDOWN_SETTINGS ShutdownSettings, UINT Flags)
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
BOOL WINAPI TerminateThread(IN HANDLE hThread, IN DWORD dwExitCode)
static BOOL ThreadShutdownNotify(IN PCSR_THREAD CsrThread, IN ULONG Flags, IN ULONG Flags2, IN PNOTIFY_CONTEXT Context)
BOOL WINAPI IsWindow(_In_opt_ HWND)
#define WM_CLIENTSHUTDOWN
TW_UINT32 TW_UINT16 TW_UINT16 MSG
#define NtCurrentThread()
HDESK WINAPI GetThreadDesktop(_In_ DWORD)
DWORD WINAPI GetTickCount(VOID)
BOOLEAN NTAPI CsrRevertToSelf(VOID)
BOOL WINAPI EnumThreadWindows(_In_ DWORD, _In_ WNDENUMPROC, _In_ LPARAM)
DWORD WINAPI GetLastError(VOID)
VOID NTAPI CsrDereferenceProcess(IN PCSR_PROCESS CsrProcess)
BOOL CALLBACK FindTopLevelWnd(IN HWND hWnd, IN LPARAM lParam)
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
ULONG NTAPI UserClientShutdown(IN PCSR_PROCESS CsrProcess, IN ULONG Flags, IN BOOLEAN FirstPhase)
VOID NTAPI CsrDereferenceThread(IN PCSR_THREAD CsrThread)
#define GetWindowLongPtrW
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI DestroyWindow(_In_ HWND)
static NTSTATUS FASTCALL UserExitReactOS(PCSR_THREAD CsrThread, UINT Flags)
static int Link(const char **args)
#define EWX_CALLER_WINLOGON
BOOL WINAPI SetThreadDesktop(_In_ HDESK)
#define QUERY_RESULT_ABORT
BOOL WINAPI GetExitCodeThread(IN HANDLE hThread, OUT LPDWORD lpExitCode)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
static VOID FASTCALL UpdateProgressBar(HWND ProgressBar, PNOTIFY_CONTEXT NotifyContext)
NTSTATUS NTAPI NtUserSetInformationThread(IN HANDLE ThreadHandle, IN USERTHREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
return STATUS_NOT_IMPLEMENTED
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
struct tagNOTIFY_CONTEXT NOTIFY_CONTEXT
static INT_PTR CALLBACK EndNowDlgProc(HWND Dlg, UINT Msg, WPARAM wParam, LPARAM lParam)
BOOL WINAPI SendNotifyMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
void(WINAPI * INITCOMMONCONTROLS_PROC)(void)
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
NTSTATUS NTAPI CsrShutdownProcesses(IN PLUID CallerLuid, IN ULONG Flags)
#define QUERY_RESULT_ERROR
#define QUERY_RESULT_TIMEOUT
DWORD WINAPI GetWindowThreadProcessId(HWND, PDWORD)
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)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
NTSTATUS NTAPI CsrLockProcessByClientId(IN HANDLE Pid, OUT PCSR_PROCESS *CsrProcess OPTIONAL)
#define SHUTDOWN_SYSTEMCONTEXT
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
DWORD WINAPI GetCurrentThreadId(VOID)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
struct tagMESSAGE_CONTEXT * PMESSAGE_CONTEXT
static DWORD WINAPI EndNowThreadProc(LPVOID Parameter)
struct tagMESSAGE_CONTEXT MESSAGE_CONTEXT
VOID NTAPI CsrReferenceThread(IN PCSR_THREAD CsrThread)
struct _LIST_ENTRY * Flink
PSHUTDOWN_SETTINGS ShutdownSettings
struct tagNOTIFY_CONTEXT * PNOTIFY_CONTEXT
_Must_inspect_result_ _In_ ULONG Flags
static const WCHAR Title[]
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define NT_SUCCESS(StatCode)
DWORD WINAPI WaitForMultipleObjectsEx(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds, IN BOOL bAlertable)
#define UlongToHandle(ul)
int WINAPI GetWindowTextLengthW(_In_ HWND)
#define QUERY_RESULT_FORCE
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
#define STATUS_ACCESS_DENIED
BOOL WINAPI SwitchDesktop(_In_ HDESK)
struct _USER_API_MESSAGE * PUSER_API_MESSAGE
#define QUERY_RESULT_CONTINUE
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
HWND WINAPI GetWindow(_In_ HWND, _In_ UINT)
#define MCSR_SHUTDOWNFINISHED
HINSTANCE UserServerDllInstance
DWORD_PTR NTAPI NtUserCallNoParam(DWORD Routine)
SHUTDOWN_SETTINGS ShutdownSettings
static BOOL NotifyTopLevelWindow(HWND Wnd, PNOTIFY_CONTEXT NotifyContext)
NTSTATUS NTAPI CsrGetProcessLuid(IN HANDLE hProcess OPTIONAL, OUT PLUID Luid)
int WINAPI GetWindowTextW(HWND hWnd, LPWSTR lpString, int nMaxCount)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
static VOID CallInitCommonControls(VOID)
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
LRESULT WINAPI SendMessageTimeoutW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM, _In_ UINT, _In_ UINT, _Out_opt_ PDWORD_PTR)
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
struct tagContext Context
DWORD WINAPI GetProcessImageFileNameW(HANDLE hProcess, LPWSTR lpImageFileName, DWORD nSize)
BOOL WINAPI SetForegroundWindow(_In_ HWND)
BOOLEAN NTAPI CsrImpersonateClient(IN PCSR_THREAD CsrThread)
NTSTATUS NTAPI NtTerminateProcess(HANDLE ProcessHandle, LONG ExitStatus)
#define EWX_CALLER_WINLOGON_LOGOFF
#define GetProcAddress(x, y)
#define NOPARAM_ROUTINE_ISCONSOLEMODE
#define SetWindowLongPtrW
NTSTATUS NTAPI CsrUnlockProcess(IN PCSR_PROCESS CsrProcess)
static HMODULE hComCtl32Lib
#define HeapFree(x, y, z)
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
#define MCS_QUERYENDSESSION
static DWORD WINAPI SendClientShutdown(LPVOID Parameter)
#define CreateDialogParam