PiDmAddCacheReferenceForObject

NTSTATUS __stdcall PiDmAddCacheReferenceForObject(PNP_OBJECT_TYPE ObjectType, WCHAR *ObjectName, PI_DM_OBJECT **Object){
  _PI_DM_OBJECT_MANAGER *ObjectManagerForObjectType; 
  _ETHREAD *CurrentThread; 
  _PI_DM_OBJECT_MANAGER *v8; 
  INT64 v9; 
  int v10; 
  _PI_DM_OBJECT **v11; 
  _PI_DM_OBJECT *v12; 
  VOID *inserted; 
  _PI_DM_OBJECT *Objecta; 
  _TABLE_SEARCH_RESULT SearchResult; 
  VOID *NodeOrParent; 
  _PI_DM_OBJECT *Buffer; 
  _PI_DM_OBJECT ComparisonObject[28]; 

  memset(ComparisonObject, 0i64, sizeof(ComparisonObject));
  NodeOrParent = 0i64;
  SearchResult = TableEmptyTree;
  Objecta = 0i64;
  Buffer = ComparisonObject;
  ObjectManagerForObjectType = PiDmGetObjectManagerForObjectType((_PNP_OBJECT_TYPE)ObjectType);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v8 = ObjectManagerForObjectType;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquireResourceExclusiveLite((UINT64)ObjectManagerForObjectType, 1, v9);
  v10 = PiDmInitializeComparisonObject(ObjectName, ObjectType, ComparisonObject);
  if( v10 < 0 )
    goto LABEL_14;
  v11 = (_PI_DM_OBJECT **)RtlLookupElementGenericTableFullAvl(
                            (_RTL_AVL_TABLE *)&v8->ObjectCache[48],
                            &Buffer,
                            &NodeOrParent,
                            &SearchResult);
  if( v11 )
    v12 = *v11;
  else
    v12 = 0i64;
  Objecta = v12;
  if( v12 )
  {
    ++v12[3];
    goto LABEL_6;
  }
  v10 = PiDmObjectCreate(ObjectType, ObjectName, &Objecta);
  if( v10 < 0 )
  {
LABEL_14:
    v12 = Objecta;
    goto LABEL_6;
  }
  inserted = RtlInsertElementGenericTableFullAvl(
               (_RTL_AVL_TABLE *)&v8->ObjectCache[48],
               &Objecta,
               8ui64,
               0i64,
               NodeOrParent,
               SearchResult);
  v12 = Objecta;
  if( inserted )
  {
    Objecta[3] = 1;
  }
  else
  {
    PiDmObjectRelease(Objecta);
    v12 = 0i64;
    v10 = -1073741670;
    Objecta = 0i64;
  }
LABEL_6:
  if( Object )
  {
    *Object = v12;
    if( v12 )
      _InterlockedIncrement(v12 + 2);
  }
  ExReleaseResourceLite((PERESOURCE)v8);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v10;
}

Referenced by:

IopProcessSetInterfaceState
IopRegisterDeviceInterface
PiDmListInitEnumCallback
PiPnpRtlCmActionCallback
PiPnpRtlEnsureObjectCached
PiPnpRtlGatherInstallerClassChangeInfo