PiDmObjectRelease

VOID __stdcall PiDmObjectRelease(_PI_DM_OBJECT *Object){
  void *v2; 
  _PI_DM_CACHED_PROPERTY_DATA *v3; 
  __int64 v4; 
  UINT64 CachedKeysCount; 
  _PI_DM_CACHED_PROPERTY_KEY *CachedKeys; 

  LODWORD(CachedKeysCount) = 0;
  if( _InterlockedExchangeAdd(Object + 2, 0xFFFFFFFF) == 1 )
  {
    v2 = (void *)*((_QWORD *)Object + 2);
    if( v2 )
      ExFreePoolWithTag(v2, 0x5A706E50u);
    PiDmGetCacheKeys((_PNP_OBJECT_TYPE)Object[7], (const _PI_DM_CACHED_PROPERTY_KEY **)&CachedKeys, &CachedKeysCount);
    if( (_DWORD)CachedKeysCount )
    {
      v3 = Object + 28;
      v4 = (unsigned int)CachedKeysCount;
      do
      {
        PiDmCacheDataFree(v3);
        v3 += 6;
        --v4;
      }
      while( v4 );
    }
    ExFreePoolWithTag(Object, 0x5A706E50u);
  }
}

Referenced by:

IopProcessSetInterfaceState
IopRegisterDeviceInterface
PiControlGetDeviceInterfaceEnabled
PiDmAddCacheReferenceForObject
PiDmCacheDataFree
PiDmEnumObjectsWithCallback
PiDmGetObjectConstraintList
PiDmGetReferencedObjectFromProperty
PiDmListEnumObjectsWithCallback
PiDmListInitEnumCallback
PiDmObjectCreate
PiDmObjectGetAggregatedBooleanPropertyData
PiDmObjectGetCachedObjectProperty
PiDmObjectGetCachedObjectPropertyData
PiDmObjectGetCachedObjectReference
PiDmObjectManagerPopulate
PiDmObjectProcessPropertyChange
PiDmObjectUpdateCachedObjectProperty
PiDmRemoveCacheReferenceForObject
PiDqQueryActionQueueEntryFree
PiPnpRtlApplyMandatoryDeviceContainerFilters
PiPnpRtlCmActionCallback
PiPnpRtlEnsureObjectCached
PiPnpRtlFreeInstallerClassChangeInfo
PiPnpRtlFreeInterfaceDeleteInfo
PiPnpRtlFreePanelRemoveInfo
PiPnpRtlObjectEventCreate
PiPnpRtlObjectEventRelease
PiUEventFreeClientRegistrationContext