IopBuildAsynchronousFsdRequest

VOID __fastcall IopBuildAsynchronousFsdRequest(
        UINT64 MajorFunction,
        _DEVICE_OBJECT *DeviceObject,
        VOID *Buffer,
        UINT64 Length,
        _LARGE_INTEGER *StartingOffset,
        _IO_STATUS_BLOCK *IoStatusBlock,
        VOID *ReturnAddress){
  UINT64 v7; 
  unsigned int v10; 
  IRP *Irp; 
  __int64 v12; 
  int v13; 
  int v14; 
  unsigned int v15; 
  INT64 v16; 
  _MDL *Mdl; 
  CHAR *Pool_1; 
  int v19; 
  INT64 a5; 
  int v21; 
  v21 = Length;
  v7 = (unsigned int)Length;
  v10 = MajorFunction;
  Irp = IopAllocateIrpExReturn(DeviceObject, *((_BYTE *)DeviceObject + 76), 0, ReturnAddress);
  if( Irp )
  {
    *((_QWORD *)Irp + 19) = KeGetCurrentThread();
    v12 = *((_QWORD *)Irp + 23);
    *(_BYTE *)(v12 - 72) = v10;
    if( v10 <= 0x1B )
    {
      v13 = 138478080;
      if( _bittest(&v13, v10) )
      {
LABEL_4:
        *((_DWORD *)Irp + 4) = *((_DWORD *)Irp + 4) & 0xFFF1FFFF | (((unsigned int)PsGetIoPriorityThread(*((_QWORD *)Irp + 19))
                                                                   + 1) << 17);
        *((_QWORD *)Irp + 9) = IoStatusBlock;
        return;
      }
    }
    v14 = *((_DWORD *)DeviceObject + 12);
    if( (v14 & 4) != 0 )
    {
      Pool_1 = IopVerifierExAllocatePool_1(NonPagedPoolNxCacheAligned, v7);
      *((_QWORD *)Irp + 3) = Pool_1;
      if( Pool_1 )
      {
        if( v10 == 4 )
        {
          memmove((UINT8 *)Pool_1, (UINT8 *)Buffer, v7);
          v19 = 48;
        }
        else
        {
          *((_QWORD *)Irp + 14) = Buffer;
          v19 = 112;
        }
        *((_DWORD *)Irp + 4) = v19;
        LODWORD(v7) = v21;
        goto LABEL_8;
      }
    }
    else
    {
      if( (v14 & 0x10) == 0 )
      {
        *((_QWORD *)Irp + 14) = Buffer;
LABEL_8:
        *(_DWORD *)(v12 - 64) = v7;
        if( StartingOffset )
          *(_LARGE_INTEGER *)(v12 - 48) = *StartingOffset;
        v15 = *((_DWORD *)DeviceObject + 18);
        if( v15 >= 7 && (v15 <= 9 || v15 == 36) )
          IoSetDiskIoAttributionFromThread(Irp, *((_ETHREAD **)Irp + 19));
        goto LABEL_4;
      }
      Mdl = IoAllocateMdl(Buffer, v7, 0, 0, 0i64);
      *((_QWORD *)Irp + 1) = Mdl;
      if( Mdl )
      {
        LODWORD(a5) = *(unsigned __int8 *)(v12 - 72);
        IopProbeAndLockPages(Mdl, v16, v10 == 3, DeviceObject, a5);
        goto LABEL_8;
      }
    }
    IoFreeIrp(Irp);
  }
}

Referenced by:

IoBuildAsynchronousFsdRequest
IopBuildSynchronousFsdRequest