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