Посылаю очередной луч позора в Редмонд.
Начиная примерно с восьмёрки, пацаны занимаются какой-то хернёй, решая несуществующие проблемы.
Когда они уже научатся нормально извлекать устройства?
До сих пор (Win 11, последние обновления) в 97 случаях из 100 винда продолжает с выдуманной беспомощностью рассказывать мне, что "я не смогла, наверное кто-то что-то использует"....
Кто-то? Что-то? Ты, @#$, операционная система или игрушка уровня "три в ряд"?
Посмотри, @!#$@#, кто этот "кто-то". И найди способ с ним договориться, чтобы он отдал хэндл по-хорошему, или пристрели его по-плохому.
Потому что и так понятно, что это какой-то из твоих же многочисленных говносервисов, который то ли там сканирует диск от вирусов, то ли индексирует картинки — в общем, ничем полезным не занимается, а только тратит мою батарейку.
Я виндой пользуюсь дольше, чем среднестатистический сотрудник Microsoft на свете прожил, и все "пользовательские программы", которые могли на мой внешний диск смотреть, закрыл первым делом ещё до того, как задуматься об извлечении устройства.
А если это какой-то очередной "дисковый кэш, который всё ещё выполняет отложенную операцию записи", то это гарантированное враньё. Например потому, что при Sleep/Hibernate почему-то flush всех кэшей занимает считанные секунды, так что даже запись свопа заканчивается быстрее, чем команда "безопасно извлечь" наконец-то показывает свое "нишмагла".
Единственное объяснение этому маразму, что мне приходит в голову — у них есть решение для этой проблемы. Но его откладывают до того момента, как выйдет очередная версия винды, настолько неудачная, что на неё согласится переходить 0% их userbase. Вот тогда фичу зарелизят — потому что она будет однозначной причиной переехать на всё что угодно, даже если там кнопку "Старт" придётся каждый раз искать при помощи Bing через AI-бота.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали: S>Начиная примерно с восьмёрки, пацаны занимаются какой-то хернёй, решая несуществующие проблемы.
Качество Windows после Гейтса вообще очень упало, но последние версии ("примерно с восьмёрки") — просто нечто. Я могу брызгать ядом 24/7, да что толку время тратить. Последнее, что резануло глаза: Майкрософт некогда писал в своих же собственных гайдлайнах для сторонних компаний, что если текст не входит, его надо обрезать с эллипсисом. Чтобы юзер понимал, что текст обрезан. Даже функция такая была в WinAPI: обрезать строку с эллипсисом под данный прямоугольник в данном контексте. В последних виндах это похерили, что регулярно приводит к фейлам в стиле "Главнокоман-дующий". Вот это что такое, например? (На картинке часть таскбара с кнопкой приложения).
Я, если бы не записал, сегодня ни за что бы не вспомнил и не догадался, что это за полюшко-поле.
Эмоциональную часть опускаю.
S>Посмотри, @!#$@#, кто этот "кто-то". И найди способ с ним договориться, чтобы он отдал хэндл по-хорошему, или пристрели его по-плохому.
Нельзя с ним договориться. Ну не хочет он закрыть хендл. А попросить его нет возможности.
Вот, к примеру, сделаю я программу, которая делает fopen, а потом этот хендл не закрывает. Сидит в памяти, чем-то занимается, процессор загружает в среднем на 0%, а хендл не закрывает.
Как ее попросить ? Никак.
Пристрелить можно, но моя программа закончив свою полезную деятельность с 0% загрузкой процессора, захочет результаты в файл записать. А тут выяснится, что хендл закрыт. Догадаешься сам, чем это кончится ?
Windows не имеет права прибивать хендлы процесссов. Это имеет право делать только пользователь, берущий тем самым на себя ответственность за последствия.
Программ таких, принудительно закрывающих хендлы файлов, немало
S>Потому что и так понятно, что это какой-то из твоих же многочисленных говносервисов, который то ли там сканирует диск от вирусов, то ли индексирует картинки — в общем, ничем полезным не занимается, а только тратит мою батарейку.
Возможно, но это ничего не меняет. Не может ОС иметь сервисы, с которыми можно договариваться. Вот просто подумай — что я должен сделать в своей программе, о которой написал выше, чтобы ОС могла с ней договориться ? Сделаю я из нее сервис, а то, о чем написал, так и оставлю.
With best regards
Pavel Dvorkin
Re[2]: Когда же винда научится извлекать устройства?
Здравствуйте, rFLY, Вы писали:
FLY>В cmd папка или диск не открыты?
Когда открыты, то понятно.
Я иногда смотрю папку из Тотального Командира. Выхожу из нее. Пытаюсь извлечь устройство. Винда не дает. А когда я Командира закрою, тогда все нормально. Что бы это значило, я не понимаю. Винда — десятка.
Re[2]: Когда же винда научится извлекать устройства?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Windows не имеет права прибивать хендлы процесссов. Это имеет право делать только пользователь, берущий тем самым на себя ответственность за последствия.
Тут же посыл в другом:
1. ОС не должна содержать бесполезные сервисы, которые только мешают пользователю. Или должна сама предлагать их отключить в случае проблем.
2. Судя по сообщению топикстартера, право она имеет прерывать эти процессы, в случае гибернейта, например. Просто так написали процесс безопасного удаления устройства, что при команде пользователя прерывания не происходит. Что бесит.
PD>Возможно, но это ничего не меняет. Не может ОС иметь сервисы, с которыми можно договариваться.
Почему нет? Сервис по индексации контента на флешках вполне может и должен иметь API, в которое будет стучаться ОС и говорить, что надо резко прерваться. В принципе многие необязательные фоновые сервисы должны иметь такие механизмы. Ты же не chkdsk запускаешь.
Re[3]: Когда же винда научится извлекать устройства?
Здравствуйте, Privalov, Вы писали:
P>Когда открыты, то понятно.
Кто-то может думать, что это не блокирует, так как никаких файлов по этому пути не открыто (т.е. раз эксплорер не блокирует, то и это не должно, но это не так).
P>Я иногда смотрю папку из Тотального Командира. Выхожу из нее. Пытаюсь извлечь устройство. Винда не дает. А когда я Командира закрою, тогда все нормально. Что бы это значило, я не понимаю. Винда — десятка.
cmd блокирует только если ты в самой папке находишься. Можно закрыть cmd, а можно просто перейти в другую папку и прежняя разблокируется.
Re[4]: Когда же винда научится извлекать устройства?
Здравствуйте, rFLY, Вы писали:
FLY>cmd блокирует только если ты в самой папке находишься. Можно закрыть cmd, а можно просто перейти в другую папку и прежняя разблокируется.
Я в курсе. Сам про cmd иногда забываю. Но Командиром я из папки выхожу, а Винда почему-то думает, что я еще внутри. Может, это особенность Командира, не знаю. А когда я его совсем закрываю, жизнь налаживается.
Re[2]: Когда же винда научится извлекать устройства?
Здравствуйте, Pavel Dvorkin, Вы писали: PD>Нельзя с ним договориться. Ну не хочет он закрыть хендл. А попросить его нет возможности.
Ага, то есть когда я делаю ShutDown, то договориться можно, а когда Eject — то нет?
Вот от тебя, Павел, я такого не ожидал.
PD>Вот, к примеру, сделаю я программу, которая делает fopen, а потом этот хендл не закрывает. Сидит в памяти, чем-то занимается, процессор загружает в среднем на 0%, а хендл не закрывает. PD>Как ее попросить ? Никак.
Повторюсь: несколько похожих задач были успешно решены примерно во времена Win7.
В частности, при шатдауне винда прекрасно строит список "несогласных", показывает их мне, и даже даёт выбор между "дать шанс закончиться добровольно" и "пристрелить к такой-то матери".
В частности, при гибернейте твоя программа прекрасно "отпустит" диск, так что его можно будет извлечь с нулевым риском для его файловой системы.
Ну, только после пробуждения твоя программа словит ошибку обращения к диску — но это уже будет проблема этой программы (или пользователя, если он реально хотел, чтобы она всё-таки файл сохранила).
PD>Windows не имеет права прибивать хендлы процесссов. Это имеет право делать только пользователь, берущий тем самым на себя ответственность за последствия.
Ну так дайте такую возможность пользователю. Что за детский сад?
PD>Программ таких, принудительно закрывающих хендлы файлов, немало
Если бы они нормально работали... PD>https://udalenie-fajlov.softok.info/
PD>Ну и сюда посмотри
PD>https://serverfault.com/questions/1966/how-do-you-find-what-process-is-holding-a-file-open-in-windows
Смотрел. Почему не сделать это штатной фичей винды?
S>>Потому что и так понятно, что это какой-то из твоих же многочисленных говносервисов, который то ли там сканирует диск от вирусов, то ли индексирует картинки — в общем, ничем полезным не занимается, а только тратит мою батарейку.
PD>Возможно, но это ничего не меняет. Не может ОС иметь сервисы, с которыми можно договариваться. Вот просто подумай — что я должен сделать в своей программе, о которой написал выше, чтобы ОС могла с ней договориться ?
А давай ты сам подумаешь, что ты должен сделать в своей программе, чтобы ОС могла с ней договориться.
PD>Сделаю я из нее сервис, а то, о чем написал, так и оставлю.
Даже если не делать сервис — как думаешь, в какой версии винды появилось сообщение WM_QUERYENDSESSION?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: Когда же винда научится извлекать устройства?
Здравствуйте, Nuzhny, Вы писали:
N>1. ОС не должна содержать бесполезные сервисы, которые только мешают пользователю.
ОС не может решать, какие сервисы полезные, а какие нет.
>Или должна сама предлагать их отключить в случае проблем.
Хм. Ты предлагаешь, чтобы обычному пользователю ОС предлагала — а не отключить ли Вам "Брокер системных событий" ? Или "Клиент групповой политики" ?
Нет уж. Нужно ему — пусть идет в "Сервисы" и там отключает, беря тем самым ответственность на себя.
А то как бы после отключения пары-тройки сервисов не пришлось бы Windows переустанавливать...
N>2. Судя по сообщению топикстартера, право она имеет прерывать эти процессы, в случае гибернейта, например. Просто так написали процесс безопасного удаления устройства, что при команде пользователя прерывания не происходит. Что бесит.
Прерывать процессы ОС права не имеет, разве что это ее собственные процессы, которые ей полностью контролируются. Может быть, TrustedInstaller и может, или еще какие-то.
PD>>Возможно, но это ничего не меняет. Не может ОС иметь сервисы, с которыми можно договариваться.
N>Почему нет? Сервис по индексации контента на флешках вполне может и должен иметь API, в которое будет стучаться ОС и говорить, что надо резко прерваться. В принципе многие необязательные фоновые сервисы должны иметь такие механизмы. Ты же не chkdsk запускаешь.
Прерваться совсем — это есть, net stop, но при этом он не прервется, а закончит работу, и можно его будет разве что заново запустить net start.
Вот только это лишь просьба — SERVICE_CONTROL_STOP. Он может не прерваться. Аналогично тому, как нажатие на крестик в верхнем правом углу окна означает лишь посылку WM_CLOSE, а закроется ли окно — зависит от того, что сделает обработчик.
Здравствуйте, Sinclair, Вы писали:
S>Ага, то есть когда я делаю ShutDown, то договориться можно, а когда Eject — то нет? S>Вот от тебя, Павел, я такого не ожидал.
Зря не ожидал. Извини за большое цитирование. Все из Соломона-Руссиновича. Выделено мной
Остановка службы
Когда Winlogon вызывает Windows-функцию ExitWindowsEx, эта функция от-
правляет сообщение Csrss — процессу подсистемы Windows — для вызова
Csrss-процедуры завершения работы. Csrss осуществляет циклический перебор
активных процессов и уведомляет их, что система завершает работу. Для каж-
дого системного процесса, за исключением SCM, Csrss ждет несколько секунд,
количество которых определено параметром HKU\.DEFAULT\Control Panel\
Desktop\WaitToKillAppTimeout (по умолчанию 20 с), пока не будет осуществлен
выход из процесса, после чего переходит к следующему процессу. Когда Csrss
встречает процесс SCM, он также уведомляет его о завершении работы системы,
но использует лимит времени, определенный для SCM. Csrss распознает SCM,
используя идентификатор процесса, который Csrss сохранил при регистрации
SCM с Csrss с помощью функции RegisterServicesProcess в ходе инициализа-
ции системы. Лимит времени для SCM отличается от лимита других процессов,
поскольку Csrss знает, что SCM обменивается данными со службами, которым
при остановке нужно осуществить подчистку после своей работы. Поэтому ад-
министратору может понадобиться настроить только лимит времени, выделяе-
мый SCM. Параметр лимита времени SCM находится в разделе реестра HKLM\
SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout и по умолчанию
составляет 12 секунд.
Обработчик остановки SCM отвечает за рассылку уведомлений всем службам,
запросившим уведомление об остановке при своей инициализации с помощью
SCM. SCM-функция ScShutdownAllServices осуществляет циклический перебор
записей служб в базе данных SCM в поиске служб, желающих получить уведомле-
ние об остановке, и отправляет каждой из них команду на остановку. Для каждой
службы, которой отправляется команда на остановку, SCM записывает параметр,
указывающий время ожидания службы, значение которого служба также определяет
при своей регистрации с помощью SCM. SCM отслеживает самое продолжительное
указанное время ожидания. После отправки сообщений об остановке SCM ждет,
либо пока одна из служб, которая была оповещена об остановке, не осуществит
выход, либо пока не пройдет самое продолжительное указанное время.
Если указанное время истечет, а служба не осуществит выход, SCM определя-
ет, не отправила ли одна или несколько служб, от которых ожидался выход, со-
общение SCM о том, что эта служба находится в процессе своей остановки. Если
хотя бы одна служба продвинулась в этом процессе, SCM снова ждет истечения
установленного времени ожидания. SCM продолжает выполнение этого цикла
ожидания, пока либо все службы не осуществят выход, либо ни одна из служб,
в отношении которых осуществляется ожидание, не уведомит его о нахождении
в процессе свой остановки за тот период времени, который указан для ожидания.
Пока SCM занимается отправкой приказов службам на остановку и ожида-
нием их выхода, Csrss ждет выхода от SCM. Если ожидание, осуществляемое
Csrss, заканчивается до того, как будет осуществлен выход SCM (по истечении
времени, указанного в параметре WaitToKillServiceTimeout), Csrss принудительно
завершает работу SCM и продолжает процесс завершения работы системы. Таким
образом, службы, давшие сбой при остановке за отведенное для этого время,
останавливаются принудительно. Такая логика позволяет системе завершать
работу вопреки тем службам, которые никогда не остановятся в результате де-
фектов своей конструкции, но это также означает, что службы, требующие более
20 секунд, не завершат своих действий по остановке.
Кроме того, поскольку порядок остановки ничем не обусловлен, службы,
которые могут зависеть от других служб, для своей первоочередной остановки
не имеют способа сообщить об этом SCM, могут не иметь никаких шансов на
подчистку после своей работы.
В связи с этими потребностями в Windows реализуются предостановочные
уведомления и порядок остановки для противодействия проблемам, вызывае-
мым этими двумя сценариями. Предостановочные уведомления рассылаются
с использованием того же механизма, который используется для уведомлений
об остановке. Уведомления рассылаются тем службам, которые запросили предостановочные
уведомления посредством API-функции SetServiceStatus, и SCM
будет ждать от них подтверждения.
Идея, заложенная в этих уведомлениях, заключается в пометке тех служб,
у которых на подчистку может уйти много времени (это, к примеру, может
касаться служб сервера базы данных), и в выделении им большего количества
времени на завершение их работы. SCM отправит запрос на выяснение хода про-
цесса и будет 3 минуты ждать завершения работы тех служб, которые на него
ответили. Если служба за это время не ответит, она будет принудительно оста-
новлена в рамках процедуры завершения работы системы; в противном случае
она может продолжать свое выполнение столько времени, сколько потребуется,
пока она будет продолжать отвечать на запросы SCM.
Службы, участвующие в предварительной остановке (preshutdown), могут
также определить порядок остановки по отношению к другим службам, также
участвующим в предварительной остановке. Службы, зависящие от первооче-
редной остановки других служб (например, Group Policy должна дождаться
завершения работы службы обновления Windows Update), могут указать свои
зависимости от остановок других служб в параметре реестра HKLM\SYSTEM\
CurrentControlSet\Control\PreshutdownOrder.
Так что здесь намного сложнее. Если коротко — Windows при определенных условиях убивает сервисы при shutdown. Там это можно, все равно помирать. А тут нельзя. Иначе может рухнуть все зависимое от этого сервиса. Только с его согласия. А это есть — SERVICE_CONTROL_STOP
PD>>Вот, к примеру, сделаю я программу, которая делает fopen, а потом этот хендл не закрывает. Сидит в памяти, чем-то занимается, процессор загружает в среднем на 0%, а хендл не закрывает. PD>>Как ее попросить ? Никак. S>Повторюсь: несколько похожих задач были успешно решены примерно во времена Win7.
Ну не знаю, что именно было решено. Механизм этот ЕМНИП не менялся.
S>В частности, при шатдауне винда прекрасно строит список "несогласных", показывает их мне, и даже даёт выбор между "дать шанс закончиться добровольно" и "пристрелить к такой-то матери".
Обычных программ, добавь. А не сервисов.
S>В частности, при гибернейте твоя программа прекрасно "отпустит" диск, так что его можно будет извлечь с нулевым риском для его файловой системы. S>Ну, только после пробуждения твоя программа словит ошибку обращения к диску — но это уже будет проблема этой программы (или пользователя, если он реально хотел, чтобы она всё-таки файл сохранила).
Так и сейчас совсем не обязательно, что если ты выдернешь флешку, с ее ФС будут проблемы. Ну не пишет, допустим, моя программа туда сейчас.
А при Hibernate все программы остановлены, так что точно не пишет. Ну а потом...
PD>>Windows не имеет права прибивать хендлы процесссов. Это имеет право делать только пользователь, берущий тем самым на себя ответственность за последствия. S>Ну так дайте такую возможность пользователю. Что за детский сад? PD>>Программ таких, принудительно закрывающих хендлы файлов, немало S>Если бы они нормально работали...
Потому что рискованно. Эти программы ты запускаешь на свой страх и риск, и MS ни за что не отвечает, если ты их используешь. А дай такую штатную возможность — закроет юзер все хендлы твоего любимого MS SQL именно в то время, когда он там что-то перестраивает, а потом начнутся вопли — где моя БД ?
PD>>Сделаю я из нее сервис, а то, о чем написал, так и оставлю. S>Даже если не делать сервис — как думаешь, в какой версии винды появилось сообщение WM_QUERYENDSESSION?
Точно не знаю, но в 3.0 уже было.
Да, это запрос на согласие закончиться при окончании сессии.
Для сервисов аналоги — SERVICE_ACCEPT_STOP (можно остановить) и SERVICE_ACCEPT_SHUTDOWN (получает уведомление при завершении работы системы).
Но никто не мешает программе потом при WM_ENDSESSION не закончиться, равно как и просто при WM_CLOSE главного окна. И сервису тоже. Тогда его будут убивать при shutdown — см. выше.
А обычную программу убивать не будут, если ты не подтвердишь ее убийство. Равно и как при WM_CLOSE она если не захочет закончиться, то только через Task Manager или аналогичными средствами.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Так что здесь намного сложнее. Если коротко — Windows при определенных условиях убивает сервисы при shutdown. Там это можно, все равно помирать. А тут нельзя. Иначе может рухнуть все зависимое от этого сервиса. Только с его согласия. А это есть — SERVICE_CONTROL_STOP
А вы понимаете, что сервисы всё равно придётся убить, так как флешку надо извлечь. Я много раз так делал: перезагружал систему, чтобы извлечь флешку. Так что сервисы в любом случае будут убиты. А если нет разницы, то зачем перезагружать систему?
И каждый день — без права на ошибку...
Re[4]: Когда же винда научится извлекать устройства?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Хм. Ты предлагаешь, чтобы обычному пользователю ОС предлагала — а не отключить ли Вам "Брокер системных событий" ? Или "Клиент групповой политики" ? PD>Нет уж. Нужно ему — пусть идет в "Сервисы" и там отключает, беря тем самым ответственность на себя.
Так про то и речь — что неясно, а кто вообще держит-то? И зачем?
Ну обычный же случай — вставил флешку, закинул файл, дождался окончания, пытаюсь вынуть — и "устройство все еще используется". Кем, почему, как понять —
Использовался же вроде только проводник для записи. Закрыл его — а она все равно "используется". Или плюешь и вынимаешь или хоть комп перезагружай. Из-за флешки, блин.
Re[5]: Когда же винда научится извлекать устройства?
Здравствуйте, Privalov, Вы писали:
FLY>>cmd блокирует только если ты в самой папке находишься. Можно закрыть cmd, а можно просто перейти в другую папку и прежняя разблокируется.
P>Я в курсе. Сам про cmd иногда забываю. Но Командиром я из папки выхожу, а Винда почему-то думает, что я еще внутри. Может, это особенность Командира, не знаю. А когда я его совсем закрываю, жизнь налаживается.
Командир кривой, держит папку? У Far'а такой проблемы нет
Здравствуйте, Sinclair, Вы писали:
S>Посылаю очередной луч позора в Редмонд. S>Начиная примерно с восьмёрки, пацаны занимаются какой-то хернёй, решая несуществующие проблемы. S>Когда они уже научатся нормально извлекать устройства?
У меня всё работает. Но я обычно копирую в Far'е, а потом выхожу с флешки. Иногда приходится подождать, потому что видимо система не успела ещё сбросить записанное на флешку. Если в такой момент её вытащить — будет битый файл, хорошо если не флешка
BFE>А вы понимаете, что сервисы всё равно придётся убить, так как флешку надо извлечь. Я много раз так делал: перезагружал систему, чтобы извлечь флешку. Так что сервисы в любом случае будут убиты. А если нет разницы, то зачем перезагружать систему?
Не обязательно. Программа, лишившаяся доступа к своему хендлу, вполне может продолжать функционировать. Скажем, хендл открывается в начале основного цикла и закрывается в его конце, и есть нормальная обработка ошибок. При потере хендла пострадает лишь то, что при этой итерации цикла должно быть записано, а в следующей итерации будет все опять в порядке.
Да и для извлечения флешки не обязательно что-то убивать. Можно просто ее выдернуть . Есть, конечно, шанс нарваться на неприятности, но далеко не всегда. И скорее всего сервис, который ее "держит", убит не будет. Или автоматически рестартанет, если настроено.
With best regards
Pavel Dvorkin
Re[5]: Когда же винда научится извлекать устройства?
Здравствуйте, fmiracle, Вы писали:
F>Так про то и речь — что неясно, а кто вообще держит-то?
Так инструменты от SysInternals в руки.
>И зачем?
А на этот вопрос, кроме автора, едва ли кто-то ответит. Вот в моем примере — зачем я открываю файл на старте и закрываю при окончании ? Она и держит хендл все свое время работы. А можно в нужный момент открыть-записать-закрыть в режиме append. Тогда держать почти никогда не будет.
F>Ну обычный же случай — вставил флешку, закинул файл, дождался окончания, пытаюсь вынуть — и "устройство все еще используется". Кем, почему, как понять —
F>Использовался же вроде только проводник для записи. Закрыл его — а она все равно "используется". Или плюешь и вынимаешь или хоть комп перезагружай. Из-за флешки, блин.
SysInternals и смотри. Может, повезет, поймешь.
With best regards
Pavel Dvorkin
Re[6]: Когда же винда научится извлекать устройства?
Здравствуйте, fmiracle, Вы писали:
F>Использовался же вроде только проводник для записи. Закрыл его — а она все равно "используется". Или плюешь и вынимаешь или хоть комп перезагружай. Из-за флешки, блин.
Ты закрыл окно "проводник". Но проводник никуда не делся, он всё ещё работает. И да, файл может типа и скопировался, но какие-нибудь кеши ещё сбрасываются