PnpSurpriseRemoveLockedDeviceNode

void __fastcall PnpSurpriseRemoveLockedDeviceNode(PVOID BugCheckParameter4, UINT64 Problem, NTSTATUS ProblemStatus){
  int v3; 
  _DEVICE_OBJECT *v4; 
  unsigned int v6; 
  int v8; 
  _DEVICE_NODE *v9; 
  int v10; 
  NTSTATUS v11; 
  __int64 v12; 
  INT64 v13; 
  _DEVICE_NODE *v14; 
  _PNP_DEVNODE_STATE v15; 
  __int64 v16; 
  PNP_DEPENDENCY_NODE *v17; 
  unsigned int Flags; 
  _DEVICE_NODE *Sibling; 
  INT64 v20; 
  INT64 v21; 
  _ADAPTER_OBJECT *v22; 
  __int128 v23; 

  v3 = *((_DWORD *)BugCheckParameter4 + 75);
  v4 = (_DEVICE_OBJECT *)*((_QWORD *)BugCheckParameter4 + 4);
  v6 = Problem;
  v8 = 768;
  v23 = 0i64;
  if( v3 == 782 || v3 == 783 )
  {
    v8 = v3;
    PipRestoreDevNodeState((_DEVICE_NODE *)BugCheckParameter4);
    v3 = *((_DWORD *)BugCheckParameter4 + 75);
  }
  *((_WORD *)BugCheckParameter4 + 233) = 0;
  if( v3 == 785 && v8 == 782 )
  {
    PipClearDevNodeFlags((_DEVICE_NODE *)BugCheckParameter4, 0x10ui64);
    PipSetDevNodeState((_DEVICE_NODE *)BugCheckParameter4, DeviceNodeDeletePendingCloses);
    return;
  }
  v9 = (_DEVICE_NODE *)*((_QWORD *)BugCheckParameter4 + 1);
  if( v9 )
  {
    do
    {
      Flags = v9->Flags;
      Sibling = v9->Sibling;
      if( (Flags & 0x10) != 0 )
      {
        Flags &= ~0x10u;
        v9->Flags = Flags;
      }
      if( v9->ResourceList || v9->BootResources || (Flags & 0x40) != 0 )
        IopReleaseDeviceResources((PDEVICE_NODE)v9, 0);
      PipSetDevNodeState(v9, DeviceNodeDeletePendingCloses);
      v9 = Sibling;
    }
    while( Sibling );
  }
  if( v3 == 778 && (*((_DWORD *)BugCheckParameter4 + 99) & 0x1000000) != 0 )
  {
    PnpMarkDeviceForRemove(v4, 1i64, (_DEVICE_OBJECT **)&v23);
    PnpUnlockMountableDevice((__int64)v4, v20, v21);
    PipClearDevNodeFlags((_DEVICE_NODE *)BugCheckParameter4, 0x1000000ui64);
  }
  v10 = *((_DWORD *)BugCheckParameter4 + 75);
  if( v10 < 769 || v10 > 770 && (v10 <= 776 || v10 == 778 || (unsigned int)(v10 - 785) > 3) )
  {
    v11 = IopRemoveDevice(v4, 0x17ui64);
    PnpDisableDeviceInterfaces((unsigned __int16 *)BugCheckParameter4 + 20, v12, v13);
    if( v11 >= 0 )
      IopReleaseDeviceResources((PDEVICE_NODE)BugCheckParameter4, 0);
    v14 = (_DEVICE_NODE *)BugCheckParameter4;
    if( (*((_DWORD *)BugCheckParameter4 + 99) & 0x10) == 0 )
    {
      v15 = DeviceNodeDeletePendingCloses;
LABEL_13:
      PipSetDevNodeState(v14, v15);
      goto LABEL_14;
    }
    PipSetDevNodeState((_DEVICE_NODE *)BugCheckParameter4, DeviceNodeRemovePendingCloses);
    v15 = DeviceNodeAwaitingQueuedDeletion;
    if( v8 == 782 )
    {
      v14 = (_DEVICE_NODE *)BugCheckParameter4;
      goto LABEL_13;
    }
  }
LABEL_14:
  if( v3 == 778 )
  {
    v22 = (_ADAPTER_OBJECT *)*((_QWORD *)&v23 + 1);
    if( *((_QWORD *)&v23 + 1) )
    {
      IopDecrementDeviceObjectHandleCount(*((_DEVICE_OBJECT **)&v23 + 1));
      HalPutDmaAdapter(v22);
    }
  }
  if( v6 && (*((_DWORD *)BugCheckParameter4 + 99) & 0x6000) == 0 )
    PipSetDevNodeProblem((_DEVICE_NODE *)BugCheckParameter4, v6, ProblemStatus);
  *((_DWORD *)BugCheckParameter4 + 176) &= ~2u;
  if( (*((_DWORD *)BugCheckParameter4 + 99) & 0x10) == 0 )
  {
    PnpAcquireDependencyRelationsLock(1);
    v16 = *((_QWORD *)BugCheckParameter4 + 4);
    if( v16 )
      v17 = *(PNP_DEPENDENCY_NODE **)(*(_QWORD *)(v16 + 312) + 80i64);
    else
      v17 = 0i64;
    if( v17 )
      PipConvertResolutionsToReservations(v17);
    ExReleaseResourceLite((PERESOURCE)((char *)&stru_140C452E0 + 384));
    PpDevNodeUnlockTree(PPL_SIMPLE_READ);
    PipProcessRebuildPowerRelationsQueue();
  }
  PiDmaGuardProcessPostRemove(BugCheckParameter4, v6, 0i64);
}

Referenced by:

PnpDeleteLockedDeviceNode