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