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; 
  _CM_TRANS *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 = (_CM_TRANS *)v15;
      if( v15 )
      {
        --CurrentThread->Tcb.KernelApcDisable;
        v9 = 1;
        ExAcquireFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 64));
        v10 = (unsigned int)CmpBindHiveToTrans((_CMHIVE *)a2, v17) != 0 ? -1072103421 : -1072103423;
      }
      else
      {
        v18 = (INT64)v14;
        v8.0 = 0i64;
        v14 = 0i64;
        --CurrentThread->Tcb.KernelApcDisable;
        ExAcquireFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 64));
        if( (*(_DWORD *)(v18 + 48) & 7) != 0 )
        {
          v10 = -1072103422;
LABEL_20:
          ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 64));
          KeLeaveCriticalRegionThread(KeGetCurrentThread());
          return v10;
        }
        *(_DWORD *)(v18 + 48) = 128;
        v19 = (INT64 *)*(&CmpDummyThreadEvent + 17);
        if( (_UNKNOWN *)**(&CmpDummyThreadEvent + 17) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 128) )
          __fastfail(3u);
        *(_QWORD *)v18 = (char *)&CmpDummyThreadEvent + 128;
        *(_QWORD *)(v18 + 8) = v19;
        *v19 = v18;
        *(&CmpDummyThreadEvent + 17) = v18;
        ExReleaseFastMutexUnsafe((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 64));
        KeLeaveCriticalRegionThread(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