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.