PoRegisterDeviceForIdleDetection
NTSTATUS __fastcall PoRegisterDeviceForIdleDetection(INT64 a1, INT64 a2, INT64 a3, INT64 a4){
NTSTATUS v4;
_DEVICE_POWER_STATE v5;
unsigned int v6;
unsigned int v7;
unsigned __int64 v9;
__int64 v10;
_QWORD *v12;
__int64 v13;
int v14;
int v15;
_DEVICE_OBJECT_POWER_EXTENSION *Dope;
unsigned __int64 v17;
_LIST_ENTRY *p_IdleList;
_LIST_ENTRY *v19;
_QWORD *v20;
v4 = 0;
v5 = (int)a4;
v6 = a3;
v7 = a2;
if( !(_DWORD)a2 && !(_DWORD)a3 )
{
v9 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&stru_140C23628 + 142);
v10 = *(_QWORD *)(*(_QWORD *)(a1 + 312) + 24i64);
if( !v10 )
goto LABEL_4;
v12 = (_QWORD *)(v10 + 32);
v13 = *(_QWORD *)(v10 + 32);
if( v13 == v10 + 32 )
goto LABEL_4;
v20 = *(_QWORD **)(v10 + 40);
if( *(_QWORD **)(v13 + 8) == v12 && (_QWORD *)*v20 == v12 )
{
*v20 = v13;
*(_QWORD *)(v13 + 8) = v20;
*(_QWORD *)(v10 + 48) = 0i64;
*(_QWORD *)(v10 + 16) = 0i64;
*(_DWORD *)(v10 + 56) = 0;
*(_DWORD *)v10 = 0;
*(_DWORD *)(v10 + 4) = 0;
*(_DWORD *)(v10 + 8) = 0;
*(_DWORD *)(v10 + 12) = 0;
*(_QWORD *)(v10 + 88) = 0i64;
*(_QWORD *)(v10 + 40) = v10 + 32;
*v12 = v12;
LABEL_4:
KxReleaseSpinLock((UINT64 *)&stru_140C23628 + 142);
__writecr8(v9);
return v4;
}
LABEL_22:
__fastfail(3u);
}
if( (unsigned int)(a4 - 2) > 2 )
return v4;
v14 = *(_DWORD *)(a1 + 72);
v15 = 0;
if( v14 != 7 && v14 != 45 )
{
LABEL_11:
Dope = PopGetDope((_DEVICE_OBJECT *)a1);
if( !Dope )
return v4;
v17 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)&stru_140C23628 + 142);
p_IdleList = &Dope->IdleList;
Dope->ConservationIdleTime = v7;
Dope->PerformanceIdleTime = v6;
Dope->IdleState = v5;
Dope->IdleType = v15;
if( p_IdleList->Flink == p_IdleList )
{
Dope->CurrentState = PowerDeviceD0;
v19 = (_LIST_ENTRY *)*(&stru_140C23628 + 146);
if( (_UNKNOWN *)**(&stru_140C23628 + 146) != (_UNKNOWN *)((char *)&stru_140C23628 + 1160) )
goto LABEL_22;
p_IdleList->Flink = (_LIST_ENTRY *)((char *)&stru_140C23628 + 1160);
Dope->IdleList.Blink = v19;
v19->Flink = p_IdleList;
*(&stru_140C23628 + 146) = &Dope->IdleList;
}
KxReleaseSpinLock((UINT64 *)&stru_140C23628 + 142);
__writecr8(v17);
PopCheckForWork();
return(int)Dope;
}
if( PopPlatformAoAc || (*(_DWORD *)(a1 + 52) & 1) == 0 )
{
v15 = 1;
goto LABEL_11;
}
return v4;
}Referenced by:
PoRunDownDeviceObject