RawQueryFileSystemInformation
NTSTATUS __stdcall RawQueryFileSystemInformation(_IRP *Irp, _IO_STACK_LOCATION *IrpSp, _VCB *Vcb){
size_t SecurityContext;
int Status;
_IRP *MasterIrp;
_DEVICE_OBJECT *v8;
VOID *v9;
UINT64 v10;
size_t v11;
VOID **PoolWithTag;
__int64 v13;
_IRP *v14;
size_t v15;
int v16;
_KEVENT *Event;
UINT8 IoStatusBlock;
UINT8 ReturnAddress;
_IO_STATUS_BLOCK *v21;
__int128 Object;
__int64 v23;
_IO_STATUS_BLOCK v24;
_LARGE_INTEGER Timeout[2];
UINT64 NumberOfBytes;
VOID *retaddr;
v23 = 0i64;
NumberOfBytes = 0i64;
SecurityContext = (size_t)IrpSp->Parameters.SecurityContext;
Object = 0i64;
v24 = 0i64;
*(_OWORD *)&Timeout[0].anonymous_0.LowPart = 0i64;
if( SecurityContext < 9 )
return -1073741789;
MasterIrp = Irp->AssociatedIrp.MasterIrp;
memset(MasterIrp, 0i64, SecurityContext);
Status = RawPerformDevIoCtrl(
v8,
*((VOID **)Vcb + 22),
v9,
v10,
Timeout,
(UINT64)Event,
IoStatusBlock,
ReturnAddress,
v21);
if( Status >= 0 )
{
v11 = HIDWORD(NumberOfBytes);
if( HIDWORD(NumberOfBytes) >= 0x18 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, HIDWORD(NumberOfBytes), 1649885522i64);
v13 = (__int64)PoolWithTag;
if( PoolWithTag )
{
memset(PoolWithTag, 0i64, v11);
KeInitializeEvent((INT64)&Object, 0, 0);
v14 = IopBuildSynchronousFsdRequest(
3ui64,
*((_DEVICE_OBJECT **)Vcb + 22),
(VOID *)v13,
v11,
0i64,
(_KEVENT *)&Object,
&v24,
retaddr);
if( v14 )
{
v14->Tail.CurrentStackLocation[-1].Flags |= 2u;
Status = IofCallDriver(*((_QWORD *)Vcb + 22), (UINT64)v14);
if( Status == 259 )
{
KeWaitForSingleObject((UINT64)&Object, 0, 0, 0, 0i64);
Status = v24.Status;
}
if( Status >= 0 )
{
if( *(_DWORD *)(v13 + 16) == 1397904198
&& (v15 = *(unsigned __int16 *)(v13 + 20), v15 <= v11)
&& (unsigned __int16)v15 >= 0x18u
&& (unsigned __int16)RawComputeFileSystemInformationChecksum(v13) == *(_WORD *)(v13 + 22) )
{
if( *(_BYTE *)(v13 + 3) == 82
&& *(_BYTE *)(v13 + 4) == 101
&& *(_BYTE *)(v13 + 5) == 70
&& *(_BYTE *)(v13 + 6) == 83 )
{
v16 = Status;
if( !*(_BYTE *)(v13 + 7) )
v16 = -1073741637;
Status = v16;
}
*(_QWORD *)&MasterIrp->Type = *(_QWORD *)(v13 + 3);
Irp->IoStatus.Information = 9i64;
}
else
{
Status = -1073741637;
}
}
}
else
{
Status = -1073741670;
}
ExFreePoolWithTag((PVOID)v13, 0);
}
else
{
return -1073741670;
}
}
else
{
return -1073741637;
}
}
return Status;
}Referenced by:
RawUserFsCtrl