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