PnpBuildCmResourceList
VOID __stdcall PnpBuildCmResourceList(){
int v0;
__int64 v1;
__int64 v2;
_DWORD *v3;
__int64 v4;
int v5;
__int64 *v6;
__int64 v7;
unsigned int v8;
__int64 *v9;
__int64 v10;
__int64 v11;
CM_RESOURCE_LIST *PoolWithTag;
CM_RESOURCE_LIST *v13;
_DWORD *v14;
_DWORD *v15;
__int64 v16;
_DWORD *v17;
int v18;
char *v19;
__int64 v20;
__int64 v21;
__int64 v22;
__int64 v23;
__int64 v24;
_DEVICE_NODE *v25;
_DWORD *v26;
int v27;
UINT8 *v28;
int v29;
__int16 v30;
VOID *v31;
int v32;
HANDLE v33;
wchar_t *Buffer;
int v35;
__int64 v36;
int v37;
int v38;
_CM_PARTIAL_RESOURCE_DESCRIPTOR *Source;
_CM_PARTIAL_RESOURCE_DESCRIPTOR **Target;
_CM_PARTIAL_RESOURCE_DESCRIPTOR **Targeta;
int v42;
UINT64 ReturnLength;
_QWORD Destination[3];
UINT64 ResourceListSize;
UNICODE_STRING ClassName;
UNICODE_STRING DriverName;
PVOID P;
HANDLE Handle;
OBJECT_NAME_INFORMATION ObjectNameInfo;
char v51;
v2 = *(_QWORD *)(v1 + 32);
v3 = 0i64;
v4 = v1;
*(_QWORD *)&DriverName.Length = v1;
LODWORD(ReturnLength) = v0;
v5 = 0;
Handle = 0i64;
v6 = *(__int64 **)(v2 + 16);
P = 0i64;
v7 = *v6;
Destination[0] = v7;
v8 = *(_DWORD *)(v7 + 20);
if( !v8 )
goto LABEL_42;
v9 = (__int64 *)(v7 + 24);
v10 = v8;
do
{
v11 = *v9++;
v5 += *(_DWORD *)(v11 + 276) + 1;
--v10;
}
while( v10 );
if( !v5 )
{
LABEL_42:
*(_DWORD *)(v4 + 56) = -1073741595;
goto LABEL_43;
}
LODWORD(ResourceListSize) = 20 * (v5 + 1);
PoolWithTag = (CM_RESOURCE_LIST *)ExAllocatePoolWithTag(PagedPool, (unsigned int)ResourceListSize, 0x20207050ui64);
Destination[1] = PoolWithTag;
v13 = PoolWithTag;
if( !PoolWithTag )
{
LABEL_37:
*(_DWORD *)(v4 + 56) = -1073741670;
LABEL_43:
*(_QWORD *)(v4 + 48) = 0i64;
goto LABEL_21;
}
memset((INT64)PoolWithTag, 0i64);
v14 = ExAllocatePoolWithTag(PagedPool, (unsigned int)(20 * (v5 + 1)), 0x20207050ui64);
v15 = v14;
if( !v14 )
{
ExFreePoolWithTag(v13, 0);
goto LABEL_37;
}
memset((INT64)v14, 0i64);
v16 = Destination[0];
v17 = (_DWORD *)((char *)v13 + 20);
*(_DWORD *)v13 = 1;
*((_DWORD *)v13 + 1) = *(_DWORD *)v2;
*((_DWORD *)v13 + 2) = *(_DWORD *)(v2 + 4);
*((_DWORD *)v13 + 3) = 65537;
*((_DWORD *)v13 + 4) = v5;
*v15 = 1;
v15[1] = *(_DWORD *)v2;
v18 = *(_DWORD *)(v2 + 4);
v19 = (char *)(v15 + 5);
v15[2] = v18;
v20 = 0i64;
v15[3] = 65537;
v15[4] = v5;
HIDWORD(ReturnLength) = 0;
if( !*(_DWORD *)(v16 + 20) )
{
LABEL_19:
if( (_DWORD)ReturnLength )
{
v31 = *(VOID **)v4;
LODWORD(Source) = 1;
if( IopCreateRegistryKeyEx(
&Handle,
0i64,
&CmRegistryMachineHardwareResourceMapName,
0x2001Fui64,
(UINT64)Source,
0i64) >= 0 )
{
LODWORD(ReturnLength) = 0;
ClassName.Buffer = L"PnP Manager";
*(_QWORD *)&ClassName.Length = 1572886i64;
DriverName.Buffer = L"PnpManager";
*(_QWORD *)&DriverName.Length = 1441812i64;
*(_OWORD *)&Destination[1] = 0i64;
v32 = ObQueryNameStringMode(v31, &ObjectNameInfo, 0x200ui64, &ReturnLength, 0);
v33 = Handle;
if( v32 >= 0 )
{
ObjectNameInfo.Name.MaximumLength = 496;
Buffer = (wchar_t *)&v51;
if( ObjectNameInfo.Name.Length )
Buffer = ObjectNameInfo.Name.Buffer;
ObjectNameInfo.Name.Buffer = Buffer;
*(OBJECT_NAME_INFORMATION *)&Destination[1] = ObjectNameInfo;
RtlAppendUnicodeToString((UNICODE_STRING *)&Destination[1], (PWCHAR)L".Raw");
v35 = ResourceListSize;
LODWORD(Target) = ResourceListSize;
if( IopWriteResourceList(
v33,
&ClassName,
&DriverName,
(UNICODE_STRING *)&Destination[1],
(CM_RESOURCE_LIST *)v15,
(UINT64)Target) >= 0 )
{
*(OBJECT_NAME_INFORMATION *)&Destination[1] = ObjectNameInfo;
RtlAppendUnicodeToString((UNICODE_STRING *)&Destination[1], (PWCHAR)L".Translated");
LODWORD(Targeta) = v35;
IopWriteResourceList(v33, &ClassName, &DriverName, (UNICODE_STRING *)&Destination[1], v13, (UINT64)Targeta);
}
}
ZwClose(v33);
}
}
*(_QWORD *)(v4 + 48) = v13;
v3 = v15;
goto LABEL_21;
}
while( 1 )
{
v21 = *(_QWORD *)(v16 + 8 * v20 + 24);
if( !*(_BYTE *)(v21 + 8) )
{
*(_OWORD *)v19 = *(_OWORD *)(v21 + 136);
*((_DWORD *)v19 + 4) = *(_DWORD *)(v21 + 152);
*(_OWORD *)v17 = *(_OWORD *)(v21 + 136);
v37 = *(_DWORD *)(v21 + 152);
goto LABEL_33;
}
v22 = *(_QWORD *)(v21 + 32);
*(_QWORD *)&ClassName.Length = v22;
if( *(_DWORD *)(v22 + 128) == 2 )
{
v23 = *(_QWORD *)(v22 + 112);
}
else
{
v42 = IopParentToRawTranslation(v22);
if( v42 < 0 )
break;
v23 = *(_QWORD *)(v21 + 112);
v22 = *(_QWORD *)&ClassName.Length;
}
*(_OWORD *)v19 = *(_OWORD *)v23;
*((_DWORD *)v19 + 4) = *(_DWORD *)(v23 + 16);
if( *(_DWORD *)(v22 + 128) == 2 )
{
v36 = *(_QWORD *)(v22 + 112);
v16 = Destination[0];
*(_OWORD *)v17 = *(_OWORD *)v36;
v37 = *(_DWORD *)(v36 + 16);
LABEL_33:
v17[4] = v37;
goto LABEL_17;
}
v24 = *(_QWORD *)(v21 + 72);
v25 = v24 ? *(_DEVICE_NODE **)(*(_QWORD *)(v24 + 312) + 40i64) : 0i64;
v42 = IopChildToRootTranslation(
v25,
(_INTERFACE_TYPE)*(_DWORD *)v21,
*(unsigned int *)(v21 + 4),
(_ARBITER_REQUEST_SOURCE)*(_DWORD *)(v21 + 80),
(_CM_PARTIAL_RESOURCE_DESCRIPTOR *)(v21 + 136),
(_CM_PARTIAL_RESOURCE_DESCRIPTOR **)&P);
if( v42 < 0 )
break;
v26 = P;
*(_OWORD *)v17 = *(_OWORD *)P;
v17[4] = v26[4];
ExFreePoolWithTag(v26, 0);
v16 = Destination[0];
LABEL_17:
v27 = *(_DWORD *)(v21 + 276);
v19 += 20;
v17 += 5;
if( v27 )
{
v28 = (UINT8 *)(*(_QWORD *)(v21 + 280) + 8i64);
v29 = v27;
do
{
*v19 = -127;
*(_BYTE *)v17 = -127;
v19[1] = 1;
*((_BYTE *)v17 + 1) = 1;
v30 = *((_WORD *)v28 - 2);
*((_WORD *)v19 + 1) = v30;
*((_WORD *)v17 + 1) = v30;
memmove((UINT8 *)v19 + 4, v28, 0xCui64);
memmove((UINT8 *)v17 + 4, v28, 0xCui64);
v28 += 32;
v19 += 20;
v17 += 5;
--v29;
}
while( v29 );
v4 = *(_QWORD *)&DriverName.Length;
v13 = (CM_RESOURCE_LIST *)Destination[1];
v16 = Destination[0];
}
v20 = (unsigned int)(HIDWORD(ReturnLength) + 1);
HIDWORD(ReturnLength) = v20;
if( (unsigned int)v20 >= *(_DWORD *)(v16 + 20) )
goto LABEL_19;
}
ExFreePoolWithTag(v13, 0);
ExFreePoolWithTag(v15, 0);
v38 = -1073741670;
if( v42 == -1073741267 )
v38 = -1073741267;
*(_DWORD *)(v4 + 56) = v38;
LABEL_21:
*(_QWORD *)(v4 + 40) = v3;
}Referenced by:
IopAllocateBootResourcesInternal
PnpBuildCmResourceLists