SmKmIssueVolumeIo

INT64 __fastcall SmKmIssueVolumeIo(INT64 a1, INT64 a2, _QWORD *a3, INT64 a4, INT64 a5){
  __int64 v5; 
  unsigned __int64 Irp; 
  _MDL *v12; 
  __int64 v13; 
  int v14; 
  unsigned __int64 v15; 
  __int64 v16; 
  UINT64 v17; 
  _MMPTE *v18; 
  int v19; 
  __int64 v20; 
  __int64 v21; 
  UINT64 v22; 
  _MMPFN **v23; 
  v5 = *(_QWORD *)(a1 + 24);
  if( (*(_QWORD *)a2 & 1) != 0 )
  {
    v12 = *(_MDL **)(a2 + 8);
    Irp = *(_QWORD *)a2 & 0xFFFFFFFFFFFFFFFEui64;
  }
  else
  {
    Irp = (unsigned __int64)IoAllocateIrp(*(_BYTE *)(v5 + 76), 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((_MMPFN *)v12, (_MMPTE *)1, v17, v18, v22, v23);
  }
  v19 = *(_DWORD *)(a2 + 16);
  *(_QWORD *)(Irp + 8) = v12;
  v20 = *(_QWORD *)(Irp + 184);
  *(_QWORD *)(Irp + 152) = KeGetCurrentThread();
  *(_QWORD *)(Irp + 72) = Irp + 48;
  *(_BYTE *)(Irp + 64) = 0;
  *(_QWORD *)(Irp + 192) = *(_QWORD *)(a1 + 8);
  *(_BYTE *)(v20 - 72) = 4 - ((*(_DWORD *)(a2 + 32) & 1) != 0);
  *(_QWORD *)(v20 - 48) = *a3;
  *(_DWORD *)(v20 - 64) = v19;
  *(_DWORD *)(v20 - 56) = 1397572723;
  v21 = *(_QWORD *)(Irp + 184);
  *(_QWORD *)(v21 - 16) = a4;
  *(_QWORD *)(v21 - 8) = a5;
  *(_BYTE *)(v21 - 69) = -32;
  IofCallDriver((PDEVICE_OBJECT)v5, (PIRP)Irp);
  return 259i64;
}

Referenced by:

SmKmIssueIo