grant correct access rights when duplicating a handle
Modified: trunk/reactos/ntoskrnl/ob/handle.c

Modified: trunk/reactos/ntoskrnl/ob/handle.c
--- trunk/reactos/ntoskrnl/ob/handle.c	2005-03-25 22:53:57 UTC (rev 14322)
+++ trunk/reactos/ntoskrnl/ob/handle.c	2005-03-25 23:11:20 UTC (rev 14323)
@@ -193,6 +193,19 @@
   NewHandleEntry.u2.GrantedAccess = ((Options & DUPLICATE_SAME_ACCESS) ?
                                      SourceHandleEntry->u2.GrantedAccess :
                                      DesiredAccess);
+  if (Options & DUPLICATE_SAME_ACCESS)
+  {
+    NewHandleEntry.u2.GrantedAccess = SourceHandleEntry->u2.GrantedAccess;
+  }
+  else
+  {
+    if (DesiredAccess & GENERIC_ANY)
+    {
+      RtlMapGenericMask(&DesiredAccess,
+                        ObjectHeader->ObjectType->Mapping);
+    }
+    NewHandleEntry.u2.GrantedAccess = DesiredAccess;
+  }
   
   /* reference the object so it doesn't get deleted after releasing the lock
      and before creating a new handle for it */
@@ -336,23 +349,39 @@
        SourceHandle == NtCurrentProcess())
      {
        PVOID ObjectBody;
+       POBJECT_TYPE ObjectType;
        
+       ObjectType = (SourceHandle == NtCurrentThread()) ? PsThreadType : PsProcessType;
+
        Status = ObReferenceObjectByHandle(SourceHandle,
-                                          PROCESS_DUP_HANDLE,
-                                          NULL,
+                                          0,
+                                          ObjectType,
                                           PreviousMode,
                                           &ObjectBody,
                                           NULL);
        if(NT_SUCCESS(Status))
        {
+         if (Options & DUPLICATE_SAME_ACCESS)
+         {
+           /* grant all access rights */
+           DesiredAccess = ((ObjectType == PsThreadType) ? THREAD_ALL_ACCESS : PROCESS_ALL_ACCESS);
+         }
+         else
+         {
+           if (DesiredAccess & GENERIC_ANY)
+           {
+             RtlMapGenericMask(&DesiredAccess,
+                               ObjectType->Mapping);
+           }
+         }
          Status = ObCreateHandle(TargetProcess,
                                  ObjectBody,
-                                 THREAD_ALL_ACCESS,
+                                 DesiredAccess,
                                  InheritHandle,
                                  &hTarget);
 
          ObDereferenceObject(ObjectBody);
-         
+
          if (Options & DUPLICATE_CLOSE_SOURCE)
          {
            ObDeleteHandle(SourceProcess,
@@ -781,7 +810,6 @@
         KeLeaveCriticalRegion();
         
         DPRINT1("GrantedAccess: 0x%x, ~GrantedAccess: 0x%x, DesiredAccess: 0x%x, denied: 0x%x\n", GrantedAccess, ~GrantedAccess, DesiredAccess, ~GrantedAccess & DesiredAccess);
-        KEBUGCHECK(0);
 
         return(STATUS_ACCESS_DENIED);
      }