PnpProcessAssignResources
INT64 __fastcall PnpProcessAssignResources(INT64 a1, INT64 a2){
UINT *v2;
UINT *v3;
unsigned int v4;
char v6;
INT64 result;
_PNP_ASSIGN_RESOURCES_CONTEXT *v8;
__int64 DeviceCount;
_PNP_RESOURCE_REQUEST *PoolWithTag;
_PNP_RESOURCE_REQUEST *v11;
INT64 v12;
_DEVICE_OBJECT **DeviceList;
__int64 v14;
_DEVICE_OBJECT *v15;
_CM_RESOURCE_LIST **p_ResourceAssignment;
__int64 v17;
__int64 v18;
int v19;
_PNP_DEVNODE_STATE *v20;
__int64 v21;
int v22;
v3 = v2;
v4 = (unsigned __int8)a2;
v6 = 0;
result = (INT64)ExAllocatePoolWithTag(PagedPool, (unsigned int)(8 * IopNumberDeviceNodes + 8), 0x35706E50ui64);
v8 = (_PNP_ASSIGN_RESOURCES_CONTEXT *)result;
if( result )
{
memset(result, 0i64);
v8->IncludeFailedDevices = v4;
PnpProcessAssignResourcesWorker((_DEVICE_NODE *)a1, v8);
DeviceCount = v8->DeviceCount;
if( (_DWORD)DeviceCount )
{
PoolWithTag = (_PNP_RESOURCE_REQUEST *)ExAllocatePoolWithTag(
PagedPool,
(unsigned int)((_DWORD)DeviceCount << 6),
0x36706E50ui64);
v11 = PoolWithTag;
if( PoolWithTag )
{
memset((INT64)PoolWithTag, 0i64);
v12 = (INT64)v11;
DeviceList = v8->DeviceList;
v14 = DeviceCount;
do
{
v15 = *DeviceList;
memset(v12, 0i64);
*(_QWORD *)(v12 + 24) = 0i64;
++DeviceList;
*(_QWORD *)v12 = v15;
*(_DWORD *)(v12 + 12) = 4;
v12 += 64i64;
--v14;
}
while( v14 );
v6 = 0;
PnpAssignResourcesToDevices((unsigned int)DeviceCount, v11, v3);
p_ResourceAssignment = &v11->ResourceAssignment;
while( 1 )
{
v17 = (__int64)*(p_ResourceAssignment - 5);
if( v17 )
v18 = *(_QWORD *)(*(_QWORD *)(v17 + 312) + 40i64);
else
v18 = 0i64;
v19 = *((_DWORD *)p_ResourceAssignment + 4);
if( v19 >= 0 )
{
v6 = 1;
if( *p_ResourceAssignment )
{
KeAcquireGuardedMutex(&PiResourceListLock);
*(_QWORD *)(v18 + 416) = *p_ResourceAssignment;
*(_QWORD *)(v18 + 424) = p_ResourceAssignment[1];
KeReleaseGuardedMutex(&PiResourceListLock);
}
else
{
PipSetDevNodeFlags(v18, 256);
}
PipSetDevNodeState((_DEVICE_NODE *)v18, DeviceNodeResourcesAssigned, v20);
PipClearDevNodeUserFlags(v18, 4);
goto LABEL_18;
}
if( v19 != -1073741267 )
break;
LABEL_18:
p_ResourceAssignment += 8;
if( !--DeviceCount )
{
ExFreePoolWithTag(v11, 0x36706E50u);
goto LABEL_3;
}
}
switch( v19 )
{
case -1073741686:
v22 = 17;
break;
case -1073741438:
v22 = 34;
break;
case -1073739512:
case -1073479627:
v22 = 35;
break;
case -1073479626:
v22 = 33;
break;
default:
v21 = v18;
if( v19 == -1073479625 )
v22 = 36;
else
v22 = 12;
goto LABEL_37;
}
v21 = v18;
LABEL_37:
PipSetDevNodeProblem(v21, v22, v19);
goto LABEL_18;
}
}
LABEL_3:
ExFreePoolWithTag(v8, 0x35706E50u);
}
LOBYTE(result) = v6;
return result;
}Referenced by:
PipProcessDevNodeTree