PnpUnlinkDeviceRemovalRelations

void __fastcall PnpUnlinkDeviceRemovalRelations(__int64 a1, _RELATION_LIST *a2){
  _ETHREAD *CurrentThread; 
  __int64 v4; 
  UINT8 v5; 
  bool v6; 
  INT64 v7; 
  char *DeviceNode; 
  INT64 v9; 
  __int64 v10; 
  _DEVICE_OBJECT *DeviceObject; 
  _RELATION_LIST_MARKER Marker; 
  _DEVICE_RELATION_LEVEL RelationLevel; 
  HPNPOPCTX *hPnpOpCtx; 

  DeviceObject = 0i64;
  v10 = 0i64;
  hPnpOpCtx = 0i64;
  PpDevNodeLockTree(PPL_TREEOP_BLOCK_READS_FROM_ALLOW);
  if( a2 && a2->Sorted )
  {
    Marker.Counter = 0;
    Marker.Mode = ENUMERATE_FORWARD;
    while( IopEnumerateRelations(a2, &Marker, &DeviceObject, &RelationLevel, 0i64) )
    {
      DeviceNode = (char *)DeviceObject->DeviceObjectExtension->DeviceNode;
      IopIsDescendantNode(a2, DeviceObject);
      if( (unsigned int)(*((_DWORD *)DeviceNode + 75) - 787) <= 1 )
      {
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        v4 = *((_QWORD *)DeviceNode + 2);
        --CurrentThread->Tcb.KernelApcDisable;
        ExAcquireResourceExclusiveLite((UINT64)&PnpReplaceEvent + 6688, 1, v9);
        PnpCleanupDeviceRegistryValues((_UNICODE_STRING *)(DeviceNode + 40));
        v5 = PpDevNodeRemoveFromTree((_DEVICE_NODE *)DeviceNode);
        ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
        KeLeaveCriticalRegion();
        if( v5 )
        {
          v6 = *((_QWORD *)DeviceNode + 6) == 0i64;
          *((_QWORD *)DeviceNode + 81) = v4;
          if( !v6 )
          {
            PiPnpRtlBeginOperation(&hPnpOpCtx);
            v10 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
            PnpSetObjectProperty(
              *(&stru_140CF2E80 + 607),
              *((_QWORD *)DeviceNode + 6),
              1u,
              0i64,
              0i64,
              (__int64)&DEVPKEY_Device_LastRemovalDate,
              16,
              (__int64)&v10,
              8,
              0);
            PnpRaiseNtPlugPlayDevicePropertyChangeEvent(v7, *((WCHAR **)DeviceNode + 6), 1);
            PnpSetDeviceInstanceRemovalEvent((__int64)DeviceNode);
            if( hPnpOpCtx )
            {
              PiPnpRtlEndOperation(hPnpOpCtx);
              hPnpOpCtx = 0i64;
            }
          }
          if( *((_DWORD *)DeviceNode + 75) == 788 )
            IopRemoveCurrentRelationFromList(&a2->DeviceObjectList, DeviceObject, &Marker);
          HalPutDmaAdapter((PADAPTER_OBJECT)DeviceObject);
        }
      }
    }
  }
  PpDevNodeUnlockTree(PPL_TREEOP_BLOCK_READS_FROM_ALLOW);
}

Referenced by:

PiEventRemovalPostSurpriseRemove
PipRemoveDevicesInRelationList
PnpProcessQueryRemoveAndEject