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