PiDmRemoveCacheReferenceForObject

NTSTATUS __stdcall PiDmRemoveCacheReferenceForObject(PNP_OBJECT_TYPE ObjectType, WCHAR *ObjectName, VOID *Object){
  NTSTATUS v4; 
  _PI_DM_OBJECT_MANAGER *ObjectManagerForObjectType; 
  _ETHREAD *CurrentThread; 
  INT64 v7; 
  _PI_DM_OBJECT *v8; 
  _PI_DM_OBJECT *Buffer; 

  Buffer = (_PI_DM_OBJECT *)Object;
  v4 = 0;
  ObjectManagerForObjectType = PiDmGetObjectManagerForObjectType((_PNP_OBJECT_TYPE)ObjectType);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquireResourceExclusiveLite((UINT64)ObjectManagerForObjectType, 1, v7);
  v8 = PiDmLookupObject(ObjectManagerForObjectType, ObjectName);
  Buffer = v8;
  if( v8 )
  {
    --v8[3];
    if( !Buffer[3] )
    {
      RtlDeleteElementGenericTableAvl((PRTL_AVL_TABLE)&ObjectManagerForObjectType->ObjectCache[48], &Buffer);
      PiDmObjectRelease(Buffer);
    }
  }
  else
  {
    v4 = -1073741772;
  }
  ExReleaseResourceLite((PERESOURCE)ObjectManagerForObjectType);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v4;
}

Referenced by:

IopProcessSetInterfaceState
IopRegisterDeviceInterface
PiDmListInitEnumCallback
PiPnpRtlCmActionCallback
PiPnpRtlFreeInstallerClassChangeInfo
PiPnpRtlObjectEventWorker