IopQueryInformation

CHAR __stdcall IopQueryInformation(UINT64 P4){
  _DEVICE_OBJECT *v1; 
  INT64 v2; 
  __int64 v3; 
  INT64 v4; 
  _DEVICE_OBJECT *v5; 
  VOID *v7; 
  NTSTATUS v8; 
  NTSTATUS Open; 
  char v10; 
  _BYTE *v11; 
  _FAST_IO_DISPATCH *FastIoDispatch; 
  unsigned __int8(__fastcall *FastIoQueryOpen)(_IRP *, _FILE_NETWORK_OPEN_INFORMATION *, _DEVICE_OBJECT *); 
  INT64 a5; 
  UINT64 SupportedFeatures; 
  _BYTE *v17; 

  v4 = v2;
  v5 = v1;
  v7 = 0i64;
  LODWORD(SupportedFeatures) = 0;
  if( !*(_BYTE *)(P4 + 208) )
  {
    v11 = v17;
    *v17 = 0;
    v10 = 0;
    FastIoDispatch = v1->DriverObject->FastIoDispatch;
    if( FastIoDispatch )
    {
      if( FastIoDispatch->SizeOfFastIoDispatch > 0xC0 )
      {
        FastIoQueryOpen = FastIoDispatch->FastIoQueryOpen;
        if( FastIoQueryOpen )
        {
          --*(_BYTE *)(v2 + 67);
          *(_QWORD *)(v2 + 184) -= 72i64;
          *(_QWORD *)(v3 + 40) = v1;
          if( (MmVerifierData & 0x10) != 0 )
            v7 = VfFastIoSnapState();
          *v11 = FastIoQueryOpen((_IRP *)v4, *(_FILE_NETWORK_OPEN_INFORMATION **)(P4 + 104), v5);
          if( v7 )
            VfFastIoCheckState(v7, FastIoQueryOpen);
          *(_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(v1, &SupportedFeatures);
  if( v8 >= 0 )
  {
    if( (SupportedFeatures & 4) == 0 )
    {
      *v17 = 0;
      LOBYTE(v8) = 0;
      return v8;
    }
    --*(_BYTE *)(v4 + 67);
    *(_QWORD *)(v4 + 184) -= 72i64;
    LODWORD(a5) = *(_DWORD *)(P4 + 200);
    Open = FsRtlQueryOpen(v5, v4, *(_QWORD *)(P4 + 112), P4 + 204, a5);
    v10 = Open;
    ++*(_BYTE *)(v4 + 67);
    *(_QWORD *)(v4 + 184) += 72i64;
    *(_QWORD *)(P4 + 168) = *(_QWORD *)(v4 + 112);
    if( Open < 0 )
    {
      if( Open == -1071906812 )
      {
        v10 = 0;
        *v17 = 0;
      }
    }
    else
    {
      *(_DWORD *)(P4 + 32) = -1096154543;
      *v17 = 1;
    }
LABEL_20:
    LOBYTE(v8) = v10;
  }
  return v8;
}

Referenced by:

IopParseDevice