PiDmObjectRelease

VOID __fastcall PiDmObjectRelease(CHAR *P){
  void *v2; 
  CHAR *v3; 
  __int64 v4; 
  unsigned int v5; 
  DEVPROPKEY **v6; 
  v5 = 0;
  if( _InterlockedExchangeAdd((volatile signed __int32 *)P + 2, 0xFFFFFFFF) == 1 )
  {
    v2 = (void *)*((_QWORD *)P + 2);
    if( v2 )
      ExFreePoolWithTag(v2, 0x5A706E50u);
    PiDmGetCacheKeys(*((_DWORD *)P + 7), &v6, &v5);
    if( v5 )
    {
      v3 = P + 112;
      v4 = v5;
      do
      {
        PiDmCacheDataFree((INT64)v3);
        v3 += 24;
        --v4;
      }
      while( v4 );
    }
    ExFreePoolWithTag(P, 0x5A706E50u);
  }
}

Referenced by:

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