PnpDelayedRemoveWorker

void __fastcall PnpDelayedRemoveWorker(PVOID P){
  INT64 v2; 
  PENDING_RELATIONS_LIST_ENTRY **v3; 
  PENDING_RELATIONS_LIST_ENTRY *v4; 
  PENDING_RELATIONS_LIST_ENTRY ***v5; 
  _QWORD *v6; 
  PENDING_RELATIONS_LIST_ENTRY *v7; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  PENDING_RELATIONS_LIST_ENTRY *Entry; 
  PENDING_RELATIONS_LIST_ENTRY **p_Entry; 

  p_Entry = &Entry;
  Entry = (PENDING_RELATIONS_LIST_ENTRY *)&Entry;
  PpDevNodeLockTree(PPL_TREEOP_ALLOW_READS);
  *(&PnpReplaceEvent + 1016) = KeGetCurrentThread();
  ExAcquireResourceExclusiveLite((UINT64)&PnpReplaceEvent + 6176, 1, v2);
  v3 = (PENDING_RELATIONS_LIST_ENTRY **)*(&PnpReplaceEvent + 788);
  if( (_UNKNOWN *)*(&PnpReplaceEvent + 788) != (_UNKNOWN *)((char *)&PnpReplaceEvent + 6304) )
  {
    do
    {
      v4 = *v3;
      if( *((_BYTE *)v3 + 104) )
      {
        if( *(_DWORD *)(*(_QWORD *)v3[8] + 8i64) == **(_DWORD **)v3[8] )
        {
          if( *((PENDING_RELATIONS_LIST_ENTRY ***)v4 + 1) != v3
            || (v5 = (PENDING_RELATIONS_LIST_ENTRY ***)v3[1], *v5 != v3)
            || (*v5 = (PENDING_RELATIONS_LIST_ENTRY **)v4,
                *((_QWORD *)v4 + 1) = v5,
                v6 = p_Entry,
                *p_Entry != (PENDING_RELATIONS_LIST_ENTRY *)&Entry) )
          {
LABEL_19:
            __fastfail(3u);
          }
          v3[1] = (PENDING_RELATIONS_LIST_ENTRY *)p_Entry;
          *v3 = (PENDING_RELATIONS_LIST_ENTRY *)&Entry;
          *v6 = v3;
          p_Entry = v3;
        }
        else
        {
          *((_BYTE *)v3 + 104) = 0;
        }
      }
      v3 = (PENDING_RELATIONS_LIST_ENTRY **)v4;
    }
    while( v4 != (PENDING_RELATIONS_LIST_ENTRY *)((char *)&PnpReplaceEvent + 6304) );
  }
  byte_140C50311 = 0;
  ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6176));
  while( 1 )
  {
    v7 = Entry;
    if( Entry == (PENDING_RELATIONS_LIST_ENTRY *)&Entry )
      break;
    if( *((PENDING_RELATIONS_LIST_ENTRY ***)Entry + 1) != &Entry )
      goto LABEL_19;
    v8 = *(_QWORD *)Entry;
    if( *(PENDING_RELATIONS_LIST_ENTRY **)(*(_QWORD *)Entry + 8i64) != Entry )
      goto LABEL_19;
    Entry = *(PENDING_RELATIONS_LIST_ENTRY **)Entry;
    *(_QWORD *)(v8 + 8) = &Entry;
    if( P )
    {
      *((_QWORD *)P + 2) = v7;
      *((_QWORD *)P + 1) = *((_QWORD *)v7 + 7);
      v9 = *((_QWORD *)v7 + 7);
      if( v9 )
        v10 = *(_QWORD *)(*(_QWORD *)(v9 + 312) + 40i64);
      else
        v10 = 0i64;
      *(_QWORD *)P = v10;
      *((_QWORD *)P + 3) = PnpEnableWatchdog(3, (__int64)P);
    }
    PipRemoveDevicesInRelationList(v7);
    if( P )
    {
      v11 = *((_QWORD *)P + 3);
      if( v11 )
      {
        PnpDisableWatchdog(v11);
        *((_QWORD *)P + 3) = 0i64;
      }
    }
  }
  *(&PnpReplaceEvent + 1016) = 0i64;
  if( P )
    ExFreePoolWithTag(P, 0x54706E50u);
  PpDevNodeUnlockTree(PPL_TREEOP_ALLOW_READS);
}

Referenced by:

PnpChainDereferenceComplete