CmpPromoteSingleKeyFromKcbStacks

__int64 __fastcall CmpPromoteSingleKeyFromKcbStacks(__int64 a1, __int64 a2, char a3){
  INT16 v5; 
  char v6; 
  _QWORD *KcbAtLayerHeight; 
  INT16 v8; 
  INT64 v9; 
  int started; 
  INT64 EntryAtLayerHeight; 
  INT16 v12; 
  INT64 v13; 
  INT64 v16[10]; 
  INT64 v17[10]; 

  memset(v17, 0i64, sizeof(v17));
  memset(v16, 0i64, sizeof(v16));
  CmpInitializeKeyNodeStack((INT64)v17);
  CmpInitializeKeyNodeStack((INT64)v16);
  v5 = *(_WORD *)(a1 + 2);
  v6 = 0;
  KcbAtLayerHeight = (_QWORD *)CmpGetKcbAtLayerHeight(a1, v5);
  v9 = CmpGetKcbAtLayerHeight(a2, v8);
  started = CmpStartKeyNodeStackFromKcbStack((INT64)v17, a1);
  if( started < 0 )
    goto LABEL_12;
  started = CmpStartKeyNodeStackFromKcbStack((INT64)v16, a2);
  if( started < 0 )
    goto LABEL_12;
  EntryAtLayerHeight = CmpKeyNodeStackGetEntryAtLayerHeight((INT64)v17, v5);
  v13 = CmpKeyNodeStackGetEntryAtLayerHeight((INT64)v16, v12);
  if( *(_DWORD *)(v9 + 40) == -1 )
  {
    started = CmpPartialPromoteSingleKeyFromKeyNodeStacks((__int16 *)v17, (__int64)v16);
    if( started < 0 )
      goto LABEL_12;
    v6 = 1;
    *(_DWORD *)(v9 + 40) = *(_DWORD *)(v13 + 8);
  }
  if( a3 )
  {
    started = CmpFullPromoteSingleKeyFromKeyNodeStacks((INT64)v17, (INT16 *)v16);
    if( started < 0 )
      goto LABEL_10;
    v6 = 1;
  }
  started = 0;
LABEL_10:
  if( v6 )
  {
    ++*(_QWORD *)(v9 + 304);
    CmpRebuildKcbCacheFromNode((PVOID)v9, *(_QWORD *)(v13 + 16), 0i64, 0);
    ++KcbAtLayerHeight[38];
    CmpRebuildKcbCacheFromNode(KcbAtLayerHeight, *(_QWORD *)(EntryAtLayerHeight + 16), 0i64, 0);
  }
LABEL_12:
  CmpCleanupKeyNodeStack((INT64)v16);
  CmpCleanupKeyNodeStack((INT64)v17);
  return(unsigned int)started;
}

Referenced by:

CmpPartialPromoteSubkeys
CmpPromoteKey
CmpPromoteSubtree