Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Антон, ты меня удивил. Не ждал от тебя такого... S>>Посмотри, @!#$@#, кто этот "кто-то". И найди способ с ним договориться, чтобы он отдал хэндл по-хорошему, или пристрели его по-плохому. PD>Нельзя с ним договориться. Ну не хочет он закрыть хендл. А попросить его нет возможности. PD>Вот, к примеру, сделаю я программу, которая делает fopen, а потом этот хендл не закрывает. Сидит в памяти, чем-то занимается, процессор загружает в среднем на 0%, а хендл не закрывает. PD>Как ее попросить ? Никак.
А по-моему, он полностью прав. В пользу чего есть два соображения.
Первое. Винда — цельный продукт. По крайней мере, она так позиционируется. Уж поверь, если бы я мог поставить винды без Битлокера или без Edge', я бы так и поступил. И без ихней телеметрии я тоже как-нибудь проживу. Но Майкрософт не даёт вариантов. Или бери всё, или ничего. А раз так, то и тестировать взаимодействие своих компонентов должна она, и должна делать это хорошо. Такой косяк не прошёл бы ни через одного хорошего начальника QA, с которыми я работал. Один бы взвился как ракета, пообещал, что научит сраных кодерков выпускать качественные продукты, открыл кучу тикетов, наговорил бы много обидных слов, переоткрывал тикет каждый раз заново, даже если бы он воспроизвёлся один раз из тысячи, с едкими комментариями. И добился своего. Другой бы (он раньше работал в полиции) говорил бы исключительно вежливо, а сам за спиной провёл бы скрытное расследование, и выяснил, кто в чём виноват и почему. И добился своего. Говорят, в Майкрософте вместо таких сейчас юнит-тесты друг друга тестируют. А скоро будут чат-боты тестировать юнит-тесты, а юнит-тесты — чат-ботов. Или уже. Вот и результат.
Второе. Если есть протокол (а сценарии работы с флешкой — это протокол в широком смысле), и он приводит к проблемам, значит он плохо спроектирован точка Я приводил недавно в пример, как Андроид принудительно разрегистрирует колбэки, которые юзер ставил в настройках, если колбэк не отвечает по истечении таймаута. Так вот, в самом частом юз-кейсе (точно не меньше половины случаев, а может и девять из десяти) там вообще колбеки не нужны. Андроид мог бы просто пассивно ждать запросов от программ. (В этом случае проблема с таймаутом просто не возникает). Следовательно, надо было оформить два сценария, с колбэками и без. Но нет! Какой-то гуглогений проектирования решил, что статика — частный случай динамики, и теперь каждый раз при запуске тяжёлой отладочной сессии или просто ресурсоёмкого приложения у меня принудительно слетают все настройки. Я не знаю, где именно Майкрософт напорол с флешками, но там явно надо искать примерно такую ошибку проектирования.
P.S. Кстати, помимо флешек есть сходная проблема. При перезагрузке винда постоянно жалуется на мешающий ей перезагрузиться Explorer. У меня, правда, стоит Черепаха, и я не знаю, влияет ли это на результат. Если нет, Майкрософт виновен по первому пункту, если да — по второму
Здравствуйте, Pavel Dvorkin, Вы писали:
F>>Так про то и речь — что неясно, а кто вообще держит-то? PD>Так инструменты от SysInternals в руки.
Это как-то оверкил.
>>И зачем? PD>А на этот вопрос, кроме автора, едва ли кто-то ответит.
А вот про это и речь.
Я воспользовался только ОС windows и ее проводником. Авторы тут — microsoft. Вот Sinclair и просит их как-то внутри себя разобраться, чтобы не удерживать флешку дольше, чем нужно. Реально винда с большой вероятностью то ли превьюшки генерирует для всех файлов на флешке, то ли на вирусы анализирует. Ни то ни другое мне не нужно для флешки, которую я собираюсь извлечь, но управлять этим процессом я не могу.
Re[4]: Когда же винда научится извлекать устройства?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>ОС не может решать, какие сервисы полезные, а какие нет.
Не может или не хочет? Вполне можно заложить в логику извлечения устройства приостановку работы служб, которые мешают. Почему нет? Сделать список служб, которые ни в каком случае нельзя приостанавливать, а остальным отсылать соответствующее сообщение.
>>Или должна сама предлагать их отключить в случае проблем. PD>Хм. Ты предлагаешь, чтобы обычному пользователю ОС предлагала — а не отключить ли Вам "Брокер системных событий" ? Или "Клиент групповой политики" ?
Нет, я предлагаю сделать механизм прерывания работы этих служб. Даже интерфейс, а не механизм — он есть готовый, вплоть до того, перезапускать ли службу после сбоев, сколько раз пробовать это делать и с какими таймаутами. Тут нет никакого риска.
PD>Нет уж. Нужно ему — пусть идет в "Сервисы" и там отключает, беря тем самым ответственность на себя. PD>А то как бы после отключения пары-тройки сервисов не пришлось бы Windows переустанавливать...
Так пользователю же не сообщается какая служба мешает. В том-то и проблема. Так-то службу можно и через диспетчер задач приостановить, интерфейс есть.
PD>Прерваться совсем — это есть, net stop, но при этом он не прервется, а закончит работу, и можно его будет разве что заново запустить net start. PD>Вот только это лишь просьба — SERVICE_CONTROL_STOP. Он может не прерваться. Аналогично тому, как нажатие на крестик в верхнем правом углу окна означает лишь посылку WM_CLOSE, а закроется ли окно — зависит от того, что сделает обработчик.
Здравствуйте, fmiracle, Вы писали:
PD>>Так инструменты от SysInternals в руки.
F>Это как-то оверкил.
Почему ? Они уже дано являются инструментами от Микрософт
>>>И зачем? PD>>А на этот вопрос, кроме автора, едва ли кто-то ответит.
F>А вот про это и речь.
F>Я воспользовался только ОС windows и ее проводником.
А Антивирус есть ? Какой ?
>Авторы тут — microsoft. Вот Sinclair и просит их как-то внутри себя разобраться, чтобы не удерживать флешку дольше, чем нужно. Реально винда с большой вероятностью то ли превьюшки генерирует для всех файлов на флешке, то ли на вирусы анализирует. Ни то ни другое мне не нужно для флешки, которую я собираюсь извлечь, но управлять этим процессом я не могу.
Соглашусь, если это действительно так. Но у меня нет данных, что это так.
И почему анализ на вирусы не нужен ? Тебе лично, возможно, и не нужен. А Если зловредная программа что-то пишет, пишет и пишет, и до поры этот никак не похоже на вирус, а потом оказывается вирусом ?
With best regards
Pavel Dvorkin
Re[3]: Когда же винда научится извлекать устройства?
A>А по-моему, он полностью прав. В пользу чего есть два соображения.
Отвечу лишь на первое
Что такое цельный продукт — я не знаю. Зато точно знаю, что это открытый продукт в том смысле, что позволяет исполнять программы не от MS. Вот для закрытого продукта, все ПО которого сделала одна фирма, она за все и отвечает. А если может исполняться и ПО других фирм, то отвечать за это ПО она не может. Например, не может отвечать за какой-то антивирус, который некорректно работает с хендлами. И т.д.
With best regards
Pavel Dvorkin
Re[7]: Когда же винда научится извлекать устройства?
Здравствуйте, Privalov, Вы писали:
P>Иногда. Far неплох. Но он не графический, мне это немного мешает.
Чем мешает? Могу поверить, что чувству прекрасного не удовлетворяет. Но чем мешает? Размер окна не так быстро изменить можно?
Re[5]: Когда же винда научится извлекать устройства?
Здравствуйте, Nuzhny, Вы писали:
PD>>ОС не может решать, какие сервисы полезные, а какие нет.
N>Не может или не хочет? Вполне можно заложить в логику извлечения устройства приостановку работы служб, которые мешают. Почему нет? Сделать список служб, которые ни в каком случае нельзя приостанавливать, а остальным отсылать соответствующее сообщение.
Все это есть. Но не директивно. Не то, чтобы нельзя XYZ, а не хотят XYZ
SERVICE_ACCEPT_PAUSE_CONTINUE
0x00000002
Службу можно приостановить и продолжить.
Этот код элемента управления позволяет службе получать уведомления SERVICE_CONTROL_PAUSE и SERVICE_CONTROL_CONTINUE .
SERVICE_ACCEPT_PRESHUTDOWN
0x00000100
Служба может выполнять задачи предварительного завершения.
Этот код элемента управления позволяет службе получать уведомления SERVICE_CONTROL_PRESHUTDOWN . Обратите внимание, что ControlService и ControlServiceEx не могут отправить это уведомление; Только система может отправить его.
Windows Server 2003 и Windows XP: Это значение не поддерживается.
SERVICE_ACCEPT_SHUTDOWN
0x00000004
Служба получает уведомление при завершении работы системы.
Этот код элемента управления позволяет службе получать уведомления SERVICE_CONTROL_SHUTDOWN . Обратите внимание, что ControlService и ControlServiceEx не могут отправить это уведомление; Только система может отправить его.
SERVICE_ACCEPT_STOP
0x00000001
Службу можно остановить.
Этот код элемента управления позволяет службе получать уведомления SERVICE_CONTROL_STOP .
>>>Или должна сама предлагать их отключить в случае проблем. PD>>Хм. Ты предлагаешь, чтобы обычному пользователю ОС предлагала — а не отключить ли Вам "Брокер системных событий" ? Или "Клиент групповой политики" ?
N>Нет, я предлагаю сделать механизм прерывания работы этих служб. Даже интерфейс, а не механизм — он есть готовый, вплоть до того, перезапускать ли службу после сбоев, сколько раз пробовать это делать и с какими таймаутами. Тут нет никакого риска.
Так все это есть в оснастке "Сервисы". И остановить, и приостановить, и перезапуск и т.д. Плюс (не все) в Task Manager
Плюс net start/stop/pause/continue
Что-то я не пойму, что ты хочешь... Чтобы сообщали имя сервиса, который держит хендл ? Или чтобы ему автоматически делали net stop ?
PD>>Прерваться совсем — это есть, net stop, но при этом он не прервется, а закончит работу, и можно его будет разве что заново запустить net start. PD>>Вот только это лишь просьба — SERVICE_CONTROL_STOP. Он может не прерваться. Аналогично тому, как нажатие на крестик в верхнем правом углу окна означает лишь посылку WM_CLOSE, а закроется ли окно — зависит от того, что сделает обработчик.
N>А как же SERVICE_CONTROL_PAUSE?
N>https://learn.microsoft.com/en-us/windows/win32/api/winsvc/nf-winsvc-controlserviceexa
А так же
Notifies a service that it should pause. The hService handle must have the SERVICE_PAUSE_CONTINUE access right.
Здравствуйте, Pavel Dvorkin, Вы писали:
BFE>>А вы понимаете, что сервисы всё равно придётся убить, так как флешку надо извлечь. Я много раз так делал: перезагружал систему, чтобы извлечь флешку. Так что сервисы в любом случае будут убиты. А если нет разницы, то зачем перезагружать систему? PD>Не обязательно.
Обязательно, раз есть "шанс нарваться на неприятности".
И каждый день — без права на ошибку...
Re[8]: Когда же винда научится извлекать устройства?
Здравствуйте, pagid_, Вы писали:
P>>Иногда. Far неплох. Но он не графический, мне это немного мешает. _>Чем мешает? Могу поверить, что чувству прекрасного не удовлетворяет. Но чем мешает? Размер окна не так быстро изменить можно?
В смысле размер окна не изменить быстро? Берёшь за угол и тащишь, он меняется. Хотя, у меня ConEmu стоит, но в десятке вроде консоль на нём как раз и написана вроде
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>... А если может исполняться и ПО других фирм, то отвечать за это ПО она не может. Например, не может отвечать за какой-то антивирус, который некорректно работает с хендлами. И т.д.
Если программа работает некорректно, то вот пускай её система и убивает. Это её, системы, работа.
И каждый день — без права на ошибку...
Re[6]: Когда же винда научится извлекать устройства?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Что-то я не пойму, что ты хочешь... Чтобы сообщали имя сервиса, который держит хендл ? Или чтобы ему автоматически делали net stop ?
Сейчас нет ничего, просто жди неизвестно чего и неизвестно сколько времени.
При этом флешку держат явно сервисы самой ОС, всякие индексаторы и превьютеры. Они не сильно важны и критичны. Я хочу, чтобы при невозможности извлечь устройство выдавался список процессов, которые её держат. Если это пользовательские программы, то их сможет закрыть сам пользователь — ему решать. Если сервисы, то предложение их прервать для извлечения. Как лучше прервать — решение за Майкрософт, это же её сервисы. Не получилось прервать — пользователь сам, зная имена сервисов, может найти их в диспетчере задач и прервать ручками.
Re[7]: Когда же винда научится извлекать устройства?
Здравствуйте, B0FEE664, Вы писали:
PD>>... А если может исполняться и ПО других фирм, то отвечать за это ПО она не может. Например, не может отвечать за какой-то антивирус, который некорректно работает с хендлами. И т.д. BFE>Если программа работает некорректно, то вот пускай её система и убивает. Это её, системы, работа.
Остается лишь дать определение некорректно работающей программы.
Исключение — понятно, а вот остальное ?
With best regards
Pavel Dvorkin
Re[7]: Когда же винда научится извлекать устройства?
N>При этом флешку держат явно сервисы самой ОС, всякие индексаторы и превьютеры. Они не сильно важны и критичны. Я хочу, чтобы при невозможности извлечь устройство выдавался список процессов, которые её держат. Если это пользовательские программы, то их сможет закрыть сам пользователь — ему решать. Если сервисы, то предложение их прервать для извлечения. Как лучше прервать — решение за Майкрософт, это же её сервисы. Не получилось прервать — пользователь сам, зная имена сервисов, может найти их в диспетчере задач и прервать ручками.
Выше уже писали, что совсем необязательно прерывать процессы. Достаточно принудительно отмонтировать ФС с инвалидированием хэндлов.
Нормальная программа должна быть устойчива к инвалидации (обычный сценарий — сетевой каталог отвалился). Тем более Вы сам пишете, что все эти индексаторы и превьюеры Вам не критичны.
Другое дело, что у MS отмонтирование как-то странно сделано
Есть команда mountvol <mount_point> /p
/P Removes the volume mount point from the specified directory,
dismounts the volume, and makes the volume not mountable.
You can make the volume mountable again by creating a volume
mount point.
C:\Users\Myuser>mountvol e:\ /p
The volume is still in use. A force dismount was issued and current handles
to the volume have been invalidated.
Вроде то, что нужно, но тем не менее safely remove всё равно не отрабатывает (проверял на виртуалке).
S>Единственное объяснение этому маразму, что мне приходит в голову — у них есть решение для этой проблемы. Но его откладывают до того момента
Вспомнилось что если команде chkdsk скормить занятый диск, то она скажет так (нагуглил):
Chkdsk may run if this volume is dismounted first. ALL OPENED HANDLES TO THIS VOLUME WOULD THEN BE INVALID. Would you like to force a dismount on this volume? (Y/N)
То есть могут, если захотят.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, Sinclair, Вы писали:
S>До сих пор (Win 11, последние обновления) в 97 случаях из 100 винда продолжает с выдуманной беспомощностью рассказывать мне, что "я не смогла, наверное кто-то что-то использует"....
Частенько бывает, что использует открытый Task Manager. Закрой его, и винда отдаст зажатую флешку
Re[7]: Когда же винда научится извлекать устройства?
Здравствуйте, Nuzhny, Вы писали:
N>Сейчас нет ничего, просто жди неизвестно чего и неизвестно сколько времени. N>При этом флешку держат явно сервисы самой ОС, всякие индексаторы и превьютеры. Они не сильно важны и критичны. Я хочу, чтобы при невозможности извлечь устройство выдавался список процессов, которые её держат. Если это пользовательские программы, то их сможет закрыть сам пользователь — ему решать. Если сервисы, то предложение их прервать для извлечения. Как лучше прервать — решение за Майкрософт, это же её сервисы. Не получилось прервать — пользователь сам, зная имена сервисов, может найти их в диспетчере задач и прервать ручками.
Вот теперь понятно.
Нет. Решительно не согласен.
Возьмем среднего юзера. Во внутренностях системы он не разбирается, а вот в запущенных им программах вполне.
Как правило (не придирайся) программа связана с окном (или консолью). Закрыл окно — закрылась и программа. Или в худшем случае надо на иконку в трее нажать и "Exit" там выполнить.
Это все он знает, и в 9x% случаев это работает.
Ну и наконец разные программы чаще всего (опять не придирайся) друг с другом не связаны. Одну закроешь — на других не скажется.
Поэтому разрешить ему убить программу можно.
А вот про сервисы он знает очень мало. В лучшем случае заглядывал на вкладку в Task Manager. Черти там разберут, что есть что.
Служба AVCTP — это что такое ? От кого она зависит ? Кто от нее зависит ? Кто зависит от тех, от кого она зависит ? И т.п.
Выяснить мы с тобой сможем, если понадобится, но обычный юзер — едва ли.
К чему приведет убиение кого-то из них ? На этот вопрос и мы с тобой не всегда ответим.
А еще учти, что приличная часть сервисов живет в svchost, количество процессов которого растет с каждой новой версией Windows прямо таки с ужасающей скоростью. Убить один сервис в svchost нельзя, можно только весь svchost убить. К каким последствиям это приведет — даже думать не хочу.
Плюс реестр. Сервисы на него завязаны, и если там что-то окажется не так — как бы дело не закончилось переустановкой Windows.
Ну а продвинутым пользователям ничего не стоит зайти в оснастку "Services" и там копаться. Они должны понимать, что они делают и понимать, что они отвечают за свои действия.
А давать всем вопрос : "Подтвердите убиение сервиса XYZ" — нет уж, увольте.
With best regards
Pavel Dvorkin
Re[8]: Когда же винда научится извлекать устройства?
Здравствуйте, ononim, Вы писали:
S>>Единственное объяснение этому маразму, что мне приходит в голову — у них есть решение для этой проблемы. Но его откладывают до того момента O>Вспомнилось что если команде chkdsk скормить занятый диск, то она скажет так (нагуглил): O>
Chkdsk may run if this volume is dismounted first. ALL OPENED HANDLES TO THIS VOLUME WOULD THEN BE INVALID. Would you like to force a dismount on this volume? (Y/N)