PnpBuildCmResourceLists
VOID __fastcall PnpBuildCmResourceLists(UINT64 a1, UINT64 a2, CHAR a3){
UINT64 v4;
unsigned int v5;
unsigned int v6;
_DWORD *v7;
int v8;
_DWORD *v9;
_CM_RESOURCE_LIST *v10;
_DEVICE_NODE *v11;
unsigned int v12;
UINT64 i;
__int64 v14;
void *v15;
void *v16;
__int64 v17;
__int64 v18;
v4 = a1;
if( a3 )
{
for( i = a1; i < a2; i += 64i64 )
{
if( *(_QWORD *)i )
v14 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)i + 312i64) + 40i64);
else
v14 = 0i64;
ExAcquireFastMutex(&PiResourceListLock);
v15 = *(void **)(v14 + 416);
if( v15 )
{
ExFreePoolWithTag(v15, 0);
*(_QWORD *)(v14 + 416) = 0i64;
}
v16 = *(void **)(v14 + 424);
if( v16 )
{
ExFreePoolWithTag(v16, 0);
*(_QWORD *)(v14 + 424) = 0i64;
}
KeReleaseGuardedMutex(&PiResourceListLock);
}
}
v5 = -1;
do
{
v6 = v5;
v5 = 0;
if( v4 >= a2 )
break;
v7 = (_DWORD *)(v4 + 56);
do
{
*((_QWORD *)v7 - 2) = 0i64;
v8 = *(v7 - 12);
if( (v8 & 0x28) == 0 )
{
if( (v8 & 0x10) != 0 )
{
*v7 = -1073741823;
}
else if( v6 == -1 || *v7 == -1073741267 )
{
*v7 = 0;
v9 = v7 - 14;
PnpBuildCmResourceList();
if( *v7 == -1073741267 )
{
++v5;
}
else
{
if( a3 )
{
if( *(_QWORD *)v9 )
v17 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)v9 + 312i64) + 40i64);
else
v17 = 0i64;
if( (*(v7 - 12) & 0x400) != 0 )
PipClearDevNodeFlags((_DEVICE_NODE *)v17, 0xC00ui64);
ExAcquireFastMutex(&PiResourceListLock);
v18 = *((_QWORD *)v7 - 2);
*(_QWORD *)(v17 + 416) = v18;
if( !v18 )
PipSetDevNodeFlags(v17, 256);
*(_QWORD *)(v17 + 424) = *((_QWORD *)v7 - 1);
KeReleaseGuardedMutex(&PiResourceListLock);
}
v10 = (_CM_RESOURCE_LIST *)*((_QWORD *)v7 - 2);
if( v10 )
{
if( *(_QWORD *)v9 )
v11 = *(_DEVICE_NODE **)(*(_QWORD *)(*(_QWORD *)v9 + 312i64) + 40i64);
else
v11 = 0i64;
v12 = PnpDetermineResourceListSize(*((CM_RESOURCE_LIST **)v7 - 2));
IopWriteAllocatedResourcesToRegistry(v11, v10, v12);
}
}
}
}
v7 += 16;
}
while( (unsigned __int64)(v7 - 14) < a2 );
v4 = a1;
if( !v5 )
break;
}
while( v5 < v6 );
}Referenced by:
PnpAllocateResources
PnpReallocateResources
PnpRebalance