PnpProcessAssignResources
char __fastcall PnpProcessAssignResources(_DEVICE_NODE *DeviceNode, unsigned __int8 a2, _BYTE *a3){
int v4;
char v6;
size_t v7;
VOID **PoolWithTag;
__int64 *v9;
__int64 v10;
VOID **v12;
PNP_RESOURCE_REQUEST *v13;
PNP_RESOURCE_REQUEST *v14;
__int64 *v15;
__int64 v16;
__int64 v17;
PNP_RESOURCE_REQUEST *v18;
__int64 v19;
_DEVICE_NODE *v20;
NTSTATUS v21;
_DEVICE_NODE *v22;
UINT64 v23;
v4 = a2;
v6 = 0;
v7 = 8 * *(&PnpReplaceEvent + 1500) + 8;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v7, 896560720i64);
v9 = (__int64 *)PoolWithTag;
if( PoolWithTag )
{
memset(PoolWithTag, 0i64, v7);
*(_DWORD *)v9 = v4;
PnpProcessAssignResourcesWorker(DeviceNode, v9);
v10 = *((unsigned int *)v9 + 1);
if( (_DWORD)v10 )
{
v12 = ExAllocatePoolWithTag(1ui64, (unsigned int)((_DWORD)v10 << 6), 913337936i64);
v13 = (PNP_RESOURCE_REQUEST *)v12;
if( v12 )
{
memset(v12, 0i64, (_DWORD)v10 << 6);
v14 = v13;
v15 = v9 + 1;
v16 = v10;
do
{
v17 = *v15;
memset(v14, 0i64, 0x40u);
*((_QWORD *)v14 + 3) = 0i64;
++v15;
*(_QWORD *)v14 = v17;
v14[3] = 4;
v14 += 16;
--v16;
}
while( v16 );
v6 = 0;
PnpAssignResourcesToDevices(v10, v13, a3);
v18 = v13 + 10;
while( 1 )
{
v19 = *((_QWORD *)v18 - 5);
if( v19 )
v20 = *(_DEVICE_NODE **)(*(_QWORD *)(v19 + 312) + 40i64);
else
v20 = 0i64;
v21 = v18[4];
if( v21 >= 0 )
{
v6 = 1;
if( *(_QWORD *)v18 )
{
KeAcquireGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
v20->ResourceList = *(_CM_RESOURCE_LIST **)v18;
v20->ResourceListTranslated = (_CM_RESOURCE_LIST *)*((_QWORD *)v18 + 1);
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
}
else
{
PipSetDevNodeFlags(v20, 0x100ui64);
}
PipSetDevNodeState(v20, DeviceNodeResourcesAssigned);
PipClearDevNodeUserFlags(v20, 4ui64);
goto LABEL_18;
}
if( v21 != -1073741267 )
break;
LABEL_18:
v18 += 16;
if( !--v10 )
{
ExFreePoolWithTag(v13, 0x36706E50u);
goto LABEL_3;
}
}
switch( v21 )
{
case -1073741686:
v23 = 17i64;
break;
case -1073741438:
v23 = 34i64;
break;
case -1073739512:
case -1073479627:
v23 = 35i64;
break;
case -1073479626:
v23 = 33i64;
break;
default:
v22 = v20;
if( v21 == -1073479625 )
v23 = 36i64;
else
v23 = 12i64;
goto LABEL_37;
}
v22 = v20;
LABEL_37:
PipSetDevNodeProblem(v22, v23, v21);
goto LABEL_18;
}
}
LABEL_3:
ExFreePoolWithTag(v9, 0x35706E50u);
}
return v6;
}Referenced by:
PipProcessDevNodeTree