PiDmEnumObjectsWithCallback
__int64 __fastcall PiDmEnumObjectsWithCallback(int a1, __int64 (__fastcall *a2)(void *, __int64, char *), __int64 a3){
int v6;
VOID *ObjectManagerForObjectType;
BOOL v8;
VOID *v9;
const wchar_t *v10;
_ETHREAD *CurrentThread;
PVOID v12;
void *v13;
BOOL v14;
_ETHREAD *v15;
PVOID v16;
char v18[4];
ULONG DeleteCount;
PVOID P;
PVOID RestartKey[2];
INT64 result[3];
int v23;
int v24;
v6 = 0;
memset((INT64)result, 0i64);
RestartKey[0] = 0i64;
DeleteCount = 0;
P = result;
v18[0] = 0;
ObjectManagerForObjectType = PiDmGetObjectManagerForObjectType((unsigned int)a1);
v23 = 0;
v9 = ObjectManagerForObjectType;
v24 = a1;
v10 = L"\\\\?\\";
if( a1 != 3 )
v10 = &word_1407CF120;
result[2] = (INT64)v10;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
LOBYTE(v8) = 1;
ExAcquireResourceSharedLite((PERESOURCE)v9, v8);
v12 = RtlEnumerateGenericTableLikeADirectory((PRTL_AVL_TABLE)v9 + 1, 0i64, 0i64, 0, RestartKey, &DeleteCount, &P);
if( v12 )
{
v13 = *(void **)v12;
_InterlockedIncrement((volatile signed __int32 *)(*(_QWORD *)v12 + 8i64));
}
else
{
v13 = 0i64;
}
ExReleaseResourceLite((PERESOURCE)v9);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
while( v13 )
{
if( PiDmObjectIsEnumerable((ULONG_PTR)v13) )
v6 = a2(v13, a3, v18);
if( v6 < 0 || v18[0] )
{
PiDmObjectRelease((CHAR *)v13);
return(unsigned int)v6;
}
P = v13;
v15 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v15 + 242);
LOBYTE(v14) = 1;
ExAcquireResourceSharedLite((PERESOURCE)v9, v14);
v16 = RtlEnumerateGenericTableLikeADirectory((PRTL_AVL_TABLE)v9 + 1, 0i64, 0i64, 1u, RestartKey, &DeleteCount, &P);
if( v16 )
{
v13 = *(void **)v16;
_InterlockedIncrement((volatile signed __int32 *)(*(_QWORD *)v16 + 8i64));
}
else
{
v13 = 0i64;
}
ExReleaseResourceLite((PERESOURCE)v9);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
PiDmObjectRelease((CHAR *)P);
}
return(unsigned int)v6;
}Referenced by:
PiDmGetObjectList
PiDmListInit
PpDevCfgInit