PopFxReleasePowerIrp
__int64 __fastcall PopFxReleasePowerIrp(__int64 a1){
unsigned __int64 v2;
_DEVICE_OBJECT *v3;
__int64 v4;
__int64 v5;
int v6;
signed __int32 v7;
signed __int32 v8;
char v9;
__int64 v10;
__int64 result;
signed __int32 v12;
signed __int32 v13;
v2 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(*(_QWORD *)(a1 + 48) + 88i64));
_InterlockedAnd((volatile signed __int32 *)(a1 + 32), 0xFFFFFFEF);
v3 = *(_DEVICE_OBJECT **)(a1 + 512);
v4 = *(_QWORD *)(a1 + 536);
v5 = *(_QWORD *)(a1 + 552);
v6 = *(_DWORD *)(a1 + 528);
_m_prefetchw((const void *)(a1 + 32));
v7 = *(_DWORD *)(a1 + 32);
do
{
v8 = v7;
v7 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 32), v7, v7);
}
while( v8 != v7 );
if( (v7 & 0x20) != 0 )
{
v9 = 1;
_m_prefetchw((const void *)(a1 + 32));
v12 = *(_DWORD *)(a1 + 32);
do
{
v13 = v12;
v12 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 32), v12, v12);
}
while( v13 != v12 );
if( (v12 & 0x100) != 0 )
{
v3 = *(_DEVICE_OBJECT **)(a1 + 520);
v4 = *(_QWORD *)(a1 + 544);
v5 = *(_QWORD *)(a1 + 560);
v6 = *(_DWORD *)(a1 + 532);
}
}
else
{
v9 = 0;
KeSetEvent((PRKEVENT)(a1 + 568), 0);
if( _InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 244), 0xFFFFFFFF) == 1 )
KeSetEvent((PRKEVENT)(a1 + 248), 0);
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(*(_QWORD *)(a1 + 48) + 88i64));
result = (unsigned int)KiIrqlFlags;
__writecr8(v2);
if( v9 )
{
LOBYTE(v10) = 2;
return PopRequestPowerIrp(v3, v10, v6, v4, v5, 1, 0i64);
}
return result;
}Referenced by:
No references.