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