FsRtlQueryCachedVdl
NTSTATUS __stdcall FsRtlQueryCachedVdl(_FILE_OBJECT *FileObject, INT64 *Vdl){
_DEVICE_OBJECT *v4;
UINT64 v5;
PIRP *v6;
UINT64 v7;
PIRP v8;
NTSTATUS Status;
int *v10;
__int64 v11;
__int128 Object;
__int64 v14;
_IO_STATUS_BLOCK IoStatusBlock;
__m128i si128;
int v17;
v14 = 0i64;
Object = 0i64;
IoStatusBlock = 0i64;
KeInitializeEvent((INT64)&Object, 0, 0);
LODWORD(v4) = IoGetRelatedDeviceObject((INT64)FileObject);
v5 = (UINT64)v4;
v6 = IoBuildDeviceIoControlRequest(0x90284u, v4, 0i64, 0, 0i64, 0, 0, (PKEVENT)&Object, &IoStatusBlock);
v7 = (UINT64)v6;
if( !v6 )
return -1073741670;
si128 = _mm_load_si128((const __m128i *)&_xmm);
v17 = 1;
v6[3] = (PIRP)&si128;
v8 = v6[23];
v8[-1].Tail.CurrentStackLocation = (_IO_STACK_LOCATION *)FileObject;
LOBYTE(v8[-1].Tail.DriverContext[2]) = 13;
LODWORD(v8[-1].Tail.Thread) = 24;
LODWORD(v8[-1].Tail.DriverContext[3]) = 64;
Status = IofCallDriver(v5, v7);
if( Status == 259 )
{
KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
Status = IoStatusBlock.Status;
}
if( (Status & 0xC0000000) != -1073741824 )
{
*Vdl = 0i64;
if( si128.m128i_i32[2] )
{
v10 = &v17;
v11 = si128.m128i_u32[2];
do
{
if( (v10[4] & 1) != 0 )
*Vdl = *(_QWORD *)v10 + *((_QWORD *)v10 + 1);
v10 += 6;
--v11;
}
while( v11 );
}
}
return Status;
}Referenced by:
No references.