PnpUnlinkDeviceRemovalRelations

void __fastcall PnpUnlinkDeviceRemovalRelations(__int64 a1, __int64 a2){
  _ETHREAD *CurrentThread; 
  __int64 v4; 
  UINT8 v5; 
  bool v6; 
  __int64 v7; 
  unsigned __int8(__fastcall *FlushAdapterBuffers)(_DMA_ADAPTER *, _MDL *, void *, void *, unsigned int, unsigned __int8); 
  __int64 v9; 
  PADAPTER_OBJECT DmaAdapter; 
  int a2a; 
  int v12; 
  int a4; 
  PVOID P; 
  DmaAdapter = 0i64;
  v9 = 0i64;
  P = 0i64;
  PpDevNodeLockTree(4);
  if( a2 && *(_BYTE *)(a2 + 8) )
  {
    v12 = 0;
    a2a = 1;
    while( IopEnumerateRelations((unsigned int **)a2, &a2a, &DmaAdapter, &a4, 0i64) )
    {
      FlushAdapterBuffers = DmaAdapter[19].DmaOperations->FlushAdapterBuffers;
      IopIsDescendantNode((int **)a2, (__int64)DmaAdapter);
      if( (unsigned int)(*((_DWORD *)FlushAdapterBuffers + 75) - 787) <= 1 )
      {
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        v4 = *((_QWORD *)FlushAdapterBuffers + 2);
        --*((_WORD *)CurrentThread + 242);
        ExAcquireResourceExclusiveLite(&PnpRegistryDeviceResource, 1u);
        PnpCleanupDeviceRegistryValues((UNICODE_STRING *)((char *)FlushAdapterBuffers + 40));
        v5 = PpDevNodeRemoveFromTree((_DEVICE_NODE *)FlushAdapterBuffers);
        ExReleaseResourceLite(&PnpRegistryDeviceResource);
        KeLeaveCriticalRegion();
        if( v5 )
        {
          v6 = *((_QWORD *)FlushAdapterBuffers + 6) == 0i64;
          *((_QWORD *)FlushAdapterBuffers + 81) = v4;
          if( !v6 )
          {
            PiPnpRtlBeginOperation((__int64 **)&P);
            v9 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
            PnpSetObjectProperty(
              PiPnpRtlCtx,
              *((_QWORD *)FlushAdapterBuffers + 6),
              1u,
              0i64,
              0i64,
              (__int64)&DEVPKEY_Device_LastRemovalDate,
              16,
              (__int64)&v9,
              8u,
              0);
            PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v7, *((_QWORD *)FlushAdapterBuffers + 6), 1);
            PnpSetDeviceInstanceRemovalEvent((__int64)FlushAdapterBuffers);
            if( P )
            {
              PiPnpRtlEndOperation(P);
              P = 0i64;
            }
          }
          if( *((_DWORD *)FlushAdapterBuffers + 75) == 788 )
            IopRemoveCurrentRelationFromList((UINT64 **)a2, (INT64)DmaAdapter, &a2a);
          HalPutDmaAdapter(DmaAdapter);
        }
      }
    }
  }
  PpDevNodeUnlockTree(4);
}

Referenced by:

PiEventRemovalPostSurpriseRemove
PipRemoveDevicesInRelationList
PnpProcessQueryRemoveAndEject