PiBuildDeviceNodeInstancePath

__int64 __fastcall PiBuildDeviceNodeInstancePath(__int64 a1, __int64 a2, __int64 a3, __int64 a4){
  WCHAR *v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  int v12; 
  UINT64 v13; 
  WCHAR *PoolWithTag; 
  int v15; 
  const wchar_t *v16; 
  WCHAR v17; 
  v8 = 0i64;
  if( a2 && a3 && a4 )
  {
    if( *(_QWORD *)(a1 + 48) && ((*(_DWORD *)(a1 + 396) & 0x2000) == 0 || *(_DWORD *)(a1 + 404) != 42) )
      PnpCleanupDeviceRegistryValues((UNICODE_STRING *)(a1 + 40));
    v9 = -1i64;
    v10 = -1i64;
    do
      ++v10;
    while( *(_WORD *)(a2 + 2 * v10) );
    v11 = -1i64;
    do
      ++v11;
    while( *(_WORD *)(a3 + 2 * v11) );
    v12 = v11 + v10;
    do
      ++v9;
    while( *(_WORD *)(a4 + 2 * v9) );
    v13 = (unsigned int)(2 * (v9 + v12) + 6);
    PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(NonPagedPoolNx, v13, 0x49706E50ui64);
    v8 = PoolWithTag;
    if( !PoolWithTag )
      return(unsigned int)-1073741670;
    v15 = RtlStringCbPrintfW(PoolWithTag, (unsigned int)v13, (WCHAR *)L"%s\\%s\\%s");
    if( v15 >= 0 )
    {
      v16 = *(const wchar_t **)(a1 + 48);
      if( !v16 || wcsicmp(v16, v8) )
      {
        PnpFreeDeviceInstancePath(a1);
        RtlInitUnicodeString((PUNICODE_STRING)(a1 + 40), v8, v17);
        return(unsigned int)v15;
      }
    }
  }
  else
  {
    v15 = -1073741823;
  }
  if( v8 )
    ExFreePoolWithTag(v8, 0x49706E50u);
  return(unsigned int)v15;
}

Referenced by:

PiProcessNewDeviceNode