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