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