CmpLoadKeyCommon

__int64 __fastcall CmpLoadKeyCommon(
        ULONG_PTR BugCheckParameter2,
        __int64 *a2,
        __int16 a3,
        __int64 a4,
        __int64 a5,
        struct _KEVENT *a6,
        char a7,
        volatile signed __int64 **a8,
        char a9,
        char a10,
        _OWORD *a11){
  __int64 LowerLayerKcb; 
  int v15; 
  int v16; 
  __int64 v17; 
  unsigned int v18; 
  INT64 v19; 
  int v20; 
  WCHAR v21; 
  INT64 v22; 
  int v23; 
  volatile INT64 *v24; 
  volatile signed __int64 **v25; 
  _QWORD *v26; 
  _QWORD *v27; 
  __int64 v28; 
  __int64 v29; 
  struct _LOOKASIDE_LIST_EX *v30; 
  EVENT_DESCRIPTOR *v31; 
  __int64 v32; 
  UINT64 KcbCacheSize; 
  INT64 KcbCacheSizea; 
  ULONG_PTR BugCheckParameter2a; 
  volatile signed __int64 **v38; 
  _KEVENT *UserEvent; 
  KAPC_STATE ApcState; 
  *(_DWORD *)(BugCheckParameter2 + 160) |= 0x20u;
  LowerLayerKcb = 0i64;
  BugCheckParameter2a = 0i64;
  UserEvent = a6;
  v38 = a8;
  memset(&ApcState, 0, sizeof(ApcState));
  *(_QWORD *)(BugCheckParameter2 + 4208) = KeGetCurrentThread();
  v15 = a3 & 0x10;
  if( (a3 & 0x10) != 0 )
  {
    v16 = *(_DWORD *)(BugCheckParameter2 + 4152) | 0x20;
    *(_DWORD *)(BugCheckParameter2 + 4152) = v16;
    if( (a3 & 0x20) != 0 )
      *(_DWORD *)(BugCheckParameter2 + 4152) = v16 | 0x40;
  }
  *(_DWORD *)(BugCheckParameter2 + 4152) |= 1u;
  LockShutdownShared();
  LOCK_HIVE_LOAD();
  CmpLockRegistryFreezeAware(1u);
  if( a4 && !v15 )
  {
    if( CmpIsKeyDeletedForKeyBody(a4, 0i64) )
    {
      v18 = -1073741444;
      LODWORD(KcbCacheSize) = 16;
LABEL_8:
      v19 = v18;
LABEL_9:
      SetFailureLocation((INT64)a11, 0i64, 29i64, v19, KcbCacheSize);
LABEL_22:
      CmpUnlockRegistry();
      UNLOCK_HIVE_LOAD();
      CmpAttachToRegistryProcess(&ApcState);
      CmpDestroyHive((PVOID)BugCheckParameter2);
      CmpDetachFromRegistryProcess(&ApcState);
      goto LABEL_39;
    }
    LOBYTE(v17) = a7;
    v20 = CmpJoinClassOfTrust(BugCheckParameter2, *(_QWORD *)(*(_QWORD *)(a4 + 8) + 32i64), v17);
    v18 = v20;
    if( v20 < 0 )
    {
      LODWORD(KcbCacheSize) = 32;
LABEL_12:
      v19 = (unsigned int)v20;
      goto LABEL_9;
    }
    v20 = CmpVEAddHiveToSIDMappingTable(BugCheckParameter2, (__int64)a2, v21);
    v18 = v20;
    if( v20 < 0 )
    {
      LODWORD(KcbCacheSize) = 48;
      goto LABEL_12;
    }
  }
  if( a5 )
  {
    v20 = CmpPerformKeyBodyDeletionCheck(a5, 0i64);
    v18 = v20;
    if( v20 < 0 )
    {
      LODWORD(KcbCacheSize) = 64;
      goto LABEL_12;
    }
    LowerLayerKcb = *(_QWORD *)(a5 + 8);
    if( (*(_DWORD *)(LowerLayerKcb + 184) & 0x40000) == 0 )
    {
      v18 = -1073741811;
      LODWORD(KcbCacheSize) = 80;
      goto LABEL_8;
    }
  }
  CmpUnlockRegistry();
  LOBYTE(v22) = a9;
  LODWORD(KcbCacheSize) = 512;
  v23 = CmpLinkHiveToMaster(
          (_UNICODE_STRING *)a2[2],
          (VOID *)a2[1],
          (_CMHIVE *)BugCheckParameter2,
          v22,
          KcbCacheSize,
          v15 != 0,
          UserEvent,
          (VOID *)a2[4],
          (_CM_KEY_CONTROL_BLOCK *)LowerLayerKcb,
          (_CM_KEY_CONTROL_BLOCK **)&BugCheckParameter2a,
          0);
  v18 = v23;
  if( v23 < 0 )
  {
    LODWORD(KcbCacheSizea) = 96;
    SetFailureLocation((INT64)a11, 0i64, 29i64, (unsigned int)v23, KcbCacheSizea);
    CmpLockRegistryFreezeAware(1u);
    goto LABEL_22;
  }
  v24 = (volatile INT64 *)BugCheckParameter2a;
  if( (a3 & 0x800) != 0 )
  {
    CmpReferenceKeyControlBlockUnsafe((volatile INT64 *)BugCheckParameter2a);
    v25 = v38;
    *v38 = v24;
  }
  else
  {
    v25 = v38;
  }
  CmpLockRegistryFreezeAware(1u);
  if( v15 )
  {
    CmpReferenceKeyControlBlockUnsafe(*(volatile INT64 **)(BugCheckParameter2 + 2928));
    *v25 = *(volatile signed __int64 **)(BugCheckParameter2 + 2928);
  }
  CmpLockHiveListExclusive();
  v26 = (_QWORD *)qword_140D2D918;
  v27 = (_QWORD *)(BugCheckParameter2 + 1600);
  if( *(__int64 **)qword_140D2D918 != &CmpHiveListHead )
    __fastfail(3u);
  *v27 = &CmpHiveListHead;
  *(_QWORD *)(BugCheckParameter2 + 1608) = v26;
  *v26 = v27;
  qword_140D2D918 = BugCheckParameter2 + 1600;
  CmpUnlockHiveList();
  CmpUnlockRegistry();
  CmpAttachToRegistryProcess(&ApcState);
  CmpRecheckHiveVolumePolicy(BugCheckParameter2);
  CmpDetachFromRegistryProcess(&ApcState);
  CmpDereferenceKeyControlBlockUnsafe(v24);
  UNLOCK_HIVE_LOAD();
  if( (a3 & 0x110) == 0 )
  {
    CmpInitCmRM(BugCheckParameter2, a10);
    *(_DWORD *)(BugCheckParameter2 + 4152) |= 8u;
  }
  if( a9 )
  {
    CmpAttachToRegistryProcess(&ApcState);
    CmpFlushHive(BugCheckParameter2, 4, v31);
    CmpDetachFromRegistryProcess(&ApcState);
  }
  if( !v15 )
    CmpAddToHiveFileList(BugCheckParameter2, v28, v29, v30);
  v32 = *(_QWORD *)(BugCheckParameter2 + 4192);
  if( v32 )
  {
    TmEnableCallbacks(
      *(PKRESOURCEMANAGER *)(v32 + 56),
      (PTM_RM_NOTIFICATION)CmKtmNotification,
      *(PVOID *)(BugCheckParameter2 + 4192));
    CmRmFinalizeRecovery(*(_QWORD *)(BugCheckParameter2 + 4192));
  }
  CmpTrimHive(BugCheckParameter2);
  LOCK_HIVE_LOAD();
  *(_DWORD *)(BugCheckParameter2 + 160) &= ~0x20u;
  *(_QWORD *)(BugCheckParameter2 + 4208) = 0i64;
  UNLOCK_HIVE_LOAD();
  v18 = 0;
LABEL_39:
  UnlockShutdown();
  if( !CmpProfileLoaded && !CmpWasSetupBoot )
  {
    CmpProfileLoaded = 1;
    CmpSetGlobalQuotaAllowed();
  }
  return v18;
}

Referenced by:

CmLoadAppKey
CmLoadKey