PiDmListAddList

VOID __fastcall PiDmListAddList(INT64 a1, UINT64 a2, INT64 a3, UINT64 a4){
  VOID *ObjectManagerForObjectType; 
  UINT64 v7; 
  _ETHREAD *CurrentThread; 
  VOID *v9; 
  _QWORD **v10; 
  _ETHREAD *v11; 
  _QWORD *i; 
  UINT64 v13; 
  _ETHREAD *v14; 
  _ETHREAD *v15; 
  ObjectManagerForObjectType = PiDmGetObjectManagerForObjectType(*(unsigned int *)(a2 + 28));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v9 = ObjectManagerForObjectType;
  v10 = (_QWORD **)(v7 + 88);
  if( a2 >= v7 )
  {
    --*((_WORD *)CurrentThread + 242);
    if( a2 > v7 )
    {
      ExAcquirePushLockSharedEx(a4, 0i64);
      v14 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v14 + 242);
    }
    ExAcquirePushLockExclusiveEx(a2, 0i64);
  }
  else
  {
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockExclusiveEx(a2, 0i64);
    v11 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v11 + 242);
    ExAcquirePushLockSharedEx(a4, 0i64);
  }
  for( i = *v10; i != v10; i = (_QWORD *)*i )
  {
    v15 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v15 + 242);
    ExAcquirePushLockSharedEx((UINT64)(i - 8), 0i64);
    PiDmListAddObjectWorker(2i64, v9, a2, i - 8, 0i64);
    ExReleasePushLockEx((UINT64)(i - 8), 0i64);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  if( a2 >= a4 )
  {
    if( a2 > a4 )
    {
      ExReleasePushLockEx(a2, 0i64);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      v13 = a4;
      goto LABEL_8;
    }
  }
  else
  {
    ExReleasePushLockEx(a4, 0i64);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  v13 = a2;
LABEL_8:
  ExReleasePushLockEx(v13, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}

Referenced by:

PiPnpRtlCmActionCallback