From 59798c6f3473008ee4032fd4e1c7371e5736f1b7 Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 9 Mar 2003 21:37:57 +0000 Subject: [PATCH] - Improved DuplicateHandle for console handles. svn path=/trunk/; revision=4272 --- reactos/lib/kernel32/misc/handle.c | 31 +++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/reactos/lib/kernel32/misc/handle.c b/reactos/lib/kernel32/misc/handle.c index db440327b38..c7d3151a3e1 100644 --- a/reactos/lib/kernel32/misc/handle.c +++ b/reactos/lib/kernel32/misc/handle.c @@ -1,4 +1,4 @@ -/* $Id: handle.c,v 1.10 2003/02/12 00:39:31 hyperion Exp $ +/* $Id: handle.c,v 1.11 2003/03/09 21:37:57 hbirr Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries @@ -16,6 +16,17 @@ #define NDEBUG #include +/* GLOBALS *******************************************************************/ + +WINBOOL STDCALL +GetProcessId (HANDLE hProcess, LPDWORD lpProcessId); + +HANDLE STDCALL +DuplicateConsoleHandle (HANDLE hConsole, + DWORD dwDesiredAccess, + BOOL bInheritHandle, + DWORD dwOptions); + /* FUNCTIONS *****************************************************************/ WINBOOL WINAPI GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags) @@ -119,18 +130,20 @@ WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle, DWORD dwOptions) { NTSTATUS errCode; + DWORD SourceProcessId, TargetProcessId; if (IsConsoleHandle(hSourceHandle)) { - /* FIXME: call CSRSS for console handle duplication */ - if (hSourceProcessHandle == hTargetProcessHandle) + if (FALSE == GetProcessId(hSourceProcessHandle, &SourceProcessId) || + FALSE == GetProcessId(hTargetProcessHandle, &TargetProcessId) || + SourceProcessId != TargetProcessId || + SourceProcessId != GetCurrentProcessId()) { - *lpTargetHandle = hSourceHandle; - return TRUE; - } - else - { - return FALSE; + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; } + + *lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions); + return *lpTargetHandle != INVALID_HANDLE_VALUE ? TRUE : FALSE; } errCode = NtDuplicateObject(hSourceProcessHandle,