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