CmpRmUnDoPhase

int __fastcall CmpRmUnDoPhase(__int64 a1){
  _CM_TRANS *v2; 
  __int64 v3; 
  _CM_TRANS *v4; 
  int v5; 
  _LIST_ENTRY *Flink; 
  _LIST_ENTRY *Blink; 
  __int64 v9; 
  char v10[4]; 
  char UowCount[12]; 
  LIST_ENTRY *ListIterator; 
  struct _OBJECT_ATTRIBUTES ObjectAttributes; 
  KAPC_STATE ApcState; 
  memset(UowCount, 0, sizeof(UowCount));
  memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
  v10[0] = 0;
  memset(&ApcState, 0, sizeof(ApcState));
LABEL_2:
  ListIterator = 0i64;
  while( 1 )
  {
    LODWORD(v2) = CmListGetNextElement((LIST_ENTRY *)(a1 + 16), &ListIterator, 0i64);
    v4 = v2;
    if( !v2 )
      return(int)v2;
    if( (v2->TransState & 2) != 0 )
    {
      CmpTransMgrRollback(v2, (UINT64 *)UowCount);
      CmpAttachToRegistryProcess(&ApcState);
      v5 = 8;
LABEL_12:
      CmpTransMgrFreeVolatileData((__int64)v4, v5);
      KiUnstackDetachProcess(&ApcState, 0i64);
      Flink = v4->TransactionListEntry.Flink;
      if( (_CM_TRANS *)v4->TransactionListEntry.Flink->Blink != v4
        || (Blink = v4->TransactionListEntry.Blink, (_CM_TRANS *)Blink->Flink != v4) )
      {
        __fastfail(3u);
      }
      Blink->Flink = Flink;
      Flink->Blink = Blink;
      ExFreePoolWithTag(v4, 0x72544D43u);
      goto LABEL_2;
    }
    ObjectAttributes.RootDirectory = (void *)((__int64)ObjectAttributes.RootDirectory & v3);
    ObjectAttributes.ObjectName = (_UNICODE_STRING *)((__int64)ObjectAttributes.ObjectName & v3);
    ObjectAttributes.Length = 48;
    ObjectAttributes.Attributes = 512;
    *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
    if( ZwOpenTransaction((PHANDLE)&UowCount[4], 0x1F003Fu, &ObjectAttributes, &v2->KtmUow, (HANDLE)(v3 & v9)) < 0 )
    {
      if( (int)CmpTransMgrPrepare(a1, (__int64)v4, UowCount, v10) < 0
        || (int)CmpTransMgrCommit(a1, (__int64)v4, (int *)UowCount) < 0 )
      {
        v4->TransState |= 2u;
        goto LABEL_2;
      }
      CmpAttachToRegistryProcess(&ApcState);
      v5 = 4;
      goto LABEL_12;
    }
    ZwClose(*(HANDLE *)&UowCount[4]);
  }
}

Referenced by:

CmpStartRMLog