CmpPrepareDiscardAndReplaceKcbAndUnbackedHigherLayers

__int64 __fastcall CmpPrepareDiscardAndReplaceKcbAndUnbackedHigherLayers(void *a1, __int64 a2){
  __int64 v4; 
  int v5; 
  UINT64 *RegLockHeldEx[2]; 

  *(_OWORD *)RegLockHeldEx = 0i64;
  CmpInitializeDelayDerefContext(RegLockHeldEx);
  *(_DWORD *)(v4 + 8) = 0;
  *(_QWORD *)v4 = a1;
  CmpEnumerateAllHigherLayerKcbs(
    (__int64)a1,
    (unsigned int(__fastcall *)(void *, __int64))CmpCleanupDiscardReplacePre,
    (unsigned int(__fastcall *)(void *, __int64, __int64))CmpPrepareDiscardReplacePost,
    (__int64)RegLockHeldEx,
    v4,
    1,
    0);
  v5 = *(_DWORD *)(a2 + 8);
  if( v5 >= 0 )
  {
    CmpPrepareDiscardReplacePost(a1, (__int64)RegLockHeldEx, a2);
    v5 = 0;
    if( *(int *)(a2 + 8) < 0 )
      v5 = *(_DWORD *)(a2 + 8);
  }
  CmpDrainDelayDerefContext(RegLockHeldEx);
  return(unsigned int)v5;
}

Referenced by:

CmDeleteLayeredKey
CmpCommitDeleteKeyUoW
CmpLightWeightPrepareDeleteKeyUoW