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