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.