PoFxReportDevicePoweredOn
INT8 __fastcall PoFxReportDevicePoweredOn(UINT64 a1){
volatile int *v1;
unsigned int DeviceDStateReason;
INT64 v4;
volatile int *v5;
char v6;
__int64 v7;
_IRP *v8;
signed int v9;
char v10;
signed int v11;
signed __int32 v12;
signed __int32 v13;
ULONG_PTR v14;
__int64 v15;
ULONG_PTR i;
signed __int32 v17;
signed __int32 v18;
signed __int32 v19;
signed __int32 v20;
v1 = *(volatile int **)(a1 + 48);
_m_prefetchw((const void *)(a1 + 32));
if( (_InterlockedAnd((volatile signed __int32 *)(a1 + 32), 0xFFFFFFFD) & 2) != 0 )
{
DeviceDStateReason = PopFxGetDeviceDStateReason(a1);
LOBYTE(v4) = 1;
PopPepDeviceDState(*(PEPHANDLE__ **)(a1 + 56), PowerDeviceD0, v4, DeviceDStateReason);
PopDiagTraceFxDevicePowerState((VOID *)v1, PowerDeviceD0);
}
v5 = v1 + 22;
v6 = ExAcquireSpinLockExclusive((INT64 *)v1 + 11);
v8 = 0i64;
v9 = _InterlockedExchange(v1 + 31, 0);
v10 = v6;
if( v9 > 0 )
{
v11 = *(_DWORD *)(*(_QWORD *)(a1 + 48) + 120i64);
if( v9 > v11 )
PopFxBugCheck(0x602u, (ULONG_PTR)v1, v9, 0);
_InterlockedAnd((volatile signed __int32 *)(a1 + 32), 0xFFFFF7FE);
*(_DWORD *)(*(_QWORD *)(a1 + 48) + 120i64) = v11 - v9;
v7 = *(_QWORD *)(a1 + 48);
_m_prefetchw((const void *)(v7 + 296));
v12 = *(_DWORD *)(v7 + 296);
do
{
v13 = v12;
v12 = _InterlockedCompareExchange((volatile signed __int32 *)(v7 + 296), v12, v12);
}
while( v13 != v12 );
if( (v12 & 4) != 0 )
{
v14 = *(_DWORD *)(a1 + 828);
v15 = (unsigned int)v9;
do
{
for( i = 0; i < v14; ++i )
{
PoFxIdleComponent(a1, i, 2ui64);
v14 = *(_DWORD *)(a1 + 828);
}
--v15;
}
while( v15 );
}
v8 = *(_IRP **)(*(_QWORD *)(a1 + 48) + 280i64);
}
LOBYTE(v7) = v10;
ExReleaseSpinLockExclusive(v5, v7);
if( *(&stru_140CF2E80 + 1836) || (v17 = *(_DWORD *)(a1 + 824), (v17 & 0x80u) != 0) )
{
_m_prefetchw((const void *)(a1 + 32));
v17 = *(_DWORD *)(a1 + 32);
do
{
v20 = v17;
v17 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 32), v17, v17);
}
while( v20 != v17 );
if( (v17 & 0x400) != 0 )
{
_InterlockedAnd((volatile signed __int32 *)(a1 + 32), 0xFFFFFBFF);
LOBYTE(v17) = PopSystemIrpCompletion(0i64, v8, *(&v8->Tail.IrpExtension + 9 * v8->StackCount));
}
}
if( !v9 )
{
_m_prefetchw((const void *)(a1 + 32));
v18 = *(_DWORD *)(a1 + 32);
do
{
v19 = v18;
v18 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 32), v18, v18);
}
while( v19 != v18 );
if( (v18 & 0x2000) != 0 )
LOBYTE(v17) = PopFxDerefAndCompleteDirectedPowerTransition(a1);
else
LOBYTE(v17) = PopFxCompleteDevicePowerRequired((POP_FX_DEVICE *)a1, 0i64);
}
return v17;
}Referenced by:
No references.