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.