SmpFpWaitForResource

VOID *__stdcall SmpFpWaitForResource(
        _SM_FORWARD_PROGRESS_CTX *FpContext,
        _SM_FP_RESOURCE_TYPE ResourceType,
        VOID *Context){
  _ETHREAD *CurrentThread; 
  _ETHREAD *i; 
  VOID *result; 

  CurrentThread = (_ETHREAD *)Context;
  if( !Context )
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  for( i = (_ETHREAD *)*((_QWORD *)FpContext + 13);
        CurrentThread != i
     && (*((_QWORD *)FpContext + 13)
      || _InterlockedCompareExchange64((volatile signed __int64 *)FpContext + 13, (signed __int64)CurrentThread, 0i64));
        i = (_ETHREAD *)*((_QWORD *)FpContext + 13) )
  {
    KeWaitForSingleObject((UINT64)(FpContext + 2), 0, 0, 0, 0i64);
  }
  result = SmpFpAllocateResource(FpContext, ResourceType);
  if( !Context )
    _InterlockedExchange64((volatile __int64 *)FpContext + 13, (__int64)result);
  return result;
}

Referenced by:

SmFpAllocate