IovAllocateIrp

_IRP *__stdcall IovAllocateIrp(_DEVICE_OBJECT *DeviceObject, INT8 StackSize, UINT8 ChargeQuota, VOID *ReturnAddress){
  unsigned int v5; 
  _IOV_IRP_TRACE *v8; 
  __int64 v9; 
  __int64 v10; 
  _IOV_IRP_TRACE *v11; 
  void **StackTrace; 
  INT8 v13; 
  _IRP *v14; 
  _IOV_REQUEST_PACKET *LockedPacket; 
  _IRP *Irp; 
  _IO_STACK_LOCATION *v17; 

  v5 = ChargeQuota;
  v8 = IovpLogStackTrace(0i64);
  v11 = v8;
  if( v8 )
    StackTrace = v8->StackTrace;
  else
    StackTrace = 0i64;
  v13 = StackSize + 1;
  v14 = 0i64;
  if( !VfIoDisabled )
  {
    LockedPacket = ViIrpAllocateLockedPacket(v13, v5, ReturnAddress);
    if( LockedPacket )
    {
      v14 = *(_IRP **)LockedPacket;
      if( StackTrace )
      {
        *(_OWORD *)(LockedPacket + 30) = *(_OWORD *)StackTrace;
        *(_OWORD *)(LockedPacket + 34) = *((_OWORD *)StackTrace + 1);
        *(_OWORD *)(LockedPacket + 38) = *((_OWORD *)StackTrace + 2);
        *(_OWORD *)(LockedPacket + 42) = *((_OWORD *)StackTrace + 3);
      }
      else
      {
        *((_QWORD *)LockedPacket + 15) = 0i64;
      }
      VfIrpDatabaseEntryReleaseLock(LockedPacket);
    }
  }
  if( !v14 )
  {
    LOBYTE(v10) = v5;
    LOBYTE(v9) = v13;
    Irp = (_IRP *)pXdvIoAllocateIrp((int)DeviceObject, v9, v10, (int)ReturnAddress, (__int64)IopAllocateIrpPrivate);
    v14 = Irp;
    if( Irp )
      VfIoAllocateIrp2(Irp, StackTrace);
  }
  if( v11 )
    v11->Irp = v14;
  if( v14 )
  {
    v17 = --v14->Tail.CurrentStackLocation;
    --v14->CurrentLocation;
    --v14->StackCount;
    v14->Tail.IrpExtension = v17;
    if( IopIsActivityTracingEnabled() )
      IopInitActivityIdIrp(v14);
  }
  return v14;
}

Referenced by:

IoAllocateIrp
IoAllocateIrpEx
IopAllocateIrpExReturn