CmpCommitLightWeightTransaction
__int64 __fastcall CmpCommitLightWeightTransaction(__int64 a1){
char v2;
signed __int32 v3;
_CM_TRANS *v4;
__int64 v5;
NTSTATUS v6;
__int64 v7;
signed __int32 v9[8];
UINT64 *RegLockHeldEx[4];
v2 = 0;
*(_OWORD *)RegLockHeldEx = 0i64;
CmpInitializeDelayDerefContext(RegLockHeldEx);
v3 = _InterlockedCompareExchange((volatile signed __int32 *)a1, 1, 0);
if( v3 )
{
v6 = -1072103421;
if( v3 == 3 )
return(unsigned int)-1072103403;
}
else
{
v4 = *(_CM_TRANS **)(a1 + 16);
if( v4 )
{
v2 = 1;
CmpLockRegistryExclusive();
}
v6 = CmpPrepareLightWeightTransaction(v4);
if( v6 < 0 )
{
if( _InterlockedCompareExchange((volatile signed __int32 *)a1, 3, 1) == 1 )
{
CmpAbortLightWeightTransaction(a1);
}
else
{
_InterlockedCompareExchange((volatile signed __int32 *)a1, 3, 4);
_InterlockedOr(v9, 0);
if( *(_QWORD *)(a1 + 8) )
ExfUnblockPushLock((_EX_PUSH_LOCK *)(a1 + 8), 0i64);
}
}
else if( _InterlockedCompareExchange((volatile signed __int32 *)a1, 2, 1) == 4 )
{
CmpCleanupLightWeightPrepare((__int64)v4, v5, (__int64)RegLockHeldEx);
_InterlockedCompareExchange((volatile signed __int32 *)a1, 3, 4);
_InterlockedOr(v9, 0);
if( *(_QWORD *)(a1 + 8) )
ExfUnblockPushLock((_EX_PUSH_LOCK *)(a1 + 8), 0i64);
v6 = -1072103421;
}
else
{
CmpCommitPreparedLightWeightTransaction((__int64)v4, (struct _LOOKASIDE_LIST_EX *)RegLockHeldEx);
if( v2 )
{
CmpCleanupLightWeightPrepare((__int64)v4, v7, (__int64)RegLockHeldEx);
CmpDrainDelayDerefContext(RegLockHeldEx);
CmpUnlockRegistry();
v2 = 0;
CmpCleanupLightWeightTransaction(v4, 4ui64);
}
v6 = 0;
}
if( v2 )
{
CmpDrainDelayDerefContext(RegLockHeldEx);
CmpUnlockRegistry();
}
}
return(unsigned int)v6;
}Referenced by:
No references.