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