PiCollapseEnumRequests
UINT8 __stdcall PiCollapseEnumRequests(_LIST_ENTRY *ListHead){
UINT64 v1;
INT64 v3;
_LIST_ENTRY *Blink;
unsigned __int8 v5;
unsigned __int64 v6;
INT64 v7;
_LIST_ENTRY *i;
INT64 *v10;
int v11;
INT64 **v12;
_LIST_ENTRY *v13;
KeAcquireSpinLockRaiseToDpc(&PnpSpinLock, v1);
v3 = PnpEnumerationRequestList;
Blink = ListHead->Blink;
v6 = v5;
if( (INT64 *)PnpEnumerationRequestList != &PnpEnumerationRequestList )
{
do
{
v10 = *(INT64 **)v3;
if( *(_BYTE *)(v3 + 28) )
break;
v11 = *(_DWORD *)(v3 + 24);
if( v11 >= 9 && (v11 <= 10 || v11 == 14) )
{
v12 = *(INT64 ***)(v3 + 8);
if( v10[1] != v3
|| *v12 != (INT64 *)v3
|| (*v12 = v10, v10[1] = (INT64)v12, v13 = ListHead->Blink, v13->Flink != ListHead) )
{
__fastfail(3u);
}
*(_QWORD *)v3 = ListHead;
*(_QWORD *)(v3 + 8) = v13;
v13->Flink = (_LIST_ENTRY *)v3;
ListHead->Blink = (_LIST_ENTRY *)v3;
}
v3 = (INT64)v10;
}
while( v10 != &PnpEnumerationRequestList );
}
KxReleaseSpinLock(&PnpSpinLock);
__writecr8(v6);
for( i = Blink->Flink; i != ListHead; i = i->Flink )
{
LOBYTE(v7) = 1;
PiMarkDeviceTreeForReenumeration((_DEVICE_NODE *)i[1].Flink[19].Blink[2].Blink, v7);
ObfDereferenceObjectWithTag(i[1].Flink, 0x746C6644ui64);
i[1].Flink = 0i64;
}
return Blink != ListHead->Blink;
}Referenced by:
PipProcessDevNodeTree