CmpTransSearchAddLightWeightTrans

INT64 __fastcall CmpTransSearchAddLightWeightTrans(INT64 a1, INT64 a2, INT64 a3, INT64 *a4){
  unsigned __int64 v5; 
  int v6; 
  _CM_TRANS_PTR v8; 
  int v9; 
  unsigned int v10; 
  INT64 v11; 
  _CM_TRANS *Trans; 
  _CM_TRANS *v14; 
  signed __int64 v15; 
  _ETHREAD *CurrentThread; 
  __int64 v17; 
  INT64 v18; 
  INT64 *v19; 
  v5 = a1 & 0xFFFFFFFFFFFFFFFEui64;
  v6 = a3;
  v8.0 = ($F21FB2B31E9B30A96ADF077329256E82)a1;
  v9 = 0;
  v10 = CmpTransReferenceTransaction(a1);
  if( (v10 & 0x80000000) != 0 )
    return v10;
  v11 = *(_QWORD *)(v5 + 16);
  if( v11 )
  {
    *a4 = v11;
    v10 = 0;
  }
  else if( v6 )
  {
    Trans = CmpTransAllocateTrans(v8, 0i64, 0i64, (_CMHIVE *)a2);
    v14 = Trans;
    if( Trans )
    {
      v15 = _InterlockedCompareExchange64((volatile signed __int64 *)(v5 + 16), (signed __int64)Trans, 0i64);
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      v17 = v15;
      if( v15 )
      {
        --*((_WORD *)CurrentThread + 242);
        v9 = 1;
        ExAcquireFastMutexUnsafe(&CmpTransactionListLock);
        v10 = CmpBindHiveToTrans(a2, v17) ? -1072103421 : -1072103423;
      }
      else
      {
        v18 = (INT64)v14;
        v8.0 = 0i64;
        v14 = 0i64;
        --*((_WORD *)CurrentThread + 242);
        ExAcquireFastMutexUnsafe(&CmpTransactionListLock);
        if( (*(_DWORD *)(v18 + 48) & 7) != 0 )
        {
          v10 = -1072103422;
LABEL_20:
          ExReleaseFastMutexUnsafe(&CmpTransactionListLock);
          KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
          return v10;
        }
        *(_DWORD *)(v18 + 48) = 128;
        v19 = (INT64 *)qword_140C47AC8;
        if( *(__int64 **)qword_140C47AC8 != &CmpLightTransactionList )
          __fastfail(3u);
        *(_QWORD *)v18 = &CmpLightTransactionList;
        *(_QWORD *)(v18 + 8) = v19;
        *v19 = v18;
        qword_140C47AC8 = v18;
        ExReleaseFastMutexUnsafe(&CmpTransactionListLock);
        KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
        *a4 = v18;
        v10 = 0;
      }
      if( v14 )
        ExFreePoolWithTag(v14, 0x72544D43u);
    }
    else
    {
      v10 = -1073741670;
    }
  }
  else
  {
    v10 = -1072103422;
  }
  if( v8.0 )
    CmpTransDereferenceTransaction((INT64)v8.TransPtr);
  if( v9 )
    goto LABEL_20;
  return v10;
}

Referenced by:

CmpTransSearchAddTransFromHive
CmpTransSearchAddTransFromKeyBody