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