Author: tfaber Date: Sat Oct 17 18:37:49 2015 New Revision: 69571
URL: http://svn.reactos.org/svn/reactos?rev=69571&view=rev Log: [NTOS:OB] - Create kernel handles if requested by the caller in ObDuplicateObject CORE-10207
Modified: trunk/reactos/ntoskrnl/ob/obhandle.c
Modified: trunk/reactos/ntoskrnl/ob/obhandle.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ob/obhandle.c?rev=... ============================================================================== --- trunk/reactos/ntoskrnl/ob/obhandle.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ob/obhandle.c [iso-8859-1] Sat Oct 17 18:37:49 2015 @@ -2150,6 +2150,8 @@ PHANDLE_TABLE HandleTable; OBJECT_HANDLE_INFORMATION HandleInformation; ULONG AuditMask; + BOOLEAN KernelHandle = FALSE; + PAGED_CODE(); OBTRACE(OB_HANDLE_DEBUG, "%s - Duplicating handle: %p for %p into %p\n", @@ -2222,6 +2224,14 @@ return Status; }
+ /* Create a kernel handle if asked, but only in the system process */ + if (PreviousMode == KernelMode && + HandleAttributes & OBJ_KERNEL_HANDLE && + TargetProcess == PsInitialSystemProcess) + { + KernelHandle = TRUE; + } + /* Get the target handle table */ HandleTable = ObReferenceProcessHandleTable(TargetProcess); if (!HandleTable) @@ -2374,6 +2384,12 @@ /* Deference the object and set failure status */ ObDereferenceObject(SourceObject); Status = STATUS_INSUFFICIENT_RESOURCES; + } + + /* Mark it as a kernel handle if requested */ + if (KernelHandle) + { + NewHandle = ObMarkHandleAsKernelHandle(NewHandle); }
/* Return the handle */