CmpResolveHiveLoadConflict

__int64 __fastcall CmpResolveHiveLoadConflict(
        _OBJECT_ATTRIBUTES *ObjectAttributes,
        __int64 a2,
        unsigned int a3,
        __int64 a4,
        __int64 a5,
        _HIVE_LOAD_FAILURE *HiveLoadFailure,
        char a7,
        __int64 a8,
        __int64 a9){
  INT64 v12; 
  unsigned int v13; 
  INT64 v14; 
  int v15; 
  NTSTATUS v16; 
  INT64 v17; 
  CMHIVE *v18; 
  unsigned int HiveFlags; 
  __int64 v20; 
  VOID *ProbeMode; 
  INT64 ProbeModea; 
  CMHIVE *CmHive; 
  _UNICODE_STRING **PathToRoot; 
  _FILE_OBJECT *FileObject; 
  _QWORD *v27; 
  VOID *Object[38]; 

  PathToRoot = (_UNICODE_STRING **)a8;
  FileObject = (_FILE_OBJECT *)a2;
  v27 = (_QWORD *)a9;
  CmHive = 0i64;
  v12 = 0i64;
  memset(Object, 0i64, 0x128u);
  LODWORD(Object[12]) = -1;
  Object[19] = &Object[18];
  Object[18] = &Object[18];
  memset(&Object[27], 0i64, 0x50u);
  LOBYTE(ProbeMode) = 0;
  if( ObReferenceObjectByNameEx(
         ObjectAttributes,
         0i64,
         (_OBJECT_TYPE *)0x20019,
         (CHAR)CmKeyObjectType,
         ProbeMode,
         Object) >= 0 )
  {
    LOCK_HIVE_LOAD();
    CmpLockRegistryFreezeAware(1u);
    if( a4 )
    {
      if( CmpIsKeyDeletedForKeyBody((CM_KEY_BODY *)a4, 0i64) )
      {
        v13 = -1073741444;
        LODWORD(ProbeModea) = 16;
        v14 = 3221225852i64;
LABEL_26:
        SetFailureLocation(HiveLoadFailure, 0i64, _CmpResolveHiveLoadConflict, v14, ProbeModea);
LABEL_27:
        CmpUnlockRegistry();
        UNLOCK_HIVE_LOAD();
        goto LABEL_28;
      }
      v12 = *(_QWORD *)(*(_QWORD *)(a4 + 8) + 32i64);
      v15 = CmpPerformTrustClassAccessCheck(v12, a7);
      v16 = v15;
      if( v15 < 0 )
      {
        LODWORD(ProbeModea) = 32;
        v17 = (unsigned int)v15;
        goto LABEL_8;
      }
    }
    if( CmpIsHiveAlreadyLoaded(0i64, FileObject, a3, &CmHive, PathToRoot) )
    {
      v18 = CmHive;
      HiveFlags = CmHive->Hive.HiveFlags;
      if( ((HiveFlags & 0x8000) == 0 || (a3 & 0x2000) != 0) && ((HiveFlags & 0x8000) != 0 || (a3 & 0x2000) == 0) )
      {
        CmpLockKcbExclusive(MEMORY[8]);
        if( (a3 & 0x800) != 0 )
        {
          CmpReferenceKeyControlBlock(MEMORY[8]);
          *v27 = MEMORY[8];
        }
        if( !a5 || (v16 = CmpRecordUnloadEventForHive(v18, (KEVENT *)a5), v16 >= 0) )
        {
          CmpUnlockKcb(MEMORY[8]);
          if( v12 )
          {
            CmpUnJoinClassOfTrust((INT64)v18);
            LOBYTE(v20) = a7;
            v18->Flags |= 1u;
            CmpJoinClassOfTrust(v18, v12, v20);
          }
          v16 = 0;
          goto LABEL_21;
        }
        CmpUnlockKcb(MEMORY[8]);
        v17 = (unsigned int)v16;
        LODWORD(ProbeModea) = 80;
LABEL_8:
        SetFailureLocation(HiveLoadFailure, 0i64, _CmpResolveHiveLoadConflict, v17, ProbeModea);
LABEL_21:
        if( v16 == -1073741275 )
          v16 = -1073741823;
        v13 = v16;
        goto LABEL_27;
      }
      LODWORD(ProbeModea) = 64;
    }
    else
    {
      LODWORD(ProbeModea) = 48;
    }
    v14 = 3221225539i64;
    v13 = -1073741757;
    goto LABEL_26;
  }
  v13 = -1073741275;
LABEL_28:
  CmpCleanupParseContext((INT64)Object, 0);
  return v13;
}

Referenced by:

CmLoadKey