PiDmObjectGetCachedObjectReference

NTSTATUS __stdcall PiDmObjectGetCachedObjectReference(
        PNP_OBJECT_TYPE ObjectType,
        WCHAR *ObjectName,
        ULONG_PTR Object,
        _DEVPROPKEY *PropertyKey,
        PI_DM_OBJECT **ReferencedObject){
  __int64 v5; 
  int v8; 
  char v9; 
  const _DEVPROPKEY *v10; 
  unsigned int v11; 
  __int64 v12; 
  unsigned int v13; 
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *v15; 
  int bf_0; 
  __int64 v17; 
  UINT64 CachedKeyCount; 
  _PI_DM_CACHED_PROPERTY_KEY *CachedKeys; 
  _EX_PUSH_LOCK *PushLock; 

  PushLock = *(_EX_PUSH_LOCK **)&Object;
  CachedKeys = 0i64;
  v5 = *(_QWORD *)&Object;
  LODWORD(CachedKeyCount) = 0;
  v8 = -1073741802;
  v9 = 0;
  PiDmGetCacheKeys((_PNP_OBJECT_TYPE)ObjectType, (const _PI_DM_CACHED_PROPERTY_KEY **)&CachedKeys, &CachedKeyCount);
  if( (_DWORD)CachedKeyCount )
  {
    PiDmGetCachedKeyIndex(CachedKeys, CachedKeyCount, v10, (INT64)v10);
    v12 = v11;
    if( v11 < v13 )
    {
      if( !v5 )
      {
        v8 = PiDmGetObject(ObjectType, ObjectName, (PI_DM_OBJECT **)&PushLock);
        if( v8 < 0 )
          return v8;
        v9 = 1;
      }
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.KernelApcDisable;
      v15 = PushLock;
      ExAcquirePushLockSharedEx(PushLock, 0i64);
      bf_0 = v15[3 * v12 + 14]._bf_0;
      if( bf_0 == 6 )
      {
        v17 = v15[3 * v12 + 16]._bf_0;
        *ReferencedObject = (PI_DM_OBJECT *)v17;
        _InterlockedIncrement((volatile signed __int32 *)(v17 + 8));
        LODWORD(v15) = (_DWORD)PushLock;
        v8 = 0;
      }
      else if( bf_0 == 2 )
      {
        v8 = -1073741275;
      }
      else
      {
        v8 = -1073741802;
      }
      ExReleasePushLockEx((ULONG_PTR)v15, 0);
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      if( v9 )
        PiDmObjectRelease((_PI_DM_OBJECT *)PushLock);
    }
  }
  return v8;
}

Referenced by:

PiDmGetReferencedObjectFromProperty
PiDmObjectGetCachedObjectProperty