PnpCmResourcesToIoResources
VOID **__fastcall PnpCmResourcesToIoResources(__int64 a1, _DWORD *a2, int a3){
unsigned int v3;
int *v4;
unsigned int v5;
int v8;
_DWORD *v9;
__int64 v10;
unsigned int v11;
__int64 v12;
__int64 v13;
unsigned int v14;
__int64 v15;
VOID **PoolWithTag;
VOID **v17;
int v18;
VOID **v19;
int v20;
_DWORD *v21;
unsigned int v22;
int v23;
VOID **result;
ULONGLONG v25;
unsigned __int64 v26;
unsigned __int64 v27;
int v28;
int v29;
unsigned __int64 Start;
v3 = *a2;
v4 = a2 + 1;
v5 = 0;
v8 = 0;
v9 = a2 + 1;
if( !*a2 )
return 0i64;
v10 = v3;
do
{
v11 = v9[3];
v9 += 4;
v8 += v11;
if( v11 )
{
v12 = v11;
do
{
v13 = 0i64;
if( *(_BYTE *)v9 == 5 )
{
v13 = (unsigned int)v9[1];
--v8;
}
v9 = (_DWORD *)((char *)v9 + v13 + 20);
--v12;
}
while( v12 );
}
--v10;
}
while( v10 );
if( !v8 )
return 0i64;
v14 = v3 + v8;
v15 = 32i64 * v14;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v15 + 72, 1970499664i64);
v17 = PoolWithTag;
if( !PoolWithTag )
return 0i64;
memset(PoolWithTag, 0i64, v15 + 72);
*((_DWORD *)v17 + 1) = *v4;
v18 = a2[2];
*((_DWORD *)v17 + 9) = v14;
v19 = v17 + 9;
*((_DWORD *)v17 + 12) = a3;
v20 = 0;
*((_DWORD *)v17 + 2) = v18;
*(VOID **)((char *)v17 + 12) = 0i64;
*(VOID **)((char *)v17 + 20) = 0i64;
*((_DWORD *)v17 + 7) = 1;
*((_DWORD *)v17 + 8) = 65537;
*((_WORD *)v17 + 20) = -32767;
*(_DWORD *)((char *)v17 + 42) = 3;
*((_WORD *)v17 + 23) = 0;
if( *a2 )
{
while( 1 )
{
if( v20 )
{
*(_DWORD *)((char *)v19 + 2) = 0;
*(_WORD *)v19 = -4095;
*((_WORD *)v19 + 3) = 0;
v28 = *v4;
if( *v4 == -1 )
v28 = 1;
*((_DWORD *)v19 + 2) = v28;
*(VOID **)((char *)v19 + 12) = (VOID *)(unsigned int)v4[1];
v19 += 4;
}
v21 = v4 + 4;
v22 = 0;
if( v4[3] )
break;
LABEL_21:
v4 = v21;
if( (unsigned int)++v20 >= *a2 )
goto LABEL_22;
}
while( 1 )
{
*(_BYTE *)v19 = 1;
*((_BYTE *)v19 + 1) = *(_BYTE *)v21;
*((_BYTE *)v19 + 2) = *((_BYTE *)v21 + 1);
*((_WORD *)v19 + 2) = *((_WORD *)v21 + 1);
*((_BYTE *)v19 + 3) = 0;
*((_WORD *)v19 + 3) = 0;
switch( *(_BYTE *)v21 )
{
case 1:
goto LABEL_24;
case 2:
if( (*((_BYTE *)v21 + 2) & 2) != 0 )
{
*((_DWORD *)v19 + 3) = -2;
v29 = *((unsigned __int16 *)v21 + 3);
*((_DWORD *)v19 + 5) = 0;
*((_DWORD *)v19 + 2) = ~v29;
*((_WORD *)v19 + 8) = 4;
*((_WORD *)v19 + 9) = *((_WORD *)v21 + 2);
v27 = *(_QWORD *)(v21 + 3);
goto LABEL_25;
}
v23 = v21[2];
*((_DWORD *)v19 + 3) = v23;
break;
case 3:
goto LABEL_24;
case 4:
if( *((char *)v21 + 2) < 0 )
{
*((_DWORD *)v19 + 2) = v21[2];
*((_DWORD *)v19 + 3) = v21[2];
*((_DWORD *)v19 + 4) = v21[1];
*((_DWORD *)v19 + 5) = *((unsigned __int8 *)v21 + 12);
}
else
{
*((_DWORD *)v19 + 2) = v21[1];
*((_DWORD *)v19 + 3) = v21[1];
}
goto LABEL_19;
case 5:
v5 = v21[1];
goto LABEL_20;
case 6:
*((_DWORD *)v19 + 3) = v21[1];
*((_DWORD *)v19 + 4) = v21[1] - 1 + v21[2];
v23 = v21[2];
break;
case 7:
LABEL_24:
Start = 0i64;
v25 = RtlCmDecodeMemIoResource((PCM_PARTIAL_RESOURCE_DESCRIPTOR)v21, &Start);
*((_DWORD *)v19 + 2) = v21[3];
v26 = Start;
v19[2] = (VOID *)Start;
v27 = v26 + v25 - 1;
*((_DWORD *)v19 + 3) = 1;
LABEL_25:
v19[3] = (VOID *)v27;
goto LABEL_19;
default:
*((_DWORD *)v19 + 2) = v21[1];
*((_DWORD *)v19 + 3) = v21[2];
*((_DWORD *)v19 + 4) = v21[3];
goto LABEL_19;
}
*((_DWORD *)v19 + 2) = v23;
LABEL_19:
v19 += 4;
LABEL_20:
v21 = (_DWORD *)((char *)v21 + v5 + 20);
++v22;
v5 = 0;
if( v22 >= v4[3] )
goto LABEL_21;
}
}
LABEL_22:
result = v17;
*(_DWORD *)v17 = (_DWORD)v19 - (_DWORD)v17;
return result;
}Referenced by:
IoReportResourceUsageInternal
IopAllocateBootResourcesInternal
IopQueryConflictListInternal
IopQueryDeviceResources
PnpFilterResourceRequirementsList
PnpReleaseBootResourcesForFilteredRequirements
PnpRestoreResourcesInternal