ObReferenceObjectByNameEx

__int64 __fastcall ObReferenceObjectByNameEx(
        __int64 a1,
        struct _SECURITY_SUBJECT_CONTEXT *a2,
        DWORD a3,
        __int64 a4,
        INT64 a5,
        __int64 a6,
        PADAPTER_OBJECT *a7){
  struct _KPRCB *CurrentPrcb; 
  __int64 v12; 
  INT64 v13; 
  INT64 v14; 
  PSLIST_ENTRY v15; 
  int v16; 
  CHAR v17; 
  struct _SLIST_ENTRY *v18; 
  _EJOB *Silo; 
  __int64 v20; 
  UINT8 v21; 
  _SLIST_ENTRY *Next; 
  struct _KPRCB *v23; 
  __int64 v24; 
  __int64 v26; 
  __int64 v27; 
  __int64(__fastcall *v28)(__int64, __int64, __int64); 
  __int64 v29; 
  __int64 v30; 
  _OBJECT_CREATE_INFORMATION *ObjectCreateInfo; 
  INT64 UseLookaside; 
  _SECURITY_QUALITY_OF_SERVICE *SecurityQos; 
  PVOID InsertObject; 
  PADAPTER_OBJECT DmaAdapter; 
  _UNICODE_STRING CapturedObjectName; 
  INT64 v37[2]; 
  __int128 v38; 
  __int128 v39; 
  __int64 v40; 
  INT64 AccessStatus; 
  DmaAdapter = 0i64;
  v40 = 0i64;
  CapturedObjectName = 0i64;
  *(_OWORD *)v37 = 0i64;
  v38 = 0i64;
  v39 = 0i64;
  if( !a1 || !a4 )
    return 3221225485i64;
  CurrentPrcb = KeGetCurrentPrcb();
  v12 = *((_QWORD *)CurrentPrcb + 272);
  ++*(_DWORD *)(v12 + 20);
  v15 = RtlpInterlockedPopEntrySList((PSLIST_HEADER)v12);
  if( !v15 )
  {
    ++*(_DWORD *)(v12 + 24);
    v26 = *((_QWORD *)CurrentPrcb + 273);
    ++*(_DWORD *)(v26 + 20);
    v15 = RtlpInterlockedPopEntrySList((PSLIST_HEADER)v26);
    if( !v15 )
    {
      v27 = *(unsigned int *)(v26 + 44);
      v28 = *(__int64(__fastcall **)(__int64, __int64, __int64))(v26 + 48);
      v29 = *(unsigned int *)(v26 + 40);
      v30 = *(unsigned int *)(v26 + 36);
      ++*(_DWORD *)(v26 + 24);
      v15 = (PSLIST_ENTRY)v28(v30, v27, v29);
      if( !v15 )
        return 3221225626i64;
    }
  }
  v16 = *((_DWORD *)CurrentPrcb + 9);
  v17 = a5;
  v18 = v15 + 10;
  LOBYTE(v13) = a5;
  LODWORD(UseLookaside) = 1;
  LOBYTE(v14) = a5;
  LODWORD(v15->Next) = v16;
  LODWORD(AccessStatus) = ObpCaptureObjectCreateInformation(
                            v14,
                            v13,
                            (_OBJECT_ATTRIBUTES *)a1,
                            &CapturedObjectName,
                            (_OBJECT_CREATE_INFORMATION *)&v15[10],
                            UseLookaside,
                            (INT64)SecurityQos,
                            (INT64)InsertObject);
  if( (int)AccessStatus >= 0 )
  {
    if( !a2 )
    {
      LODWORD(AccessStatus) = SeCreateAccessState(
                                (_ACCESS_STATE *)v15,
                                (_AUX_ACCESS_DATA *)&v15[14],
                                a3,
                                (_GENERIC_MAPPING *)(a4 + 76));
      if( (int)AccessStatus < 0 )
      {
LABEL_14:
        if( a2 == (struct _SECURITY_SUBJECT_CONTEXT *)v15 )
        {
          SepDeleteAccessState((ACCESS_STATE *)a2);
          SeReleaseSubjectContext(a2 + 1);
        }
        Next = v15[12].Next;
        if( Next )
        {
          SeReleaseSecurityDescriptor(Next, (INT8)v15[11].Next, 1u);
          v15[12].Next = 0i64;
        }
        if( CapturedObjectName.Buffer )
          ObpFreeObjectNameBuffer(&CapturedObjectName);
        goto LABEL_20;
      }
      a2 = (struct _SECURITY_SUBJECT_CONTEXT *)v15;
    }
    LODWORD(AccessStatus) = ObpAdjustAccessMask((ACCESS_STATE *)a2);
    if( (int)AccessStatus >= 0 )
    {
      Silo = PsGetCurrentSilo();
      LOBYTE(ObjectCreateInfo) = v17;
      LODWORD(AccessStatus) = ObpLookupObjectName(
                                *((VOID **)&v15[10].Next + 1),
                                &CapturedObjectName,
                                LODWORD(v18->Next),
                                (_OBJECT_TYPE *)a4,
                                (INT64)ObjectCreateInfo,
                                (VOID *)a6,
                                0i64,
                                0i64,
                                Silo,
                                (_ACCESS_STATE *)a2,
                                (_OBP_LOOKUP_CONTEXT *)&v15[28],
                                0i64,
                                (VOID **)&DmaAdapter);
      if( (int)AccessStatus >= 0 )
      {
        ObpReleaseLookupContext((INT64)&v15[28]);
        v20 = ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ LOBYTE(DmaAdapter[-2].DmaOperations) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)DmaAdapter - 48) >> 8)];
        if( (*(_DWORD *)(v20 + 72) & (__int64)v18->Next) != 0 )
        {
          HalPutDmaAdapter(DmaAdapter);
          LODWORD(AccessStatus) = -1073741811;
        }
        else
        {
          *(_QWORD *)&v38 = v20 + 16;
          *((_QWORD *)&v38 + 1) = &CapturedObjectName;
          *(_QWORD *)&v39 = *((_QWORD *)&v15[10].Next + 1);
          SeSetLearningModeObjectInformation((INT64)v37);
          if( ObpCheckObjectReference(DmaAdapter, (_ACCESS_STATE *)a2, v21, v17, &AccessStatus) )
            *a7 = DmaAdapter;
          else
            HalPutDmaAdapter(DmaAdapter);
          SeClearLearningModeObjectInformation();
        }
      }
    }
    goto LABEL_14;
  }
LABEL_20:
  v23 = KeGetCurrentPrcb();
  v24 = *((_QWORD *)v23 + 272);
  ++*(_DWORD *)(v24 + 28);
  if( *(_WORD *)v24 < *(_WORD *)(v24 + 16)
    || (++*(_DWORD *)(v24 + 32),
        v24 = *((_QWORD *)v23 + 273),
        ++*(_DWORD *)(v24 + 28),
        *(_WORD *)v24 < *(_WORD *)(v24 + 16)) )
  {
    RtlpInterlockedPushEntrySList((PSLIST_HEADER)v24, v15);
  }
  else
  {
    ++*(_DWORD *)(v24 + 32);
    (*(void(__fastcall **)(PSLIST_ENTRY))(v24 + 56))(v15);
  }
  return(unsigned int)AccessStatus;
}

Referenced by:

AlpcpCreateClientPort
CmObReferenceObjectByName
CmUnloadKey
CmpResolveHiveLoadConflict
NtQueryOpenSubKeys
NtQueryOpenSubKeysEx
ObInitServerSilo