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