SmpFpWaitForResource

INT64 __fastcall SmpFpWaitForResource(INT64 SpinLock, UINT64 a2, _ETHREAD *a3){
  _ETHREAD *CurrentThread; 
  unsigned int v4; 
  _ETHREAD *i; 
  INT64 result; 
  CurrentThread = a3;
  v4 = a2;
  if( !a3 )
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  for( i = *(_ETHREAD **)(SpinLock + 104);
        CurrentThread != i
     && (*(_QWORD *)(SpinLock + 104)
      || _InterlockedCompareExchange64((volatile signed __int64 *)(SpinLock + 104), (signed __int64)CurrentThread, 0i64));
        i = *(_ETHREAD **)(SpinLock + 104) )
  {
    KeWaitForSingleObject((PVOID)(SpinLock + 8), Executive, 0, 0, 0i64);
  }
  LODWORD(result) = SmpFpAllocateResource(SpinLock, v4);
  if( !a3 )
    _InterlockedExchange64((volatile __int64 *)(SpinLock + 104), result);
  return result;
}

Referenced by:

SmFpAllocate