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