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