PiDqPnPGetObjectProperty

__int64 __fastcall PiDqPnPGetObjectProperty(
        __int64 a1,
        unsigned int a2,
        char *a3,
        __int64 a4,
        int a5,
        NTSTRSAFE_PCWSTR pszSrc,
        __int64 a7){
  __int128 v7; 
  __int64 v8; 
  WCHAR *v9; 
  void *PoolWithTag; 
  int v14; 
  UINT64 v15; 
  int PWSTR; 
  int ObjectProperty; 
  void *v19; 
  int v20[18]; 
  SIZE_T NumberOfBytes; 
  v7 = *(_OWORD *)a4;
  v8 = a7;
  v9 = (WCHAR *)pszSrc;
  v20[0] = 0;
  LODWORD(NumberOfBytes) = 512;
  *(_OWORD *)a7 = v7;
  PoolWithTag = 0i64;
  *(_DWORD *)(v8 + 16) = *(_DWORD *)(a4 + 16);
  v14 = a5;
  LODWORD(v15) = 0;
  *(_QWORD *)(v8 + 32) = 0i64;
  *(_QWORD *)(v8 + 40) = 0i64;
  *(_DWORD *)(v8 + 20) = v14;
  PWSTR = PnpAllocatePWSTR(v9, 0x7FFFFFFFui64, 0x58706E50ui64, (WCHAR **)(v8 + 24));
  if( PWSTR >= 0 )
  {
    while( 1 )
    {
      if( (unsigned int)NumberOfBytes > (unsigned int)v15 )
      {
        v15 = (unsigned int)NumberOfBytes;
        if( PoolWithTag )
          ExFreePoolWithTag(PoolWithTag, 0x58706E50u);
        PoolWithTag = ExAllocatePoolWithTag(PagedPool, v15, 0x58706E50ui64);
        if( !PoolWithTag )
          break;
      }
      LODWORD(NumberOfBytes) = 0;
      if( a2 )
        ObjectProperty = PnpGetObjectProperty(
                           PiPnpRtlCtx,
                           a1,
                           a2,
                           (__int64)a3,
                           v9,
                           a4,
                           v20,
                           (unsigned __int64)PoolWithTag,
                           v15,
                           (ULONG *)&NumberOfBytes,
                           0);
      else
        ObjectProperty = PnpGetGenericStoreProperty(
                           PiPnpRtlCtx,
                           a3,
                           v9,
                           a4,
                           v20,
                           (__int64)PoolWithTag,
                           v15,
                           &NumberOfBytes);
      PWSTR = ObjectProperty;
      if( ObjectProperty != -1073741789 )
        goto LABEL_9;
    }
    PWSTR = -1073741670;
LABEL_9:
    if( PWSTR >= 0 )
    {
      *(_DWORD *)(v8 + 32) = v20[0];
      *(_DWORD *)(v8 + 36) = NumberOfBytes;
      *(_QWORD *)(v8 + 40) = PoolWithTag;
      return(unsigned int)PWSTR;
    }
    if( PoolWithTag )
      ExFreePoolWithTag(PoolWithTag, 0x58706E50u);
  }
  if( PWSTR == -1073741275 )
  {
    return 0;
  }
  else
  {
    v19 = *(void **)(v8 + 24);
    if( v19 )
      ExFreePoolWithTag(v19, 0x58706E50u);
  }
  return(unsigned int)PWSTR;
}

Referenced by:

PiDqActionDataGetAllPropertiesInAllLanguages
PiDqActionDataGetChangedProperties
PiDqActionDataGetRequestedProperties
PiDqPnPGetObjectPropertyInBestLocale
PiDqPropertyCallback