PnpGetResourceRequirementsForAssignTable
__int64 __fastcall PnpGetResourceRequirementsForAssignTable(unsigned __int64 a1, unsigned __int64 a2, int *a3){
int v3;
unsigned __int64 v6;
int v7;
_REQ_LIST **v8;
__int64 v9;
_DEVICE_NODE *v10;
_IO_RESOURCE_REQUIREMENTS_LIST *v11;
int v12;
_IO_RESOURCE_REQUIREMENTS_LIST *v14;
NTSTATUS v15;
_REQ_LIST *v16;
unsigned int v17;
unsigned int v18;
_IO_RESOURCE_REQUIREMENTS_LIST *ResourceRequirements;
UINT64 Length;
int v21;
char *v22;
v3 = 0;
LODWORD(Length) = 0;
v21 = 0;
v22 = 0i64;
*a3 = 0;
if( a1 < a2 )
{
v6 = a1 + 24;
while( 1 )
{
v7 = *(_DWORD *)(v6 - 16);
v8 = (_REQ_LIST **)(v6 + 8);
*(_QWORD *)(v6 + 8) = 0i64;
if( (v7 & 0x20) == 0 )
break;
LABEL_13:
v6 += 64i64;
if( v6 - 24 >= a2 )
{
v3 = *a3;
return v3 == 0 ? 0xC0000001 : 0;
}
}
*(_QWORD *)(v6 + 16) = 0i64;
v9 = *(_QWORD *)(v6 - 24);
*(_QWORD *)(v6 + 24) = 0i64;
if( v9 )
v10 = *(_DEVICE_NODE **)(*(_QWORD *)(v9 + 312) + 40i64);
else
v10 = 0i64;
ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
if( (v10->Flags & 0x400) != 0 )
{
ResourceRequirements = v10->ResourceRequirements;
if( ResourceRequirements )
{
ExFreePoolWithTag(ResourceRequirements, 0);
v10->ResourceRequirements = 0i64;
PipClearDevNodeFlags(v10, 0x200ui64);
*(_DWORD *)(v6 - 16) |= 0x400u;
}
}
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
if( !*(_QWORD *)v6 )
{
v11 = v10->ResourceRequirements;
if( !v11 || (v10->Flags & 0x200) != 0 )
{
IopQueryDeviceResources(*(_DEVICE_OBJECT **)(v6 - 24), 1ui64, (VOID **)v6, &Length);
if( v12 < 0 || !*(_QWORD *)v6 )
{
*(_DWORD *)(v6 + 32) = v12;
LABEL_12:
*(_DWORD *)(v6 - 16) |= 0x20u;
goto LABEL_13;
}
ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 6336));
v14 = v10->ResourceRequirements;
if( v14 )
{
ExFreePoolWithTag(v14, 0);
PipClearDevNodeFlags(v10, 0x200ui64);
}
v10->ResourceRequirements = *(_IO_RESOURCE_REQUIREMENTS_LIST **)v6;
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 6336));
}
else
{
*(_QWORD *)v6 = v11;
*(_DWORD *)(v6 - 12) = 4;
}
}
if( (*(_DWORD *)(v6 - 16) & 0x200) != 0 )
{
if( (int)PnpFilterResourceRequirementsList(*(VOID **)v6, &v10->ResourceList->Count, &v22, &v21) >= 0 && v22 )
*(_QWORD *)v6 = v22;
else
*(_DWORD *)(v6 - 16) &= ~0x200u;
}
v15 = IopResourceRequirementsListToReqList((PNP_RESOURCE_REQUEST *)(v6 - 24), (VOID **)(v6 + 8));
if( v15 >= 0 )
{
v16 = *v8;
if( *v8 )
{
IopRearrangeReqList(*v8);
if( *((_QWORD *)v16 + 3) )
{
v17 = v16[8];
v18 = 0;
*(_DWORD *)(v6 + 32) = v15;
if( v17 >= 3 )
v18 = v17;
++*a3;
*(_DWORD *)(v6 - 8) = v18;
goto LABEL_13;
}
PnpFreeResourceRequirementsForAssignTable(v6 - 24, v6 + 40);
v15 = -1073741438;
}
}
*(_DWORD *)(v6 + 32) = v15;
goto LABEL_12;
}
return v3 == 0 ? 0xC0000001 : 0;
}Referenced by:
PnpAllocateResources
PnpQueryRebalanceWorker
PnpReallocateResources