ObpReferenceProcessObjectByHandle

NTSTATUS __stdcall ObpReferenceProcessObjectByHandle(
        PVOID Handle,
        _EPROCESS *Process,
        _HANDLE_TABLE *HandleTable,
        INT8 AccessMode,
        UINT64 Tag,
        PVOID *Object,
        _OBJECT_HANDLE_INFORMATION *HandleInformation,
        _HANDLE_TABLE_ENTRY_INFO *ObjectInfo){
  _EXHANDLE v8; 
  _ETHREAD *CurrentThread; 
  _HANDLE_TABLE_ENTRY *v12; 
  _HANDLE_TABLE_ENTRY *v13; 
  __int64 LowValue; 
  __int32 bf_0; 
  _OBJECT_HEADER *v16; 
  int v17; 
  _HANDLE_TABLE_ENTRY_INFO v18; 
  __int64 v19; 
  unsigned int v20; 
  NTSTATUS result; 
  bool v22; 
  _HANDLE_TABLE_ENTRY_INFO *HandleExtraInfo; 
  int v24[14]; 

  v8 = (_EXHANDLE)Handle;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  *Object = 0i64;
  if( (int)Handle >= 0 )
  {
LABEL_6:
    --CurrentThread->Tcb.KernelApcDisable;
    if( (v8._bf_0 & 0x3FC) != 0
      && (v12 = ExpLookupHandleTableEntry(HandleTable, v8), (v13 = v12) != 0i64)
      && ExLockHandleTableEntry(HandleTable, v12) )
    {
      LowValue = v13->LowValue;
      bf_0 = v13->LeafHandleValue.$E5B3C52FE72490EE6A49ADBB8529F30E::_bf_0;
      v16 = (_OBJECT_HEADER *)((v13->LowValue >> 16) & 0xFFFFFFFFFFFFFFF0ui64);
      v17 = bf_0 & 0x1FFFFFF;
      if( HandleTable->ExtraInfoPages
        && (HandleExtraInfo = ExpGetHandleExtraInfo(HandleTable, v8.GenericHandleOverlay),
            LowValue = v13->LowValue,
            bf_0 = v13->LeafHandleValue.$E5B3C52FE72490EE6A49ADBB8529F30E::_bf_0,
            HandleExtraInfo) )
      {
        v18 = *HandleExtraInfo;
      }
      else
      {
        v18 = 0i64;
      }
      v19 = (LowValue >> 17) & 7;
      *ObjectInfo = v18;
      v20 = v19 | 8;
      if( (bf_0 & 0x2000000) == 0 )
        v20 = v19;
      HandleInformation->HandleAttributes = v20;
      HandleInformation->GrantedAccess = v17;
      ObpIncrPointerCount(v16);
      _InterlockedExchangeAdd64(&v13->VolatileLowValue, 1ui64);
      _InterlockedOr(v24, 0);
      if( HandleTable->HandleContentionEvent._bf_0 )
        ExfUnblockPushLock(&HandleTable->HandleContentionEvent._bf_0, 0i64);
      KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
      if( ObpTraceFlags )
        ObpPushStackInfo(v16, 1u, 1ui64, (unsigned int)Tag);
      *Object = &v16->Body;
      return 0;
    }
    else
    {
      KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
      return -1073741816;
    }
  }
  if( Handle == (PVOID)-1i64 )
  {
    v22 = ObpTraceFlags == 0;
    HandleInformation->GrantedAccess = 0x1FFFFF;
    HandleInformation->HandleAttributes = 0;
    *ObjectInfo = 0i64;
    if( !v22 )
      ObpPushStackInfo((_OBJECT_HEADER *)&Process[-1].DynamicEnforcedCetCompatibleRanges, 1u, 1ui64, (unsigned int)Tag);
    ObpIncrPointerCount((_OBJECT_HEADER *)&Process[-1].DynamicEnforcedCetCompatibleRanges);
    result = 0;
    *Object = Process;
  }
  else
  {
    if( Handle != (PVOID)-2i64 )
    {
      if( AccessMode )
        return -1073741816;
      HandleTable = ::HandleTable;
      v8 = (_EXHANDLE)((unsigned __int64)Handle ^ 0xFFFFFFFF80000000ui64);
      goto LABEL_6;
    }
    v22 = ObpTraceFlags == 0;
    HandleInformation->GrantedAccess = 0x1FFFFF;
    HandleInformation->HandleAttributes = 0;
    *ObjectInfo = 0i64;
    if( !v22 )
      ObpPushStackInfo(
        (_OBJECT_HEADER *)(&CurrentThread[-1].LockEntries[5].CpuPriorityKey + 8),
        1u,
        1ui64,
        (unsigned int)Tag);
    ObpIncrPointerCount((_OBJECT_HEADER *)(&CurrentThread[-1].LockEntries[5].CpuPriorityKey + 8));
    result = 0;
    *Object = CurrentThread;
  }
  return result;
}

Referenced by:

ObCaptureObjectStateForDuplication