Обработка запросов на остановку устройства

Есть два обстоятельства, в которых перед тем, как попросить драйверы устройства остановить устройство, диспетчер PnP спрашивает драйверы, является ли остановка устройства хорошей идеей:

Существует несколько способов, с помощью которых драйвер может справиться с такими ситуациями:

  • Если драйвер вызвал WdfDeviceSetSpecialFileSupport , так как устройство поддерживает специальный файл и если на устройстве открыт специальный файл, платформа не позволит остановить устройство.

  • Чтобы временно предотвратить все остановки в течение относительно короткого периода времени, драйвер может вызвать WdfDeviceSetStaticStopRemove.

  • Чтобы оценить и обработать каждую попытку остановки по отдельности, драйвер может предоставить функции обратного вызова EvtDeviceQueryStop и EvtDeviceQueryRemove .

Если устройство не поддерживает специальные файлы и если остановка или удаление устройства никогда не является проблемой для драйвера или устройства, драйвер не предоставляет функции обратного вызова EvtDeviceQueryStop и EvtDeviceQueryRemove и никогда не вызывает WdfDeviceSetStaticStopRemove. В этом случае диспетчер PnP всегда останавливает устройство, не проверив, разрешен ли драйвер.

Перераспределение ресурсов

Иногда диспетчеру PnP приходится перераспределять аппаратные ресурсы системы. Как правило, это перераспределение происходит из-за того, что драйвер шины сообщил, что новое устройство подключено, и новое устройство требует уже назначенных ресурсов. Устройства должны быть остановлены перед переназначением ресурсов.

Если иногда необходимо, чтобы драйвер не позволял диспетчеру PnP останавливать занятое устройство, драйвер может предоставить функцию обратного вызова EvtDeviceQueryStop . Если функция обратного вызова EvtDeviceQueryStop драйвера возвращает значение состояния ошибки, диспетчер PnP не остановит устройство.

Если драйвер определяет, что устройство безопасно остановить, функция обратного вызова возвращает STATUS_SUCCESS. Если ни один из других драйверов устройства не предотвращает остановку, диспетчер PnP временно останавливает устройство.

Сведения о порядке, в котором платформа вызывает функции обратного вызова событий драйвера, когда диспетчер PnP останавливает устройство для перераспределения ресурсов, см. в статье Диспетчер PnP перераспределяет системные ресурсы.

Пользователь удаляет или отключает устройство

Пользователь может удалить или отключить некоторые устройства. Пример:

  • Если драйвер задал съемный элемент (а не элемент SurpriseRemovalOK ) структуры WDF_DEVICE_PNP_CAPABILITIES устройства, пользователь может запустить программу "Отключить" или "Извлечь оборудование", а затем отключить или извлечь устройство.

  • Если драйвер не задал элемент NotDisable в структуре WDF_DEVICE_STATE устройства, пользователь может отключить устройство с помощью диспетчер устройств.

В таких случаях диспетчер PnP пытается остановить устройство, прежде чем пользователь удалит его.

Если драйверу необходимо иногда предотвратить удаление занятого устройства, драйвер может предоставить функцию обратного вызова EvtDeviceQueryRemove . Если функция обратного вызова EvtDeviceQueryRemove драйвера возвращает значение состояния ошибки, диспетчер PnP не остановит устройство.

Если драйвер определяет, что пользователь безопасно удаляет устройство, функция обратного вызова возвращает STATUS_SUCCESS. Если ни один из других драйверов устройства не препятствует удалению, диспетчер PnP останавливает устройство.

Сведения о порядке, в котором платформа вызывает функции обратного вызова событий драйвера при остановке устройства для удаления, см. в разделе Пользователь отключает устройство.