CmpCommitDiscardReplacePost
INT64 __fastcall CmpCommitDiscardReplacePost(_CM_KEY_CONTROL_BLOCK *Kcb, VOID *Context){
__int64 v2;
__int64 v3;
_QWORD *v6;
__int64 v7;
ULONG_PTR v8;
unsigned int KeyCell;
__int64 v10;
__int64 v11;
unsigned __int64 v12;
_QWORD **v13;
_QWORD *v14;
__int64 v16[3];
v3 = v2 + 16;
v6 = *(_QWORD **)v3;
if( *(_QWORD *)(*(_QWORD *)v3 + 8i64) != v3 || (v7 = *v6, *(_QWORD **)(*v6 + 8i64) != v6) )
__fastfail(3u);
*(_QWORD *)v3 = v7;
v8 = (ULONG_PTR)(v6 - 15);
*(_QWORD *)(v7 + 8) = v3;
v6[1] = v6;
*v6 = v6;
*((_WORD *)v6 - 27) = Kcb->LayerHeight;
v6[9] = Kcb->LayerInfo;
Kcb->LayerInfo = 0i64;
Kcb->LayerHeight = 0;
*(_QWORD *)(v6[9] + 16i64) = v6 - 15;
KeyCell = Kcb->KeyHash.KeyCell;
if( KeyCell != -1 )
{
*(_DWORD *)(v8 + 40) = KeyCell;
CmpMarkKeyUnbacked(Kcb);
CmpRebuildKcbCache((_CM_KEY_CONTROL_BLOCK *)v8);
}
CmpDiscardKcb((UINT64)Kcb, (INT64)Context);
v10 = *(_QWORD *)(v8 + 32);
v11 = *(_QWORD *)(v10 + 1640);
v12 = 3
* ((unsigned int)(*(_DWORD *)(v10 + 1648) - 1) & ((unsigned int)(101027
* (*(_DWORD *)(v8 + 16) ^ (*(_DWORD *)(v8 + 16) >> 9))) ^ ((unsigned __int64)(unsigned int)(101027 * (*(_DWORD *)(v8 + 16) ^ (*(_DWORD *)(v8 + 16) >> 9))) >> 9)));
*(_QWORD *)(v8 + 24) = *(_QWORD *)(v11
+ 24
* ((unsigned int)(*(_DWORD *)(v10 + 1648) - 1) & ((unsigned int)(101027
* (*(_DWORD *)(v8 + 16) ^ (*(_DWORD *)(v8 + 16) >> 9))) ^ ((unsigned __int64)(unsigned int)(101027 * (*(_DWORD *)(v8 + 16) ^ (*(_DWORD *)(v8 + 16) >> 9))) >> 9)))
+ 16);
*(_QWORD *)(v11 + 8 * v12 + 16) = v8 + 16;
v13 = (_QWORD **)(*(_QWORD *)(v8 + 192) + 32i64);
v14 = *v13;
while( v14 != v13 )
{
CmpReferenceKeyControlBlockUnsafe((volatile INT64 *)v8);
CmpDereferenceKeyControlBlockUnsafe((volatile INT64 *)Kcb);
v14 = (_QWORD *)*v14;
v13 = (_QWORD **)(*(_QWORD *)(v8 + 192) + 32i64);
}
v16[0] = (__int64)Kcb;
v16[1] = v8;
CmpSearchKeyControlBlockTreeEx(
(__int64(__fastcall *)(ULONG_PTR, ULONG_PTR, __int64, __int64))CmpRefreshParent,
*(_QWORD *)(v8 + 32),
(__int64)Context,
(__int64)v16,
0);
CmpDereferenceKeyControlBlockWithLock((ULONG_PTR)Kcb, (INT64)Context, 0);
CmpDereferenceKeyControlBlockWithLock(v8, (INT64)Context, 0);
return 0i64;
}Referenced by:
CmpCommitDiscardAndReplaceKcbAndUnbackedHigherLayers