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