PiDmAddCacheReferenceForObject
NTSTATUS __stdcall PiDmAddCacheReferenceForObject(PNP_OBJECT_TYPE ObjectType, WCHAR *ObjectName, PI_DM_OBJECT **Object){
_PI_DM_OBJECT_MANAGER *ObjectManagerForObjectType;
_ETHREAD *CurrentThread;
_PI_DM_OBJECT_MANAGER *v8;
INT64 v9;
int v10;
_PI_DM_OBJECT **v11;
_PI_DM_OBJECT *v12;
VOID *inserted;
_PI_DM_OBJECT *Objecta;
_TABLE_SEARCH_RESULT SearchResult;
VOID *NodeOrParent;
_PI_DM_OBJECT *Buffer;
_PI_DM_OBJECT ComparisonObject[28];
memset(ComparisonObject, 0i64, sizeof(ComparisonObject));
NodeOrParent = 0i64;
SearchResult = TableEmptyTree;
Objecta = 0i64;
Buffer = ComparisonObject;
ObjectManagerForObjectType = PiDmGetObjectManagerForObjectType((_PNP_OBJECT_TYPE)ObjectType);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v8 = ObjectManagerForObjectType;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceExclusiveLite((UINT64)ObjectManagerForObjectType, 1, v9);
v10 = PiDmInitializeComparisonObject(ObjectName, ObjectType, ComparisonObject);
if( v10 < 0 )
goto LABEL_14;
v11 = (_PI_DM_OBJECT **)RtlLookupElementGenericTableFullAvl(
(_RTL_AVL_TABLE *)&v8->ObjectCache[48],
&Buffer,
&NodeOrParent,
&SearchResult);
if( v11 )
v12 = *v11;
else
v12 = 0i64;
Objecta = v12;
if( v12 )
{
++v12[3];
goto LABEL_6;
}
v10 = PiDmObjectCreate(ObjectType, ObjectName, &Objecta);
if( v10 < 0 )
{
LABEL_14:
v12 = Objecta;
goto LABEL_6;
}
inserted = RtlInsertElementGenericTableFullAvl(
(_RTL_AVL_TABLE *)&v8->ObjectCache[48],
&Objecta,
8ui64,
0i64,
NodeOrParent,
SearchResult);
v12 = Objecta;
if( inserted )
{
Objecta[3] = 1;
}
else
{
PiDmObjectRelease(Objecta);
v12 = 0i64;
v10 = -1073741670;
Objecta = 0i64;
}
LABEL_6:
if( Object )
{
*Object = v12;
if( v12 )
_InterlockedIncrement(v12 + 2);
}
ExReleaseResourceLite((PERESOURCE)v8);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v10;
}Referenced by:
IopProcessSetInterfaceState
IopRegisterDeviceInterface
PiDmListInitEnumCallback
PiPnpRtlCmActionCallback
PiPnpRtlEnsureObjectCached
PiPnpRtlGatherInstallerClassChangeInfo