PnpSurpriseRemoveLockedDeviceNode

void __fastcall PnpSurpriseRemoveLockedDeviceNode(ULONG_PTR BugCheckParameter4, UINT64 a2, _PNP_DEVNODE_STATE *a3){
  int v3; 
  DEVICE_OBJECT *v4; 
  int v5; 
  int v6; 
  int v8; 
  __int64 v9; 
  int v10; 
  NTSTATUS v11; 
  _PNP_DEVNODE_STATE *v12; 
  _DEVICE_NODE *v13; 
  _PNP_DEVNODE_STATE v14; 
  INT64 v15; 
  INT64 v16; 
  INT64 v17; 
  __int64 v18; 
  INT64 v19; 
  int v20; 
  __int64 v21; 
  _PNP_DEVNODE_STATE *v22; 
  struct _DMA_ADAPTER *v23; 
  __int128 v24; 
  INT64 v25; 
  INT64 v26; 
  INT64 v27; 
  INT64 v28; 
  v3 = *(_DWORD *)(BugCheckParameter4 + 300);
  v4 = *(DEVICE_OBJECT **)(BugCheckParameter4 + 32);
  v5 = (int)a3;
  v6 = a2;
  v8 = 768;
  v24 = 0i64;
  if( v3 == 782 || v3 == 783 )
  {
    v8 = v3;
    PipRestoreDevNodeState(BugCheckParameter4, a2);
    v3 = *(_DWORD *)(BugCheckParameter4 + 300);
  }
  *(_WORD *)(BugCheckParameter4 + 466) = 0;
  if( v3 == 785 && v8 == 782 )
  {
    PipClearDevNodeFlags((_DEVICE_NODE *)BugCheckParameter4, 0x10ui64);
    PipSetDevNodeState((_DEVICE_NODE *)BugCheckParameter4, DeviceNodeDeletePendingCloses, v22);
    return;
  }
  v9 = *(_QWORD *)(BugCheckParameter4 + 8);
  if( v9 )
  {
    do
    {
      v20 = *(_DWORD *)(v9 + 396);
      v21 = *(_QWORD *)v9;
      if( (v20 & 0x10) != 0 )
      {
        v20 &= ~0x10u;
        *(_DWORD *)(v9 + 396) = v20;
      }
      if( *(_QWORD *)(v9 + 416) || *(_QWORD *)(v9 + 544) || (v20 & 0x40) != 0 )
        IopReleaseDeviceResources(v9, 0);
      PipSetDevNodeState((_DEVICE_NODE *)v9, DeviceNodeDeletePendingCloses, a3);
      v9 = v21;
    }
    while( v21 );
  }
  if( v3 == 778 && (*(_DWORD *)(BugCheckParameter4 + 396) & 0x1000000) != 0 )
  {
    PnpMarkDeviceForRemove((ULONG_PTR)v4, 1, (ULONG_PTR *)&v24);
    PnpUnlockMountableDevice(v4);
    PipClearDevNodeFlags((_DEVICE_NODE *)BugCheckParameter4, 0x1000000ui64);
  }
  v10 = *(_DWORD *)(BugCheckParameter4 + 300);
  if( v10 < 769 || v10 > 770 && (v10 <= 776 || v10 == 778 || (unsigned int)(v10 - 785) > 3) )
  {
    v11 = IopRemoveDevice(v4, 0x17ui64);
    PnpDisableDeviceInterfaces((UNICODE_STRING *)(BugCheckParameter4 + 40));
    if( v11 >= 0 )
      IopReleaseDeviceResources(BugCheckParameter4, 0);
    v13 = (_DEVICE_NODE *)BugCheckParameter4;
    if( (*(_DWORD *)(BugCheckParameter4 + 396) & 0x10) == 0 )
    {
      v14 = DeviceNodeDeletePendingCloses;
LABEL_13:
      PipSetDevNodeState(v13, v14, v12);
      goto LABEL_14;
    }
    PipSetDevNodeState((_DEVICE_NODE *)BugCheckParameter4, DeviceNodeRemovePendingCloses, v12);
    v14 = DeviceNodeAwaitingQueuedDeletion;
    if( v8 == 782 )
    {
      v13 = (_DEVICE_NODE *)BugCheckParameter4;
      goto LABEL_13;
    }
  }
LABEL_14:
  if( v3 == 778 )
  {
    v23 = (struct _DMA_ADAPTER *)*((_QWORD *)&v24 + 1);
    if( *((_QWORD *)&v24 + 1) )
    {
      IopDecrementDeviceObjectHandleCount(*((_DEVICE_OBJECT **)&v24 + 1));
      HalPutDmaAdapter(v23);
    }
  }
  if( v6 && (*(_DWORD *)(BugCheckParameter4 + 396) & 0x6000) == 0 )
    PipSetDevNodeProblem(BugCheckParameter4, v6, v5);
  *(_DWORD *)(BugCheckParameter4 + 704) &= ~2u;
  if( (*(_DWORD *)(BugCheckParameter4 + 396) & 0x10) == 0 )
  {
    PnpAcquireDependencyRelationsLock(1u);
    v18 = *(_QWORD *)(BugCheckParameter4 + 32);
    if( v18 )
      v19 = *(_QWORD *)(*(_QWORD *)(v18 + 312) + 80i64);
    else
      v19 = 0i64;
    if( v19 )
      PipConvertResolutionsToReservations(v19, v15, v16, v17, v24, *((INT64 *)&v24 + 1), v25, v26, v27, v28);
    ExReleaseResourceLite(&PiDependencyRelationsLock);
    PpDevNodeUnlockTree(0);
    PipProcessRebuildPowerRelationsQueue();
  }
  PiDmaGuardProcessPostRemove(BugCheckParameter4);
}

Referenced by:

PnpDeleteLockedDeviceNode