PiDmObjectGetCachedObjectReference

__int64 __fastcall PiDmObjectGetCachedObjectReference(int a1, wchar_t *a2, ULONG_PTR a3, __int64 a4, _QWORD *a5){
  int Object; 
  char v9; 
  __int64 v10; 
  unsigned int CachedKeyIndex; 
  __int64 v12; 
  unsigned int v13; 
  _ETHREAD *CurrentThread; 
  ULONG_PTR v15; 
  int v16; 
  __int64 v17; 
  unsigned int v19; 
  DEVPROPKEY **v20; 
  ULONG_PTR BugCheckParameter2; 
  BugCheckParameter2 = a3;
  v20 = 0i64;
  v19 = 0;
  Object = -1073741802;
  v9 = 0;
  PiDmGetCacheKeys(a1, &v20, &v19);
  if( v19 )
  {
    CachedKeyIndex = PiDmGetCachedKeyIndex((__int64)v20, v19, v10);
    v12 = CachedKeyIndex;
    if( CachedKeyIndex < v13 )
    {
      if( !a3 )
      {
        Object = PiDmGetObject((unsigned int)a1, a2, (INT64 *)&BugCheckParameter2);
        if( Object < 0 )
          return(unsigned int)Object;
        v9 = 1;
      }
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 242);
      v15 = BugCheckParameter2;
      ExAcquirePushLockSharedEx(BugCheckParameter2, 0i64);
      v16 = *(_DWORD *)(v15 + 24 * v12 + 112);
      if( v16 == 6 )
      {
        v17 = *(_QWORD *)(v15 + 24 * v12 + 128);
        *a5 = v17;
        _InterlockedIncrement((volatile signed __int32 *)(v17 + 8));
        v15 = BugCheckParameter2;
        Object = 0;
      }
      else if( v16 == 2 )
      {
        Object = -1073741275;
      }
      else
      {
        Object = -1073741802;
      }
      ExReleasePushLockEx(v15, 0i64);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      if( v9 )
        PiDmObjectRelease((CHAR *)BugCheckParameter2);
    }
  }
  return(unsigned int)Object;
}

Referenced by:

PiDmGetReferencedObjectFromProperty
PiDmObjectGetCachedObjectProperty