PopRequestPowerIrp
__int64 __fastcall PopRequestPowerIrp(
_DEVICE_OBJECT *a1,
__int64 a2,
int a3,
__int64 a4,
__int64 a5,
char a6,
volatile __int64 *Irp){
volatile __int64 *v7;
char v9;
char v11;
__int64 result;
CHAR v13;
UINT64 *v14;
IRP *v15;
__int64 v16;
volatile __int64 *v17;
__int64 v18;
INT64(__stdcall *v19)(DEVICE_OBJECT *, IRP *, VOID *);
volatile __int64 v20;
INT64 v21;
__int64 v22;
__int64 v23;
char v24;
__int64 v25;
unsigned __int8 v26;
unsigned __int64 v27;
__int64 v28;
PVOID retaddr;
v7 = Irp;
v28 = 0i64;
v9 = a2;
if( Irp )
_InterlockedExchange64(Irp, 0i64);
Irp = 0i64;
if( !(_BYTE)a2 )
goto LABEL_21;
if( (unsigned __int8)(a2 - 2) > 1u )
return 3221225712i64;
v11 = 1;
if( !(_BYTE)PopCurrentBroadcast )
LABEL_21:
v11 = 0;
result = PopAllocateIrp(a1, a2, a2, (_BYTE)a2 != 0, a3, v11, a6, a4, a5, (__int64)&Irp, (__int64)&v28);
if( (int)result >= 0 && (_DWORD)result != 259 )
{
v15 = (IRP *)Irp;
if( Irp )
{
v16 = v28;
v17 = Irp + 23;
v18 = *((_QWORD *)Irp + 23);
v19 = PopRequestCompletion;
*(_QWORD *)(v18 - 16) = PopRequestCompletion;
*(_QWORD *)(v18 - 8) = v16;
*(_BYTE *)(v18 - 69) = -32;
if( v7 )
{
_InterlockedExchange64(v7, (__int64)v15);
v15 = (IRP *)Irp;
v16 = v28;
}
v20 = *v17;
if( v9 )
{
*(_DWORD *)(v20 - 56) = 1;
*(_DWORD *)(v20 - 48) = a3;
if( (_BYTE)PopCurrentBroadcast )
{
v21 = *(_QWORD *)(v16 + 200);
if( !v21 || (unsigned int)PopFxGetDeviceDStateReason(v21) == 1 )
{
*(_DWORD *)(v20 - 40) = PopMapInternalActionToIrpAction(
SDWORD2(PopCurrentBroadcast),
(_SYSTEM_POWER_STATE)(WORD2(PopCurrentBroadcast) >> 12),
1u);
*(_DWORD *)(v20 - 64) = DWORD1(PopCurrentBroadcast);
}
}
v22 = *(_QWORD *)(v16 + 200);
if( v22 && v9 == 2 )
{
if( (_InterlockedCompareExchange((volatile signed __int32 *)(v22 + 824), 0, 0) & 0x20) != 0 )
{
_m_prefetchw((const void *)(v22 + 32));
if( (_InterlockedOr((volatile signed __int32 *)(v22 + 32), 0) & 0x2000) != 0 )
{
KeAcquireSpinLockRaiseToDpc((UINT64 *)(v22 + 1152), (UINT64)v19);
*(_DWORD *)(v22 + 1180) |= 1u;
v27 = v26;
_InterlockedIncrement((volatile signed __int32 *)(v22 + 1160));
KxReleaseSpinLock((UINT64 *)(v22 + 1152));
__writecr8(v27);
}
}
v15 = (IRP *)Irp;
}
if( (*(_WORD *)(&PerfGlobalGroupMask + 2) & 0x8000) != 0 )
PopLogNotifyDevice((__int64)a1, 0i64, (__int64)v15);
PopQueueQuerySetIrp(v15);
}
else
{
v23 = *(_QWORD *)(v16 + 200);
if( v23 )
{
_m_prefetchw((const void *)(v23 + 32));
v24 = _InterlockedOr((volatile signed __int32 *)(v23 + 32), 0);
v25 = v28;
v24 &= 1u;
*(_BYTE *)(v28 + 208) = v24;
v24 ^= 1u;
*(_BYTE *)(v25 + 209) = v24;
v17 = *(volatile __int64 **)(v16 + 200);
if( v24 )
{
PopPepDeviceWaitWake(*((_QWORD *)v17 + 7), 0i64, v13, v14);
}
else
{
if( _InterlockedExchangeAdd((volatile signed __int32 *)v17 + 61, 0xFFFFFFFF) == 1 )
KeSetEvent((PRKEVENT)(v17 + 31), 0);
*(_QWORD *)(v16 + 200) = 0i64;
}
v15 = (IRP *)Irp;
}
*(_DWORD *)(v20 - 64) = a3;
PopDiagTraceIrpStart((IRP *)v17, v15);
IofCallDriverSpecifyReturn(*(DEVICE_OBJECT **)(v20 - 32), v15, retaddr);
}
return 259i64;
}
else
{
return 3221225626i64;
}
}
return result;
}Referenced by:
PoRequestPowerIrp
PopFxReleasePowerIrp
PopScanIdleList