update for HEAD-2003050101
[reactos.git] / lib / kernel32 / misc / handle.c
index 129b9b3..5b8233a 100644 (file)
 #define NDEBUG
 #include <kernel32/kernel32.h>
 
+/* 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,