PiDmObjectUpdateCachedObjectProperty
VOID __stdcall PiDmObjectUpdateCachedObjectProperty(
UINT64 a1,
WCHAR *a2,
INT64 a3,
INT64 a4,
INT64 PropertyKey,
INT64 PropertyType,
WCHAR *buf2,
UINT64 PropertySize){
bool v8;
unsigned int v10;
INT64 v11;
INT64 v12;
unsigned int v13;
__int64 v14;
unsigned int v15;
_ETHREAD *CurrentThread;
_PI_DM_OBJECT *v17;
__int64 v18;
WCHAR *v19;
unsigned int v20;
int ObjectProperty;
void *v22;
int v23;
unsigned int v24;
_ETHREAD *v25;
UINT64 count;
VOID *buf1;
_PI_DM_OBJECT *Object;
_PI_DM_CACHED_PROPERTY_KEY *CachedKeys;
_PI_DM_CACHED_PROPERTY_DATA *v30;
int v31;
int v32;
UINT64 CachedKeysCount;
v32 = HIDWORD(a3);
Object = 0i64;
v8 = 0;
CachedKeys = 0i64;
LODWORD(CachedKeysCount) = 0;
v10 = a1;
v31 = 0;
buf1 = 0i64;
LODWORD(count) = 0;
if( !a4 )
{
PiDmGetCacheKeys((_PNP_OBJECT_TYPE)a1, (const _PI_DM_CACHED_PROPERTY_KEY **)&CachedKeys, &CachedKeysCount);
if( (_DWORD)CachedKeysCount )
{
v12 = PropertyKey;
PiDmGetCachedKeyIndex(CachedKeys, CachedKeysCount, (const _DEVPROPKEY *)PropertyKey, v11);
v14 = v13;
if( v13 < v15 && PiDmGetObject(v10, a2, &Object) >= 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v17 = Object;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Object, 0i64);
v18 = 3 * v14;
v19 = buf2;
v20 = v17[2 * v18 + 28];
v30 = &v17[2 * v18 + 28];
LODWORD(CachedKeysCount) = v20;
if( v20 <= 1 )
{
PiDmCacheDataEncode(
(unsigned int)PropertyType,
(UINT8 *)buf2,
(unsigned int)PropertySize,
(unsigned int)CachedKeys[2 * v18 + 2],
CachedKeys[2 * v18 + 3],
&v17[2 * v18 + 28]);
v8 = (_DWORD)CachedKeysCount == 0;
}
ExReleasePushLockEx((ULONG_PTR)v17, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( !v8 )
goto LABEL_9;
ObjectProperty = PnpGetObjectProperty(
0x5A706E50u,
(unsigned int)PropertySize,
(INT64)a2,
v10,
0i64,
0i64,
v12,
(INT64)&v31,
(__int64)&buf1,
(__int64)&count);
v22 = buf1;
v23 = ObjectProperty;
if( ObjectProperty == -1073741275 )
{
v31 = 0;
v23 = 0;
if( buf1 )
{
ExFreePoolWithTag(buf1, 0x5A706E50u);
v22 = 0i64;
buf1 = 0i64;
}
v24 = 0;
}
else
{
v24 = count;
}
if( v23 < 0 || v31 != (_DWORD)PropertyType || v24 != (_DWORD)PropertySize )
goto LABEL_26;
if( v22 )
{
if( !v19 )
goto LABEL_26;
}
else if( v19 )
{
goto LABEL_26;
}
if( !v24 )
goto LABEL_20;
if( !v22 )
{
LABEL_9:
PiDmObjectRelease(Object);
return;
}
if( !memcmp(v22, v19, v24) )
{
LABEL_20:
if( v22 )
ExFreePoolWithTag(v22, 0x5A706E50u);
goto LABEL_9;
}
LABEL_26:
v25 = (_ETHREAD *)KeGetCurrentThread();
--v25->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Object, 0i64);
PiDmCacheDataFree(v30);
ExReleasePushLockEx((ULONG_PTR)Object, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v22 = buf1;
goto LABEL_20;
}
}
}
}Referenced by:
PiDmObjectUpdateCachedCmProperty
PiPnpRtlObjectActionCallback