CmpTransMgrFreeVolatileData
VOID __stdcall CmpTransMgrFreeVolatileData(_CM_TRANS *CmTrans, UINT64 TransactionNotification){
int v3;
_LIST_ENTRY *Blink;
int Flink_high;
UINT64 v6;
ULONG_PTR v7;
UINT64 Blink_low;
ULONG_PTR v9;
_LIST_ENTRY *v10;
__int64 v11;
int v12;
ULONG_PTR Flink;
_LIST_ENTRY *v14;
INT64 a1[2];
int v16;
int v17;
v3 = TransactionNotification;
*(_OWORD *)a1 = 0i64;
CmpInitializeDelayDerefContext(a1);
while( CmTrans->KCBUoWListHead.Flink != &CmTrans->KCBUoWListHead )
{
Blink = CmTrans->KCBUoWListHead.Blink;
if( !Blink[3].Flink[2].Flink )
goto LABEL_10;
CmpLockRegistryExclusive();
Flink_high = HIDWORD(Blink[4].Flink);
if( !Flink_high )
{
Blink_low = LODWORD(Blink[5].Blink);
if( (unsigned int)(Blink_low - 1) <= 0xFFFFFFFD )
CmpFreeKeyByCell((UINT64)Blink[3].Flink[2].Flink, Blink_low, 0);
goto LABEL_9;
}
if( Flink_high > 3 )
{
if( Flink_high <= 5 )
{
CmpFreeValue((UINT64)Blink[3].Flink[2].Flink, HIDWORD(Blink[5].Blink));
}
else
{
if( Flink_high != 9 )
{
if( Flink_high != 12 )
goto LABEL_9;
Flink = (ULONG_PTR)Blink[6].Flink;
if( Flink - 1 > 0xFFFFFFFD )
goto LABEL_9;
v14 = Blink[3].Flink[2].Flink;
LABEL_27:
HvFreeCell((ULONG_PTR)v14, Flink);
goto LABEL_9;
}
v16 = -1;
v9 = (ULONG_PTR)Blink[6].Flink;
v17 = 0;
v10 = Blink[3].Flink[2].Flink;
v11 = ((__int64(__fastcall *)(_LIST_ENTRY *, _QWORD, int *))v10->Blink)(v10, v9, &v16);
if( v11 )
{
if( !HvMarkCellDirty(v10, (PVOID)v9, 1u) )
goto LABEL_31;
v12 = *(_DWORD *)(v11 + 12);
if( v12 != 1 )
{
*(_DWORD *)(v11 + 12) = v12 - 1;
LABEL_31:
((void(__fastcall *)(_LIST_ENTRY *, int *))v10[1].Flink)(v10, &v16);
goto LABEL_9;
}
((void(__fastcall *)(_LIST_ENTRY *, int *))v10[1].Flink)(v10, &v16);
CmpRemoveSecurityCellList((_HHIVE *)v10, v9);
Flink = v9;
LODWORD(v14) = (_DWORD)v10;
goto LABEL_27;
}
}
}
LABEL_9:
CmpUnlockRegistry();
LABEL_10:
CmpLockRegistry();
v6 = (UINT64)Blink[3].Flink;
CmpLockHashEntryExclusiveByKcb(v6);
CmpLockKcbExclusive(v6);
if( *(_CM_TRANS **)(v6 + 288) == CmTrans )
{
v7 = *(_DWORD *)(v6 + 284);
if( v7 != -1 )
{
HvFreeCell(*(_QWORD *)(v6 + 32), v7);
*(_DWORD *)(v6 + 280) = 0;
*(_DWORD *)(v6 + 284) = -1;
}
*(_QWORD *)(v6 + 288) = 0i64;
}
if( CmEqualTrans(*(_QWORD *)(v6 + 240), (__int64)CmTrans) )
{
if( v3 == 8 )
{
CmpFlushNotifiesOnKeyBodyList(v6, 8i64, (__int64)a1, 0);
*(_WORD *)(v6 + 8) |= 0x20u;
CmpMarkKeyUnbacked(v6, (__int64)a1);
if( (*(_DWORD *)(v6 + 8) & 0x20000) == 0 )
CmpDiscardKcb(v6, (INT64)a1);
}
*(_QWORD *)(v6 + 240) = 0i64;
}
if( *(_DWORD *)(v6 + 40) != -1 )
{
if( *(_QWORD *)(v6 + 32) )
CmpRebuildKcbCache((PVOID)v6, (__int64)a1);
}
CmpReferenceKeyControlBlockUnsafe((volatile INT64 *)v6);
CmpRundownUnitOfWork(Blink);
CmpFreeUnitOfWork(Blink);
CmpUnlockKcb((_CM_KEY_CONTROL_BLOCK *)v6);
CmpUnlockHashEntryByKcb(v6);
CmpDereferenceKeyControlBlock(v6);
CmpDrainDelayDerefContext((UINT64 **)a1);
CmpUnlockRegistry();
}
}Referenced by:
CmRmFinalizeRecovery
CmpCleanupLightWeightTransaction
CmpRmUnDoPhase