CmpPromoteSubtree

__int64 __fastcall CmpPromoteSubtree(__int64 a1, __int16 *a2){
  __int16 v4; 
  int v5; 
  int v6; 
  __int16 *v8; 
  __int16 *v9; 
  __int64 v10; 
  __int64 v11; 
  int v12; 
  bool v13; 
  INT64 a3; 
  __int64 a2a; 
  INT64 v16[14]; 

  memset(v16, 0i64, 0x68u);
  a2a = 0i64;
  a3 = 0i64;
  CmpSubtreeEnumeratorInitialize(v16);
  if( a1 )
  {
    v4 = *(_WORD *)(a1 + 2);
    v5 = CmpSubtreeEnumeratorStartForKcbStack((INT64)v16, a1);
  }
  else
  {
    v4 = *a2;
    v5 = CmpSubtreeEnumeratorStartForKeyNodeStack((INT64)v16, a2);
  }
  v6 = v5;
  if( v5 >= 0 )
  {
    while( 1 )
    {
      v6 = CmpSubtreeEnumeratorAdvance((INT64)v16);
      if( v6 == -2147483622 )
      {
        v6 = 0;
        goto LABEL_6;
      }
      if( v6 < 0 )
        goto LABEL_6;
      CmpSubtreeEnumeratorGetCurrentKeyStacks((INT16 *)v16, &a2a, &a3);
      v8 = (__int16 *)a3;
      v9 = *(__int16 **)(408i64 * SLOWORD(v16[0]) + v16[12] - 392);
      v11 = *(_QWORD *)(CmpKeyNodeStackGetEntryAtLayerHeight(a3, v4) + 16);
      if( a2a )
        break;
      if( v10 )
      {
        v12 = CmpPromoteSingleKeyFromParentKcbAndChildKeyNode(v10, v8, 1);
        goto LABEL_12;
      }
      v6 = CmpPartialPromoteSingleKeyFromKeyNodeStacks(v9, (__int64)v8);
      if( v6 >= 0 )
      {
        v6 = CmpFullPromoteSingleKeyFromKeyNodeStacks((INT64)v9, v8);
        if( v6 >= 0 )
          v6 = 0;
      }
      v13 = v6 < 0;
LABEL_18:
      if( v13 )
        goto LABEL_6;
      if( !v11 )
        CmpKeyEnumStackNotifyPromotion((INT16 *)(v16[12] + 56 + 408i64 * (SLOWORD(v16[0]) - 1)));
    }
    v12 = CmpPromoteSingleKeyFromKcbStacks(v10, a2a, 1);
LABEL_12:
    v6 = v12;
    v13 = v12 < 0;
    goto LABEL_18;
  }
LABEL_6:
  CmpSubtreeEnumeratorCleanup((INT64)v16);
  return(unsigned int)v6;
}

Referenced by:

CmRenameKey
CmSaveKey