PoFxStartDevicePowerManagement
VOID __stdcall PoFxStartDevicePowerManagement(POHANDLE *Handle){
POHANDLE v1;
POHANDLE v3;
ULONG_PTR v4;
unsigned __int8 v5;
unsigned int v6;
unsigned __int64 v7;
unsigned int v8;
__int64 v9;
unsigned int i;
_ETHREAD *CurrentThread;
char v12;
_DEVICE_OBJECT *v13;
POHANDLE v14;
v1 = Handle[6];
PopPepDeviceStarted((_POP_PEP_DEVICE *)Handle[7]);
v3 = Handle[8];
v4 = 0;
if( v3 )
{
v14 = Handle[9];
(*((void(__fastcall **)(__int64, POHANDLE *))v3 + 12))(18i64, &v14);
}
if( v1 )
{
v5 = ExAcquireSpinLockExclusive((INT64 *)v1 + 11);
v6 = *((_DWORD *)v1 + 30);
v7 = v5;
if( ((_DWORD)Handle[103] & 1) != 0 )
{
if( !v6 )
{
LABEL_10:
_InterlockedOr((volatile signed __int32 *)v1 + 74, 4u);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v1 + 11);
__writecr8(v7);
PopDiagTraceFxDeviceStartPowerManagement(v1);
goto LABEL_11;
}
v6 = 0;
*((_DWORD *)v1 + 30) = 0;
}
if( v6 )
{
v8 = *((_DWORD *)Handle + 207);
v9 = v6;
do
{
for( i = 0; i < v8; ++i )
{
PoFxActivateComponent(Handle, i, 2ui64);
v8 = *((_DWORD *)Handle + 207);
}
--v9;
}
while( v9 );
}
goto LABEL_10;
}
LABEL_11:
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&stru_140C23628 + 489, 0i64);
v12 = *(&stru_140CF2E80 + 7784);
if( _InterlockedCompareExchange64((_QWORD *)&stru_140C23628 + 489, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)&stru_140C23628 + 489);
KeAbPostRelease((char *)&stru_140C23628 + 3912);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( v12 )
{
v13 = (_DEVICE_OBJECT *)*((_QWORD *)v1 + 4);
PopFxActivateDevice(v13, 0);
PopFxIncrementDeviceSleepCount(v13);
}
if( *((_DWORD *)Handle + 207) )
{
do
PoFxIdleComponent((ULONG_PTR)Handle, v4++, 1ui64);
while( v4 < *((_DWORD *)Handle + 207) );
}
}Referenced by:
HalpDmaInitPowerManagement
HalpInterruptInitPowerManagement
HalpTimerInitPowerManagement
PoFxEnableDStateReporting
PoFxRegisterDebugger