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