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