PnpBuildCmResourceLists
void __fastcall PnpBuildCmResourceLists(unsigned __int64 a1, unsigned __int64 a2, char a3){
unsigned __int64 v4;
unsigned int v5;
unsigned int v6;
_DWORD *v7;
int v8;
_DWORD *v9;
_CM_RESOURCE_LIST *v10;
_DEVICE_NODE *v11;
unsigned int v12;
unsigned __int64 i;
__int64 v14;
void *v15;
void *v16;
_DEVICE_NODE *v17;
_CM_RESOURCE_LIST *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((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
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((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
}
}
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((__int64)(v7 - 14), 1);
if( *v7 == -1073741267 )
{
++v5;
}
else
{
if( a3 )
{
if( *(_QWORD *)v9 )
v17 = *(_DEVICE_NODE **)(*(_QWORD *)(*(_QWORD *)v9 + 312i64) + 40i64);
else
v17 = 0i64;
if( (*(v7 - 12) & 0x400) != 0 )
PipClearDevNodeFlags(v17, 0xC00ui64);
ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
v18 = (_CM_RESOURCE_LIST *)*((_QWORD *)v7 - 2);
v17->ResourceList = v18;
if( !v18 )
PipSetDevNodeFlags(v17, 0x100ui64);
v17->ResourceListTranslated = (_CM_RESOURCE_LIST *)*((_QWORD *)v7 - 1);
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
}
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(*((_DWORD **)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