PiDmRemoveCacheReferenceForObject
INT64 __fastcall PiDmRemoveCacheReferenceForObject(INT64 a1, WCHAR *a2, CHAR *a3){
unsigned int v4;
VOID *ObjectManagerForObjectType;
_ETHREAD *CurrentThread;
INT64 v7;
CHAR *Buffer;
Buffer = a3;
v4 = 0;
ObjectManagerForObjectType = PiDmGetObjectManagerForObjectType(a1);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquireResourceExclusiveLite((ERESOURCE *)ObjectManagerForObjectType, 1u);
v7 = PiDmLookupObject((INT64)ObjectManagerForObjectType, a2);
Buffer = (CHAR *)v7;
if( v7 )
{
--*(_DWORD *)(v7 + 12);
if( !*((_DWORD *)Buffer + 3) )
{
RtlDeleteElementGenericTableAvl((RTL_AVL_TABLE *)ObjectManagerForObjectType + 1, &Buffer);
PiDmObjectRelease(Buffer);
}
}
else
{
v4 = -1073741772;
}
ExReleaseResourceLite((PERESOURCE)ObjectManagerForObjectType);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return v4;
}Referenced by:
IopProcessSetInterfaceState
IopRegisterDeviceInterface
PiDmListInitEnumCallback
PiPnpRtlCmActionCallback
PiPnpRtlFreeInstallerClassChangeInfo
PiPnpRtlObjectEventWorker