CmRmFinalizeRecovery

__int64 __fastcall CmRmFinalizeRecovery(__int64 a1){
  _ETHREAD *CurrentThread; 
  _CM_TRANS **v3; 
  _CM_TRANS *v4; 
  _CM_TRANS *Flink; 
  struct _DMA_ADAPTER *KtmEnlistmentObject; 
  void *KtmEnlistmentHandle; 
  _ETHREAD *v9; 
  UINT64 UowCount; 
  KAPC_STATE ApcState; 
  LODWORD(UowCount) = 0;
  memset(&ApcState, 0, sizeof(ApcState));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquireFastMutexUnsafe(&CmpTransactionListLock);
  v3 = (_CM_TRANS **)(a1 + 16);
  while( 1 )
  {
    v4 = *v3;
    if( *v3 == (_CM_TRANS *)v3 )
      break;
    if( (_CM_TRANS **)v4->TransactionListEntry.Blink != v3
      || (Flink = (_CM_TRANS *)v4->TransactionListEntry.Flink, (_CM_TRANS *)v4->TransactionListEntry.Flink->Blink != v4) )
    {
      __fastfail(3u);
    }
    *v3 = Flink;
    Flink->TransactionListEntry.Blink = (_LIST_ENTRY *)v3;
    ExReleaseFastMutexUnsafe(&CmpTransactionListLock);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    CmpTransMgrRollback(v4, &UowCount);
    CmpAttachToRegistryProcess(&ApcState);
    CmpTransMgrFreeVolatileData((__int64)v4, 8);
    KiUnstackDetachProcess(&ApcState, 0i64);
    if( v4->Trans.0 )
      CmpTransDereferenceTransaction((INT64)v4->Trans.TransPtr);
    KtmEnlistmentObject = (struct _DMA_ADAPTER *)v4->KtmEnlistmentObject;
    if( KtmEnlistmentObject )
      HalPutDmaAdapter(KtmEnlistmentObject);
    KtmEnlistmentHandle = v4->KtmEnlistmentHandle;
    if( KtmEnlistmentHandle )
      ZwClose(KtmEnlistmentHandle);
    ExFreePoolWithTag(v4, 0x72544D43u);
    v9 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v9 + 242);
    ExAcquireFastMutexUnsafe(&CmpTransactionListLock);
  }
  ExReleaseFastMutexUnsafe(&CmpTransactionListLock);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return 0i64;
}

Referenced by:

CmpFinishSystemHivesLoad
CmpLoadKeyCommon
CmpMountPreloadedHives