PiDmRemoveCacheReferenceForObject

INT64 __fastcall PiDmRemoveCacheReferenceForObject(INT64 a1, WCHAR *a2, CHAR *a3){
  unsigned int v4; 
  VOID *ObjectManagerForObjectType; 
  _ETHREAD *CurrentThread; 
  INT64 v7; 
  CHAR *Buffer; 
  Buffer = a3;
  v4 = 0;
  ObjectManagerForObjectType = PiDmGetObjectManagerForObjectType(a1);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquireResourceExclusiveLite((ERESOURCE *)ObjectManagerForObjectType, 1u);
  v7 = PiDmLookupObject((INT64)ObjectManagerForObjectType, a2);
  Buffer = (CHAR *)v7;
  if( v7 )
  {
    --*(_DWORD *)(v7 + 12);
    if( !*((_DWORD *)Buffer + 3) )
    {
      RtlDeleteElementGenericTableAvl((RTL_AVL_TABLE *)ObjectManagerForObjectType + 1, &Buffer);
      PiDmObjectRelease(Buffer);
    }
  }
  else
  {
    v4 = -1073741772;
  }
  ExReleaseResourceLite((PERESOURCE)ObjectManagerForObjectType);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v4;
}

Referenced by:

IopProcessSetInterfaceState
IopRegisterDeviceInterface
PiDmListInitEnumCallback
PiPnpRtlCmActionCallback
PiPnpRtlFreeInstallerClassChangeInfo
PiPnpRtlObjectEventWorker