IopQueryConflictListInternal
__int64 __fastcall IopQueryConflictListInternal(
_DEVICE_OBJECT *PhysicalDeviceObject,
__int64 a2,
__int64 a3,
_DWORD *a4,
unsigned int a5){
_DWORD *DeviceNode;
int ConflictFillConflicts;
int v10;
__int64 v11;
int v12;
int v13;
VOID **v14;
VOID **v15;
__int64 v16;
__int64 v17;
_PI_RESOURCE_ARBITER_ENTRY *v18;
__int64 v19;
char v20;
NTSTATUS v21;
unsigned int v23;
PVOID P;
VOID *ResReqList;
PNP_RESOURCE_REQUEST Request[16];
__int128 Input1;
__int128 v28;
v23 = 0;
P = 0i64;
Input1 = 0i64;
v28 = 0i64;
memset(Request, 0i64, sizeof(Request));
ResReqList = 0i64;
a4[2] = 0;
a4[3] = 0;
a4[4] = 32;
if( PhysicalDeviceObject )
DeviceNode = PhysicalDeviceObject->DeviceObjectExtension->DeviceNode;
else
DeviceNode = 0i64;
if( !DeviceNode )
return(unsigned int)-1073741810;
if( *(_BYTE *)(a2 + 20) == 1 )
goto LABEL_12;
if( *(_BYTE *)(a2 + 20) != 2 )
{
if( *(_BYTE *)(a2 + 20) == 3 )
{
LABEL_12:
if( !*(_DWORD *)(a2 + 32) )
return 0;
goto LABEL_14;
}
if( *(_BYTE *)(a2 + 20) != 4 )
{
if( *(_BYTE *)(a2 + 20) != 7 )
return(unsigned int)-1073741811;
goto LABEL_12;
}
}
LABEL_14:
v10 = DeviceNode[114];
v11 = *((_QWORD *)DeviceNode + 55);
if( v10 == -1 )
{
if( !v11 || (v10 = *(_DWORD *)(v11 + 4), v10 == -1) )
v10 = 1;
}
v12 = v10;
if( v10 == 8 )
v12 = 1;
*(_DWORD *)(a2 + 4) = v12;
v13 = DeviceNode[115];
if( v13 == -1 )
{
if( !v11 || (v13 = *(_DWORD *)(v11 + 8), v13 == -1) )
v13 = 0;
}
*(_DWORD *)(a2 + 8) = v13;
v14 = PnpCmResourcesToIoResources(0xFFFFFFFFi64, (_DWORD *)a2, 0);
v15 = v14;
if( v14 )
{
Request[3] = -1;
*(_QWORD *)Request = PhysicalDeviceObject;
*(_QWORD *)&Request[6] = v14;
ConflictFillConflicts = IopResourceRequirementsListToReqList(Request, &ResReqList);
if( ConflictFillConflicts >= 0 )
{
if( ResReqList
&& (v16 = *((_QWORD *)ResReqList + 5),
*((_QWORD *)ResReqList + 2) = (char *)ResReqList + 40,
*(_DWORD *)(v16 + 20) == 1)
&& (v17 = *(_QWORD *)(v16 + 24), *(_BYTE *)(v17 + 8)) )
{
v18 = *(_PI_RESOURCE_ARBITER_ENTRY **)(v17 + 288);
v19 = *(_QWORD *)(*(_QWORD *)(v17 + 32) + 64i64);
v20 = *(_BYTE *)(v19 + 1);
if( v20 == (char)0x80 || v20 == -16 )
v19 += 32i64;
*((_QWORD *)&Input1 + 1) = v19;
*(_QWORD *)&v28 = &v23;
*(_QWORD *)&Input1 = PhysicalDeviceObject;
*((_QWORD *)&v28 + 1) = &P;
v21 = IopCallArbiter(v18, ArbiterActionQueryConflict, &Input1);
ConflictFillConflicts = v21;
if( v21 < 0 )
{
if( v21 == -1073741172 )
ConflictFillConflicts = IopQueryConflictFillConflicts(0i64, 0, 0i64, (__int64)a4, a5, 4);
}
else
{
ConflictFillConflicts = IopQueryConflictFillConflicts(PhysicalDeviceObject, v23, P, (__int64)a4, a5, 0);
if( P )
ExFreePoolWithTag(P, 0);
}
}
else
{
ConflictFillConflicts = -1073741811;
}
}
ExFreePoolWithTag(v15, 0);
}
else
{
ConflictFillConflicts = -1073741811;
}
if( ResReqList )
IopFreeReqList((_REQ_LIST *)ResReqList);
return(unsigned int)ConflictFillConflicts;
}Referenced by:
IopQueryConflictList