update for HEAD-2003091401
[reactos.git] / lib / kernel32 / misc / handle.c
index 2011d89..fff661c 100644 (file)
 
 /* INCLUDES ******************************************************************/
 
-#include <ddk/ntddk.h>
-#include <windows.h>
+#include <k32.h>
 
 #define NDEBUG
 #include <kernel32/kernel32.h>
-#include <kernel32/error.h>
+
+/* GLOBALS *******************************************************************/
+
+WINBOOL STDCALL
+InternalGetProcessId (HANDLE hProcess, LPDWORD lpProcessId);
+
+HANDLE STDCALL
+DuplicateConsoleHandle (HANDLE hConsole,
+                       DWORD   dwDesiredAccess,
+                       BOOL    bInheritHandle,
+                       DWORD   dwOptions);
 
 /* FUNCTIONS *****************************************************************/
 
+/*
+ * @implemented
+ */
 WINBOOL WINAPI GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags)
 {
    OBJECT_DATA_INFORMATION HandleInfo;
@@ -44,6 +56,9 @@ WINBOOL WINAPI GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags)
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL STDCALL SetHandleInformation(HANDLE hObject,
                                     DWORD dwMask,
                                     DWORD dwFlags)
@@ -64,11 +79,11 @@ WINBOOL STDCALL SetHandleInformation(HANDLE hObject,
      }
    if (dwMask & HANDLE_FLAG_INHERIT)
      {
-       HandleInfo.bInheritHandle = TRUE;
+       HandleInfo.bInheritHandle = dwFlags & HANDLE_FLAG_INHERIT;
      } 
    if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE) 
      {
-       HandleInfo.bProtectFromClose = TRUE;
+       HandleInfo.bProtectFromClose = dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE;
      }
    
    errCode = NtSetInformationObject(hObject,
@@ -85,6 +100,9 @@ WINBOOL STDCALL SetHandleInformation(HANDLE hObject,
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL STDCALL CloseHandle(HANDLE  hObject)
 /*
  * FUNCTION: Closes an open object handle
@@ -112,6 +130,9 @@ WINBOOL STDCALL CloseHandle(HANDLE  hObject)
 }
 
 
+/*
+ * @implemented
+ */
 WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
                                HANDLE hSourceHandle,
                                HANDLE hTargetProcessHandle,
@@ -121,18 +142,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 == InternalGetProcessId(hSourceProcessHandle, &SourceProcessId) || 
+         FALSE == InternalGetProcessId(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,
@@ -151,10 +174,13 @@ WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
    return TRUE;
 }
 
+
+/*
+ * @implemented
+ */
 UINT STDCALL SetHandleCount(UINT nCount)
 {
    return(nCount);
 }
 
-
 /* EOF */