PnpDeleteLockedDeviceNode

__int64 __fastcall PnpDeleteLockedDeviceNode(
        PVOID BugCheckParameter4,
        int a2,
        unsigned int a3,
        NTSTATUS a4,
        __int64 a5,
        __int64 a6){
  unsigned int v6; 
  int v10; 
  int v11; 

  v6 = 0;
  if( a2 )
  {
    v10 = a2 - 1;
    if( v10 )
    {
      v11 = v10 - 1;
      if( v11 )
      {
        if( v11 == 1 )
        {
          PoFxActivateDevice(*((_DEVICE_OBJECT **)BugCheckParameter4 + 4));
          *((_DWORD *)BugCheckParameter4 + 176) |= 8u;
          PnpSurpriseRemoveLockedDeviceNode(BugCheckParameter4, a3, a4);
        }
      }
      else
      {
        PoFxActivateDevice(*((_DEVICE_OBJECT **)BugCheckParameter4 + 4));
        *((_DWORD *)BugCheckParameter4 + 176) |= 0x10u;
        PnpRemoveLockedDeviceNode(BugCheckParameter4, a3, a4);
      }
    }
    else
    {
      if( (*((_DWORD *)BugCheckParameter4 + 176) & 4) == 0 )
        KeBugCheckEx(0xCAu, (PVOID)0xD, BugCheckParameter4, (PVOID)4, 0i64);
      PoFxIdleDevice(*((_DEVICE_OBJECT **)BugCheckParameter4 + 4));
      *((_DWORD *)BugCheckParameter4 + 176) &= ~4u;
      if( *((_DWORD *)BugCheckParameter4 + 75) == 784 )
      {
        IopRemoveDevice(*((_DEVICE_OBJECT **)BugCheckParameter4 + 4), 3ui64);
        PipRestoreDevNodeState((_DEVICE_NODE *)BugCheckParameter4);
        PnpStartedDeviceNodeDependencyCheck((_DEVICE_NODE *)BugCheckParameter4);
      }
    }
  }
  else
  {
    PoFxActivateDevice(*((_DEVICE_OBJECT **)BugCheckParameter4 + 4));
    *((_DWORD *)BugCheckParameter4 + 176) |= 4u;
    return(unsigned int)PnpQueryRemoveLockedDeviceNode(
                           (_DEVICE_NODE *)BugCheckParameter4,
                           a3,
                           (_DWORD *)a5,
                           (_UNICODE_STRING *)a6);
  }
  return v6;
}

Referenced by:

PnpCancelRemoveOnHungDevices
PnpDeleteLockedDeviceNodes