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