IopQueryInformation
CHAR __fastcall IopQueryInformation(UINT64 P4){
__int64 v1;
INT64 v2;
__int64 v3;
INT64 v4;
_DEVICE_OBJECT *v5;
void *v7;
NTSTATUS v8;
int Open;
char v10;
_BYTE *v11;
__int64 v12;
__int64(__fastcall *v13)(INT64, _QWORD, _DEVICE_OBJECT *);
UINT64 SupportedFeatures;
_BYTE *v16;
v4 = v2;
v5 = (_DEVICE_OBJECT *)v1;
v7 = 0i64;
LODWORD(SupportedFeatures) = 0;
if( !*(_BYTE *)(P4 + 208) )
{
v11 = v16;
*v16 = 0;
v10 = 0;
v12 = *(_QWORD *)(*(_QWORD *)(v1 + 8) + 80i64);
if( v12 )
{
if( *(_DWORD *)v12 > 0xC0u )
{
v13 = *(__int64(__fastcall **)(INT64, _QWORD, _DEVICE_OBJECT *))(v12 + 192);
if( v13 )
{
--*(_BYTE *)(v2 + 67);
*(_QWORD *)(v2 + 184) -= 72i64;
*(_QWORD *)(v3 + 40) = v1;
if( (MmVerifierData & 0x10) != 0 )
v7 = VfFastIoSnapState();
*v11 = v13(v4, *(_QWORD *)(P4 + 104), v5);
if( v7 )
VfFastIoCheckState(v7, v13);
*(_QWORD *)(P4 + 168) = *(_QWORD *)(v4 + 112);
if( *v11 )
{
*(_DWORD *)(P4 + 32) = -1096154543;
if( !*(_BYTE *)(P4 + 139) )
{
**(_QWORD **)(P4 + 96) = **(_QWORD **)(P4 + 104);
*(_QWORD *)(*(_QWORD *)(P4 + 96) + 8i64) = *(_QWORD *)(*(_QWORD *)(P4 + 104) + 8i64);
*(_QWORD *)(*(_QWORD *)(P4 + 96) + 16i64) = *(_QWORD *)(*(_QWORD *)(P4 + 104) + 16i64);
*(_QWORD *)(*(_QWORD *)(P4 + 96) + 24i64) = *(_QWORD *)(*(_QWORD *)(P4 + 104) + 24i64);
*(_DWORD *)(*(_QWORD *)(P4 + 96) + 32i64) = *(_DWORD *)(*(_QWORD *)(P4 + 104) + 48i64);
}
}
else
{
*(_QWORD *)(v4 + 184) += 72i64;
++*(_BYTE *)(v4 + 67);
}
}
}
}
goto LABEL_20;
}
v8 = FsRtlGetSupportedFeatures((DEVICE_OBJECT *)v1, &SupportedFeatures);
if( v8 >= 0 )
{
if( (SupportedFeatures & 4) == 0 )
{
*v16 = 0;
LOBYTE(v8) = 0;
return v8;
}
--*(_BYTE *)(v4 + 67);
*(_QWORD *)(v4 + 184) -= 72i64;
Open = FsRtlQueryOpen(v5, v4);
v10 = Open;
++*(_BYTE *)(v4 + 67);
*(_QWORD *)(v4 + 184) += 72i64;
*(_QWORD *)(P4 + 168) = *(_QWORD *)(v4 + 112);
if( Open < 0 )
{
if( Open == -1071906812 )
{
v10 = 0;
*v16 = 0;
}
}
else
{
*(_DWORD *)(P4 + 32) = -1096154543;
*v16 = 1;
}
LABEL_20:
LOBYTE(v8) = v10;
}
return v8;
}Referenced by:
IopParseDevice