Макрос WdfDeviceStopIdle (wdfdevice.h)
[Относится к KMDF и UMDF]
Метод WdfDeviceStopIdle информирует платформу о том, что указанное устройство должно быть помещено в рабочее (D0) состояние питания.
Синтаксис
NTSTATUS WdfDeviceStopIdle(
_In_ WDFDEVICE Device,
_In_ BOOLEAN WaitForD0
);
Параметры
[in] Device
Дескриптор объекта устройства платформы.
[in] WaitForD0
Логическое значение, указывающее, когда возвращается WdfDeviceStopIdle . Значение TRUE возвращается только после того, как указанное устройство перейдет в состояние питания устройства D0. Если значение FALSE, метод возвращает немедленно.
Возвращаемое значение
None
Remarks
Этот макрос может возвращать следующие значения:
Возвращаемое значение | Значение |
---|---|
STATUS_PENDING | Устройство работает асинхронно. |
STATUS_INVALID_DEVICE_STATE | Драйвер не является владельцем политики питания для устройства. |
STATUS_POWER_STATE_INVALID | Произошел сбой устройства, и устройство не может войти в состояние питания D0. |
Метод может возвращать другие значения NTSTATUS.
Примечание
Для устройств, указывающих SystemManagedIdleTimeout или SystemManagedIdleTimeoutWithHint в перечислении WDF_POWER_POLICY_IDLE_TIMEOUT_TYPE , при вызове WdfDeviceStopIdle с параметром WaitForD0 значение FALSE, если устройство по-прежнему находится в D0 и период ожидания простоя еще не истек, начиная с версий WDF 1.33/2.33, WdfDeviceStopIdle возвращает STATUS_SUCCESS (в предыдущих версиях это приводило к возврату значения STATUS_PENDING).
Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Если устройство может перейти в состояние с низким энергопотреблением, когда оно переходит в режим простоя, драйверу может потребоваться иногда вызывать WdfDeviceStopIdle , чтобы вернуть устройство в рабочее состояние (D0) или запретить ему переход в состояние с низким энергопотреблением.
WdfDeviceStopIdle не запрещает платформе переходить устройства в спящий режим, когда система переходит в спящий режим Sx. Единственным эффектом является предотвращение перехода в спящий режим Dx, пока система находится в рабочем состоянии S0. Аналогичным образом, если устройство поддерживает прямое управление питанием, WdfDeviceStopIdle не запрещает устройству отключить питание.
Предупреждение
Не вызывайте WdfDeviceStopIdle с WaitForD0 = TRUE во время отключения питания прямо или косвенно. Например, если обратный вызов EvtDeviceArmWakeFromS0 ожидает другого потока, который вызывает WdfDeviceStopIdle(TRUE)
, переход на питание блокируется и система аварийно завершает работу.
Драйверу не нужно вызывать WdfDeviceStopIdle , когда устройство простаивает, а платформа помещает запрос ввода-вывода в очередь ввода-вывода устройства, управляемой питанием. Кроме того, драйверу не нужно вызывать WdfDeviceStopIdle , когда устройство бездействует и обнаруживает сигнал пробуждения. В обоих случаях платформа запрашивает у водителя автобуса восстановление состояния питания устройства до D0.
Хотя драйверам обычно не требуется вызывать WdfDeviceStopIdle при обработке запросов ввода-вывода, получаемых из очереди ввода-вывода, управляемой питанием, вызов разрешен. Однако драйверы не должны задавать параметру WaitForD0значение TRUE при обработке запросов ввода-вывода из очереди ввода-вывода, управляемой питанием.
Драйвер должен вызыватьWdfDeviceStopIdle , если он должен получить доступ к устройству из-за запроса, полученного драйвером вне очереди ввода-вывода, управляемой питанием. Например, драйвер может поддерживать определенный драйвером интерфейс или запрос WMI, требующий доступа к устройству. В этом случае необходимо убедиться, что устройство находится в рабочем состоянии до того, как драйвер обращается к устройству, и что устройство остается в рабочем состоянии до тех пор, пока драйвер не завершит доступ к устройству.
Вызов WdfDeviceStopIdle приводит устройство в рабочее (D0), если система находится в рабочем (S0) состоянии. Устройство остается в рабочем состоянии до тех пор, пока драйвер не вызовет WdfDeviceResumeIdle, после чего платформа может поместить устройство в состояние с низким энергопотреблением, если оно остается в состоянии простоя.
Не вызывайте WdfDeviceStopIdle до того, как платформа впервые вызовет функцию обратного вызова EvtDeviceD0Entry драйвера.
Вызов WdfDeviceStopIdle может восстановить неактивное устройство до рабочего состояния, только если система находится в рабочем состоянии (S0). Если система переходит в состояние с низким энергопотреблением или устройство уже отключено в ответ на Sx (где x > 0), когда драйвер вызывает WdfDeviceStopIdle с параметром WaitForD0 значениеTRUE, функция не возвращается, пока система не вернется в состояние S0.
Каждый успешный вызов WdfDeviceStopIdle в конечном итоге должен сопровождаться вызовом WdfDeviceResumeIdle, иначе устройство никогда не вернется в состояние с низким энергопотреблением, если оно снова перейдет в режим простоя. Вызовы WdfDeviceStopIdle могут быть вложенными, поэтому количество вызовов WdfDeviceResumeIdle должно быть равно количеству вызовов WdfDeviceStopIdle. Не вызывайте WdfDeviceResumeIdle , если вызов WdfDeviceStopIdle завершается сбоем.
Если после возврата WdfDeviceStopIdle система переходит в состояние низкого энергопотребления, устройство также переходит в состояние с низким энергопотреблением. Когда система возвращается в рабочее состояние (S0), устройство также возвращается в рабочее (D0). Ссылка на питание при вызове WdfDeviceStopIdle остается активной и не позволяет устройству переходить в состояние с низким энергопотреблением до тех пор, пока не будет сопоставлен вызов WdfDeviceResumeIdle.
Дополнительные сведения см. в разделе Поддержка выключения в режиме простоя.
Если параметр WaitForD0 имеет значение TRUE, необходимо вызвать WdfDeviceStopIdle по адресу IRQL = PASSIVE_LEVEL. Если waitForD0 имеет значение FALSE, этот метод должен вызываться по адресу IRQL <= DISPATCH_LEVEL.
Вызов WdfDeviceStopIdleWithTag вместо WdfDeviceStopIdle предоставляет дополнительные сведения (значение тега, номер строки и имя файла), которые можно просмотреть в отладчиках Майкрософт.
Примеры
В следующем примере кода WdfDeviceStopIdle возвращается после того, как указанное устройство перейдет в состояние питания устройства D0.
NTSTATUS status;
status = WdfDeviceStopIdle(Device, TRUE);
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Минимальная версия KMDF | 1,0 |
Минимальная версия UMDF | 2,0 |
Верхняя часть | wdfdevice.h (включая Wdf.h) |
Библиотека | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | См. раздел "Примечания". |
Правила соответствия DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |