From d3b269610434ba7f9e6e0c8da66c2498fc3842fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Fri, 28 Nov 2014 20:34:16 +0000 Subject: [PATCH] [USER32] - Call GetThreadConsoleDesktop of CONSRV if needed, in GetThreadDesktop (in case the process is a console app). - Introduce two last-error helpers UserSetLast(NT)Error which work the same as the (Base)SetLast(NT)Error of kernel32, needed for CSR status errors etc... [WINSRV] - Improve the stub of SrvGetThreadConsoleDesktop (it needs to success, and atm. it always zeroes-out the returned console desktop handle). svn path=/trunk/; revision=65513 --- reactos/include/reactos/subsys/win/winmsg.h | 13 ++++-- reactos/win32ss/user/user32/include/user32p.h | 2 + reactos/win32ss/user/user32/misc/desktop.c | 18 +++++++- reactos/win32ss/user/user32/misc/misc.c | 45 ++++++++++--------- reactos/win32ss/user/winsrv/usersrv/init.c | 9 +++- 5 files changed, 62 insertions(+), 25 deletions(-) diff --git a/reactos/include/reactos/subsys/win/winmsg.h b/reactos/include/reactos/subsys/win/winmsg.h index 44593bdd68d..5fe92ab5263 100644 --- a/reactos/include/reactos/subsys/win/winmsg.h +++ b/reactos/include/reactos/subsys/win/winmsg.h @@ -36,18 +36,24 @@ typedef enum _USERSRV_API_NUMBER } USERSRV_API_NUMBER, *PUSERSRV_API_NUMBER; -typedef struct +typedef struct _USER_EXIT_REACTOS { UINT Flags; DWORD Reserved; } USER_EXIT_REACTOS, *PUSER_EXIT_REACTOS; -typedef struct +typedef struct _USER_GET_THREAD_CONSOLE_DESKTOP +{ + ULONG_PTR ThreadId; + HANDLE ConsoleDesktop; +} USER_GET_THREAD_CONSOLE_DESKTOP, *PUSER_GET_THREAD_CONSOLE_DESKTOP; + +typedef struct _USER_REGISTER_SERVICES_PROCESS { ULONG_PTR ProcessId; } USER_REGISTER_SERVICES_PROCESS, *PUSER_REGISTER_SERVICES_PROCESS; -typedef struct +typedef struct _USER_REGISTER_LOGON_PROCESS { ULONG_PTR ProcessId; BOOL Register; @@ -65,6 +71,7 @@ typedef struct _USER_API_MESSAGE union { USER_EXIT_REACTOS ExitReactosRequest; + USER_GET_THREAD_CONSOLE_DESKTOP GetThreadConsoleDesktopRequest; USER_REGISTER_SERVICES_PROCESS RegisterServicesProcessRequest; USER_REGISTER_LOGON_PROCESS RegisterLogonProcessRequest; } Data; diff --git a/reactos/win32ss/user/user32/include/user32p.h b/reactos/win32ss/user/user32/include/user32p.h index 4edf1649f9d..cc1ed2246a5 100644 --- a/reactos/win32ss/user/user32/include/user32p.h +++ b/reactos/win32ss/user/user32/include/user32p.h @@ -68,6 +68,8 @@ BOOL FASTCALL MessageInit(VOID); VOID FASTCALL MessageCleanup(VOID); /* definitions for misc.c */ +VOID WINAPI UserSetLastError(IN DWORD dwErrCode); +VOID WINAPI UserSetLastNTError(IN NTSTATUS Status); PCALLPROCDATA FASTCALL ValidateCallProc(HANDLE hCallProc); PWND FASTCALL ValidateHwnd(HWND hwnd); PWND FASTCALL ValidateHwndOrDesk(HWND hwnd); diff --git a/reactos/win32ss/user/user32/misc/desktop.c b/reactos/win32ss/user/user32/misc/desktop.c index 50702a34027..b86f3d0c502 100644 --- a/reactos/win32ss/user/user32/misc/desktop.c +++ b/reactos/win32ss/user/user32/misc/desktop.c @@ -548,7 +548,23 @@ WINAPI GetThreadDesktop( DWORD dwThreadId) { - return NtUserGetThreadDesktop(dwThreadId, 0); + USER_API_MESSAGE ApiMessage; + PUSER_GET_THREAD_CONSOLE_DESKTOP GetThreadConsoleDesktopRequest = &ApiMessage.Data.GetThreadConsoleDesktopRequest; + + GetThreadConsoleDesktopRequest->ThreadId = dwThreadId; + + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(USERSRV_SERVERDLL_INDEX, UserpGetThreadConsoleDesktop), + sizeof(*GetThreadConsoleDesktopRequest)); + if (!NT_SUCCESS(ApiMessage.Status)) + { + UserSetLastNTError(ApiMessage.Status); + return NULL; + } + + return NtUserGetThreadDesktop(dwThreadId, + (DWORD)GetThreadConsoleDesktopRequest->ConsoleDesktop); } diff --git a/reactos/win32ss/user/user32/misc/misc.c b/reactos/win32ss/user/user32/misc/misc.c index bdbdedaf516..db902eb0160 100644 --- a/reactos/win32ss/user/user32/misc/misc.c +++ b/reactos/win32ss/user/user32/misc/misc.c @@ -1,28 +1,9 @@ /* - * ReactOS kernel - * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ -/* + * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll * FILE: lib/user32/misc/misc.c * PURPOSE: Misc * PROGRAMMER: Thomas Weidenmueller (w3seek@users.sourceforge.net) - * UPDATE HISTORY: - * 19-11-2003 Created */ /* INCLUDES ******************************************************************/ @@ -35,6 +16,30 @@ WINE_DEFAULT_DEBUG_CHANNEL(user32); /* FUNCTIONS *****************************************************************/ +VOID +WINAPI +UserSetLastError(IN DWORD dwErrCode) +{ + /* + * Equivalent of SetLastError in kernel32, but without breaking + * into the debugger nor checking whether the last old error is + * the same as the one we are going to set. + */ + NtCurrentTeb()->LastErrorValue = dwErrCode; +} + +VOID +WINAPI +UserSetLastNTError(IN NTSTATUS Status) +{ + /* + * Equivalent of BaseSetLastNTError in kernel32, but using + * UserSetLastError: convert from NT to Win32, then set. + */ + UserSetLastError(RtlNtStatusToDosError(Status)); +} + + /* * @implemented */ diff --git a/reactos/win32ss/user/winsrv/usersrv/init.c b/reactos/win32ss/user/winsrv/usersrv/init.c index 8949e60eca5..4b6939a0bb7 100644 --- a/reactos/win32ss/user/winsrv/usersrv/init.c +++ b/reactos/win32ss/user/winsrv/usersrv/init.c @@ -121,8 +121,15 @@ CSR_API(SrvActivateDebugger) CSR_API(SrvGetThreadConsoleDesktop) { + PUSER_GET_THREAD_CONSOLE_DESKTOP GetThreadConsoleDesktopRequest = &((PUSER_API_MESSAGE)ApiMessage)->Data.GetThreadConsoleDesktopRequest; + DPRINT1("%s not yet implemented\n", __FUNCTION__); - return STATUS_NOT_IMPLEMENTED; + + /* Return nothing for the moment... */ + GetThreadConsoleDesktopRequest->ConsoleDesktop = NULL; + + /* Always succeeds */ + return STATUS_SUCCESS; } CSR_API(SrvDeviceEvent)