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