IopValidateQueryInformationParameters
NTSTATUS __stdcall IopValidateQueryInformationParameters(
CHAR a1,
INT64 a2,
UINT64 a3,
UINT64 a4,
UINT64 Length,
INT64 a6){
unsigned int v6;
__int64 v7;
UINT64 v9;
unsigned __int64 v10;
__int16 v11;
if( !a1 )
return 0;
if( (unsigned int)a6 >= 0x4C )
return -1073741821;
v6 = *((unsigned __int8 *)IopQueryOperationLength + (int)a6);
if( !(_BYTE)v6 )
return -1073741821;
if( (unsigned int)Length >= v6 )
{
if( a3 >= 0x7FFFFFFF0000i64 )
a3 = 0x7FFFFFFF0000i64;
*(_DWORD *)a3 = *(_DWORD *)a3;
v7 = *(_QWORD *)(*(_QWORD *)(a2 + 184) + 1408i64);
if( v7 && ((v11 = *(_WORD *)(v7 + 8), v11 == 332) || v11 == 452) )
{
ProbeForWrite(a4, (unsigned int)Length, 4i64);
}
else if( (_DWORD)Length )
{
if( ((*((unsigned __int8 *)IopQuerySetAlignmentRequirement + (int)a6) - 1) & (unsigned int)a4) != 0 )
ExRaiseDatatypeMisalignment();
v9 = (unsigned int)Length + a4 - 1;
if( a4 > v9 || v9 >= 0x7FFFFFFF0000i64 )
ExRaiseAccessViolation();
v10 = (v9 & 0xFFFFFFFFFFFFF000ui64) + 4096;
do
{
*(_BYTE *)a4 = *(_BYTE *)a4;
a4 = (a4 & 0xFFFFFFFFFFFFF000ui64) + 4096;
}
while( a4 != v10 );
}
return 0;
}
return -1073741820;
}Referenced by:
IoQueryInformationByName
NtQueryInformationFile