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