PoFxIdleDevice
VOID __stdcall PoFxIdleDevice(DEVICE_OBJECT *Pdo){
__int64 v1;
INT64 *v2;
KIRQL v3;
int v4;
unsigned __int64 v5;
signed __int32 v6;
signed __int32 v7;
signed __int32 v8;
signed __int32 v9;
__int64 v10;
unsigned int i;
if( Pdo )
v1 = *(_QWORD *)(*((_QWORD *)Pdo + 39) + 40i64);
else
v1 = 0i64;
if( v1 )
{
v2 = (INT64 *)(v1 + 88);
v3 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v1 + 88));
v4 = *(_DWORD *)(v1 + 120);
v5 = v3;
_m_prefetchw((const void *)(v1 + 296));
v6 = *(_DWORD *)(v1 + 296);
do
{
v7 = v6;
v6 = _InterlockedCompareExchange((volatile signed __int32 *)(v1 + 296), v6, v6);
}
while( v7 != v6 );
if( (v6 & 4) == 0 || (*(_DWORD *)(*(_QWORD *)(v1 + 80) + 824i64) & 1) == 0 )
{
*(_DWORD *)(v1 + 120) = v4 - 1;
_m_prefetchw((const void *)(v1 + 296));
v8 = *(_DWORD *)(v1 + 296);
do
{
v9 = v8;
v8 = _InterlockedCompareExchange((volatile signed __int32 *)(v1 + 296), v8, v8);
}
while( v9 != v8 );
if( (v8 & 4) != 0 )
{
v10 = *(_QWORD *)(v1 + 80);
for( i = 0; i < *(_DWORD *)(v10 + 828); ++i )
PoFxIdleComponent((POHANDLE *)v10, i, 2ui64);
}
}
ExReleaseSpinLockExclusiveFromDpcLevel(v2);
__writecr8(v5);
}
}Referenced by:
PiProcessQueryDeviceState
PiProcessResourceRequirementsChanged
PipEnumerateDevice
PipProcessDevNodeTree
PipProcessRestartPhase2
PnpCancelStopDeviceNode
PnpDeleteLockedDeviceNode
PnpDeleteLockedDeviceNodes
PnpDeviceCompletionProcessCompletedRequest
PopCompleteDirectedPowerTransitionCallback
PopFxClearDeviceConstraints
PopFxIdleDevicesFromSx
PopFxSetDeviceAccountingCsPlatformState
PopFxUpdateVetoMaskWork
PopPepInitializeVetoMasks
PopPepResetDeviceAccountingLevel
PopPlIdleDeviceIterator