PiDmGetReferencedObjectFromProperty

NTSTATUS __stdcall PiDmGetReferencedObjectFromProperty(
        PNP_OBJECT_TYPE ObjectType,
        WCHAR *ObjectName,
        PVOID Object,
        VOID *PropertyKey,
        const _DEVPROPKEY *ReferencedObjectType,
        PNP_OBJECT_TYPE ReferencedObject,
        PI_DM_OBJECT **Objecta){
  NTSTATUS CachedObjectReference; 
  int v10; 
  int ObjectProperty; 
  UINT64 v13; 
  _GUID *v14; 
  WCHAR *v15; 
  INT64 v16; 
  _GUID *Guid; 
  __int64 v18; 
  WCHAR GuidString[40]; 

  LODWORD(v16) = 0;
  Guid = 0i64;
  *Objecta = 0i64;
  CachedObjectReference = PiDmObjectGetCachedObjectReference(
                            ObjectType,
                            ObjectName,
                            (ULONG_PTR)Object,
                            (_DEVPROPKEY *)ReferencedObjectType,
                            Objecta);
  v10 = CachedObjectReference;
  if( CachedObjectReference >= 0 )
  {
    if( (*Objecta)[7] != ReferencedObject )
    {
      PiDmObjectRelease(*Objecta);
      *Objecta = 0i64;
      return -1073741772;
    }
    return v10;
  }
  if( CachedObjectReference != -1073741802 )
    return v10;
  ObjectProperty = PnpGetObjectProperty(
                     0x5A706E50u,
                     0x10ui64,
                     (INT64)ObjectName,
                     ObjectType,
                     0i64,
                     0i64,
                     (INT64)ReferencedObjectType,
                     (INT64)&v16,
                     (__int64)&Guid,
                     (__int64)&v18);
  v14 = Guid;
  v10 = ObjectProperty;
  if( ObjectProperty >= 0 )
  {
    if( (_DWORD)v16 == 13 )
    {
      v10 = PnpStringFromGuid(Guid, GuidString, v13);
      if( v10 < 0 )
        goto LABEL_11;
      v15 = GuidString;
      goto LABEL_10;
    }
    if( (_DWORD)v16 == 18 )
    {
      v15 = (WCHAR *)Guid;
LABEL_10:
      v10 = PiDmGetObject(ReferencedObject, v15, Objecta);
      goto LABEL_11;
    }
    v10 = -1073741772;
  }
LABEL_11:
  if( v14 )
    ExFreePoolWithTag(v14, 0x5A706E50u);
  return v10;
}

Referenced by:

PiDmObjectProcessPropertyChange