PiDmRemoveCacheReferenceForObject
NTSTATUS __stdcall PiDmRemoveCacheReferenceForObject(PNP_OBJECT_TYPE ObjectType, WCHAR *ObjectName, VOID *Object){
NTSTATUS v4;
_PI_DM_OBJECT_MANAGER *ObjectManagerForObjectType;
_ETHREAD *CurrentThread;
INT64 v7;
_PI_DM_OBJECT *v8;
_PI_DM_OBJECT *Buffer;
Buffer = (_PI_DM_OBJECT *)Object;
v4 = 0;
ObjectManagerForObjectType = PiDmGetObjectManagerForObjectType((_PNP_OBJECT_TYPE)ObjectType);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceExclusiveLite((UINT64)ObjectManagerForObjectType, 1, v7);
v8 = PiDmLookupObject(ObjectManagerForObjectType, ObjectName);
Buffer = v8;
if( v8 )
{
--v8[3];
if( !Buffer[3] )
{
RtlDeleteElementGenericTableAvl((PRTL_AVL_TABLE)&ObjectManagerForObjectType->ObjectCache[48], &Buffer);
PiDmObjectRelease(Buffer);
}
}
else
{
v4 = -1073741772;
}
ExReleaseResourceLite((PERESOURCE)ObjectManagerForObjectType);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v4;
}Referenced by:
IopProcessSetInterfaceState
IopRegisterDeviceInterface
PiDmListInitEnumCallback
PiPnpRtlCmActionCallback
PiPnpRtlFreeInstallerClassChangeInfo
PiPnpRtlObjectEventWorker