PopRequestPowerIrp
NTSTATUS __stdcall PopRequestPowerIrp(
_DEVICE_OBJECT *TargetDevice,
CHAR a2,
INT64 a3,
INT64 a4,
INT64 a5,
CHAR a6,
INT64 Irp){
volatile __int64 *v7;
POWER_STATE PowerState;
char v11;
NTSTATUS result;
_IRP *v13;
__int64 v14;
INT64 v15;
__int64 v16;
__int64 v17;
INT64 v18;
__int64 v19;
__int64 v20;
char v21;
__int64 v22;
unsigned __int8 v23;
unsigned __int64 v24;
INT64 MustSucceed;
INT64 AllocatePendingIrp;
VOID *v27;
POWER_STATE v28[2];
VOID *v29;
_IRP **vars0;
POP_IRP_DATA **anonymous1;
PVOID retaddr;
v7 = (volatile __int64 *)Irp;
*(_QWORD *)&v28[0].SystemState = 0i64;
PowerState.SystemState = a3;
if( Irp )
_InterlockedExchange64((volatile __int64 *)Irp, 0i64);
Irp = 0i64;
if( !a2 )
goto LABEL_21;
if( (unsigned __int8)(a2 - 2) > 1u )
return -1073741584;
v11 = 1;
if( !(_BYTE)PopCurrentBroadcast )
LABEL_21:
v11 = 0;
LOBYTE(a3) = a2;
LOBYTE(AllocatePendingIrp) = a6;
LOBYTE(MustSucceed) = v11;
result = PopAllocateIrp(
TargetDevice,
(_IRP *)a2,
a3,
(POWER_STATE_TYPE)(a2 != 0),
PowerState,
MustSucceed,
AllocatePendingIrp,
(VOID *)a4,
(_DEVICE_OBJECT *)a5,
(UINT8)&Irp,
(POWER_STATE)v28,
v27,
*(_IO_STATUS_BLOCK **)&v28[0].SystemState,
v29,
vars0,
anonymous1);
if( result >= 0 && result != 259 )
{
v13 = (_IRP *)Irp;
if( Irp )
{
v14 = *(_QWORD *)&v28[0].SystemState;
v15 = Irp + 184;
v16 = *(_QWORD *)(Irp + 184);
*(_QWORD *)(v16 - 16) = PopRequestCompletion;
*(_QWORD *)(v16 - 8) = v14;
*(_BYTE *)(v16 - 69) = -32;
if( v7 )
{
_InterlockedExchange64(v7, (__int64)v13);
v13 = (_IRP *)Irp;
v14 = *(_QWORD *)&v28[0].SystemState;
}
v17 = *(_QWORD *)v15;
if( a2 )
{
*(_DWORD *)(v17 - 56) = 1;
*(POWER_STATE *)(v17 - 48) = PowerState;
if( (_BYTE)PopCurrentBroadcast )
{
v18 = *(_QWORD *)(v14 + 200);
if( !v18 || PopFxGetDeviceDStateReason(v18) == 1 )
{
*(_DWORD *)(v17 - 40) = PopMapInternalActionToIrpAction(
SDWORD2(PopCurrentBroadcast),
(_SYSTEM_POWER_STATE)(WORD2(PopCurrentBroadcast) >> 12),
1u);
*(_DWORD *)(v17 - 64) = DWORD1(PopCurrentBroadcast);
}
}
v19 = *(_QWORD *)(v14 + 200);
if( v19 && a2 == 2 )
{
if( (_InterlockedCompareExchange((volatile signed __int32 *)(v19 + 824), 0, 0) & 0x20) != 0 )
{
_m_prefetchw((const void *)(v19 + 32));
if( (_InterlockedOr((volatile signed __int32 *)(v19 + 32), 0) & 0x2000) != 0 )
{
v23 = KeAcquireSpinLockRaiseToDpc((UINT64 *)(v19 + 1152));
*(_DWORD *)(v19 + 1180) |= 1u;
v24 = v23;
_InterlockedIncrement((volatile signed __int32 *)(v19 + 1160));
KxReleaseSpinLock((UINT64 *)(v19 + 1152));
__writecr8(v24);
}
}
v13 = (_IRP *)Irp;
}
if( (xmmword_140CFB490 & 0x8000) != 0 )
PopLogNotifyDevice(TargetDevice, 0i64, v13);
PopQueueQuerySetIrp(v13);
}
else
{
v20 = *(_QWORD *)(v14 + 200);
if( v20 )
{
_m_prefetchw((const void *)(v20 + 32));
v21 = _InterlockedOr((volatile signed __int32 *)(v20 + 32), 0);
v22 = *(_QWORD *)&v28[0].SystemState;
v21 &= 1u;
*(_BYTE *)(*(_QWORD *)&v28[0].SystemState + 208i64) = v21;
v21 ^= 1u;
*(_BYTE *)(v22 + 209) = v21;
v15 = *(_QWORD *)(v14 + 200);
if( v21 )
{
PopPepDeviceWaitWake(*(PEPHANDLE **)(v15 + 56), 0);
}
else
{
if( _InterlockedExchangeAdd((volatile signed __int32 *)(v15 + 244), 0xFFFFFFFF) == 1 )
KeSetEvent((PRKEVENT)(v15 + 248), 0, 0);
*(_QWORD *)(v14 + 200) = 0i64;
}
v13 = (_IRP *)Irp;
}
*(POWER_STATE *)(v17 - 64) = PowerState;
PopDiagTraceIrpStart((_IRP *)v15);
IofCallDriverSpecifyReturn(*(_DEVICE_OBJECT **)(v17 - 32), v13, retaddr);
}
return 259;
}
else
{
return -1073741670;
}
}
return result;
}Referenced by:
PoRequestPowerIrp
PopFxReleasePowerIrp
PopScanIdleList