ObpCreateTypeArray
_OBJECT_TYPE_ARRAY *__stdcall ObpCreateTypeArray(_OBJECT_TYPE *ObjectType){
_ETHREAD *CurrentThread;
ULONG_PTR v3;
_OBJECT_TYPE *Flink;
_OBJECT_TYPE_ARRAY *v5;
unsigned int v6;
__int64 v7;
VOID **PoolWithTag;
__int64 v9;
_OBJECT_TYPE *v10;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
v3 = (_DWORD)ObjectType + 184;
ExAcquirePushLockExclusiveEx(&ObjectType->TypeLock, 0i64);
Flink = (_OBJECT_TYPE *)ObjectType->TypeList.Flink;
v5 = 0i64;
v6 = 0;
if( (_OBJECT_TYPE *)ObjectType->TypeList.Flink != ObjectType )
{
do
{
Flink = (_OBJECT_TYPE *)Flink->TypeList.Flink;
v7 = v6++;
}
while( Flink != ObjectType );
if( v6 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 8 * v7 + 16, 1916887631i64);
v5 = (_OBJECT_TYPE_ARRAY *)PoolWithTag;
if( PoolWithTag )
{
*(_DWORD *)PoolWithTag = v6;
v9 = 0i64;
v10 = (_OBJECT_TYPE *)ObjectType->TypeList.Flink;
while( v10 != ObjectType )
{
*(_QWORD *)&v5[2 * v9 + 2] = v10;
if( !ObReferenceObjectSafe((INT64)&v10->TypeInfo.GenericMapping.GenericWrite) )
*(_QWORD *)&v5[2 * v9 + 2] = 0i64;
v10 = (_OBJECT_TYPE *)v10->TypeList.Flink;
v9 = (unsigned int)(v9 + 1);
}
}
}
}
ExReleasePushLockEx(v3, 0);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
return v5;
}Referenced by:
ObEnumerateObjectsByType
ObGetObjectInformation