PnpChainDereferenceComplete

VOID __fastcall PnpChainDereferenceComplete(
        _DEVICE_OBJECT *PhysicalDeviceObject,
        UINT64 OnCleanStack,
        INT64 a3,
        INT64 a4){
  _ETHREAD *CurrentThread; 
  int v5; 
  PVOID *i; 
  int *v8; 
  _QWORD *v9; 
  int v10; 
  int v11; 
  __int64 v12; 
  bool v13; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v5 = OnCleanStack;
  --*((_WORD *)CurrentThread + 242);
  ExAcquireResourceExclusiveLite(&IopSurpriseRemoveListLock, 1u);
  for( i = (PVOID *)IopPendingSurpriseRemovals; ; i = (PVOID *)*i )
  {
    if( i == &IopPendingSurpriseRemovals )
      goto LABEL_14;
    if( !*((_BYTE *)i + 104) && (int)IopSetRelationsTag((int **)i[8], (__int64)PhysicalDeviceObject) >= 0 )
    {
      v8 = *(int **)i[8];
      v9 = i[7];
      v10 = v8[2];
      v11 = *v8;
      v12 = v9 ? *(_QWORD *)(v9[39] + 40i64) : 0i64;
      if( v10 == v11 && *(_DWORD *)(v12 + 300) != 782 )
        break;
    }
  }
  v13 = PnpDelayedRemovePending == 0;
  *((_BYTE *)i + 104) = 1;
  if( !v13 )
  {
LABEL_14:
    ExReleaseResourceLite(&IopSurpriseRemoveListLock);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    return;
  }
  PnpDelayedRemovePending = 1;
  ExReleaseResourceLite(&IopSurpriseRemoveListLock);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  if( v5 && *((PEPROCESS *)KeGetCurrentThread() + 23) == PsInitialSystemProcess )
  {
    PnpDelayedRemoveWorker(0i64);
  }
  else
  {
    PnpDelayedRemoveWorkItem.Parameter = 0i64;
    PnpDelayedRemoveWorkItem.List.Flink = 0i64;
    PnpDelayedRemoveWorkItem.WorkerRoutine = (void(__fastcall *)(void *))PnpDelayedRemoveWorker;
    ExQueueWorkItem(&PnpDelayedRemoveWorkItem, DelayedWorkQueue);
  }
}

Referenced by:

IopCompleteUnloadOrDelete
PnpIsChainDereferenced