PoFxReportDevicePoweredOn
VOID __stdcall PoFxReportDevicePoweredOn(POHANDLE *Handle){
POHANDLE v1;
unsigned int DeviceDStateReason;
INT64 v4;
volatile LONG *v5;
KIRQL v6;
__int64 v7;
int v8;
KIRQL v9;
int v10;
POHANDLE v11;
signed __int32 v12;
signed __int32 v13;
unsigned int v14;
__int64 v15;
unsigned int i;
signed __int32 v17;
signed __int32 v18;
signed __int32 v19;
signed __int32 v20;
v1 = Handle[6];
_m_prefetchw(Handle + 4);
if( (_InterlockedAnd((volatile signed __int32 *)Handle + 8, 0xFFFFFFFD) & 2) != 0 )
{
DeviceDStateReason = PopFxGetDeviceDStateReason((INT64)Handle);
LOBYTE(v4) = 1;
PopPepDeviceDState((PEPHANDLE__ *)Handle[7], PowerDeviceD0, v4, DeviceDStateReason);
PopDiagTraceFxDevicePowerState(v1, PowerDeviceD0);
}
v5 = (volatile LONG *)(v1 + 22);
v6 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)v1 + 22);
v7 = 0i64;
v8 = _InterlockedExchange((volatile __int32 *)v1 + 31, 0);
v9 = v6;
if( v8 > 0 )
{
v10 = *((_DWORD *)Handle[6] + 30);
if( v8 > v10 )
PopFxBugCheck(0x602ui64, (UINT64)v1, v8, 0i64);
_InterlockedAnd((volatile signed __int32 *)Handle + 8, 0xFFFFF7FE);
*((_DWORD *)Handle[6] + 30) = v10 - v8;
v11 = Handle[6];
_m_prefetchw(v11 + 74);
v12 = *((_DWORD *)v11 + 74);
do
{
v13 = v12;
v12 = _InterlockedCompareExchange((volatile signed __int32 *)v11 + 74, v12, v12);
}
while( v13 != v12 );
if( (v12 & 4) != 0 )
{
v14 = *((_DWORD *)Handle + 207);
v15 = (unsigned int)v8;
do
{
for( i = 0; i < v14; ++i )
{
PoFxIdleComponent(Handle, i, 2ui64);
v14 = *((_DWORD *)Handle + 207);
}
--v15;
}
while( v15 );
}
v7 = *((_QWORD *)Handle[6] + 35);
}
ExReleaseSpinLockExclusive(v5, v9);
if( PopPoFxSystemIrpWaitForReportDevicePoweredReg || (*((_DWORD *)Handle + 206) & 0x80u) != 0 )
{
_m_prefetchw(Handle + 4);
v19 = *((_DWORD *)Handle + 8);
do
{
v20 = v19;
v19 = _InterlockedCompareExchange((volatile signed __int32 *)Handle + 8, v19, v19);
}
while( v20 != v19 );
if( (v19 & 0x400) != 0 )
{
_InterlockedAnd((volatile signed __int32 *)Handle + 8, 0xFFFFFBFF);
PopSystemIrpCompletion(0i64, (_IRP *)v7, *(PVOID *)(v7 + 72i64 * *(char *)(v7 + 66) + 200));
}
}
if( !v8 )
{
_m_prefetchw(Handle + 4);
v17 = *((_DWORD *)Handle + 8);
do
{
v18 = v17;
v17 = _InterlockedCompareExchange((volatile signed __int32 *)Handle + 8, v17, v17);
}
while( v18 != v17 );
if( (v17 & 0x2000) != 0 )
PopFxDerefAndCompleteDirectedPowerTransition(Handle);
else
PopFxCompleteDevicePowerRequired((ULONG_PTR)Handle, 0i64);
}
}Referenced by:
No references.