PopFxAllocatePowerIrp
NTSTATUS __stdcall PopFxAllocatePowerIrp(
INT64 a1,
INT64 a2,
INT64 a3,
INT64 a4,
INT64 a5,
CHAR a6,
INT64 a7,
PEX_SPIN_LOCK SpinLock){
int v10;
unsigned __int8 v11;
__int64 v12;
unsigned __int64 v13;
int v14;
signed __int32 v16;
char v17;
unsigned int v18;
signed __int32 v19;
unsigned int v20;
UINT64 RemlockSize;
INT64 *SpinLocka;
SpinLocka = (INT64 *)(a1 + 88);
v10 = a3;
*(_QWORD *)SpinLock = 0i64;
*(_QWORD *)a7 = 0i64;
v11 = ExAcquireSpinLockExclusive((INT64 *)(a1 + 88));
v12 = *(_QWORD *)(a1 + 80);
v13 = v11;
if( !v12 )
{
v14 = -1073741130;
goto LABEL_3;
}
if( a6 )
{
v14 = 0;
}
else
{
LODWORD(RemlockSize) = 32;
v14 = IoAcquireRemoveLockEx((_IO_REMOVE_LOCK *)(v12 + 240), 0i64, (CHAR *)&File, 1ui64, RemlockSize);
if( v14 < 0 )
goto LABEL_3;
}
_m_prefetchw((const void *)(v12 + 32));
v16 = _InterlockedOr((volatile signed __int32 *)(v12 + 32), 0) & 0x10;
_m_prefetchw((const void *)(v12 + 32));
v17 = _InterlockedOr((volatile signed __int32 *)(v12 + 32), 0);
if( v16 )
{
if( (v17 & 0x20) != 0
&& (_m_prefetchw((const void *)(v12 + 32)),
v18 = ((unsigned int)_InterlockedOr((volatile signed __int32 *)(v12 + 32), 0) >> 8) & 1,
_m_prefetchw((const void *)(v12 + 32)),
v18 == (((unsigned int)_InterlockedOr((volatile signed __int32 *)(v12 + 32), 0) >> 9) & 1)) )
{
v14 = -1073741670;
}
else
{
_m_prefetchw((const void *)(v12 + 32));
v19 = _InterlockedOr((volatile signed __int32 *)(v12 + 32), 0) & 0x200;
_InterlockedOr((volatile signed __int32 *)(v12 + 32), 0x20u);
_InterlockedXor((volatile signed __int32 *)(v12 + 32), 0x200u);
v14 = 259;
*(_QWORD *)((v19 != 0 ? 520i64 : 512i64) + v12) = a2;
*(_DWORD *)((v19 != 0 ? 4 : 0) + v12 + 528) = v10;
*(_QWORD *)((v19 != 0 ? 8 : 0) + v12 + 536) = a4;
*(_QWORD *)((v19 != 0 ? 8 : 0) + v12 + 552) = a5;
}
}
else if( (v17 & 0x10) == 0 )
{
_m_prefetchw((const void *)(v12 + 32));
if( (_InterlockedOr((volatile signed __int32 *)(v12 + 32), 0) & 0x20) != 0 )
{
if( a6 )
{
_InterlockedOr((volatile signed __int32 *)(v12 + 32), 0);
_InterlockedXor((volatile signed __int32 *)(v12 + 32), 0x100u);
_m_prefetchw((const void *)(v12 + 32));
v20 = ((unsigned int)_InterlockedOr((volatile signed __int32 *)(v12 + 32), 0) >> 8) & 1;
_m_prefetchw((const void *)(v12 + 32));
if( v20 == (((unsigned int)_InterlockedOr((volatile signed __int32 *)(v12 + 32), 0) >> 9) & 1) )
_InterlockedAnd((volatile signed __int32 *)(v12 + 32), 0xFFFFFFDF);
_InterlockedOr((volatile signed __int32 *)(v12 + 32), 0x10u);
v14 = 0;
*(_QWORD *)a7 = *(_QWORD *)(v12 + 16);
*(_QWORD *)SpinLock = *(_QWORD *)(v12 + 24);
}
else
{
v14 = -1073741670;
}
if( _InterlockedExchangeAdd((volatile signed __int32 *)(v12 + 244), 0xFFFFFFFF) == 1 )
KeSetEvent((PRKEVENT)(v12 + 248), 0, 0);
}
else
{
_InterlockedOr((volatile signed __int32 *)(v12 + 32), 0x10u);
KeResetEvent((_KEVENT *)(v12 + 568));
v14 = 0;
*(_QWORD *)a7 = *(_QWORD *)(v12 + 16);
*(_QWORD *)SpinLock = *(_QWORD *)(v12 + 24);
}
}
LABEL_3:
ExReleaseSpinLockExclusiveFromDpcLevel(SpinLocka);
__writecr8(v13);
if( v12 )
PopFxAddLogEntry(*(_QWORD *)(v12 + 48), 0, 21, v14);
return v14;
}Referenced by:
PopAllocateIrp