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