PnpCompileDeviceInstancePaths
INT64 __fastcall PnpCompileDeviceInstancePaths(INT64 a1, UINT64 **rdx0, CHAR r8_0, CHAR r9_0, CHAR **a5){
unsigned int v5;
unsigned int v9;
CHAR **v10;
int v11;
__int64 v12;
CHAR *CriticalMemory;
UINT8 *v14;
__int64 v15;
__int64 v16;
UINT8 *v17;
UINT8 *v18;
int a2[2];
__int64 a3;
int a4;
v5 = 0;
a3 = 0i64;
a4 = 0;
v9 = a1;
if( !rdx0 )
__fastfail(5u);
v10 = a5;
v11 = 0;
*(_QWORD *)a2 = 0i64;
*a5 = 0i64;
while( IopEnumerateRelations((unsigned int **)rdx0, a2, &a3, &a4, 0i64) )
{
if( a3 )
v12 = *(_QWORD *)(*(_QWORD *)(a3 + 312) + 40i64);
else
v12 = 0i64;
if( v12 && (!r9_0 || (*(_DWORD *)(v12 + 704) & 2) == 0) && *(_QWORD *)(v12 + 48) && (!r8_0 || a4) )
v11 += *(unsigned __int16 *)(v12 + 40) + 2;
}
CriticalMemory = PnpAllocateCriticalMemory(v9, PagedPool, (unsigned int)(v11 + 2), 0x4B706E50ui64);
*v10 = CriticalMemory;
v14 = (UINT8 *)CriticalMemory;
if( CriticalMemory )
{
*(_QWORD *)a2 = 2i64;
while( IopEnumerateRelations((unsigned int **)rdx0, a2, &a3, &a4, 0i64) )
{
if( a3 )
v15 = *(_QWORD *)(*(_QWORD *)(a3 + 312) + 40i64);
else
v15 = 0i64;
if( v15 && (!r9_0 || (*(_DWORD *)(v15 + 704) & 2) == 0) && *(_QWORD *)(v15 + 48) && (!r8_0 || a4) )
{
v16 = *(_QWORD *)(*(_QWORD *)(a3 + 312) + 40i64);
if( v16 )
{
v17 = *(UINT8 **)(v16 + 48);
if( v17 )
{
memmove(v14, v17, *(unsigned __int16 *)(v16 + 40));
v18 = &v14[2 * ((unsigned __int64)*(unsigned __int16 *)(v16 + 40) >> 1)];
*(_WORD *)v18 = 0;
v14 = v18 + 2;
}
}
}
}
*(_WORD *)v14 = 0;
}
else
{
return(unsigned int)-1073741670;
}
return v5;
}Referenced by:
PnpCancelRemoveOnHungDevices
PnpProcessQueryRemoveAndEject