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