PnpGetResourceRequirementsForAssignTable
VOID __stdcall PnpGetResourceRequirementsForAssignTable(
_PNP_RESOURCE_REQUEST *RequestTable,
_PNP_RESOURCE_REQUEST *RequestTableEnd,
UINT64 *DeviceCount,
INT64 a4){
_IO_RESOURCE_REQUIREMENTS_LIST **p_ResourceRequirements;
int v7;
__int64 *v8;
__int64 v9;
__int64 v10;
_IO_RESOURCE_REQUIREMENTS_LIST *v11;
int v12;
void *v13;
int v14;
__int64 v15;
unsigned int v16;
unsigned int v17;
void *v18;
UINT64 v19;
UINT64 ExactMatch;
_IO_RESOURCE_REQUIREMENTS_LIST *FilteredList;
LODWORD(v19) = 0;
LODWORD(ExactMatch) = 0;
FilteredList = 0i64;
*(_DWORD *)DeviceCount = 0;
if( RequestTable < RequestTableEnd )
{
p_ResourceRequirements = &RequestTable->ResourceRequirements;
while( 1 )
{
v7 = *((_DWORD *)p_ResourceRequirements - 4);
v8 = (__int64 *)(p_ResourceRequirements + 1);
p_ResourceRequirements[1] = 0i64;
if( (v7 & 0x20) == 0 )
break;
LABEL_13:
p_ResourceRequirements += 8;
if( p_ResourceRequirements - 3 >= (_IO_RESOURCE_REQUIREMENTS_LIST **)RequestTableEnd )
return;
}
p_ResourceRequirements[2] = 0i64;
v9 = (__int64)*(p_ResourceRequirements - 3);
p_ResourceRequirements[3] = 0i64;
if( v9 )
v10 = *(_QWORD *)(*(_QWORD *)(v9 + 312) + 40i64);
else
v10 = 0i64;
ExAcquireFastMutex(&PiResourceListLock);
if( (*(_DWORD *)(v10 + 396) & 0x400) != 0 )
{
v18 = *(void **)(v10 + 440);
if( v18 )
{
ExFreePoolWithTag(v18, 0);
*(_QWORD *)(v10 + 440) = 0i64;
PipClearDevNodeFlags((_DEVICE_NODE *)v10, 0x200ui64);
*((_DWORD *)p_ResourceRequirements - 4) |= 0x400u;
}
}
KeReleaseGuardedMutex(&PiResourceListLock);
if( !*p_ResourceRequirements )
{
v11 = *(_IO_RESOURCE_REQUIREMENTS_LIST **)(v10 + 440);
if( !v11 || (*(_DWORD *)(v10 + 396) & 0x200) != 0 )
{
IopQueryDeviceResources(
(_DEVICE_OBJECT *)*(p_ResourceRequirements - 3),
1ui64,
(PVOID *)p_ResourceRequirements,
&v19);
if( v12 < 0 || !*p_ResourceRequirements )
{
*((_DWORD *)p_ResourceRequirements + 8) = v12;
LABEL_12:
*((_DWORD *)p_ResourceRequirements - 4) |= 0x20u;
goto LABEL_13;
}
ExAcquireFastMutex(&PiResourceListLock);
v13 = *(void **)(v10 + 440);
if( v13 )
{
ExFreePoolWithTag(v13, 0);
PipClearDevNodeFlags((_DEVICE_NODE *)v10, 0x200ui64);
}
*(_QWORD *)(v10 + 440) = *p_ResourceRequirements;
KeReleaseGuardedMutex(&PiResourceListLock);
}
else
{
*p_ResourceRequirements = v11;
*((_DWORD *)p_ResourceRequirements - 3) = 4;
}
}
if( (*(_DWORD *)(p_ResourceRequirements - 2) & 0x200) != 0 )
{
if( (int)PnpFilterResourceRequirementsList(
*p_ResourceRequirements,
*(_CM_RESOURCE_LIST **)(v10 + 416),
&FilteredList,
&ExactMatch) >= 0
&& FilteredList )
{
*p_ResourceRequirements = FilteredList;
}
else
{
*((_DWORD *)p_ResourceRequirements - 4) &= ~0x200u;
}
}
v14 = IopResourceRequirementsListToReqList((INT64)(p_ResourceRequirements - 3), (CHAR **)p_ResourceRequirements + 1);
if( v14 >= 0 )
{
v15 = *v8;
if( *v8 )
{
IopRearrangeReqList(*v8);
if( *(_QWORD *)(v15 + 24) )
{
v16 = *(_DWORD *)(v15 + 32);
v17 = 0;
*((_DWORD *)p_ResourceRequirements + 8) = v14;
if( v16 >= 3 )
v17 = v16;
++*(_DWORD *)DeviceCount;
*((_DWORD *)p_ResourceRequirements - 2) = v17;
goto LABEL_13;
}
PnpFreeResourceRequirementsForAssignTable(
(_PNP_RESOURCE_REQUEST *)(p_ResourceRequirements - 3),
(_PNP_RESOURCE_REQUEST *)(p_ResourceRequirements + 5));
v14 = -1073741438;
}
}
*((_DWORD *)p_ResourceRequirements + 8) = v14;
goto LABEL_12;
}
}Referenced by:
PnpAllocateResources
PnpQueryRebalanceWorker
PnpReallocateResources