PiDmObjectGetCachedObjectPropertyData
NTSTATUS __stdcall PiDmObjectGetCachedObjectPropertyData(
PNP_OBJECT_TYPE ObjectType,
WCHAR *ObjectName,
PVOID Object,
_DEVPROPKEY *PropertyKey,
UINT64 *PropertyType,
_GUID *PropertyBuffer,
UINT64 BufferSize,
UINT64 *PropertySize){
int v11;
char v12;
const _DEVPROPKEY *v13;
unsigned int v14;
__int64 v15;
unsigned int v16;
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *v18;
PI_DM_CACHED_PROPERTY_DATA *v19;
UINT64 CachedKeyCount;
_PI_DM_CACHED_PROPERTY_KEY *CachedKeys;
_EX_PUSH_LOCK *PushLock;
PushLock = (_EX_PUSH_LOCK *)Object;
CachedKeys = 0i64;
LODWORD(CachedKeyCount) = 0;
v11 = -1073741802;
v12 = 0;
PiDmGetCacheKeys((_PNP_OBJECT_TYPE)ObjectType, (const _PI_DM_CACHED_PROPERTY_KEY **)&CachedKeys, &CachedKeyCount);
if( (_DWORD)CachedKeyCount )
{
PiDmGetCachedKeyIndex(CachedKeys, CachedKeyCount, v13, (INT64)v13);
v15 = v14;
if( v14 < v16 )
{
if( !Object )
{
v11 = PiDmGetObject(ObjectType, ObjectName, (PI_DM_OBJECT **)&PushLock);
if( v11 < 0 )
return v11;
v12 = 1;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v18 = PushLock;
ExAcquirePushLockSharedEx(PushLock, 0i64);
v19 = (PI_DM_CACHED_PROPERTY_DATA *)&v18[2 * v15 + 14 + v15];
if( (unsigned int)*v19 <= 1 )
v11 = -1073741802;
else
v11 = PiDmCacheDataDecode(v19, PropertyType, (UINT8 *)PropertyBuffer, (unsigned int)BufferSize, PropertySize);
ExReleasePushLockEx((ULONG_PTR)v18, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( v12 )
PiDmObjectRelease((_PI_DM_OBJECT *)PushLock);
}
}
return v11;
}Referenced by:
PiDmObjectGetCachedObjectProperty