fixed calls to NtDuplicateObject
[reactos.git] / reactos / lib / kernel32 / misc / handle.c
index 0eafead..3ee219c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: handle.c,v 1.13 2003/08/28 19:37:00 gvg Exp $
+/* $Id$
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS system libraries
 #include <k32.h>
 
 #define NDEBUG
-#include <kernel32/kernel32.h>
+#include "../include/debug.h"
 
 /* GLOBALS *******************************************************************/
 
-WINBOOL STDCALL
-InternalGetProcessId (HANDLE hProcess, LPDWORD lpProcessId);
-
 HANDLE STDCALL
 DuplicateConsoleHandle (HANDLE hConsole,
                        DWORD   dwDesiredAccess,
@@ -32,78 +29,118 @@ DuplicateConsoleHandle (HANDLE     hConsole,
 /*
  * @implemented
  */
-WINBOOL WINAPI GetHandleInformation(HANDLE hObject, LPDWORD lpdwFlags)
+BOOL WINAPI
+GetHandleInformation (HANDLE hObject,
+                     LPDWORD lpdwFlags)
 {
-   OBJECT_DATA_INFORMATION HandleInfo;
-   ULONG BytesWritten;
-   NTSTATUS errCode;
-   
-   errCode = NtQueryObject(hObject,
-                          ObjectDataInformation, 
-                          &HandleInfo, 
-                          sizeof(OBJECT_DATA_INFORMATION),
-                          &BytesWritten);
-   if (!NT_SUCCESS(errCode)) 
-     {
-       SetLastErrorByStatus (errCode);
-       return FALSE;
-     }
-   if ( HandleInfo.bInheritHandle )
-     *lpdwFlags &= HANDLE_FLAG_INHERIT;
-   if ( HandleInfo.bProtectFromClose )
-     *lpdwFlags &= HANDLE_FLAG_PROTECT_FROM_CLOSE;
-   return TRUE;
+  PRTL_USER_PROCESS_PARAMETERS Ppb;
+  OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
+  ULONG BytesWritten;
+  NTSTATUS Status;
+  DWORD Flags;
+
+  Ppb = NtCurrentPeb()->ProcessParameters;
+  switch ((ULONG)hObject)
+  {
+    case STD_INPUT_HANDLE:
+      hObject = Ppb->StandardInput;
+      break;
+    case STD_OUTPUT_HANDLE:
+      hObject = Ppb->StandardOutput;
+      break;
+    case STD_ERROR_HANDLE:
+      hObject = Ppb->StandardError;
+      break;
+  }
+
+  Status = NtQueryObject (hObject,
+                         ObjectHandleInformation,
+                         &HandleInfo,
+                         sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
+                         &BytesWritten);
+  if (NT_SUCCESS(Status))
+  {
+    Flags = 0;
+    if (HandleInfo.Inherit)
+      Flags |= HANDLE_FLAG_INHERIT;
+    if (HandleInfo.ProtectFromClose)
+      Flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE;
+
+    *lpdwFlags = Flags;
+
+    return TRUE;
+  }
+  else
+  {
+    SetLastErrorByStatus (Status);
+    return FALSE;
+  }
 }
 
 
 /*
  * @implemented
  */
-WINBOOL STDCALL SetHandleInformation(HANDLE hObject,
-                                    DWORD dwMask,
-                                    DWORD dwFlags)
+BOOL STDCALL
+SetHandleInformation (HANDLE hObject,
+                     DWORD dwMask,
+                     DWORD dwFlags)
 {
-   OBJECT_DATA_INFORMATION HandleInfo;
-   NTSTATUS errCode;
-   ULONG BytesWritten;
-
-   errCode = NtQueryObject(hObject,
-                          ObjectDataInformation,
-                          &HandleInfo,
-                          sizeof(OBJECT_DATA_INFORMATION),
-                          &BytesWritten);
-   if (!NT_SUCCESS(errCode)) 
-     {
-       SetLastErrorByStatus (errCode);
-       return FALSE;
-     }
-   if (dwMask & HANDLE_FLAG_INHERIT)
-     {
-       HandleInfo.bInheritHandle = dwFlags & HANDLE_FLAG_INHERIT;
-     } 
-   if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE) 
-     {
-       HandleInfo.bProtectFromClose = dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE;
-     }
-   
-   errCode = NtSetInformationObject(hObject,
-                                   ObjectDataInformation,
-                                   &HandleInfo,
-                                   sizeof(OBJECT_DATA_INFORMATION));
-   if (!NT_SUCCESS(errCode)) 
-     {
-       SetLastErrorByStatus (errCode);
-       return FALSE;
-     }
-   
-   return TRUE;
+  PRTL_USER_PROCESS_PARAMETERS Ppb;
+  OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
+  ULONG BytesWritten;
+  NTSTATUS Status;
+
+  Ppb = NtCurrentPeb()->ProcessParameters;
+  switch ((ULONG)hObject)
+  {
+    case STD_INPUT_HANDLE:
+      hObject = Ppb->StandardInput;
+      break;
+    case STD_OUTPUT_HANDLE:
+      hObject = Ppb->StandardOutput;
+      break;
+    case STD_ERROR_HANDLE:
+      hObject = Ppb->StandardError;
+      break;
+  }
+
+  Status = NtQueryObject (hObject,
+                         ObjectHandleInformation,
+                         &HandleInfo,
+                         sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
+                         &BytesWritten);
+  if (NT_SUCCESS(Status))
+  {
+    if (dwMask & HANDLE_FLAG_INHERIT)
+      HandleInfo.Inherit = (dwFlags & HANDLE_FLAG_INHERIT) != 0;
+    if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
+      HandleInfo.ProtectFromClose = (dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0;
+
+    Status = NtSetInformationObject (hObject,
+                                    ObjectHandleInformation,
+                                    &HandleInfo,
+                                    sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION));
+    if(!NT_SUCCESS(Status))
+    {
+      SetLastErrorByStatus (Status);
+      return FALSE;
+    }
+
+    return TRUE;
+  }
+  else
+  {
+    SetLastErrorByStatus (Status);
+    return FALSE;
+  }
 }
 
 
 /*
  * @implemented
  */
-WINBOOL STDCALL CloseHandle(HANDLE  hObject)
+BOOL STDCALL CloseHandle(HANDLE  hObject)
 /*
  * FUNCTION: Closes an open object handle
  * PARAMETERS:
@@ -112,20 +149,35 @@ WINBOOL STDCALL CloseHandle(HANDLE  hObject)
  *          If the function fails, the return value is zero
  */
 {
-   NTSTATUS errCode;
-   
+   PRTL_USER_PROCESS_PARAMETERS Ppb;
+   NTSTATUS Status;
+
+   Ppb = NtCurrentPeb()->ProcessParameters;
+   switch ((ULONG)hObject)
+   {
+     case STD_INPUT_HANDLE:
+       hObject = Ppb->StandardInput;
+       break;
+     case STD_OUTPUT_HANDLE:
+       hObject = Ppb->StandardOutput;
+       break;
+     case STD_ERROR_HANDLE:
+       hObject = Ppb->StandardError;
+       break;
+   }
+
    if (IsConsoleHandle(hObject))
      {
        return(CloseConsoleHandle(hObject));
      }
-   
-   errCode = NtClose(hObject);
-   if (!NT_SUCCESS(errCode)) 
-     {     
-       SetLastErrorByStatus (errCode);
+
+   Status = NtClose(hObject);
+   if (!NT_SUCCESS(Status))
+     {
+       SetLastErrorByStatus (Status);
        return FALSE;
      }
-   
+
    return TRUE;
 }
 
@@ -133,7 +185,7 @@ WINBOOL STDCALL CloseHandle(HANDLE  hObject)
 /*
  * @implemented
  */
-WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
+BOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
                                HANDLE hSourceHandle,
                                HANDLE hTargetProcessHandle,
                                LPHANDLE lpTargetHandle,
@@ -141,12 +193,29 @@ WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
                                BOOL bInheritHandle,
                                DWORD dwOptions)
 {
-   NTSTATUS errCode;
+   PRTL_USER_PROCESS_PARAMETERS Ppb;
    DWORD SourceProcessId, TargetProcessId;
+   NTSTATUS Status;
+
+   Ppb = NtCurrentPeb()->ProcessParameters;
+   switch ((ULONG)hSourceHandle)
+   {
+     case STD_INPUT_HANDLE:
+       hSourceHandle = Ppb->StandardInput;
+       break;
+     case STD_OUTPUT_HANDLE:
+       hSourceHandle = Ppb->StandardOutput;
+       break;
+     case STD_ERROR_HANDLE:
+       hSourceHandle = Ppb->StandardError;
+       break;
+   }
+
    if (IsConsoleHandle(hSourceHandle))
    {
-      if (FALSE == InternalGetProcessId(hSourceProcessHandle, &SourceProcessId) || 
-         FALSE == InternalGetProcessId(hTargetProcessHandle, &TargetProcessId) ||
+      SourceProcessId = GetProcessId(hSourceProcessHandle);
+      TargetProcessId = GetProcessId(hTargetProcessHandle);
+      if (!SourceProcessId || !TargetProcessId ||
          SourceProcessId != TargetProcessId ||
          SourceProcessId != GetCurrentProcessId())
       {
@@ -155,22 +224,22 @@ WINBOOL STDCALL DuplicateHandle(HANDLE hSourceProcessHandle,
       }
 
       *lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions);
-      return *lpTargetHandle != INVALID_HANDLE_VALUE ? TRUE : FALSE;
+      return *lpTargetHandle != INVALID_HANDLE_VALUE;
    }
-      
-   errCode = NtDuplicateObject(hSourceProcessHandle,
-                              hSourceHandle,
-                              hTargetProcessHandle,
-                              lpTargetHandle, 
-                              dwDesiredAccess, 
-                              (BOOLEAN)bInheritHandle,
-                              dwOptions);
-   if (!NT_SUCCESS(errCode)) 
+
+   Status = NtDuplicateObject(hSourceProcessHandle,
+                             hSourceHandle,
+                             hTargetProcessHandle,
+                             lpTargetHandle,
+                             dwDesiredAccess,
+                             bInheritHandle ? OBJ_INHERIT : 0,
+                             dwOptions);
+   if (!NT_SUCCESS(Status))
      {
-       SetLastErrorByStatus (errCode);
+       SetLastErrorByStatus (Status);
        return FALSE;
      }
-   
+
    return TRUE;
 }