Added basic support for console handles in DuplicateHandle.
[reactos.git] / reactos / lib / kernel32 / misc / handle.c
index 9cf1336..464b362 100644 (file)
@@ -1,4 +1,5 @@
-/*
+/* $Id: handle.c,v 1.6 2002/05/07 22:24:52 hbirr Exp $
+ *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS system libraries
  * FILE:            lib/kernel32/misc/handle.c
@@ -15,6 +16,7 @@
 
 #define NDEBUG
 #include <kernel32/kernel32.h>
+#include <kernel32/error.h>
 
 /* FUNCTIONS *****************************************************************/
 
@@ -31,7 +33,7 @@ WINBOOL WINAPI GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags)
                           &BytesWritten);
    if (!NT_SUCCESS(errCode)) 
      {
-       SetLastError(RtlNtStatusToDosError(errCode));
+       SetLastErrorByStatus (errCode);
        return FALSE;
      }
    if ( HandleInfo.bInheritHandle )
@@ -57,7 +59,7 @@ WINBOOL STDCALL SetHandleInformation(HANDLE hObject,
                           &BytesWritten);
    if (!NT_SUCCESS(errCode)) 
      {
-       SetLastError(RtlNtStatusToDosError(errCode));
+       SetLastErrorByStatus (errCode);
        return FALSE;
      }
    if (dwMask & HANDLE_FLAG_INHERIT)
@@ -75,7 +77,7 @@ WINBOOL STDCALL SetHandleInformation(HANDLE hObject,
                                    sizeof(OBJECT_DATA_INFORMATION));
    if (!NT_SUCCESS(errCode)) 
      {
-       SetLastError(RtlNtStatusToDosError(errCode));
+       SetLastErrorByStatus (errCode);
        return FALSE;
      }
    
@@ -102,7 +104,7 @@ WINBOOL STDCALL CloseHandle(HANDLE  hObject)
    errCode = NtClose(hObject);
    if (!NT_SUCCESS(errCode)) 
      {     
-       SetLastError(RtlNtStatusToDosError(errCode));
+       SetLastErrorByStatus (errCode);
        return FALSE;
      }
    
@@ -119,7 +121,20 @@ WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
                                DWORD dwOptions)
 {
    NTSTATUS errCode;
-
+   if (IsConsoleHandle(hSourceHandle))
+   {
+      /* FIXME: call CSRSS for console handle duplication */
+      if (hSourceProcessHandle == hTargetProcessHandle)
+      {
+        *lpTargetHandle = hSourceHandle;
+        return TRUE;
+      }
+      else
+      {
+        return FALSE;
+      }
+   }
+      
    errCode = NtDuplicateObject(hSourceProcessHandle,
                               hSourceHandle,
                               hTargetProcessHandle,
@@ -129,7 +144,7 @@ WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
                               dwOptions);
    if (!NT_SUCCESS(errCode)) 
      {
-       SetLastError(RtlNtStatusToDosError(errCode));
+       SetLastErrorByStatus (errCode);
        return FALSE;
      }
    
@@ -140,3 +155,6 @@ UINT STDCALL SetHandleCount(UINT nCount)
 {
    return(nCount);
 }
+
+
+/* EOF */