PiDmListEnumObjectsWithCallback

__int64 __fastcall PiDmListEnumObjectsWithCallback(
        int a1,
        ULONG_PTR a2,
        __int64 (__fastcall *a3)(_QWORD, __int64, char *),
        __int64 a4){
  _QWORD *v4; 
  int v5; 
  __int64 v6; 
  __int64 v10; 
  _ETHREAD *CurrentThread; 
  ULONG_PTR v12; 
  unsigned int v13; 
  _QWORD *PoolWithTag; 
  _QWORD *v15; 
  volatile signed __int32 *v16; 
  unsigned int v17; 
  _QWORD *v18; 
  CHAR **v19; 
  char v21; 
  v4 = 0i64;
  v21 = 0;
  v5 = 0;
  v6 = 0i64;
  v10 = 5i64 * a1;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v12 = a2 + PiDmListDefs[5 * a1 + 1];
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockSharedEx(a2, 0i64);
  v13 = *(_DWORD *)(v12 + 16);
  if( v13 )
  {
    PoolWithTag = ExAllocatePoolWithTag(PagedPool, 8i64 * v13, 0x5A706E50ui64);
    v4 = PoolWithTag;
    if( PoolWithTag )
    {
      v15 = *(_QWORD **)v12;
      if( *(_QWORD *)v12 != v12 )
      {
        do
        {
          v16 = (volatile signed __int32 *)((char *)v15 - PiDmListDefs[v10 + 3]);
          PoolWithTag[v6] = v16;
          _InterlockedIncrement(v16 + 2);
          v15 = (_QWORD *)*v15;
          v6 = (unsigned int)(v6 + 1);
        }
        while( v15 != (_QWORD *)v12 );
      }
    }
    else
    {
      v5 = -1073741670;
    }
  }
  ExReleasePushLockEx(a2, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  v17 = 0;
  if( (_DWORD)v6 )
  {
    v18 = v4;
    do
    {
      v5 = a3(*v18, a4, &v21);
      if( v5 < 0 )
        break;
      if( v21 )
        break;
      ++v17;
      ++v18;
    }
    while( v17 < (unsigned int)v6 );
  }
  if( v4 )
  {
    if( (_DWORD)v6 )
    {
      v19 = (CHAR **)v4;
      do
      {
        PiDmObjectRelease(*v19++);
        --v6;
      }
      while( v6 );
    }
    ExFreePoolWithTag(v4, 0x5A706E50u);
  }
  return(unsigned int)v5;
}

Referenced by:

PiDmGetObjectConstraintList
PiPnpRtlApplyMandatoryDeviceContainerFilters
PiPnpRtlCmActionCallback