PiDmEnumObjectsWithCallback

NTSTATUS __fastcall PiDmEnumObjectsWithCallback(
        PNP_OBJECT_TYPE ObjectType,
        INT64 a2,
        INT64 *EnumCallback,
        PI_DM_OBJECT *a4,
        VOID *a5,
        UINT8 *a6,
        VOID *Context){
  NTSTATUS v10; 
  _PI_DM_OBJECT_MANAGER *ObjectManagerForObjectType; 
  UINT64 v12; 
  const wchar_t *v13; 
  _ETHREAD *CurrentThread; 
  _RTL_BALANCED_LINKS *v15; 
  _EX_PUSH_LOCK *Parent; 
  _ETHREAD *v17; 
  _RTL_BALANCED_LINKS *v18; 
  VOID **v20; 
  VOID **v21; 
  UINT64 *MatchData; 
  UINT64 NextFlag; 
  __int64 RestartKey[2]; 
  __int64 v25[14]; 

  v10 = 0;
  memset(v25, 0i64, sizeof(v25));
  RestartKey[0] = 0i64;
  HIDWORD(MatchData) = 0;
  NextFlag = (UINT64)v25;
  LOBYTE(MatchData) = 0;
  ObjectManagerForObjectType = PiDmGetObjectManagerForObjectType((_PNP_OBJECT_TYPE)ObjectType);
  LODWORD(v25[3]) = 0;
  v12 = (UINT64)ObjectManagerForObjectType;
  HIDWORD(v25[3]) = ObjectType;
  v13 = L"\\\\?\\";
  if( ObjectType != 3 )
    v13 = (const wchar_t *)&dword_1407CF120;
  v25[2] = (__int64)v13;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquireResourceSharedLite(v12, 1);
  v15 = RtlEnumerateGenericTableLikeADirectory(
          (_RTL_AVL_TABLE *)(v12 + 104),
          0i64,
          0i64,
          0i64,
          RestartKey,
          (char *)&MatchData + 4,
          (UINT64)&NextFlag,
          v20,
          MatchData,
          (VOID *)NextFlag);
  if( v15 )
  {
    Parent = (_EX_PUSH_LOCK *)v15->Parent;
    _InterlockedIncrement((volatile signed __int32 *)&v15->Parent->LeftChild);
  }
  else
  {
    Parent = 0i64;
  }
  ExReleaseResourceLite((PERESOURCE)v12);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  while( Parent )
  {
    if( PiDmObjectIsEnumerable(Parent) )
      v10 = ((__int64(__fastcall *)(_EX_PUSH_LOCK *, INT64 *, UINT64 **))a2)(Parent, EnumCallback, &MatchData);
    if( v10 < 0 || (_BYTE)MatchData )
    {
      PiDmObjectRelease((_PI_DM_OBJECT *)Parent);
      return v10;
    }
    NextFlag = (UINT64)Parent;
    v17 = (_ETHREAD *)KeGetCurrentThread();
    --v17->Tcb.KernelApcDisable;
    ExAcquireResourceSharedLite(v12, 1);
    v18 = RtlEnumerateGenericTableLikeADirectory(
            (_RTL_AVL_TABLE *)(v12 + 104),
            0i64,
            0i64,
            (VOID *)1,
            RestartKey,
            (char *)&MatchData + 4,
            (UINT64)&NextFlag,
            v21,
            MatchData,
            (VOID *)NextFlag);
    if( v18 )
    {
      Parent = (_EX_PUSH_LOCK *)v18->Parent;
      _InterlockedIncrement((volatile signed __int32 *)&v18->Parent->LeftChild);
    }
    else
    {
      Parent = 0i64;
    }
    ExReleaseResourceLite((PERESOURCE)v12);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    PiDmObjectRelease((_PI_DM_OBJECT *)NextFlag);
  }
  return v10;
}

Referenced by:

PiDmGetObjectList
PiDmListInit
PpDevCfgInit