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