struct
_IO_STATUS_BLOCK IoStatusBlock;
PMDL MemoryDescriptorList;
PIRP Irp;
PDEVICE_OBJECT DeviceObject;
NTSTATUS v9;
struct
_KEVENT Event;
ULONG
*v11;
__int64
v12;
_MDL *v13;
unsigned
int
v14;
_FILE_OBJECT *FileObject;
PVOID
VirtualAddress;
ULONG
Length;
int
v18;
v18 = a4;
Length = a3;
VirtualAddress = a2;
FileObject = a1;
MemoryDescriptorList = 0i64;
DeviceObject = IoGetRelatedDeviceObject(a1);
KeInitializeEvent(&Event, 0, 0);
Irp = IoBuildDeviceIoControlRequest(3u, DeviceObject, 0i64, 0, 0i64, 0, 1u, &Event, &IoStatusBlock);
if
( !Irp )
return
3221225626i64;
if
( Length )
{
MemoryDescriptorList = IoAllocateMdl(VirtualAddress, Length, 0, 0, 0i64);
if
( !MemoryDescriptorList )
{
IoFreeIrp(Irp);
return
3221225626i64;
}
MmProbeAndLockPages(MemoryDescriptorList, 0, 0);
v9 = 0;
}
sub_16320((
__int64
)Irp, 0i64, 0i64, 0, 0, 0);
v12 = sub_162C0((
__int64
)Irp);
*(_BYTE *)v12 = 15;
*(_BYTE *)(v12 + 1) = 7;
*(_QWORD *)(v12 + 40) = DeviceObject;
*(_QWORD *)(v12 + 48) = FileObject;
v11 = (
ULONG
*)(v12 + 8);
*(_DWORD *)(v12 + 12) = v18;
*v11 = Length;
if
( Length )
v13 = MemoryDescriptorList;
else
v13 = 0i64;
Irp->MdlAddress = v13;
v9 = IofCallDriver(DeviceObject, Irp);
if
( v9 == 259 )
{
KeWaitForSingleObject(&Event, 0, 0, 0, 0i64);
v9 = IoStatusBlock.Status;
}
if
( v9 < 0 )
v14 = v9;
else
v14 = IoStatusBlock.Information;
return
v14;