NtDuplicateObject

NTSTATUS __stdcall NtDuplicateObject(
        VOID *SourceProcessHandle,
        VOID *SourceHandle,
        VOID *TargetProcessHandle,
        VOID **TargetHandle,
        _ACCESS_MASK DesiredAccess,
        UINT64 HandleAttributes,
        UINT64 Options){
  VOID *v10; 
  char PreviousMode; 
  NTSTATUS result; 
  int v13; 
  VOID *v14; 
  VOID *v15; 
  NTSTATUS v16; 
  __int64 v17; 
  UINT64 Tag; 
  UINT64 Taga; 
  PVOID *Object; 
  POBJECT_HANDLE_INFORMATION HandleInformation; 
  PVOID v22; 
  PVOID v23; 
  __int64 v24[3]; 

  v10 = 0i64;
  v24[0] = 0i64;
  v23 = 0i64;
  v22 = 0i64;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( TargetHandle && PreviousMode )
  {
    v17 = (__int64)TargetHandle;
    if( (unsigned __int64)TargetHandle >= 0x7FFFFFFF0000i64 )
      v17 = 0x7FFFFFFF0000i64;
    *(_QWORD *)v17 = *(_QWORD *)v17;
    *TargetHandle = 0i64;
  }
  LODWORD(Tag) = 1967415887;
  result = ObReferenceObjectByHandleWithTag(
             SourceProcessHandle,
             0x40ui64,
             (_OBJECT_TYPE *)PsProcessType,
             PreviousMode,
             Tag,
             &v23,
             0i64);
  if( result >= 0 )
  {
    if( TargetProcessHandle )
    {
      LODWORD(Taga) = 1967415887;
      v13 = ObReferenceObjectByHandleWithTag(
              TargetProcessHandle,
              0x40ui64,
              (_OBJECT_TYPE *)PsProcessType,
              PreviousMode,
              Taga,
              &v22,
              0i64);
      if( v13 < 0 )
      {
        v22 = 0i64;
        goto LABEL_7;
      }
    }
    else
    {
      v13 = 0;
    }
    v10 = v22;
LABEL_7:
    LODWORD(HandleInformation) = Options;
    LODWORD(Object) = HandleAttributes;
    LODWORD(Taga) = DesiredAccess;
    v14 = SourceHandle;
    v15 = v23;
    v16 = ObDuplicateObject(
            (INT64)v23,
            (UINT64)v14,
            (INT64)v10,
            (UINT64 *)v24,
            Taga,
            (INT64)Object,
            (INT64)HandleInformation,
            PreviousMode);
    if( TargetHandle )
      *TargetHandle = (VOID *)v24[0];
    ObfDereferenceObjectWithTag(v15, 0x7544624Fui64);
    if( v10 )
      ObfDereferenceObjectWithTag(v10, 0x7544624Fui64);
    if( v13 < 0 )
      return v13;
    return v16;
  }
  return result;
}

Referenced by:

No references.