PopFxActivateDevice
VOID __stdcall PopFxActivateDevice(DEVICE_OBJECT *Pdo, UINT8 SetSystemTransition){
char v2;
char v3;
__int64 v5;
INT64 *v6;
KIRQL v7;
int v8;
unsigned __int64 v9;
signed __int32 v10;
signed __int32 v11;
ULONG_PTR v12;
signed __int32 v13;
signed __int32 v14;
unsigned int i;
__int64 j;
UINT64 v17;
v3 = v2;
if( Pdo )
v5 = *(_QWORD *)(*((_QWORD *)Pdo + 39) + 40i64);
else
v5 = 0i64;
v6 = (INT64 *)(v5 + 88);
v7 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v5 + 88));
v8 = *(_DWORD *)(v5 + 120);
v9 = v7;
_m_prefetchw((const void *)(v5 + 296));
v10 = *(_DWORD *)(v5 + 296);
do
{
v11 = v10;
v10 = _InterlockedCompareExchange((volatile signed __int32 *)(v5 + 296), v10, v10);
}
while( v11 != v10 );
if( (v10 & 4) != 0 && (*(_DWORD *)(*(_QWORD *)(v5 + 80) + 824i64) & 1) != 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v5 + 88));
__writecr8(v9);
}
else
{
*(_DWORD *)(v5 + 120) = v8 + 1;
v12 = 0i64;
_m_prefetchw((const void *)(v5 + 296));
v13 = *(_DWORD *)(v5 + 296);
do
{
v14 = v13;
v13 = _InterlockedCompareExchange((volatile signed __int32 *)(v5 + 296), v13, v13);
}
while( v14 != v13 );
if( (v13 & 4) != 0 )
{
v12 = *(_QWORD *)(v5 + 80);
PopFxAddRefDevice(v12);
for( i = 0; i < *(_DWORD *)(v12 + 828); ++i )
PoFxActivateComponent((POHANDLE *)v12, i, 2ui64);
}
ExReleaseSpinLockExclusiveFromDpcLevel(v6);
__writecr8(v9);
if( v12 )
{
for( j = 0i64; (unsigned int)j < *(_DWORD *)(v12 + 828); j = (unsigned int)(j + 1) )
{
v17 = *(_QWORD *)(*(_QWORD *)(v12 + 832) + 8 * j);
if( (*(_DWORD *)(v17 + 88) & 0x3FFFFFFF) == 0
|| (KeWaitForSingleObject((PVOID)(v17 + 104), Executive, 0, 0, 0i64), *(int *)(v17 + 88) >= 0) )
{
PopFxBugCheck(0x608ui64, v17, v17 + 88, 0i64);
}
if( SetSystemTransition )
_InterlockedOr((volatile signed __int32 *)(v12 + 32), 1u);
if( PopPoFxSystemIrpWaitForReportDevicePoweredReg || (*(_DWORD *)(v12 + 824) & 0x80u) != 0 )
{
if( v3 )
_InterlockedOr((volatile signed __int32 *)(v12 + 32), 0x800u);
}
}
KeWaitForSingleObject((PVOID)(v12 + 568), Executive, 0, 0, 0i64);
if( _InterlockedExchangeAdd((volatile signed __int32 *)(v12 + 244), 0xFFFFFFFF) == 1 )
KeSetEvent((PRKEVENT)(v12 + 248), 0);
}
}
}Referenced by:
PoFxActivateDevice
PoFxActivateDeviceForSystemTransition
PoFxStartDevicePowerManagement
PopFxActivateDevicesForSx
PopFxClearDeviceConstraints
PopFxSetDeviceAccountingCsPlatformState
PopPepInitializeVetoMasks
PopPepResetDeviceAccountingLevel
PopPlActivateDeviceIterator