ObpReferenceObjectByHandleWithTag

NTSTATUS __stdcall ObpReferenceObjectByHandleWithTag(
        VOID *Handle,
        UINT64 DesiredAccess,
        _OBJECT_TYPE *ObjectType,
        CHAR AccessMode,
        UINT64 Tag,
        VOID **Object,
        _OBJECT_HANDLE_INFORMATION *HandleInformation,
        _HANDLE_TABLE_ENTRY_INFO *ObjectInfo){
  _ETHREAD *CurrentThread; 
  NTSTATUS v11; 
  _EPROCESS *Process; 
  _HANDLE_TABLE *ObjectTable; 
  _HANDLE_TABLE_ENTRY *v15; 
  _HANDLE_TABLE_ENTRY *v16; 
  __int64 LowValue; 
  __int64 HighValue; 
  __int64 v19; 
  __int64 v20; 
  _HANDLE_TABLE_ENTRY v21; 
  unsigned __int8 v22; 
  _OBJECT_HEADER *v23; 
  unsigned __int8 v24; 
  int v25; 
  unsigned int v26; 
  __int64 v27; 
  char v28; 
  _HANDLE_TABLE *v29; 
  char *v31; 
  PVOID v32; 
  NTSTATUS v33; 
  unsigned int v34; 
  INT64 v35; 
  unsigned __int64 v36; 
  __int64 v37; 
  __int64 v38; 
  __int64 v39; 
  _EPROCESS *v40; 
  __int64 v41; 
  NTSTATUS v42; 
  _HANDLE_TABLE_ENTRY_INFO *HandleExtraInfo; 
  int v44[8]; 
  PVOID BugCheckParameter4; 
  _HANDLE_TABLE_ENTRY CurrentValue; 
  _EX_RUNDOWN_REF *v47; 
  int DesiredAccessa; 
  char Objecta; 
  _HANDLE_TABLE *ObjectInfoa; 

  DesiredAccessa = DesiredAccess;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v11 = 0;
  Objecta = 0;
  Process = CurrentThread->Tcb.ApcState.Process;
  v47 = (_EX_RUNDOWN_REF *)Process;
  *Object = 0i64;
  if( ObjectInfo )
    *ObjectInfo = 0i64;
  if( ((unsigned __int64)Handle & 0xFFFFFFFF80000000ui64) == 0xFFFFFFFF80000000ui64 )
  {
    if( Handle == (VOID *)-1i64 )
    {
      if( ObjectType != (_OBJECT_TYPE *)PsProcessType && ObjectType )
        return -1073741788;
      v40 = CurrentThread->Tcb.ApcState.Process;
      if( (DesiredAccess & 0xFFE00000) != 0 && AccessMode )
        return -1073741790;
      if( HandleInformation )
      {
        HandleInformation->GrantedAccess = 0x1FFFFF;
        HandleInformation->HandleAttributes = 0;
      }
      if( ObpTraceFlags )
      {
        ObpPushStackInfo((_OBJECT_HEADER *)&v40[-1].DynamicEnforcedCetCompatibleRanges, 1u, 1ui64, (unsigned int)Tag);
        v11 = 0;
      }
      v41 = _InterlockedIncrement64((volatile signed __int64 *)&v40[-1].DynamicEnforcedCetCompatibleRanges);
      if( v41 <= 1 )
        KeBugCheckEx(0x18u, 0i64, v40, (PVOID)0x10, (PVOID)v41);
      *Object = v40;
      return v11;
    }
    if( Handle == (VOID *)-2i64 )
    {
      if( ObjectType != (_OBJECT_TYPE *)PsThreadType && ObjectType )
        return -1073741788;
      if( (DesiredAccess & 0xFFE00000) != 0 && AccessMode )
        return -1073741790;
      if( HandleInformation )
      {
        HandleInformation->GrantedAccess = 0x1FFFFF;
        HandleInformation->HandleAttributes = 0;
      }
      if( ObpTraceFlags )
      {
        ObpPushStackInfo(
          (_OBJECT_HEADER *)(&CurrentThread[-1].LockEntries[5].CpuPriorityKey + 8),
          1u,
          1ui64,
          (unsigned int)Tag);
        v11 = 0;
      }
      v39 = _InterlockedIncrement64((volatile signed __int64 *)&CurrentThread[-1].LockEntries[5].OwnerTree.Min);
      if( v39 <= 1 )
        KeBugCheckEx(0x18u, 0i64, CurrentThread, (PVOID)0x10, (PVOID)v39);
      *Object = CurrentThread;
      return v11;
    }
    if( AccessMode )
      return -1073741816;
    ObjectTable = HandleTable;
    Handle = (VOID *)((unsigned __int64)Handle ^ 0xFFFFFFFF80000000ui64);
    --CurrentThread->Tcb.KernelApcDisable;
    ObjectInfoa = ObjectTable;
    goto LABEL_10;
  }
  if( (MmVerifierData & 0x100) != 0 && !AccessMode )
    VfCheckUserHandle(Handle);
  --CurrentThread->Tcb.KernelApcDisable;
  if( Process == CurrentThread->Tcb.Process )
  {
    if( (Process->Flags & 0x4000000) == 0 )
    {
LABEL_110:
      v33 = -1073741816;
      goto LABEL_81;
    }
    ObjectTable = Process->ObjectTable;
  }
  else
  {
    ObjectTable = ObReferenceProcessHandleTable(Process);
    Objecta = 1;
  }
  ObjectInfoa = ObjectTable;
  if( !ObjectTable )
    goto LABEL_110;
  if( ObjectTable == HandleTable )
  {
LABEL_85:
    v33 = -1073741816;
    goto LABEL_79;
  }
LABEL_10:
  if( ((unsigned __int16)Handle & 0x3FC) == 0
    || (v15 = ExpLookupHandleTableEntry(ObjectTable, (_EXHANDLE)Handle), (v16 = v15) == 0i64) )
  {
LABEL_83:
    if( Handle )
      ExHandleLogBadReference(ObjectTable, Handle, KeGetCurrentThread()->PreviousMode);
    goto LABEL_85;
  }
  _m_prefetchw(v15);
  LowValue = v15->LowValue;
  HighValue = v15->HighValue;
  CurrentValue.HighValue = HighValue;
  CurrentValue.LowValue = LowValue;
  v19 = LowValue;
  if( (LowValue & 0x1FFFE) == 0 )
    goto LABEL_46;
  while( 1 )
  {
    if( (v19 & 1) == 0 )
    {
      ExpBlockOnLockedHandleEntry(ObjectTable, v16, v19);
      _m_prefetchw(v16);
      HighValue = v16->HighValue;
      ObjectTable = ObjectInfoa;
      CurrentValue.LowValue = v16->LowValue;
      v19 = CurrentValue.LowValue;
      CurrentValue.HighValue = HighValue;
      goto LABEL_75;
    }
    v21.LowValue = v19;
    v21.HighValue = HighValue;
    v22 = _InterlockedCompareExchange128(&v16->VolatileLowValue, HighValue, v19 - 2, &v21.LowValue);
    v20 = v21.LowValue;
    v19 = v21.LowValue;
    CurrentValue = v21;
    HighValue = v21.HighValue;
    if( v22 )
      break;
LABEL_75:
    if( (v19 & 0x1FFFE) == 0 )
    {
      do
      {
LABEL_46:
        while( 1 )
        {
          _m_prefetchw(v16);
          v35 = v16->LowValue;
          if( (v16->LowValue & 1) != 0 )
            break;
          if( !v35 )
            goto LABEL_83;
          ExpBlockOnLockedHandleEntry(ObjectTable, v16, v35);
          ObjectTable = ObjectInfoa;
        }
      }
      while( v35 != _InterlockedCompareExchange64(&v16->VolatileLowValue, v35 - 1, v35) );
      v23 = (_OBJECT_HEADER *)((v16->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64);
      CurrentValue = *v16;
      v36 = ExSlowReplenishHandleTableEntry(v16) + 1;
      v38 = _InterlockedExchangeAdd64(&v23->PointerCount, v36);
      if( v38 <= 0 )
        KeBugCheckEx(0x18u, 0i64, &v23->Body, (PVOID)0x10, (PVOID)(v36 + v38));
      _InterlockedExchangeAdd64(&v16->VolatileLowValue, 1ui64);
      _InterlockedOr(v44, 0);
      if( *(_QWORD *)(v37 + 48) )
        ExfUnblockPushLock((INT64 *)(v37 + 48), 0i64);
      goto LABEL_51;
    }
  }
  if( (unsigned __int16)((unsigned __int64)v20 >> 1) != 16 )
  {
    v23 = (_OBJECT_HEADER *)((v20 >> 16) & 0xFFFFFFFFFFFFFFF0ui64);
    goto LABEL_17;
  }
  CurrentValue.LowValue = v20 ^ ((unsigned int)v20 ^ (2 * (unsigned int)((unsigned __int64)v20 >> 1) - 2)) & 0x1FFFE;
  v23 = (_OBJECT_HEADER *)((CurrentValue.LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64);
  ObpIncrPointerCountEx(v23, 32752i64);
  v42 = ExFastReplenishHandleTableEntry(v16, &CurrentValue, 32752i64);
  if( v42 )
    _InterlockedExchangeAdd64(&v23->PointerCount, -v42);
LABEL_51:
  LODWORD(HighValue) = CurrentValue.LeafHandleValue.$E5B3C52FE72490EE6A49ADBB8529F30E::_bf_0;
  v19 = CurrentValue.LowValue;
LABEL_17:
  if( ObpTraceFlags )
    ObpPushStackInfo(v23, 1u, 1ui64, (unsigned int)Tag);
  v24 = ObHeaderCookie ^ v23->TypeIndex ^ BYTE1(v23);
  if( !ObjectType || ObjectType->Index != v24 )
  {
    v32 = (PVOID)ObTypeIndexTable[v24];
    if( !v32 || v32 == MmBadPointer )
      KeBugCheckEx(0x189u, v23, v32, 0i64, 0i64);
    if( ObjectType )
    {
      v33 = -1073741788;
      goto LABEL_78;
    }
  }
  v25 = DesiredAccessa;
  v26 = HighValue & 0x1FFFFFF;
  if( !AccessMode )
  {
LABEL_24:
    v27 = v19 >> 17;
    if( HandleInformation )
    {
      v34 = v27 & 7;
      HandleInformation->GrantedAccess = v26;
      HandleInformation->HandleAttributes = v34;
      if( (v34 & 4) == 0 )
        goto LABEL_26;
    }
    else if( (v27 & 4) == 0 )
    {
LABEL_26:
      v28 = 0;
      goto LABEL_27;
    }
    v28 = 1;
LABEL_27:
    v29 = ObjectInfoa;
    if( ObjectInfo )
    {
      if( ObjectInfoa->ExtraInfoPages )
      {
        HandleExtraInfo = ExpGetHandleExtraInfo(ObjectInfoa, Handle);
        v25 = DesiredAccessa;
        if( HandleExtraInfo )
          *ObjectInfo = *HandleExtraInfo;
      }
    }
    if( v28 )
    {
      if( v25 )
      {
        LODWORD(BugCheckParameter4) = v25;
        if( !ObpAuditObjectAccess(v29, Handle, v16, v23, (UINT64)BugCheckParameter4) )
        {
          v33 = -1073741816;
          goto LABEL_78;
        }
      }
    }
    *Object = &v23->Body;
    if( Objecta )
      ExReleaseRundownProtection(v47 + 139);
    KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
    return 0;
  }
  if( (~v26 & DesiredAccessa) != 0 )
  {
    v33 = -1073741790;
    goto LABEL_78;
  }
  if( (v23->InfoMask & 0x40) == 0 )
    goto LABEL_24;
  v31 = (char *)v23 - *((unsigned __int8 *)&dword_140C25D60 + (v23->InfoMask & 0x7F));
  if( !*(_BYTE *)(*(_QWORD *)v31 + 24i64) )
  {
LABEL_35:
    v25 = DesiredAccessa;
    goto LABEL_24;
  }
  if( *(_QWORD *)(*(_QWORD *)v31 + 16i64) != 1i64 )
  {
    v19 = CurrentValue.LowValue;
    goto LABEL_35;
  }
  v33 = -1073700858;
LABEL_78:
  ObfDereferenceObjectWithTag(&v23->Body, (unsigned int)Tag);
LABEL_79:
  if( Objecta )
    ExReleaseRundownProtection(v47 + 139);
LABEL_81:
  KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
  return v33;
}

Referenced by:

DbgkpCreateNotificationEvent
DbgkpWerInitializeDeferredLiveDump
ExpWnfCaptureScopeInstanceId
HalpAcquirePccInterface
MiAllocateVirtualMemoryPrepare
MmFreeVirtualMemory
MmPrefetchVirtualMemory
MmProcessWorkingSetControl
NtAlertThread
NtCreateEnclave
NtCreateThreadEx
NtCreateUserProcess
NtOpenProcessTokenEx
NtQueryInformationJobObject
NtRemoveProcessDebug
ObReferenceObjectByHandle
ObReferenceObjectByHandleWithTag
ObpLookupObjectName
PfpSourceGetPrefetchSupport
PopSetSpecialRequest
PsCreateSystemThreadEx
PsReferencePartitionByHandle
PspBuildCreateProcessContext
PspConvertSiloToServerSilo
PspCreateThread
VrpHandleIoctlGetVirtualRootKey