CmpDrainDelayDerefContext

VOID __fastcall CmpDrainDelayDerefContext(UINT64 **RegLockHeldEx){
  CHAR v1; 
  CHAR v2; 
  UINT64 ***v4; 
  UINT64 *v5; 
  _CM_KEY_CONTROL_BLOCK *v6; 
  INT64 v7; 
  unsigned int v8; 
  _CM_KCB_LAYER_INFO *LayerInfo; 
  _CM_KEY_CONTROL_BLOCK *Kcb; 
  _CM_KCB_LAYER_INFO *LowerLayer; 

  v2 = v1;
  if( *RegLockHeldEx != (UINT64 *)RegLockHeldEx )
  {
    while( 1 )
    {
      v4 = (UINT64 ***)*RegLockHeldEx;
      if( *RegLockHeldEx == (UINT64 *)RegLockHeldEx )
        break;
      if( v4[1] != RegLockHeldEx || (v5 = (UINT64 *)*v4, (*v4)[1] != (UINT64 *)v4) )
        __fastfail(3u);
      *RegLockHeldEx = v5;
      v6 = (_CM_KEY_CONTROL_BLOCK *)(v4 - 28);
      v5[1] = (UINT64)RegLockHeldEx;
      *((_BYTE *)v4 - 160) &= ~1u;
      v7 = (INT64)*(v4 - 24);
      v4[1] = (UINT64 **)v4;
      *v4 = (UINT64 **)v4;
      v8 = *((_DWORD *)v4 - 52);
      CmpLockHashEntryExclusiveByKcb((UINT64)(v4 - 28));
      CmpLockKcbExclusive((INT64)v6);
      LayerInfo = v6->LayerInfo;
      Kcb = 0i64;
      if( LayerInfo )
      {
        LowerLayer = LayerInfo->LowerLayer;
        if( LowerLayer )
        {
          Kcb = LowerLayer->Kcb;
          CmpUnlockKcb(v6);
          CmpLockKcbExclusive((INT64)Kcb);
          CmpLockKcbExclusive((INT64)v6);
        }
      }
      CmpDereferenceKeyControlBlockWithLock((ULONG_PTR)v6, (INT64)RegLockHeldEx, v2);
      CmpUnlockKcb(v6);
      if( Kcb )
        CmpUnlockKcb(Kcb);
      CmpUnlockHashEntry(v7, v8);
    }
  }
}

Referenced by:

CmDeleteValueKey
CmEnumerateKey
CmKeyBodyReplicateToVirtual
CmQueryKey
CmRenameKey
CmRestoreKey
CmSetValueKey
CmpCleanUpKCBCacheTable
CmpCloneHwProfile
CmpCommitLightWeightTransaction
CmpCompleteUnloadKey
CmpDelayCloseWorker
CmpDeleteKeyObject
CmpDereferenceKeyControlBlock
CmpDoParseKey
CmpEnumerateLayeredKey
CmpLightWeightPrepareRenameKeyUoW
CmpLinkHiveToMaster
CmpPerformUnloadKey
CmpPrepareDiscardAndReplaceKcbAndUnbackedHigherLayers
CmpPrepareToInvalidateAllHigherLayerKcbs
CmpRefreshHive
CmpSaveBootControlSet
CmpTransMgrCommitUoW
CmpTransMgrFreeVolatileData
CmpUnfreezeHive