CmpTransInitializeTransaction
NTSTATUS __stdcall CmpTransInitializeTransaction(_CM_TRANS *CmTrans){
_CM_TRANS_PTR v1;
unsigned int v3;
NTSTATUS started;
void *KtmEnlistmentHandle;
_CM_RM *CmRm;
UINT8 v7;
_ETHREAD *CurrentThread;
int v10[8];
__int64 v11;
PVOID Object;
_CM_TRANS *CmTransa;
CmTransa = 0i64;
v1.0 = 0i64;
v3 = 64;
if( CmTrans->Trans.0 )
{
if( CmTrans->CmRm != CmRmSystem )
{
started = CmpTransSearchAddTransFromRm((_CM_RM *)CmRmSystem, CmTrans->Trans, 0i64, 1ui64, &CmTransa);
if( started < 0 )
return started;
}
v1.0 = ($F21FB2B31E9B30A96ADF077329256E82)CmTrans->Trans;
started = CmpTransReferenceTransaction((INT64)v1.TransPtr);
if( started < 0 )
return started;
started = CmpStartRMLogs(CmTrans->CmRm);
if( started < 0 )
goto LABEL_16;
started = CmTmCreateEnlistment(
&CmTrans->KtmEnlistmentHandle,
(KRESOURCEMANAGER *)CmTrans->CmRm->KtmRm,
(KTRANSACTION *)(*(_QWORD *)&CmTrans->Trans.0 & 0xFFFFFFFFFFFFFFFEui64),
CmTrans);
if( started < 0 )
goto LABEL_16;
v11 = 0i64;
KtmEnlistmentHandle = CmTrans->KtmEnlistmentHandle;
Object = 0i64;
ObReferenceObjectByHandle(KtmEnlistmentHandle, 0i64, 0i64, 0, &Object, 0i64);
CmRm = CmTrans->CmRm;
CmTrans->KtmEnlistmentObject = (_KENLISTMENT *)Object;
if( CmpAccountForLogReservation(CmRm, v7) >= 0 )
v3 = 96;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 64));
if( (CmTrans->TransState & 6) == 0 )
{
CmTrans->TransState = v3;
--dword_140C5030C;
ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 64));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
_InterlockedOr(v10, 0);
if( *(&CmpDummyThreadEvent + 15) )
ExfUnblockPushLock((INT64 *)&CmpDummyThreadEvent + 15, 0i64);
return 0;
}
started = -1072103422;
ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 64));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
LABEL_16:
if( v1.0 )
CmpTransDereferenceTransaction((INT64)v1.TransPtr);
return started;
}Referenced by:
CmpTransSearchAddTrans