Поделиться через


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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