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