PfpScenCtxPrefetchWait

NTSTATUS __fastcall PfpScenCtxPrefetchWait(
        PFP_SCENARIO_CONTEXT *ScenCtx,
        PF_PHASED_SCENARIO_TYPE Scenario,
        UINT64 WaitTimeMax,
        UINT64 DelayForStartMax){
  int v4; 
  unsigned int v5; 
  unsigned int v6; 
  PF_PHASED_SCENARIO_TYPE v7; 
  int v9; 
  _ETHREAD *CurrentThread; 
  int v11; 
  int v13; 
  unsigned int v14; 
  volatile unsigned __int64 TickCountQuad; 
  unsigned int TickCountMultiplier; 
  NTSTATUS v17; 
  __int64 v18; 
  _LARGE_INTEGER v19; 
  PF_PHASED_SCENARIO_TYPE v20; 
  unsigned int v21; 

  v21 = WaitTimeMax;
  v20 = Scenario;
  v19.QuadPart = 0i64;
  v4 = 0;
  v5 = 0;
  v6 = WaitTimeMax;
  v7 = Scenario;
  v9 = *(&stru_140C4DB30 + 2042) < *(&stru_140C4DB30 + 2043) ? 0x7D0 : 0;
  while( 1 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)ScenCtx, 0i64);
    if( ScenCtx[12] != v7 || (ScenCtx[2] & 0xC) == 8 )
      break;
    if( v4 )
      goto LABEL_22;
    KeResetEvent((_KEVENT *)(ScenCtx + 4));
    v11 = ScenCtx[2] & 3;
    if( v11 == 1 )
    {
      v13 = 2;
      v14 = v6 - v5;
    }
    else
    {
      if( v11 )
        break;
      if( !v9 )
      {
LABEL_22:
        PfpScenCtxWaiterTimedOut(ScenCtx);
        break;
      }
      v14 = v9;
      v13 = 1;
      v9 = 0;
    }
    ScenCtx[2] = ScenCtx[2] & 0xFFFFFFF3 | 4;
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)ScenCtx, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)ScenCtx);
    KeAbPostRelease(ScenCtx);
    KeLeaveCriticalRegion();
    v19.QuadPart = -10000i64 * v14;
    TickCountQuad = KUSER_SHARED_DATA.TickCountQuad;
    TickCountMultiplier = KUSER_SHARED_DATA.TickCountMultiplier;
    v17 = KeWaitForSingleObject((UINT64)(ScenCtx + 4), 0, 0, 0, (INT64)&v19);
    v18 = (unsigned int)TickCountQuad;
    v6 = v21;
    v5 += ((KUSER_SHARED_DATA.TickCount.LowPart * (unsigned __int64)KUSER_SHARED_DATA.TickCountMultiplier) >> 24)
        + ((KUSER_SHARED_DATA.TickCountMultiplier * KUSER_SHARED_DATA.TickCount.High1Time
          - TickCountMultiplier * HIDWORD(TickCountQuad)) << 8)
        - ((v18 * (unsigned __int64)TickCountMultiplier) >> 24);
    if( v17 == 258 || v5 >= v21 )
    {
      v4 = 1;
    }
    else if( v13 == 2 )
    {
      return v5;
    }
    v7 = v20;
  }
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)ScenCtx, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)ScenCtx);
  KeAbPostRelease(ScenCtx);
  KeLeaveCriticalRegion();
  return v5;
}

Referenced by:

PfPowerActionNotify
PfpProcessScenarioPhase