PiControlGetDevicePowerData

NTSTATUS __stdcall PiControlGetDevicePowerData(
        _DEVICE_NODE *DeviceNode,
        UINT64 OutputBufferLength,
        VOID *PowerDataBuffer,
        UINT64 *BytesWritten){
  size_t v4; 
  NTSTATUS v7; 
  _DEVICE_POWER_STATE DoDevicePowerState; 
  int v10; 
  __int64 v11; 
  __int64 v12; 
  _DEVICE_POWER_STATE DeviceWake; 
  _SYSTEM_POWER_STATE SystemWake; 
  __int32 v15; 
  __int32 v16; 
  __int32 v17; 
  __int64 v18; 
  __int128 v19; 
  __int128 v20; 
  __int128 Src; 
  __m256i v22; 
  __int64 v23; 
  _DEVICE_CAPABILITIES Capabilities; 
  UINT64 *BytesWrittena; 

  v4 = (unsigned int)PowerDataBuffer;
  memset(&Capabilities, 0i64, sizeof(Capabilities));
  v7 = 0;
  DWORD2(Src) = 0;
  *(_DWORD *)BytesWrittena = 0;
  LODWORD(Src) = 56;
  if( v4 < 4 )
  {
    *(_DWORD *)BytesWrittena = 56;
    return -2147483643;
  }
  if( PpIrpQueryCapabilities(DeviceNode->PhysicalDeviceObject, &Capabilities) < 0 )
    return -1073741810;
  if( PipIsDevNodeDNStarted((__int64)DeviceNode) )
  {
    DoDevicePowerState = PopLockGetDoDevicePowerState(DeviceNode->PhysicalDeviceObject->DeviceObjectExtension);
    if( DoDevicePowerState == PowerDeviceUnspecified )
      DoDevicePowerState = PowerDeviceD0;
    DWORD1(Src) = DoDevicePowerState;
  }
  else
  {
    DWORD1(Src) = 4;
  }
  v10 = 9;
  if( (Capabilities._bf_4 & 1) != 0 )
    v10 = 11;
  v11 = 2i64;
  DWORD2(Src) = v10;
  if( (Capabilities._bf_4 & 2) != 0 )
  {
    v10 |= 4u;
    DWORD2(Src) = v10;
  }
  if( (Capabilities._bf_4 & 0x400) != 0 )
  {
    v10 |= 0x10u;
    DWORD2(Src) = v10;
  }
  if( (Capabilities._bf_4 & 0x800) != 0 )
  {
    v10 |= 0x20u;
    DWORD2(Src) = v10;
  }
  if( (Capabilities._bf_4 & 0x1000) != 0 )
  {
    v10 |= 0x40u;
    DWORD2(Src) = v10;
  }
  if( (Capabilities._bf_4 & 0x2000) != 0 )
  {
    v10 |= 0x80u;
    DWORD2(Src) = v10;
  }
  if( (Capabilities._bf_4 & 0x10000) != 0 )
  {
    v10 |= 0x100u;
    DWORD2(Src) = v10;
  }
  v12 = 2i64;
  DeviceWake = Capabilities.DeviceWake;
  SystemWake = Capabilities.SystemWake;
  LODWORD(v23) = Capabilities.DeviceState[6];
  HIDWORD(Src) = Capabilities.D1Latency;
  v22.m256i_i64[0] = *(_QWORD *)&Capabilities.D2Latency;
  *(_OWORD *)&v22.m256i_u64[1] = *(_OWORD *)Capabilities.DeviceState;
  v22.m256i_i64[3] = *(_QWORD *)&Capabilities.DeviceState[4];
  do
  {
    v15 = DeviceWake - 1;
    if( v15 )
    {
      v16 = v15 - 1;
      if( v16 )
      {
        v17 = v16 - 1;
        if( v17 )
        {
          if( v17 != 1 )
            goto LABEL_34;
          v10 |= 0x80u;
        }
        else
        {
          v10 |= 0x44u;
        }
      }
      else
      {
        v10 |= 0x22u;
      }
    }
    else
    {
      v10 |= 0x10u;
    }
    DWORD2(Src) = v10;
LABEL_34:
    if( Capabilities.SystemWake )
      DeviceWake = Capabilities.DeviceState[Capabilities.SystemWake];
    else
      DeviceWake = PowerDeviceUnspecified;
    --v12;
  }
  while( v12 );
  if( (v10 & 0x80) != 0 )
  {
    v18 = 4i64;
    goto LABEL_42;
  }
  if( (v10 & 0x40) != 0 )
  {
    v18 = 3i64;
LABEL_42:
    v11 = v18;
  }
  else if( (v10 & 0x20) != 0 )
  {
    LODWORD(v18) = 2;
  }
  else if( (v10 & 0x10) != 0 )
  {
    LODWORD(v18) = 1;
    v11 = 1i64;
  }
  else
  {
    LODWORD(v18) = 0;
    v11 = 0i64;
  }
  if( Capabilities.SystemWake == PowerSystemUnspecified && (_DWORD)v18 )
  {
    for( SystemWake = PowerSystemSleeping3; SystemWake >= PowerSystemWorking; --SystemWake )
    {
      if( Capabilities.DeviceState[2] && (int)Capabilities.DeviceState[2] <= v11 )
        break;
    }
  }
  HIDWORD(v23) = SystemWake;
  if( v4 >= 0x38 )
  {
    if( BytesWritten )
    {
      v19 = *(_OWORD *)v22.m256i_i8;
      *(_OWORD *)BytesWritten = Src;
      v20 = *(_OWORD *)&v22.m256i_u64[2];
      *((_OWORD *)BytesWritten + 1) = v19;
      *(_QWORD *)&v19 = v23;
      *((_OWORD *)BytesWritten + 2) = v20;
      BytesWritten[6] = v19;
    }
  }
  else
  {
    if( BytesWritten )
      memmove(BytesWritten, &Src, v4);
    v7 = -2147483643;
  }
  *(_DWORD *)BytesWrittena = 56;
  return v7;
}

Referenced by:

PiControlGetPropertyData