SmKmIssueVolumeIo

__int64 __fastcall SmKmIssueVolumeIo(
        __int64 a1,
        __int64 a2,
        _QWORD *a3,
        int (__fastcall *a4)(_DEVICE_OBJECT *, _IRP *, void *),
        void *a5){
  UINT64 v5; 
  __int64 v9; 
  UINT64 Irp; 
  _MDL *v12; 
  __int64 v13; 
  int v14; 
  unsigned __int64 v15; 
  __int64 v16; 
  int v17; 
  __int64 v18; 
  __int64 v19; 

  v5 = *(_QWORD *)(a1 + 24);
  v9 = a1;
  if( (*(_QWORD *)a2 & 1) != 0 )
  {
    v12 = *(_MDL **)(a2 + 8);
    Irp = *(_QWORD *)a2 & 0xFFFFFFFFFFFFFFFEui64;
  }
  else
  {
    LOBYTE(a1) = *(_BYTE *)(v5 + 76);
    Irp = (UINT64)IoAllocateIrp(a1, 0);
    if( !Irp )
      return 3221225626i64;
    v12 = *(_MDL **)a2;
    v13 = *(unsigned int *)(a2 + 16);
    v14 = *(_QWORD *)(a2 + 8);
    v15 = *(_QWORD *)(a2 + 8) & 0xFFFFFFFFFFFFF000ui64;
    v16 = *(_QWORD *)(a2 + 8) & 0xFFFi64;
    v12->Next = 0i64;
    v12->MdlFlags = 0;
    v12->StartVa = (void *)v15;
    v12->ByteOffset = v14 & 0xFFF;
    v12->ByteCount = v13;
    v12->Size = 8 * (((unsigned __int64)(v16 + v13 + 4095) >> 12) + 6);
    MmBuildMdlForNonPagedPool(v12);
    MmMdlPageContentsState(v12, MmMdlPageContentsInvariant);
  }
  v17 = *(_DWORD *)(a2 + 16);
  *(_QWORD *)(Irp + 8) = v12;
  v18 = *(_QWORD *)(Irp + 184);
  *(_QWORD *)(Irp + 152) = KeGetCurrentThread();
  *(_QWORD *)(Irp + 72) = Irp + 48;
  *(_BYTE *)(Irp + 64) = 0;
  *(_QWORD *)(Irp + 192) = *(_QWORD *)(v9 + 8);
  *(_BYTE *)(v18 - 72) = 4 - ((*(_DWORD *)(a2 + 32) & 1) != 0);
  *(_QWORD *)(v18 - 48) = *a3;
  *(_DWORD *)(v18 - 64) = v17;
  *(_DWORD *)(v18 - 56) = 1397572723;
  v19 = *(_QWORD *)(Irp + 184);
  *(_QWORD *)(v19 - 16) = a4;
  *(_QWORD *)(v19 - 8) = a5;
  *(_BYTE *)(v19 - 69) = -32;
  IofCallDriver(v5, Irp);
  return 259i64;
}

Referenced by:

SmKmIssueIo