diff --git a/reactos/include/reactos/subsys/win/winmsg.h b/reactos/include/reactos/subsys/win/winmsg.h index 5fe92ab5263..1f01da32a30 100644 --- a/reactos/include/reactos/subsys/win/winmsg.h +++ b/reactos/include/reactos/subsys/win/winmsg.h @@ -42,6 +42,14 @@ typedef struct _USER_EXIT_REACTOS DWORD Reserved; } USER_EXIT_REACTOS, *PUSER_EXIT_REACTOS; +typedef struct _USER_END_TASK +{ + DWORD LastError; + HWND WndHandle; + BOOL Force; + BOOL Success; +} USER_END_TASK, *PUSER_END_TASK; + typedef struct _USER_GET_THREAD_CONSOLE_DESKTOP { ULONG_PTR ThreadId; @@ -71,6 +79,7 @@ typedef struct _USER_API_MESSAGE union { USER_EXIT_REACTOS ExitReactosRequest; + USER_END_TASK EndTaskRequest; USER_GET_THREAD_CONSOLE_DESKTOP GetThreadConsoleDesktopRequest; USER_REGISTER_SERVICES_PROCESS RegisterServicesProcessRequest; USER_REGISTER_LOGON_PROCESS RegisterLogonProcessRequest; diff --git a/reactos/win32ss/user/user32/misc/exit.c b/reactos/win32ss/user/user32/misc/exit.c index d87d6f628f3..b8f8281f13f 100644 --- a/reactos/win32ss/user/user32/misc/exit.c +++ b/reactos/win32ss/user/user32/misc/exit.c @@ -86,4 +86,38 @@ ExitWindowsEx(UINT uFlags, return TRUE; } +/* + * @implemented + */ +BOOL +WINAPI +EndTask(HWND hWnd, + BOOL fShutDown, + BOOL fForce) +{ + USER_API_MESSAGE ApiMessage; + PUSER_END_TASK EndTaskRequest = &ApiMessage.Data.EndTaskRequest; + + UNREFERENCED_PARAMETER(fShutDown); + + // EndTaskRequest->LastError = ERROR_SUCCESS; + EndTaskRequest->WndHandle = hWnd; + EndTaskRequest->Force = fForce; + + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(USERSRV_SERVERDLL_INDEX, UserpEndTask), + sizeof(*EndTaskRequest)); + if (!NT_SUCCESS(ApiMessage.Status)) + { + UserSetLastNTError(ApiMessage.Status); + return FALSE; + } + + if (EndTaskRequest->LastError != ERROR_SUCCESS) + UserSetLastError(EndTaskRequest->LastError); + + return EndTaskRequest->Success; +} + /* EOF */ diff --git a/reactos/win32ss/user/user32/misc/misc.c b/reactos/win32ss/user/user32/misc/misc.c index db9757b989c..7c8a500961f 100644 --- a/reactos/win32ss/user/user32/misc/misc.c +++ b/reactos/win32ss/user/user32/misc/misc.c @@ -155,29 +155,6 @@ NTSTATUS Status; return TRUE; } -/* - * @implemented - */ -BOOL -WINAPI -EndTask( - HWND hWnd, - BOOL fShutDown, - BOOL fForce) -{ - SendMessageW(hWnd, WM_CLOSE, 0, 0); - - if (IsWindow(hWnd)) - { - if (fForce) - return DestroyWindow(hWnd); - else - return FALSE; - } - - return TRUE; -} - /* * @implemented */ diff --git a/reactos/win32ss/user/winsrv/usersrv/shutdown.c b/reactos/win32ss/user/winsrv/usersrv/shutdown.c index b0de4d31045..eb3b6600919 100644 --- a/reactos/win32ss/user/winsrv/usersrv/shutdown.c +++ b/reactos/win32ss/user/winsrv/usersrv/shutdown.c @@ -940,8 +940,33 @@ CSR_API(SrvExitWindowsEx) CSR_API(SrvEndTask) { - DPRINT1("%s not yet implemented\n", __FUNCTION__); - return STATUS_NOT_IMPLEMENTED; + PUSER_END_TASK EndTaskRequest = &((PUSER_API_MESSAGE)ApiMessage)->Data.EndTaskRequest; + + // FIXME: This is HACK-plemented!! + DPRINT1("SrvEndTask is HACKPLEMENTED!!\n"); + + SendMessageW(EndTaskRequest->WndHandle, WM_CLOSE, 0, 0); + // PostMessageW(EndTaskRequest->WndHandle, WM_CLOSE, 0, 0); + + if (IsWindow(EndTaskRequest->WndHandle)) + { + if (EndTaskRequest->Force) + { + EndTaskRequest->Success = DestroyWindow(EndTaskRequest->WndHandle); + EndTaskRequest->LastError = GetLastError(); + } + else + { + EndTaskRequest->Success = FALSE; + } + } + else + { + EndTaskRequest->LastError = ERROR_SUCCESS; + EndTaskRequest->Success = TRUE; + } + + return STATUS_SUCCESS; } CSR_API(SrvLogon)