PopFxActivateDevice
VOID __stdcall PopFxActivateDevice(_DEVICE_OBJECT *Pdo, UINT8 SetSystemTransition){
char v2;
char v3;
INT64 *DeviceNode;
INT64 *v6;
unsigned __int8 v7;
int v8;
unsigned __int64 v9;
signed __int32 v10;
signed __int32 v11;
INT64 v12;
signed __int32 v13;
signed __int32 v14;
unsigned int i;
__int64 j;
__int64 v17;
v3 = v2;
if( Pdo )
DeviceNode = (INT64 *)Pdo->DeviceObjectExtension->DeviceNode;
else
DeviceNode = 0i64;
v6 = DeviceNode + 11;
v7 = ExAcquireSpinLockExclusive(DeviceNode + 11);
v8 = *((_DWORD *)DeviceNode + 30);
v9 = v7;
_m_prefetchw(DeviceNode + 37);
v10 = *((_DWORD *)DeviceNode + 74);
do
{
v11 = v10;
v10 = _InterlockedCompareExchange((volatile signed __int32 *)DeviceNode + 74, v10, v10);
}
while( v11 != v10 );
if( (v10 & 4) != 0 && (*(_DWORD *)(DeviceNode[10] + 824) & 1) != 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel(DeviceNode + 11);
__writecr8(v9);
}
else
{
*((_DWORD *)DeviceNode + 30) = v8 + 1;
v12 = 0i64;
_m_prefetchw(DeviceNode + 37);
v13 = *((_DWORD *)DeviceNode + 74);
do
{
v14 = v13;
v13 = _InterlockedCompareExchange((volatile signed __int32 *)DeviceNode + 74, v13, v13);
}
while( v14 != v13 );
if( (v13 & 4) != 0 )
{
v12 = DeviceNode[10];
PopFxAddRefDevice((POP_FX_DEVICE *)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(v17 + 104, 0, 0, 0, 0i64), *(int *)(v17 + 88) >= 0) )
{
PopFxBugCheck(0x608u, v17, v17 + 88, 0);
}
if( SetSystemTransition )
_InterlockedOr((volatile signed __int32 *)(v12 + 32), 1u);
if( *(&stru_140CF2E80 + 1836) || (*(_DWORD *)(v12 + 824) & 0x80u) != 0 )
{
if( v3 )
_InterlockedOr((volatile signed __int32 *)(v12 + 32), 0x800u);
}
}
KeWaitForSingleObject(v12 + 568, 0, 0, 0, 0i64);
if( _InterlockedExchangeAdd((volatile signed __int32 *)(v12 + 244), 0xFFFFFFFF) == 1 )
KeSetEvent((PRKEVENT)(v12 + 248), 0, 0);
}
}
}Referenced by:
PoFxActivateDevice
PoFxActivateDeviceForSystemTransition
PoFxStartDevicePowerManagement
PopFxActivateDevicesForSx
PopFxClearDeviceConstraints
PopFxSetDeviceAccountingCsPlatformState
PopPepInitializeVetoMasks
PopPepResetDeviceAccountingLevel
PopPlActivateDeviceIterator