IopQueryResourceHandlerInterface

__int64 __fastcall IopQueryResourceHandlerInterface(int a1, __int64 a2, unsigned __int8 a3, _QWORD *a4){
  __int64 v4; 
  __int64 v6; 
  int v9; 
  GUID v10; 
  unsigned __int16 v11; 
  _QWORD *PoolWithTag; 
  _QWORD *v13; 
  NTSTATUS v14; 
  int v16; 
  int v17; 
  int v18; 
  bool v19; 
  INT64 result[2]; 
  unsigned __int16 v21; 
  __int16 v22; 
  _QWORD *v23; 
  __int64 v24; 
  GUID v25; 
  v4 = *(_QWORD *)(a2 + 312);
  v6 = a3;
  v25 = 0i64;
  if( *(_QWORD *)(*(_QWORD *)(v4 + 40) + 432i64) == *(_QWORD *)(a2 + 8) || (*(_DWORD *)(a2 + 48) & 0x1000) == 0 )
    return 3221225659i64;
  v9 = a1 - 1;
  if( v9 )
  {
    v16 = v9 - 1;
    if( v16 )
    {
      if( v16 != 1 )
        return 3221225485i64;
      v10 = GUID_LEGACY_DEVICE_DETECTION_STANDARD;
      v11 = 40;
    }
    else
    {
      v10 = GUID_ARBITER_INTERFACE_STANDARD;
      v11 = 48;
    }
  }
  else
  {
    v10 = GUID_TRANSLATOR_INTERFACE_STANDARD;
    v11 = 52;
  }
  v25 = v10;
  PoolWithTag = ExAllocatePoolWithTag(PagedPool, v11, 0x20207050ui64);
  v13 = PoolWithTag;
  if( PoolWithTag )
  {
    memset((INT64)PoolWithTag, 0i64);
    *(_WORD *)v13 = v11;
    memset((INT64)result, 0i64);
    LOWORD(result[0]) = 2075;
    v21 = v11;
    result[1] = (INT64)&v25;
    *((_WORD *)v13 + 1) = 0;
    v22 = 0;
    v23 = v13;
    v24 = v6;
    v14 = IopSynchronousCall((DEVICE_OBJECT *)a2, (IO_STACK_LOCATION *)result, 3221225659i64, 0i64, 0i64);
    if( v14 < 0 )
      goto LABEL_7;
    v17 = a1 - 1;
    if( v17 )
    {
      v18 = v17 - 1;
      if( v18 && v18 != 1 )
      {
        v14 = -1073741811;
        goto LABEL_7;
      }
      v19 = v13[4] == 0i64;
    }
    else
    {
      if( !v13[4] )
      {
LABEL_21:
        v14 = -1073741823;
LABEL_15:
        if( v14 >= 0 )
        {
          *a4 = v13;
          return(unsigned int)v14;
        }
LABEL_7:
        ExFreePoolWithTag(v13, 0);
        return(unsigned int)v14;
      }
      v19 = v13[5] == 0i64;
    }
    if( !v19 )
      goto LABEL_15;
    goto LABEL_21;
  }
  return 3221225626i64;
}

Referenced by:

IoTranslateBusAddress
IopDuplicateDetection
IopSetupArbiterAndTranslators