PiCollapseEnumRequests
bool __fastcall PiCollapseEnumRequests(_LIST_ENTRY *a1){
unsigned __int8 v2;
__int64 *v3;
_LIST_ENTRY *Blink;
unsigned __int64 v5;
_LIST_ENTRY *i;
__int64 *v8;
int v9;
__int64 **v10;
_LIST_ENTRY *v11;
v2 = KeAcquireSpinLockRaiseToDpc((UINT64 *)&PnpReplaceEvent + 50);
v3 = (__int64 *)*(&PnpReplaceEvent + 48);
Blink = a1->Blink;
v5 = v2;
if( (_UNKNOWN *)*(&PnpReplaceEvent + 48) != (_UNKNOWN *)((char *)&PnpReplaceEvent + 384) )
{
do
{
v8 = (__int64 *)*v3;
if( *((_BYTE *)v3 + 28) )
break;
v9 = *((_DWORD *)v3 + 6);
if( v9 >= 9 && (v9 <= 10 || v9 == 14) )
{
v10 = (__int64 **)v3[1];
if( (__int64 *)v8[1] != v3
|| *v10 != v3
|| (*v10 = v8, v8[1] = (__int64)v10, v11 = a1->Blink, v11->Flink != a1) )
{
__fastfail(3u);
}
*v3 = (__int64)a1;
v3[1] = (__int64)v11;
v11->Flink = (_LIST_ENTRY *)v3;
a1->Blink = (_LIST_ENTRY *)v3;
}
v3 = v8;
}
while( v8 != (__int64 *)((char *)&PnpReplaceEvent + 384) );
}
KxReleaseSpinLock((UINT64 *)&PnpReplaceEvent + 50);
__writecr8(v5);
for( i = Blink->Flink; i != a1; i = i->Flink )
{
PiMarkDeviceTreeForReenumeration((_DEVICE_NODE *)i[1].Flink[19].Blink[2].Blink, 1u);
ObfDereferenceObjectWithTag(i[1].Flink, 0x746C6644ui64);
i[1].Flink = 0i64;
}
return Blink != a1->Blink;
}Referenced by:
PipProcessDevNodeTree