ExpTryConvertSharedSpinLockExclusiveInstrumented

UINT64 __stdcall ExpTryConvertSharedSpinLockExclusiveInstrumented(INT64 *SpinLock, PVOID ReturnAddress){
  struct _KPRCB *CurrentPrcb; 
  signed __int32 v4; 
  signed __int32 v5; 
  bool v6; 
  signed __int32 v7; 
  UINT64 SpinCount; 
  CurrentPrcb = KeGetCurrentPrcb();
  if( _interlockedbittestandset((volatile signed __int32 *)SpinLock, 0x1Fu) )
    return 0i64;
  ++*((_DWORD *)CurrentPrcb + 8496);
  v4 = *(_DWORD *)SpinLock;
  v5 = *(_DWORD *)SpinLock;
  LODWORD(SpinCount) = 0;
  if( (v5 & 0xBFFFFFFF) != -2147483647 )
  {
    do
    {
      if( (v4 & 0x40000000) == 0 )
      {
        v7 = _InterlockedCompareExchange((volatile signed __int32 *)SpinLock, v4 | 0x40000000, v4);
        v6 = v4 == v7;
        v4 = v7;
        if( !v6 )
          continue;
      }
      KeYieldProcessorEx(&SpinCount);
      v4 = *(_DWORD *)SpinLock;
    }
    while( (v4 & 0xBFFFFFFF) != -2147483647 );
  }
  *((_DWORD *)CurrentPrcb + 8498) += SpinCount;
  ++*((_DWORD *)CurrentPrcb + 8497);
  return 1i64;
}

Referenced by:

No references.