Download Windows Speedup Tool to fix errors and make PC run faster
Does the display of your computer turn on all of a sudden? No matter how many time you put it to sleep, it always wakes up. Windows 11 or Windows 10 computer Sleep state is built such that only if it’s essential, it wakes up. The important thing can be either configured by you or when there is hardware interrupting the sleep. In this post, we are sharing how to troubleshoot the sleep issues because of Legacy Kernel Caller.
What is keeping my computer from going to sleep
An audio stream is currently in use
Instead of checking on power configuration, the best way to find out is to execute the command “powercfg -requests“. This command finds out requests from drivers, and applications that prevent the computer from going to sleep or turning off the display.
If you notice a mention of Legacy Kernel Caller in the result, this points to external hardware which is waking up your system. Part of the result will look as below:
SYSTEM
[DRIVER] USB AUDIO DEVICE
An audio stream is currently in use
[DRIVER] Legacy Kernel Caller.
If your Windows 11/10 computer will not Sleep because of Legacy Kernel Caller driver, An audio stream is currently in use issue, here is how you can fix it.
1] Remove such external hardware
Remove such external hardware one by one from the computer. We have seen a lot of users reporting about “TV card”.
Once you remove it, run the command “powercfg -requests” again, and you should notice that “Legacy Kernel Caller” is no more in the list. Also, the computer will get into regular sleep mode once the hardware is removed. What happens is the driver gets hung and doesn’t release the power request despite being any longer in use.
2] Use Request Override
The powercfg command offers a request override option. It allows users to disable request from applications and services to wake the computer from sleep. Run this command on the Command Prompt (admin privileges) to disable it.
Powercfg -requestsoverride Driver "Legacy Kernel Caller" System
3] Check Streaming & Media Applications
If this is not the case, you need to check if you are running a video or audio service in the background. You must have noticed that when you play a video, the computer never goes to sleep. If you had put the machine to sleep in between watching a video, it is possible that the computer is waking up because of that.
4] Check which devices can wake your system
Here is one last suggestion, if you don’t see any Legacy Kernel Caller in the result. Execute the command “powercfg –devicequery wake_armed“. It will list down all the devices that can wake your system. If there is anything other than keyboard, mouse, or touch, you need to check power configuration of that device.
Go to Device Manager, and disable the option in its Properties which says “Allow this device to wake the computer“.
5] Run the Power Troubleshooter
If Sleep Mode is not working, you could also run the Power Troubleshooter.
I have seen many suggestions to reset your power configuration plan, and even update the drivers – but that’s probably is the last thing you need to worry about.
We hope this post resolves your problem.
A Windows computer can face several other Sleep-related issues. Maybe some of these posts will help you someday.
- Windows goes to sleep automatically randomly
- Prevent Computer from waking up from Sleep
- Windows computer goes to Sleep too early
- Windows will not wake up from Sleep Mode
- Sleep Mode is not working in Windows
- Windows computer wakes from sleep automatically
- Wake up computer from Sleep, at a particular time.
Ashish holds a Bachelor’s in Computer Engineering and is a veteran Windows and Xbox user. He has work experience as a Database and Microsoft.NET Developer. He has been a Microsoft MVP (2008-2010) and excels in writing tutorials to improve the day-to-day experience with your devices.
В моем основном ноутбуке различные проблемы с электропитанием возникают часто, что объяснимо работой в инсайдерских сборках. Однако и в стабильной версии 1803 я заметил, что моя система перестала уходить в сон. При этом монитор выключался через указанный промежуток времени, что намекало на правильное определение системой состояния бездействия.
Я выставил маленький период перехода в сон, 1-2 минуты и приступил к диагностике.
Проверка запросов к подсистеме питания от приложений и драйверов
Первым делом надо смотреть в powercfg, что удерживает ОС от перехода в сон. Процессы и драйверы, обращающиеся к подсистеме электропитания, можно увидеть в командной строке от имени администратора:
powercfg -requests
Сразу видно, что запрос к SYSTEM идет от DRIVER — в данном случае, Realtek использует аудиопоток.
В списке также может присутствовать WebRTC от Chrome, а сразу после перезапуска системы там можно увидеть запросы оптимизации загрузки, индекс поиска, но они быстро исчезают. Можно внести процесс или драйвер в список исключений, и он не будет препятствовать уходу в сон.
powercfg -requestsoverride DRIVER "Realtek High Definition Audio (HDAUDIO\FUNC_01&VEN_10EC&DEV_0269&SUBSYS_17AA2204&REV_1002\4&d00657&0&0001)" SYSTEM
Команда читается как «игнорировать запрос от DRIVER [полное имя драйвера] к SYSTEM».
Список исключений хранится в разделе реестра
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerRequestOverride
и выводится командой
powercfg -requestsoverride
Я перезагрузился для верности, но система отказывалась засыпать. Проверив исключения и список запросов, я обнаружил, что драйвер Realtek продолжал использовать аудиопоток, хотя был внесен в исключения.
Я поплясал немножко с бубном вокруг исключений, но успеха не добился. Быстрое гугление подтвердило, что в некоторых случаях они не срабатывают. Это типично для legacy запросов, но тут был другой случай, и я не первый, кто с этим столкнулся.
В итоге я удалил Realtek из списка. Можно удалять записи в редакторе реестра или консоли. Команда почти такая же, как при добавлении, просто не указывается куда идет запрос, т.е. в данном случае в конце команды нет SYSTEM:
powercfg -requestsoverride DRIVER "Realtek High Definition Audio (HDAUDIO\FUNC_01&VEN_10EC&DEV_0269&SUBSYS_17AA2204&REV_1002\4&d00657&0&0001)"
Мы пойдем другим путем ©
Вычисление процесса, использующего подсистему звука
Известно, что черными делами занимается драйвер Realtek. Очевидно, он загружается при старте системы, поэтому имя файла несложно выяснить с помощью Autoruns.
Три записи относятся к двум файлам, один из которых – панель управления, судя по имени. Поэтому объектом интереса стал ravbg64.exe.
В Process Explorer от имени администратора я открыл нижнюю панель сочетанием Ctrl + L, перешел в нее и нажал kbd class=»dark»>Ctrl + D, чтобы увидеть список библиотек и дескрипторов процесса. Конечно, там очень много всего, но меня интересовало, что может использовать аудиопоток. Поэтому мое внимание быстро привлекла библиотека AudioSes.dll с описанием Audio Session.
Ctrl + Shift + F по audioses.dll выдает список процессов, вовлеченных в звуковую сессию. Под подозрение попали сторонние приложения и драйверы (за исключением самого Realtek), выделенные на картинке.
Закрыв Telegram и TeamViewer, я повторил проверку запросов, но ничего не изменилось. Я отключил драйвер Synaptics в msconfig – Службы – Не показывать службы Microsoft и перезагрузился, но запрос от Realtek не исчез.
Так, а что там SearchUI.exe может слушать? Графический интерфейс поиска… да это же Cortana! И она настроена откликаться на голосовое обращение. (У меня английский интерфейс.)
Действительно, после отключения этого параметра и контрольной перезагрузки SearchUI перестал использовать сессию аудио, а запрос от Realtek к подсистеме электропитания исчез! Соответственно, наладился и уход в сон.
Заключение и мысли по поводу
Голосовым помощником я пользуюсь нечасто (при необходимости Cortana можно вызвать сочетанием клавиш), и нормальный сон системы для меня важнее. Поэтому проблему я счел для себя полностью решенной, но осталась пара вопросов. Они очень похожи на баги, которые я занес в Feedback Hub (поддержка инсайдеров приветствуется):
- Параметр “Hey Cortana” препятствует уходу в сон
- Не работает игнорирование запросов драйвера Realtek к подсистеме электропитания
Можно спорить, является ли первая проблема багом или так и задумано — раз Cortana должна слушать, то и спать не должна. Но такое поведение неочевидно и нигде не описано (про повышенный расход батареи предупреждают, кстати). Оно не создает проблем лишь на современных устройствах с InstantGo, в которых не используется традиционный сон. Возможно, в представлениях и мечтах Microsoft такие устройства сейчас у всех, но реальность суровее.
Upd. Буквально на следующий день после публикации статьи я зашел в настройки Cortana и обнаружил, что там добавили параметр, контролирующий уход в сон при работе от элкетросети. Теперь Cortana не препятствует уходу в сон (я проверил), но при желании можно переопределить это поведение.
Так или иначе, цель статьи в том, чтобы показать вам простой прием решения распространенной задачи, а также подход к диагностике более сложной проблемы с помощью утилит Sysinternals.
У вас возникают проблемы со сном / гибернацией в Windows 10?
- Да (43%, голосов: 135)
- Нет (27%, голосов: 86)
- Не пользуюсь этими режимами (17%, голосов: 53)
- Моего варианта тут нет / У меня не Windows 10 (12%, голосов: 39)
Проголосовало: 313 [архив опросов]
Загрузка …
Диспетчер электропитания (power manager) глаз не спускает с показателей использования электроэнергии по всей системе. Исторически управление потреблением энергии состояло из отключения монитора и остановки вращения дисководов. Но эта проблема быстро становится все более сложной — из-за требований к увеличению продолжительности работы ноутбуков от батарей, а также соображений экономии энергии на настольных компьютерах (которые оставляют постоянно включенными) и высокой стоимости потребляемой серверными фермами электроэнергии.
Новые средства управления электропитанием включают уменьшение потребления энергии компонентами, когда система не используется, для этого отдельные устройства переключаются в состояние резервирования или даже полностью отключаются (при помощи выключателя питания). Мультипроцессорные системы отключают отдельные процессоры, когда они не нужны, и даже могут уменьшать тактовую частоту процессоров (для уменьшения энергопотребления). Когда процессор бездействует, потребление им энергии также уменьшается, поскольку ему не нужно делать ничего, кроме ожидания возникновения прерывания.
Windows поддерживает специальный режим выключения под названием гибернация (hybernation), при котором выполняется копирование всей физической памяти на диск, а затем потребление энергии снижается до минимального (в состоянии гибернации ноутбуки могут работать неделями), при этом батарея разряжается минимально. Поскольку все состояние памяти записано на диск, то вы можете даже заменить батарею ноутбука (пока он находится в гибернации). Когда система возобновляет свою работу, выходя из гибернации, она восстанавливает сохраненное состояние памяти (и повторно инициализирует устройства). Это приводит компьютер в то же самое состояние, в котором он был перед гибернацией (без необходимости выполнять повторно регистрацию и запускать все приложения и службы, которые выполнялись. Windows старается оптимизировать этот процесс, игнорируя немодифицированные страницы (имеющие резервирование на диске), и сжимает остальные страницы памяти для снижения требуемого объема ввода-вывода. Алгоритм гибернации предусматривает автоматическую балансировку пропускной способности системы ввода-вывода и процессора. Чтобы при более высокой пропускной способности процессора снизить потребность в пропускной способности системы ввода-вывода, используется более ресурсоемкое, но при этом более эффективное сжатие данных. Достаточная пропускная способность системы ввода-вывода позволяет избежать сжатия при переходе в режим гибернации. При использовании мультипроцессоров последнего поколения вход в состояние гибернации и выход из него могут составлять всего несколько секунд, даже если оперативная память системы имеет большой объем.
Альтернатива гибернации — состояние ожидания (standby mode), при котором диспетчер электропитания переводит всю систему на низшее состояние потребления энергии (используется ровно столько энергии, сколько нужно для регенерации состояния динамической памяти). Поскольку память не нужно копировать на диск, то переход в это состояние на некоторых системах осуществляется быстрее, чем гибернация.
Несмотря на доступность гибернации и состояния ожидания, многие пользователи не избавились от привычки выключать свой персональный компьютер по окончании работы.
Гибернация используется в Windows для осуществления псевдовыключения запуска, называемого HiberBoot, которое осуществляется намного быстрее обычного выключения и запуска. Когда пользователь дает системе команду на выключение, HiberBoot выводит пользователя из системы, а затем переводит ее в состояние гибернации в той точке, с которой можно будет опять нормально войти в систему. Позже, когда пользователь снова включит систему, HiberBoot возобновит работу системы с точки входа в нее пользователя. Для пользователя все это похоже на очень быстрое выключение, поскольку большинство шагов инициализации системы пропускается. Разумеется, иногда систему нужно выключать по-настоящему, чтобы устранить проблемы или установить обновление ядра. Если система получает команду на перезапуск, а не на выключение, она переносит настоящее выключение и выполняет обычную загрузку.
Ожидается, что вычислительные устройства на телефонах и планшетных компьютерах, а также на новых поколениях ноутбуков всегда будут потреблять небольшое количество электроэнергии. Чтобы обеспечить такой режим, в современной Windows реализована специальная версия управления электропитанием, которая называется CS (connected standby — ожидание в режиме подключения). CS возможна на системах со специальным оборудованием подключения к сети, способным отслеживать трафик в небольшом наборе подключений, используя намного меньше энергии, чем при работе центрального процессора. Получается, что CS-система всегда включена, выход из CS осуществляется сразу же, как только пользователь включил экран. Ожидание в режиме подключения отличается от обычного режима ожидания, потому что CS-система будет также выходить из ожидания, когда получит пакет из отслеживаемого подключения. После того как батарея начинает садиться, CS-система переходит в состояние гибернации, чтобы избежать полного разряда батареи и возможной потери пользовательских данных.
Достижение продожительной работы батареи требует не только как можно более частого выключения процессора. Важно также как можно дольше удерживать процессор в выключенном состоянии. Сетевое оборудование CS-системы позволяет процесорам оставаться выключенными до поступления данных, но повторное включение процессора может быть вызвано и другими событиями. Основанные на NT драйверы устройств Windows, системные службы и сами приложения зачастую запускаются без особой причины, только для того, чтобы проверить состояние дел. Подобная активность опроса обычно основана на установках таймеров на периодический запуск кода в системе или приложении. Опрос, основанный на сигналах таймера, может внести сумятицу в события, включающие процессор. Во избежание этого в современной Windows от таких таймеров требуется указать параметр погрешности, позволяющий операционной системе объединять события таймера и сокращать количество отдельных оснований для включения процессора. В Windows также оформляются условия, при которых приложение, не находящееся в стадии активного выполнения, может выполнять код в фоновом режиме. Операции, подобные проверке обновлений или освежению содержимого, не могут выполняться только по запросу запуска по истечении времени таймера. Приложение должно подчиняться операционной системе в вопросах подобной фоновой активности. Например, проверка на наличие обновлений должна происходить только один раз в день или в следующий раз, когда на устройстве будет происходить заряд батареи. Набор системных посредников предоставляет различные условия, которые могут использоваться для ограничений на выполнение фоновой активности. Если фоновой задаче требуются доступ к дешевой сети или пользовательские полномочия, посредники не станут выполнять задачу, пока не возникнут необходимые условия.
Сегодня многие приложения реализуются как с локальным кодом, так и со службами, находящимися в облаке. Windows предоставляет службу уведомлений Windows (Windows Notification Service (WNS)), позволяющую сторонним службам проталкивать уведомления в устройство Windows в CS, не требуя от сетевого оборудования CS специально прислушиваться к пакетам от сторонних серверов. WNS-уведомления могут оповещать о критичных по времени событиях, таких как поступление текстового сообщения или вызова по VoIP. При поступлении WNS-пакета процессор должен будет включиться для его обработки, но сетевое оборудование CS имеет возможность различать трафик разных подключений, что означает, что процессор не должен включаться в ответ на каждый произвольный пакет, поступающий из сетевого интерфейса.
В моем основном ноутбуке различные проблемы с электропитанием возникают часто, что объяснимо работой в инсайдерских сборках. Однако и в стабильной версии 1803 я заметил, что моя система перестала уходить в сон. При этом монитор выключался через указанный промежуток времени, что намекало на правильное определение системой состояния бездействия .
Я выставил маленький период перехода в сон, 1-2 минуты и приступил к диагностике.
Проверка запросов к подсистеме питания от приложений и драйверов
Первым делом надо смотреть в powercfg
, что удерживает ОС от перехода в сон. Процессы и драйверы, обращающиеся к подсистеме электропитания, можно увидеть в командной строке от имени администратора :
Powercfg -requests
Сразу видно, что запрос к SYSTEM идет от DRIVER — в данном случае, Realtek использует аудиопоток.
В списке также может присутствовать WebRTC от Chrome, а сразу после перезапуска системы там можно увидеть запросы оптимизации загрузки, индекс поиска, но они быстро исчезают. Можно внести процесс или драйвер в список исключений, и он не будет препятствовать уходу в сон.
Powercfg -requestsoverride DRIVER «Realtek High Definition Audio (HDAUDIO\FUNC_01&VEN_10EC&DEV_0269&SUBSYS_17AA2204&REV_1002\4&d00657&0&0001)» SYSTEM
Команда читается как «игнорировать запрос от DRIVER [полное имя драйвера] к SYSTEM».
Список исключений хранится в разделе реестра
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerRequestOverride
и выводится командой
Powercfg -requestsoverride
Я перезагрузился для верности, но система отказывалась засыпать. Проверив исключения и список запросов, я обнаружил, что драйвер Realtek продолжал использовать аудиопоток, хотя был внесен в исключения.
Я поплясал немножко с бубном вокруг исключений, но успеха не добился. Быстрое гугление подтвердило, что в некоторых случаях они не срабатывают. Это типично для legacy запросов, но тут был другой случай, и я не первый, кто с этим столкнулся.
В итоге я удалил Realtek из списка. Можно удалять записи в редакторе реестра или консоли. Команда почти такая же, как при добавлении, просто не указывается куда идет запрос, т.е. в данном случае в конце команды нет SYSTEM:
Powercfg -requestsoverride DRIVER «Realtek High Definition Audio (HDAUDIO\FUNC_01&VEN_10EC&DEV_0269&SUBSYS_17AA2204&REV_1002\4&d00657&0&0001)»
Мы пойдем другим путем
Вычисление процесса, использующего подсистему звука
Известно, что черными делами занимается драйвер Realtek. Очевидно, он загружается при старте системы, поэтому имя файла несложно выяснить с помощью Autoruns .
Три записи относятся к двум файлам, один из которых – панель управления, судя по имени. Поэтому объектом интереса стал ravbg64.exe
.
Центр безопасности Защитника Windows , в том числе новый раздел “Безопасность устройства”, которые предлагает управление расширенными инструментами безопасности, такими как «Изоляция ядра».
Изоляция ядра — технология безопасности на основе виртуализации, которая обеспечивает дополнительный уровень защиты против интеллектуальных атак. Целостность памяти является одной из составных частей технологии изоляции ядра — функция предназначена для предотвращения вставки вредоносного кода в процессы с высокой безопасностью. Защита обеспечивается за счет того, что страница виртуальной памяти ядра начинает выполнятся только после успешного прохождения проверки целостности.
Рассмотрим, как включить функцию “Целостность памяти” в Windows 10 April 2018 Update, чтобы усилить безопасность компьютера.
Включение целостности памяти
- Откройте Центр безопасности Защитника Windows.
- Выберите раздел “Безопасность устройства”.
- В секции “Изоляции ядра” нажмите ссылку “Сведения об изоляции ядра”.
- Переведите переключатель “Целостность памяти” в активное положение.
После выполнения этих действий нужно перезагрузить компьютер, чтобы изменения вступили в силу.
Примечание
: для работы данной функции ваш процессор должен поддерживать технологии виртуализации. Кроме того, виртуализация должна быть включена в BIOS или UEFI. В противном случае, функция будет недоступна.
Исправление проблем с изоляцией ядра
В некоторых случаях можно столкнуться с проблемами совместимости в некоторых приложениях, если изоляция ядра включена. Чтобы исправить неполадки придется отключить функцию.
Если вы пытаетесь отключить целостность памяти в Центре безопасности Защитника Windows, но опция стала неактивной и показывается сообщение “Этим параметром управляет ваш администратор”, то все еще можно деактивировать функцию с помощью системного реестра.
Примечание
: Некорректное изменение реестра может привести к серьезным проблемам. Рекомендуется создать резервную копию реестра Windows перед тем, как выполнить данные шаги. В меню редактора реестра выберите Файл > Экспорт для сохранения резервной копии.
- Нажмите сочетание клавиш Windows + R , чтобы вызвать окно “Выполнить”.
- Введите regedit и нажмите ОК, чтобы запустить редактор реестра.
- Перейдите по следующему пути:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity
- Дважды щелкните по записи Enabled
. - Поменяйте значение с 1 на 0.
- Нажмите ОК.
Для отключения вы также можете воспользоваться готовым
Драйверы режима ядра: Часть 1: Основные понятия — Архив WASM.RU
Обзор архитектуры
Внутренний мир Windows 2000 разделен на две части с четко обозначенными границами, как в плане адресного пространства, так и в плане прав и обязанностей кода в этом адресном пространстве выполняющегося.
С разделением адресного пространства все на удивление просто. Все четыре, доступного в 32-х разрядной архитектуре, гигабайта разделены на две равные части (4GT RAM Tuning и Physical Address Extension я опускаю как зкзотические). Нижняя половина отдана процессам пользовательского режима, верхняя принадлежит ядру.
С разделением прав и обязанностей немного сложнее.
К пользовательским относятся следующие процессы:
- Процессы поддержки системы (System Support Processes) — например, процесс входа в систему Winlogon (реализован в \%SystemRoot%\System32\Winlogon.exe);
- Процессы сервисов (Service Processes) — например, спулер печати;
- Пользовательские приложения (User Applications) — бывают пяти типов: Win32, Windows 3.1, MS-DOS, POSIX и OS/2;
- Подсистемы окружения (Environment Subsystems) — поддерживается три подсистемы окружения: Win32 (реализована в \%SystemRoot%\System32\Csrss.exe), POSIX (реализована в \%SystemRoot%\System32\Psxss.exe), OS/2 (реализована в \%SystemRoot%\System32\os2ss.exe).
Ядро состоит из следующих компонентов:
Исполнительная система (Executive) — управление памятью, процессами и потоками и др.;
- Ядро (Kernel) — планирование потоков, диспетчеризация прерываний и исключений и др. (реализовано в \%SystemRoot%\System32\Ntoskrnl.exe);
- Драйверы устройств (Device Drivers) — драйверы аппаратных устройств, сетевые драйверы, драйверы файловых систем;
- Уровень абстрагирования от оборудования (Hardware Abstraction Layer, HAL) — изолирует три вышеперечисленных компонента от различий между аппаратными архитектурами (реализован в \%SystemRoot%\System32\Hal.dll);
- Подсистема поддержки окон и графики (Windowing And Graphics System) — функции графического пользовательского интерфейса (Graphic User Interface, GUI) (реализована в \%SystemRoot%\System32\Win32k.sys).
Рис. 1-1. Упрощенная схема архитектуры Windows 2000
Режим пользователя и режим ядра
Хотя процессоры семейства Intel x86 поддерживают четыре уровня привилегий (называемых кольцами защиты), в Windows используются только два: 0-ой для режима ядра и 3-ий для режима пользователя. Это связано с поддержкой других процессоров (alpha, mips), в которых реализовано только два уровня привилегий. Предыдущие выпуски Windows NT поддерживали эти архитектуры, но в Windows 2000 осталась поддержка только x86.
Компоненты пользовательского режима имеют свои защищенные адресные пространства, потоки этих процессов выполняются в непривилегированном режиме процессора (называемом пользовательским), не могут выполнять привилегированные команды процессора, имеют ограниченный и опосредованный доступ к системным данным, и к системному адресному пространству, не имеют прямого доступа к оборудованию. Правда, в процессе своей работы, потоки этих процессов, вызывая системные сервисы, переходят в режим ядра, но в этом случае полностью теряют контроль над своим выполнением до возвращения обратно в режим пользователя.
Процессы пользовательского режима рассматриваются как потенциально опасные с точки зрения стабильности системы. Их права ограничиваются. И всяческие попытки выйти за пределы этих ограничений жестко пресекаются.
Компоненты ядра разделяют единое адресное пространство, выполняются в привилегированном режиме процессора (называемом режимом ядра), могут выполнять все, в том числе и привилегированные, команды процессора, имеют неограниченный и прямой доступ к системным данным и коду, имеют прямой, или через HAL, доступ к оборудованию.
Код ядра (собственно это и есть сама система) рассматривается как полностью доверительный. Поэтому, будучи загруженным в системное адресное пространство, драйвер становится частью системы и на него не накладываются какие-либо ограничения.
Таким образом пользовательские приложения отделены от собственно операционной системы. Если вы зададитесь целью написать сколь-нибудь серьезное приложение, для работы которого необходим доступ к внутренним функциям или структурам данных системы, то столкнетесь со множеством ограничений, преодолеть которые можно только разместив свой код в системном адресном пространстве. Из документированных существует только один способ это сделать — установить драйвер устройства. Способ этот относительно прост, надежен, а главное, полностью обеспечен поддержкой со стороны самой операционной системы.
Драйверы Windows 2000
Windows 2000 поддерживает множество типов драйверов устройств.
Существует два базовых, которые имеют своих представителей:
- Драйверы пользовательского режима (User-Mode Drivers):
- Драйверы виртуальных устройств (Virtual Device Drivers, VDD) — используются для поддержки программ MS-DOS (не путать с VxD драйверами в Windows 95/98 — это совсем разные вещи, хотя и имеют одно название);
- Драйверы принтеров (Printer Drivers).
- Драйверы режима ядра (Kernel-Mode Drivers):
- Драйверы файловой системы (File System Drivers) — реализуют ввод-вывод на локальные и сетевые диски;
- Унаследованные драйверы (Legacy Drivers) — написаны для предыдущих версий Windows NT;
- Драйверы видеоадаптеров (Video Drivers) — реализуют графические операции;
- Драйверы потоковых устройств (Streaming Drivers) — реализуют ввод-вывод видео и звука;
- WDM-драйверы (Windows Driver Model, WDM) — поддерживают технологию Plag and Play и управления электропитанием. Их отличительной особенностью является совместимость на уровне исходного кода между Windows 98, Windows ME и Windows 2000.
В разных источниках вы можете встретить классификацию немного отличную от приведенной выше, это не суть важно. Важно то, что драйверы, которые мы будем писать, не подпадают ни под один из пунктов этой классификации. Это ни драйверы файловой системы, ни унаследованные драйверы, ни драйверы видеоадаптеров или звуковых карт, ни WDM-драйверы, т.к. не поддерживают Plag»n»Play и управление электропитанием. Это не драйверы пользовательского режима (это вообще не интересно). На самом деле это просто черт знает что такое, т.к. система сама позволяет легко и просто добавить в саму себя код непонятно для какого устройства, и делать с ней все что угодно! Это как если бы к вам ночью в дверь постучался совершенно незнакомый человек, и вы ни слова не говоря впустили бы его на ночлег, да еще уложили бы в свою постель! Однако, это не является каким-то багом или дырой в системе безопастности. Просто система работает так, как она работает. Иначе и быть не может, т.к. взаимодействуя с окружением, система вынуждена предоставлять к себе доступ. И если бы это было не так, то это была бы полностью закрытая, а значит, бесполезная система.
Как следует из самого названия, драйвер устройства это программа предназначенная для управления каким-то устройством, причем устройство это не обязательно должно быть физическим. Оно может быть логическим или, как в нашем случае, виртуальным.
По своей структуре драйвер устройства является ни чем иным как файлом PE-формата (Portable Executable, PE). Таким же как обычные exe и dll. Только загружается и работает по другим правилам. Драйверы можно рассматривать как DLL режима ядра, предназначенные для выполнения задач не решаемых из пользовательского режима. Принципиальная разница здесь (не считая уровня привилегий) в том, что мы не сможем напрямую обращаться к драйверу, ни к его коду, ни к его данным, а будем пользоваться специальным механизмом предоставляемым диспетчером ввода-вывода (Input/Output Manager). Диспетчер ввода-вывода обеспечивает среду для функционирования драйверов, а также предоставляет механизмы для их загрузки, выгрузки и управления ими.
Приступая к разработке драйверов режима ядра, вы почувствуете себя совершенным новичком, т.к. весь предыдущий опыт использования API тут не поможет — ядро предоставляет совершенно другой набор функций. Также придется пользоваться плохо документированными (определенными только в заголовочных файлах) или вовсе недокументированными функциями и структурами данных.
Одно- и многоуровневые драйверы
Большинство драйверов управляющих физическими устройствами являются многоуровневыми (layered drivers). Обработка запроса ввода-вывода разделяется между несколькими драйверами. Каждый выполняет свою часть работы. Например, запрос на чтение файла передается драйверу файловой системы, котрый, выполнив некоторые операции (например, разбиение запроса на несколько частей), передает его «ниже» — драйверу диска, а тот, в свою очередь, отправляет запрос драйверу шины. Кроме того между этими драйверами можно добавить любое количество драйверов-фильтров (например, шифрующих данные). Выполнив запрос нижестоящий драйвер (lower-level driver) передает его результаты «наверх» — вышестоящему (higher-level driver). Но, к счастью, у нас все будет значительно проще. Наши драйверы всегда будут одноуровневыми (monolithic drivers), что сильно упростит весь процесс их написания и отладки.
Контекст потока
Поскольку, в большинстве случаев, мы имеем всего один процессор, а приложений, которые нужно выполнять много, то естественно, что для создания иллюзии одновременного их выполнения надо последовательно подключать эти приложения к процессору, причем очень быстро. Эта процедура называется переключением контекста потока (thread context switching). Если система переключает контекст потоков принадлежащих одному процессу, то необходимо сохранить значение регистров процессора отключаемого потока, и загрузить, предварительно сохраненные значения регистров процессора подключаемого потока. И обновить кое-какие структуры данных. Если же подключаемый поток принадлежит другому процессу, то необходимо еще в регистр CR3 процессора загрузить указатель на каталог страниц (page directory) процесса. Так как каждому пользовательскому процессу предоставлено закрытое адресное пространство, то у разных процессов разные проекции адресных пространств, а значит, и разные каталоги страниц и наборы таблиц страниц по которым процессор транслирует виртуальные адреса в физические. Все это не имеет прямого отношения к программированию драйверов. Но я напоминаю об этом в связи вот с чем. Так как переключение контекста операция не самая быстрая, то драйверы, по соображениям лучшей производительности, как правило, не создают своих потоков. Но код драйвера все же нужно выполнять. Поэтому, для экономии времени на переключение контекстов, драйверы выполняются в режиме ядра в одном из трех контекстов:
- в контексте пользовательского потока инициировавшего запрос ввода-вывода;
- в контексте системного потока режима ядра (эти потоки принадлежат процессу System);
- как результат прерывания (а значит, не в контексте какого-либо процесса или потока, который был текущим на момент прерывания).
Не совсем понимаю как можно выполнить что-то «не в контексте какого-либо процесса или потока», но учитывая авторитет людей это написавших (Д. Соломон и М. Руссинович), а также то, что нам это не понадобится, т.к. мы не будем обрабатывать ни программные, ни тем более, аппаратные прерывания, про третий случай можно сразу забыть. Остаются первые два варианта. Если инициируется запрос ввода-вывода, то мы в контексте потока этот запрос инициировавшего, и значит, можем напрямую обращаться к адресному пространству процесса которому этот поток принадлежит. Если мы в контексте системного потока, то ни к какому пользовательскому процессу обращаться напрямую не можем, а к системному мы и так всегда можем обратиться. Если нужно из драйвера посмотреть, что там у какого-нибудь процесса лежит по такому-то адресу, то придется либо самим переключать контекст, либо по таблицам страниц транслировать адреса.
Уровни запросов прерываний
Прерывание — неотъемлемая часть любой операционной системы. Прерывание требует обработки, поэтому выполнение текущего кода прекращается и управление передается обработчику прерывания. Существуют как аппаратные, так и программные прерывания. Прерывания обслуживаются в соответствии с их приоритетом. Windows 2000 использует схему приоритетов прерываний, известную под названием уровни запросов прерываний (interrupt request levels, IRQL). Всего существует 32 уровня, с 0 (passive), имеющего самый низкий приоритет, по 31 (high), имеющего соответственно самый высокий. Причем, прерывания с IRQL=0 (passive) по IRQL=2 (DPC\dispatch) являются программными, а прерывания с IRQL=3 (device 1) по IRQL=31 (high) являются аппаратными. Не путайте уровни приоритета прерываний с уровнями приоритетов потоков — это совсем разные вещи. Прерывание с уровнем IRQL=0, строго говоря, прерыванием не является, т.к. оно не может прервать работу никакого кода (ведь для этого этот код должен выполняться на еще более низком уровне прерывания, а такого уровня нет). На этом IRQL выполняются потоки пользовательского режима. И код наших драйверов тоже будет выполняться на этом IRQL. Это отнюдь не означает, что код любого драйвера всегда выполняется на уровне «passive». Просто мы не будем обрабатывать ни программные, ни тем более аппаратные прерывания. А отсюда следуют, по крайней мере, два очень важных вывода.
Первый: работа наших драйверов может быть в любой момент прервана, для обработки прерывания с более высоким приоритетом (например, от таймера, когда планировщик посчитает, что наш поток и так уже достаточно долго имеет процессор, и пора ему отдохнуть). Поэтому, в этом смысле, код наших драйверов является прерываемым и вытесняемым (процессор отдается другому потоку), точно также как и код любого пользовательского потока. Существуют функции ядра позволяющие узнать текущий уровень прерывания, а также повысить или понизить его.
Второй важный момент: на уровне прерывания passive можно вызывать любые функции ядра (в DDK в описании каждой функции обязательно указано, на каком уровне прерывания ее можно вызывать), а также обращаться к страницам памяти сброшенным в файл подкачки. На более высоких уровнях прерывания (DPC/dispath и выше), попытка обращения к странице отсутствующей в физической памяти приводит к краху системы, т.к. диспетчер памяти (Memory Manager) не может обработать ошибку страницы.
«Голубой экран смерти»
Думаю каждый, хотя бы один раз, видел волнующую картину под названием «голубой экран смерти» (Blue Screen Of Death, BSOD). Наверное, нет необходимости объяснять, что это такое и почему возникает. Важно здесь то, что взявшись за разработку драйверов режима ядра, приготовьтесь к тому, что BSOD дастаточно часто будет появляться на экране вашего монитора.
В третьем кольце все было просто: набросал примерный код, расставил int3 где надо, запустил и… в отладчике уже разбираешься что к чему. Если что-то не так — прибил, исправил ошибки, перекомпилировал… и так далее, до тех пор пока код не заработает как надо. При программировании драйверов об этой технике можно забыть. Тут «сапер» ошибается один раз. Одно неверное движение… и можно откинуться на спинку кресла и минутку расслабиться.
Для того чтобы видеть BSOD как можно реже следует придерживаться одного очень простого правила: «Семь раз отмерь — один отрежь»… в смысле «Семь раз проверь — один запусти». Это конечно просто сказать, но значительно труднее сделать. Но как правило, учитывая то, что структура драйверов, которые вы будете писать (после прочтения этих статей), относительно проста, можно разобраться с ошибками и до появления BSOD. Если же он упорно появляется перед вашими глазами, и вы никак не можете понять причину, возможным способом прояснить ситуацию является анализ аварийного дампа (crash dump). О том, что это такое, как его сделать и анализировать можно почитать в статье Марка Руссиновича «Анализ аварийных дампов памяти» http://www.osp.ru/win2000/2001/03/025.htm. Дело это (анализ) очень непростое, но думаю, что до этого не дойдет.
Теоретик из меня хреновый, так что все вышесказанное вы можете рассматривать как очень базовые сведения о тех принципах, которые совершенно необходимо понимать. Нельзя приступать к разработке драйверов режима ядра не имея понятия о том, что такое контекст потока, уровни прерываний и приоритеты потоков, режим ядра/пользователя и т.д. и т.п. Чувствуете себе неуверенно в каком-то вопросе — список литературы внизу.
Теперь осветим кое-какие более практические вещи (совсем практическими они станут в следующих статьях), а именно, что нам понадобится, чтобы всю эту теорию превратить в практику.
Driver Development Kit
Первое это конечно Комплект разработки драйверов устройств (Windows 2000 Driver Development Kit, 2KDDK), который можно свободно скачать с сайта Microsoft (во всяком случе я сливал его совершенно безвозмездно отсюда: http://www.microsoft.com/ddk/). В этот пакет входит документация, которая является богатым источником информации о внутренних структурах данных и внутрисистемных функциях используемых драйверами устройств.
Помимо документации в DDK входит набор библиотечных файлов (*.lib), которые будут совершенно необходимы при компоновке. В DDK входит два комплекта этих файлов: для окончательной версии Windows (называемой свободным выпуском (free build)); и для отладочной (называемой проверочным выпуском (checked build)). Находятся эти файлы в каталогах %ddk%\libfre\i386 и %ddk%\libchk\i386 соответственно. Отладочная версия отличается более строгой проверкой ошибок. Использовать нужно файлы соответствующие вашей версии системы поместив их в каталог \masm32\lib\w2k.
Включаемые файлы
Также нам понадобятся включаемые (*.inc) файлы с определениями прототипов функций. Их нам (точнее мне ) тоже придется делать самим. Я перепробовал много разных утилит, конвертирующих *.lib -> *.inc, как входящих в пакет masm32 by hutch, так и слитых мной в разное время с бескрайних просторов Internet. Из всех что имеются у меня в наличии, только protoize.exe by f0dder справилась со своей задачей, и мне практически ничего не пришлось править руками. Эта замечательная тулза будет лежать в каталоге \tools\protoize. Сайт автора: http://f0dder.didjitalyphrozen.com/. Только вы ее там не найдете. f0dder несколько раз постил эту утилиту в конференции http://board.win32asmcommunity.net/. Инклуды будут лежать в каталоге \include\w2k. Их следует поместить в каталог \masm32\include\w2k. Для конвертации использовались *.lib для свободного выпуска Windows 2000, т. к. у меня стоит именно этот вариант (и у вас, наверняка, тоже).
Следующая проблема более серьезна. Это практически полное отсутствие включаемых файлов с определениями необходимых структур, символьных констант и макросов. Найти что-либо путное в сети вы вряд ли сможете — уж слишком экзотическое это занятие — писать драйверы режима ядра на ассемблере. Кое-что можно найти у EliCZ http://www.anticracking.sk/EliCZ/. Кое-что у Y0da http://mitglied.lycos.de/yoda2k/index.htm (частично сделаное им самим, частично взятое у того же EliCZ). Но сделано это из рук вон плохо, (при всем моем глубоком уважении к нашим словакскому и немецкому коллегам): имена членов многих структур отличаются от определенных в оригинальных заголовочных файлах из DDK; вложенные структуры и обьединения не имеют имен; хотя в оригинале они именованы. И вообще, все находится в некотором беспорядке, и при просмотре вызывает удручающее впечатление. Неплохо сделан только ntstatus.inc. Частично это объясняется тем, что EliCZ начал создавать свои инклуды еще в отсутствие у него DDK (как он сам говорит). В любом случае, я не советую вам их использовать, по крайней мере без тщательной проверки. Кое-что, в свое время, мелькало в конференции http://board.win32asmcommunity.net/, но качество тоже не особо впечатляет. Короче, единственно правильное решение в данной ситуации — делать все самим, причем вручную, т. к. какие-либо тулзы, позволяющие автоматизировать этот процесс, мне не известны. Если вы, вдруг, наткнетесь на что-то стоящее, не сочтите за труд — дайте мне знать.
Отладка драйверов
Также нам потребуется отладчик, причем, поскольку отлаживать придется код режима ядра, то и отладчик нужен соответствующий. Самым лучшим выбором будет SoftICE. Или можно воспользоваться Kernel Debugger входящим в состав DDK. Этот отладчик требует двух компьютеров — ведущего и ведомого, что не каждый может себе позволить. Марк Руссинович (Mark Russinovich, http://www.sysinternals.com/) написал утилиту LiveKd, которая позволяет использовать Kernel Debugger без подключения второго компьютера. Не знаю есть ли она на сайте (не проверял), но на диске к книжке «Внутреннее устройство Microsoft Windows 2000» имеется. Также этот отладчик чрезвычайно полезен для исследования внутреннего устройства системы, при условии что у вас установлены отладочные символы, которые можно (или было можно) свободно скачать с сайта Microsoft.
Дэвид Соломон, Марк Руссинович, «Внутреннее устройство Microsoft Windows 2000», изд. «Питер», 2001. Хотя в этой книге нет ни одной строчки исходного кода, она прежде всего для программистов.
Свен Шрайбер, «Недокументированные возможности Windows 2000», изд. «Питер», 2002. Сугубо практическая книга, в которой раскрыто множество тайн Windows 2000.
Walter Oney, «Programming the Microsoft Driver Model», Microsoft Press, 1999 В этой книге упор сделан на Plag»n»Play драйверы, но это нисколько не умоляет ее достоинств, т.к. базовые принципы разработки драйверов универсальны.
Джеффри Рихтер, «Windows для профессионалов: создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows», изд. «Питер», 2000. Эта книжка не имеет никакого непосредственного отношения к программированию драйверов, но тоже очень интересная;-)
Этот список ни в коем случае не претендует на полноту. Многое, особенно по английски, можно найти в Internet (кроме Шрайбера, все книги есть в электронном варианте). В отношении книг хочу сказать еще, что все они из разряда «must have». Увидите — покупайте не глядя. Все, кроме Walter»а Oney, переведены на наш «великий и могучий».
И последнее. Я не являюсь большим специалистом в области разработки драйверов, так что ошибки или неточности, как в этой, так и во всех последующих статьях, весьма вероятны. Найдете — смело тыкайте носом. Скажу спасибо.
просмотров
Вопрос от пользователя
Здравствуйте.
Подскажите, как решить одну проблемку — мой ноутбук не уходит в спящий режим: т.е. экран гаснет, все вроде бы выключается, но буквально через секунду-другую он снова включается. Что интересно — обычное включение/выключение работает нормально.
В принципе, ничего криминального нет, но, когда надо оставить ноутбук на 15-20 мин., отойдя по делам, совсем не хочется его туда-сюда выключать/включать.
Доброго времени суток!
Вообще, если обобщить и выделить основные варианты поведения ПК (при которых возникает проблема «сна»), то встречаются следующие проблемы:
- компьютер уходит и сразу же выходит из спящего режима (как у автора вопроса);
- компьютер выходит из спящего режима в любое время, часто без пользователя;
- компьютер вообще не переходит в спящий режим (всегда включен или выключен).
Подобные проблемы, чаще всего, возникают по нескольким причинам. О том, как их исправить и будет сегодняшняя заметка ✌.
Итак, приступим…
*
👉 Дополнение!
Кстати, если у вас обратная проблема: компьютер или ноутбук выходит из спящего режима самостоятельно, то рекомендую ознакомиться с этой статьей
*
Почему компьютер не уходит в спящий режим
👉 1) Старые, конфликтующие драйвера
Первое, на что рекомендую обратить внимание при появлении подобных проблем — это драйвера. Особенно, этот момент касается драйвера на видеокарту.
Вариантов, как обновить драйвера — несколько. Можно воспользоваться программами для автоматического поиска и обновления драйверов, можно зайти на сайт производителя вашего оборудования, скачать нужную версию и обновить в ручном режиме. Ссылку на статью о том, как это делается, привожу ниже.
👉 Инструкция!
Как установить драйвера на компьютер, ноутбук — инструкция по шагам
*
👉 2) Неактуальные настройки электропитания
В половине случаев из всех — виной тому, что ноутбук (компьютер) не уходит в спящий режим (гибернацию) являются неверные настройки электропитания.
Чтобы проверить и поменять их, нажмите сочетание кнопок Win+R и введите команду powercfg.cpl, нажмите Enter (см. пример ниже). 👇
powercfg.cpl — открыть настройки электропитания
Далее вы должны увидеть различные планы электропитания. Нам нужно открыть настройки перехода в спящий режим (либо настройка текущего плана электропитания), см. скриншот ниже. 👇
Настройка перехода в спящий режим
Обратите внимание на время перехода в спящий режим. Установите значение, например, в 15 мин. (главное, чтобы в параметрах не стояло значение «никогда»).
Через какое время переводить ПК в спящий режим
Кроме этого, обязательно откройте дополнительные параметры питания. Ссылка на редактирование этих параметров находится внизу окна (пример ниже). 👇
Изменить дополнительные параметры питания
Здесь нужно открыть две вкладки:
- Сон\Разрешить таймеры пробуждения: ставим оба параметра от батареи и сети на «Отключить». Таким образом мы запрещаем устройствам пробуждать компьютер;
- Параметры мультимедиа\При общем доступе к мультимедиа: ставим в параметрах и от батареи, и от сети «Разрешить компьютеру переходить в спящий режим». Сохраните настройки.
Разрешить ПК переходить в спящий режим
*
👉 3) Не отключены устройства, будящие компьютер
Для начала предлагаю определить устройство, которое выводит ваше устройство из спящего режима (например, мышка). Затем мы просто запретим ему «будить» ПК.
И так, сначала жмем Win+R, вводим команду compmgmt.msc, жмем Enter. Таким образом открываем управление компьютером (можете через панель управления, но так быстрее на мой взгляд ✌).
compmgmt.msc — управление компьютером
В управлении ПК, откройте следующую ветку: «Просмотр событий/Журналы Windows/Система«. В ней ищите событие, источник которого Power-TroubleShooter. Когда найдете ближайшее — открывайте его.
Смотрим журналы Windows
В свойствах события будет указан источник выхода: в моем случае — это кнопка питания (т.к. я сам пробудил ноутбук 👌).
Кто вывел компьютер из спящего режима?
Чаще всего причина пробуждения кроется в мышке (клавиатуре). В любом случае, зная устройство, можно запретить ему это делать. Для этого откройте диспетчер устройств (сочетание кнопок WIN+R, затем ввести команду devmgmt.msc).
Как открыть диспетчер устройств
После чего откройте раздел «Мыши и иные указывающие устройства», а затем откройте свойства нужного устройства (обычно HID-совместимая мышь).
Свойства мышки
В свойствах есть спец. вкладка «Управление электропитанием»: просто снимите в ней галочку с пункта «Разрешить этому устройству выводить компьютер из ждущего режима». Сохраните параметры.
Отключаем разрешение на пробуждение
Таким образом можно запретить пробуждать ПК и другим устройствам (клавиатуре, например).
*
Примечание: в вашем случае, возможно, что будит компьютер другое устройство, а не мышка. Но принцип действия будет аналогичен…
*
👉 4) Не настроен BIOS
В некоторых версиях BIOS есть определенные опции, позволяющие будить компьютер. Например, речь может идти о Wake on LAN — крайне полезной функции для системных администраторов, позволяющей им «будить» ПК по сети.
👉 Инструкция!
Как войти в БИОС (BIOS) на компьютере / ноутбуке.
Обычно, пункт Wake находится в разделе Power (также проверьте вкладку Advanced). Пример показан на скрине ниже.
Чтобы исключить эту функцию (а она иногда работает некорректно) — переведите режим Enabled на Disabled (т.е. выключено).
Wake on LAN
*
👉 5) Возможно, что есть процесс, не дающий уйти в спящий режим
Чтобы узнать, какой процесс мешает уйти в спящий режим, необходимо открыть командную строку (от имени администратора).
Для этого запустите диспетчер задач (нажмите одновременно Ctrl+Shift+Esc), далее нажмите файл\новая задача и введите CMD (не забудьте поставить галочку «Создать задачу с правами администратора», см. скрин ниже).
👉 В помощь!
Инструкция по тому, как открыть командную строку.
Запуск командной строки с правами администратора
Далее введите команду powercfg /requests и нажмите Enter. В идеале, если никакие процессы не блокируют уход в сон, напротив DISPLAY, SYSTEM, AWAYMODE и пр. должны гореть «нет» (или «none» в англ. версии). См. скрин ниже:
- слева — все в порядке, процессы, блокирующие ПК не выявлены;
- справа — найден один процесс, который может помешать уходу ноутбука в спящий режим.
Что мешает уйти в спящий режим?
*
Примечание: если в качестве причины у вас значится звуковой драйвер («audio…», как у меня на скрине выше ☝) — попробуйте обновить драйвер на аудио-карту, мат. плату, и отключить Кортану (последнее актуально для Windows 10!).
*
PS
Кстати, чтобы вывести компьютер из спящего режима — нажмите кнопку питания / кнопку включения (а то ведь мышке то мы запретили будить ПК 👌).
*
А теперь статью я завершаю, и удачи всем желаю!
👋
Первая публикация: 05.09.2017
Корректировка: 7.08.2021
В моем основном ноутбуке различные проблемы с электропитанием возникают часто, что объяснимо работой в инсайдерских сборках. Однако и в стабильной версии 1803 я заметил, что моя система перестала уходить в сон. При этом монитор выключался через указанный промежуток времени, что намекало на правильное определение системой состояния бездействия.
Я выставил маленький период перехода в сон, 1-2 минуты и приступил к диагностике.
Проверка запросов к подсистеме питания от приложений и драйверов
Первым делом надо смотреть в powercfg, что удерживает ОС от перехода в сон. Процессы и драйверы, обращающиеся к подсистеме электропитания, можно увидеть в командной строке от имени администратора:
powercfg -requests
Сразу видно, что запрос к SYSTEM идет от DRIVER — в данном случае, Realtek использует аудиопоток.
В списке также может присутствовать WebRTC от Chrome, а сразу после перезапуска системы там можно увидеть запросы оптимизации загрузки, индекс поиска, но они быстро исчезают. Можно внести процесс или драйвер в список исключений, и он не будет препятствовать уходу в сон.
powercfg -requestsoverride DRIVER "Realtek High Definition Audio (HDAUDIOFUNC_01&VEN_10EC&DEV_0269&SUBSYS_17AA2204&REV_10024&d00657&0&0001)" SYSTEM
Команда читается как «игнорировать запрос от DRIVER [полное имя драйвера] к SYSTEM».
Список исключений хранится в разделе реестра
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerPowerRequestOverride
и выводится командой
powercfg -requestsoverride
Я перезагрузился для верности, но система отказывалась засыпать. Проверив исключения и список запросов, я обнаружил, что драйвер Realtek продолжал использовать аудиопоток, хотя был внесен в исключения.
Я поплясал немножко с бубном вокруг исключений, но успеха не добился. Быстрое гугление подтвердило, что в некоторых случаях они не срабатывают. Это типично для legacy запросов, но тут был другой случай, и я не первый, кто с этим столкнулся.
В итоге я удалил Realtek из списка. Можно удалять записи в редакторе реестра или консоли. Команда почти такая же, как при добавлении, просто не указывается куда идет запрос, т.е. в данном случае в конце команды нет SYSTEM:
powercfg -requestsoverride DRIVER "Realtek High Definition Audio (HDAUDIOFUNC_01&VEN_10EC&DEV_0269&SUBSYS_17AA2204&REV_10024&d00657&0&0001)"
Мы пойдем другим путем ©
Вычисление процесса, использующего подсистему звука
Известно, что черными делами занимается драйвер Realtek. Очевидно, он загружается при старте системы, поэтому имя файла несложно выяснить с помощью Autoruns.
Три записи относятся к двум файлам, один из которых – панель управления, судя по имени. Поэтому объектом интереса стал ravbg64.exe.
В Process Explorer от имени администратора я открыл нижнюю панель сочетанием Ctrl + L, перешел в нее и нажал kbd class=»dark»>Ctrl + D, чтобы увидеть список библиотек и дескрипторов процесса. Конечно, там очень много всего, но меня интересовало, что может использовать аудиопоток. Поэтому мое внимание быстро привлекла библиотека AudioSes.dll с описанием Audio Session.
Ctrl + Shift + F по audioses.dll выдает список процессов, вовлеченных в звуковую сессию. Под подозрение попали сторонние приложения и драйверы (за исключением самого Realtek), выделенные на картинке.
Закрыв Telegram и TeamViewer, я повторил проверку запросов, но ничего не изменилось. Я отключил драйвер Synaptics в msconfig – Службы – Не показывать службы Microsoft и перезагрузился, но запрос от Realtek не исчез.
Так, а что там SearchUI.exe может слушать? Графический интерфейс поиска… да это же Cortana! И она настроена откликаться на голосовое обращение. (У меня английский интерфейс.)
Действительно, после отключения этого параметра и контрольной перезагрузки SearchUI перестал использовать сессию аудио, а запрос от Realtek к подсистеме электропитания исчез! Соответственно, наладился и уход в сон.
Заключение и мысли по поводу
Голосовым помощником я пользуюсь нечасто (при необходимости Cortana можно вызвать сочетанием клавиш), и нормальный сон системы для меня важнее. Поэтому проблему я счел для себя полностью решенной, но осталась пара вопросов. Они очень похожи на баги, которые я занес в Feedback Hub (поддержка инсайдеров приветствуется):
- Параметр “Hey Cortana” препятствует уходу в сон
- Не работает игнорирование запросов драйвера Realtek к подсистеме электропитания
Можно спорить, является ли первая проблема багом или так и задумано — раз Cortana должна слушать, то и спать не должна. Но такое поведение неочевидно и нигде не описано (про повышенный расход батареи предупреждают, кстати). Оно не создает проблем лишь на современных устройствах с InstantGo, в которых не используется традиционный сон. Возможно, в представлениях и мечтах Microsoft такие устройства сейчас у всех, но реальность суровее.
Upd. Буквально на следующий день после публикации статьи я зашел в настройки Cortana и обнаружил, что там добавили параметр, контролирующий уход в сон при работе от элкетросети. Теперь Cortana не препятствует уходу в сон (я проверил), но при желании можно переопределить это поведение.
Так или иначе, цель статьи в том, чтобы показать вам простой прием решения распространенной задачи, а также подход к диагностике более сложной проблемы с помощью утилит Sysinternals.
У вас возникают проблемы со сном / гибернацией в Windows 10?
- Да (43%, голосов: 135)
- Нет (27%, голосов: 86)
- Не пользуюсь этими режимами (17%, голосов: 53)
- Моего варианта тут нет / У меня не Windows 10 (12%, голосов: 39)
Проголосовало: 313 [архив опросов]
Загрузка …
Download PC Repair Tool to quickly find & fix Windows errors automatically
Does the display of your computer turn on all of a sudden? No matter how many time you put it to sleep, it always wakes up. Windows 11 or Windows 10 computer Sleep state is built such that only if it’s essential, it wakes up. The important thing can be either configured by you or when there is hardware interrupting the sleep. In this post, we are sharing how to troubleshoot the sleep issues because of Legacy Kernel Caller.
What is keeping my computer from going to sleep
An audio stream is currently in use
Instead of checking on power configuration, the best way to find out is to execute the command “powercfg -requests“. This command finds out requests from drivers, and applications that prevent the computer from going to sleep or turning off the display.
If you notice a mention of Legacy Kernel Caller in the result, this points to external hardware which is waking up your system. Part of the result will look as below:
SYSTEM
[DRIVER] USB AUDIO DEVICE
An audio stream is currently in use
[DRIVER] Legacy Kernel Caller.
If your Windows 11/10 computer will not Sleep because of Legacy Kernel Caller driver, An audio stream is currently in use issue, here is how you can fix it.
1] Remove such external hardware
Remove such external hardware one by one from the computer. We have seen a lot of users reporting about “TV card”.
Once you remove it, run the command “powercfg -requests” again, and you should notice that “Legacy Kernel Caller” is no more in the list. Also, the computer will get into regular sleep mode once the hardware is removed. What happens is the driver gets hung and doesn’t release the power request despite being any longer in use.
2] Use Request Override
The powercfg command offers a request override option. It allows users to disable request from applications and services to wake the computer from sleep. Run this command on the Command Prompt (admin privileges) to disable it.
Powercfg -requestsoverride Driver "Legacy Kernel Caller" System
3] Check Streaming & Media Applications
If this is not the case, you need to check if you are running a video or audio service in the background. You must have noticed that when you play a video, the computer never goes to sleep. If you had put the machine to sleep in between watching a video, it is possible that the computer is waking up because of that.
4] Check which devices can wake your system
Here is one last suggestion, if you don’t see any Legacy Kernel Caller in the result. Execute the command “powercfg –devicequery wake_armed“. It will list down all the devices that can wake your system. If there is anything other than keyboard, mouse, or touch, you need to check power configuration of that device.
Go to Device Manager, and disable the option in its Properties which says “Allow this device to wake the computer“.
5] Run the Power Troubleshooter
If Sleep Mode is not working, you could also run the Power Troubleshooter.
I have seen many suggestions to reset your power configuration plan, and even update the drivers – but that’s probably is the last thing you need to worry about.
We hope this post resolves your problem.
A Windows computer can face several other Sleep-related issues. Maybe some of these posts will help you someday.
- Windows goes to sleep automatically randomly
- Prevent Computer from waking up from Sleep
- Windows computer goes to Sleep too early
- Windows will not wake up from Sleep Mode
- Sleep Mode is not working in Windows
- Windows computer wakes from sleep automatically
- Wake up computer from Sleep, at a particular time.
Ashish holds a Bachelor’s in Computer Engineering and is a veteran Windows and Xbox user. He has work experience as a Database and Microsoft.NET Developer. He has been a Microsoft MVP (2008-2010) and excels in writing tutorials to improve the day-to-day experience with your devices.
Вопрос от пользователя
Здравствуйте.
Подскажите, как решить одну проблемку — мой ноутбук не уходит в спящий режим: т.е. экран гаснет, все вроде бы выключается, но буквально через секунду-другую он снова включается. Что интересно — обычное включение/выключение работает нормально.
В принципе, ничего криминального нет, но, когда надо оставить ноутбук на 15-20 мин., отойдя по делам, совсем не хочется его туда-сюда выключать/включать.
Доброго времени суток!
Вообще, если обобщить и выделить основные варианты поведения ПК (при которых возникает проблема «сна»), то встречаются следующие проблемы:
- компьютер уходит и сразу же выходит из спящего режима (как у автора вопроса);
- компьютер выходит из спящего режима в любое время, часто без пользователя;
- компьютер вообще не переходит в спящий режим (всегда включен или выключен).
Подобные проблемы, чаще всего, возникают по нескольким причинам. О том, как их исправить и будет сегодняшняя заметка ✌.
Итак, приступим…
*
👉 Дополнение!
Кстати, если у вас обратная проблема: компьютер или ноутбук выходит из спящего режима самостоятельно, то рекомендую ознакомиться с этой статьей
*
Почему компьютер не уходит в спящий режим
👉 1) Старые, конфликтующие драйвера
Первое, на что рекомендую обратить внимание при появлении подобных проблем — это драйвера. Особенно, этот момент касается драйвера на видеокарту.
Вариантов, как обновить драйвера — несколько. Можно воспользоваться программами для автоматического поиска и обновления драйверов, можно зайти на сайт производителя вашего оборудования, скачать нужную версию и обновить в ручном режиме. Ссылку на статью о том, как это делается, привожу ниже.
👉 Инструкция!
Как установить драйвера на компьютер, ноутбук — инструкция по шагам
*
👉 2) Неактуальные настройки электропитания
В половине случаев из всех — виной тому, что ноутбук (компьютер) не уходит в спящий режим (гибернацию) являются неверные настройки электропитания.
Чтобы проверить и поменять их, нажмите сочетание кнопок Win+R и введите команду powercfg.cpl, нажмите Enter (см. пример ниже). 👇
powercfg.cpl — открыть настройки электропитания
Далее вы должны увидеть различные планы электропитания. Нам нужно открыть настройки перехода в спящий режим (либо настройка текущего плана электропитания), см. скриншот ниже. 👇
Настройка перехода в спящий режим
Обратите внимание на время перехода в спящий режим. Установите значение, например, в 15 мин. (главное, чтобы в параметрах не стояло значение «никогда»).
Через какое время переводить ПК в спящий режим
Кроме этого, обязательно откройте дополнительные параметры питания. Ссылка на редактирование этих параметров находится внизу окна (пример ниже). 👇
Изменить дополнительные параметры питания
Здесь нужно открыть две вкладки:
- СонРазрешить таймеры пробуждения: ставим оба параметра от батареи и сети на «Отключить». Таким образом мы запрещаем устройствам пробуждать компьютер;
- Параметры мультимедиаПри общем доступе к мультимедиа: ставим в параметрах и от батареи, и от сети «Разрешить компьютеру переходить в спящий режим». Сохраните настройки.
Разрешить ПК переходить в спящий режим
*
👉 3) Не отключены устройства, будящие компьютер
Для начала предлагаю определить устройство, которое выводит ваше устройство из спящего режима (например, мышка). Затем мы просто запретим ему «будить» ПК.
И так, сначала жмем Win+R, вводим команду compmgmt.msc, жмем Enter. Таким образом открываем управление компьютером (можете через панель управления, но так быстрее на мой взгляд ✌).
compmgmt.msc — управление компьютером
В управлении ПК, откройте следующую ветку: «Просмотр событий/Журналы Windows/Система«. В ней ищите событие, источник которого Power-TroubleShooter. Когда найдете ближайшее — открывайте его.
Смотрим журналы Windows
В свойствах события будет указан источник выхода: в моем случае — это кнопка питания (т.к. я сам пробудил ноутбук 👌).
Кто вывел компьютер из спящего режима?
Чаще всего причина пробуждения кроется в мышке (клавиатуре). В любом случае, зная устройство, можно запретить ему это делать. Для этого откройте диспетчер устройств (сочетание кнопок WIN+R, затем ввести команду devmgmt.msc).
Как открыть диспетчер устройств
После чего откройте раздел «Мыши и иные указывающие устройства», а затем откройте свойства нужного устройства (обычно HID-совместимая мышь).
Свойства мышки
В свойствах есть спец. вкладка «Управление электропитанием»: просто снимите в ней галочку с пункта «Разрешить этому устройству выводить компьютер из ждущего режима». Сохраните параметры.
Отключаем разрешение на пробуждение
Таким образом можно запретить пробуждать ПК и другим устройствам (клавиатуре, например).
*
Примечание: в вашем случае, возможно, что будит компьютер другое устройство, а не мышка. Но принцип действия будет аналогичен…
*
👉 4) Не настроен BIOS
В некоторых версиях BIOS есть определенные опции, позволяющие будить компьютер. Например, речь может идти о Wake on LAN — крайне полезной функции для системных администраторов, позволяющей им «будить» ПК по сети.
👉 Инструкция!
Как войти в БИОС (BIOS) на компьютере / ноутбуке.
Обычно, пункт Wake находится в разделе Power (также проверьте вкладку Advanced). Пример показан на скрине ниже.
Чтобы исключить эту функцию (а она иногда работает некорректно) — переведите режим Enabled на Disabled (т.е. выключено).
Wake on LAN
*
👉 5) Возможно, что есть процесс, не дающий уйти в спящий режим
Чтобы узнать, какой процесс мешает уйти в спящий режим, необходимо открыть командную строку (от имени администратора).
Для этого запустите диспетчер задач (нажмите одновременно Ctrl+Shift+Esc), далее нажмите файлновая задача и введите CMD (не забудьте поставить галочку «Создать задачу с правами администратора», см. скрин ниже).
👉 В помощь!
Инструкция по тому, как открыть командную строку.
Запуск командной строки с правами администратора
Далее введите команду powercfg /requests и нажмите Enter. В идеале, если никакие процессы не блокируют уход в сон, напротив DISPLAY, SYSTEM, AWAYMODE и пр. должны гореть «нет» (или «none» в англ. версии). См. скрин ниже:
- слева — все в порядке, процессы, блокирующие ПК не выявлены;
- справа — найден один процесс, который может помешать уходу ноутбука в спящий режим.
Что мешает уйти в спящий режим?
*
Примечание: если в качестве причины у вас значится звуковой драйвер («audio…», как у меня на скрине выше ☝) — попробуйте обновить драйвер на аудио-карту, мат. плату, и отключить Кортану (последнее актуально для Windows 10!).
*
PS
Кстати, чтобы вывести компьютер из спящего режима — нажмите кнопку питания / кнопку включения (а то ведь мышке то мы запретили будить ПК 👌).
*
А теперь статью я завершаю, и удачи всем желаю!
👋
Первая публикация: 05.09.2017
Корректировка: 7.08.2021
Полезный софт:
- Видео-Монтаж
Отличное ПО для создания своих первых видеороликов (все действия идут по шагам!).
Видео сделает даже новичок!
- Ускоритель компьютера
Программа для очистки Windows от «мусора» (удаляет временные файлы, ускоряет систему, оптимизирует реестр).