Безопасное извлечение запоминающих устройств для USB

Здесь можно сообщить о найденных багах в Far.
sysadm-nk-resurs
Posts: 71
Joined: Tue 29 Dec, 2009 19:16

Безопасное извлечение запоминающих устройств для USB

Post by sysadm-nk-resurs »

Far Manager, version 2.0 (build 1302) x86. (Shift-Del в меню выбора диска)
Заметил несколько опережающую работу данной фичи, а именно:
после нажатия Shift-Del на USB-диске выскакивает диалог
╔════════ Device Removal ═══════╗
║ Do you want to remove the device ║
║ Запоминающее устройство для USB ║
║ ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ ║
║ (disk(s): ХХХ:) ║
║ Remove Cancel ║
╚═══════════════════════════╝
и, если ничего не выбирать - в течение 2-3 секунд девайс, тем не менее, оказывается извлечённым.
Заметил просто потому, что недавно поставил USB Safely Remove, а он чуть информативнее стандартной виндовой извлекалочки - и говорит, что девайс, мол, был отключен.
(т.е. - дискомфорта от такого поведения практически нет - я всё равно девайс извлекать собрался... Но, как-бы - нехорошо действия действовать без команды "ФАС!" :) )
Потом проверил: да, действительно - нажав ESC или "Cancel" через пару секунд - выбрать диск этого девайса нельзя: он и вправду уже отключен.
Далее проверил на машине без установленной "USB Safely Remove" - картина та-же, проблема не в "USB Safely Remove", а именно в FAR'е.
Заодно проверил на имеющейся версии "Far Manager, version 2.0 (build 1174) x86" - картина та-же... Давно, видимо, сломалось...
User avatar
[e]Bu$ter
Posts: 792
Joined: Mon 30 May, 2005 23:05
Location: Беларусь, Минск
Contact:

Re: Безопасное извлечение запоминающих устройств для USB

Post by [e]Bu$ter »

Ну и на этот же счёт добавлю хотелку. Если на панели открыта флешка, то её нельзя извлечь через фаровский Hotplug devices list — пишет The disk is in use or locked by another process. Но через меню дисков это устройство в тот же момент прекрасно извлекается.
Вот и подумалось, раз уж фар может определить, что это он сам устройство и заблокировал, то почему освобождает его только когда извлечение происходит через меню дисков?
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Безопасное извлечение запоминающих устройств для USB

Post by Skirda »

[e]Bu$ter wrote:Вот и подумалось, раз уж фар может определить, что это он сам устройство и заблокировал, то почему освобождает его только когда извлечение происходит через меню дисков?
элементарная недоработка
на мантис пачт выкладывай :D
We are the Borg. You will be assimilated.
So Say We All!
User avatar
[e]Bu$ter
Posts: 792
Joined: Mon 30 May, 2005 23:05
Location: Беларусь, Минск
Contact:

Re: Безопасное извлечение запоминающих устройств для USB

Post by [e]Bu$ter »

Skirda wrote:элементарная недоработка
на мантис пачт выкладывай :D
Ну что ж. Я уже нашел костыль который освобождает девайс перед отключением его из меню дисков, попробую вставить его в функцию вызываемую из Hotplug devices list. Если заработает — будет патч :D

Только нужно седьмой SDK докачать.
User avatar
[e]Bu$ter
Posts: 792
Joined: Mon 30 May, 2005 23:05
Location: Беларусь, Минск
Contact:

Re: Безопасное извлечение запоминающих устройств для USB

Post by [e]Bu$ter »

Просидел пару часов. Походу дважды собирался всё бросить, но всё таки докопался и нашел простой способ придумал костыль способный пофиксить проблему без лишнего кода.

Уже вроде и патч собрался выкладывать, но успел заметить, что извлечение работает только для левой панели :?
Ещё через час копания стало понятно, что не смотря на то, что в функции FileList::IfGoHome вызовы GetCurDir и Another->GetCurDir возвращают правильные папки для своих панелей, вызовы SetCurDir происходят из разных мест: для левой панели SetCurDir вызывается для объекта FileList (то, что надо), а для правой панели (всегда) Another->SetCurDir вызывается из объекта Panel, что понятное дело не приводит к смене папки.
Дальше я ничего ломать не стал, ибо чую, что не правильно это.

Вот этот кривой костыль:

Code: Select all

Index: hotplug.cpp
===================================================================
--- hotplug.cpp	(revision 3944)
+++ hotplug.cpp	(working copy)
@@ -39,6 +39,7 @@
 #include "language.hpp"
 #include "keys.hpp"
 #include "help.hpp"
+#include "filelist.hpp"
 #include "vmenu.hpp"
 #include "BlockExtKey.hpp"
 #include "imports.hpp"
@@ -647,11 +648,13 @@
 		string strDiskMsg;
 		wchar_t Disks[256], *pDisk=Disks;
 		*pDisk=0;
+		FileList fl;
 
 		for (int Drive='A'; Drive <= 'Z'; ++Drive)
 		{
 			if (dwDriveMask & (1 << (Drive-'A')))
 			{
+				fl.IfGoHome((wchar_t)Drive);
 				*pDisk++=(wchar_t)Drive;
 				*pDisk++=L':';
 				*pDisk++=L',';
Как ещё из этой функции (hotplug.cpp::RemoveHotplugDevice) можно добраться до панелей и если потребуется сменить на них папки?
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Безопасное извлечение запоминающих устройств для USB

Post by t-rex »

Без обид, забудь, ты вообще не в теме.
User avatar
[e]Bu$ter
Posts: 792
Joined: Mon 30 May, 2005 23:05
Location: Беларусь, Минск
Contact:

Re: Безопасное извлечение запоминающих устройств для USB

Post by [e]Bu$ter »

Да никаких проблем, на что тут обижаться. Я прекрасно понимаю, что не в курсе даже и на процент, как и что в фаре устроено. И что шансов на решение проблемы локально, без вникания в механизмы взаимодействия, у меня очень мало. Но попробовать было интересно.
User avatar
vkh
Posts: 226
Joined: Fri 13 Nov, 2009 07:48
Has thanked: 2 times
Been thanked: 1 time

Re: Безопасное извлечение запоминающих устройств для USB

Post by vkh »

в последних сборках FAR Manager 2 перестал показывать флэшки в списке hotplug устройств и пропала реакция на ShiftDel в списке дисков на диске флэшки.
в винде извлечение отрабатывает без проблем
topmo3
Posts: 156
Joined: Mon 21 Aug, 2006 15:36
Has thanked: 37 times
Been thanked: 6 times

Re: Безопасное извлечение запоминающих устройств для USB

Post by topmo3 »

у меня всё работает как и прежде
Far Manager, version 2.0 (build 1583) x86
User avatar
vkh
Posts: 226
Joined: Fri 13 Nov, 2009 07:48
Has thanked: 2 times
Been thanked: 1 time

Re: Безопасное извлечение запоминающих устройств для USB

Post by vkh »

странно, обновил FAR дома, и дома перестали отображаться Hotplug устройства
при подключенной флэшке и кардридере

Code: Select all

 ╔═══════════════════════ Hotplug-устройства ═══════════════════════╗
║  Запоминающее устройство для USB "Multi Flash Reader USB Device" ║
╚═══════════════════ Редактирование: Del,Ctrl-R ═══════════════════╝
при этом FAR даже запущен с флэшки. никто не в курсе в чем может быть дело?
повторяется не только на рабочем и домашнем компе, но и на других компах на работе. предыдущие билды показывают Hotplug девайсы без проблем.
без плагинов та же картина.
при этом мульти флэш ридер извлекается, а флэшка - нет реакции.

Code: Select all

╔═════════════ G:\projects\fardev\unicode_far ═════════════╗╔══════ G:\projects\fardev\unicode_far\Release.32.vc ══════╗
║р           Имя             │             Имя             ║║и           Имя             │             Имя             ║
║..                          │cmdline.cpp                  ▲║..                          │                             ║
║.svn                        │cmem.cpp                     ▓║obj                         │                             ║
║bootstrap                   │codepage.cpp                 ▓║Far.exe                     │                             ║
║contrib                     │config.cpp                   ▓║Far.exp                     │                             ║
║Include                     │console.cpp                  ▓║Far.lib                     │                             ║
║Release.32.vc               │constitle.cpp                ▓║far.map                     │                             ║
║scripts                     │copy.cpp                     ▓║far.pdb                     │                             ║
║SDK                         │ctrlobj.cpp                  ░║FarCze.lng                  │                             ║
║tools                       │cvtname.cpp                  ░║FarEng.hlf                  │                             ║
║UCD                         │datetime.cpp                 ░║FarEng.lng                  │                             ║
║ch                                                        ░║FarGer.lng                  │                             ║
║CO  ╔═════════════════ Диск ══════════════════╗           ░║FarHun.hlf                  │                             ║
║HA  ║  C: жёсткий        │ 297,99 Г│  4                                                 │                             ║
║HA  ║  D: DVD-RW         │         │      ╔══════ Удаление устройства ══════╗           │                             ║
║LI  ║  E: DVD-ROM        │         │      ║  Вы хотите удалить устройство   ║           │                             ║
║MA  ║  F: CD-ROM         │  25,19 М│      ║ Запоминающее устройство для USB ║           │                             ║
║ma  ║  G: сменный        │         │      ║  Multi Flash Reader USB Device  ║           │                             ║
║ma  ║  Z: сменный        │         │      ║          (диск(и): Z:)          ║           │                             ║
║RE  ╚══════════ Del,Shift-Del,F4,F9 ═══   ╟─────────────────────────────────╢           │                             ║
║RE                                        ║     { Удалить } [ Отмена ]      ║           │                             ║
║REMINDER                    │edit.cpp     ╚═════════════════════════════════╝           │                             ║
║SYSLOG-RU                   │editor.cpp                                                 │                             ║
║UNICODE                     │eject.cpp                    ░║                            │                             ║
║svn_tag_build.bat           │execute.cpp                  ░║                            │                             ║
║hook_wow64.c                │farexcpt.cpp                 ░║                            │                             ║
║adminmode.cpp               │farqueue.cpp                 ░║                            │                             ║
║CachedWrite.cpp             │farrtl.cpp                   ░║                            │                             ║
║cddrv.cpp                   │farwinapi.cpp                ░║                            │                             ║
║CFileMask.cpp               │ffolders.cpp                 ░║                            │                             ║
║chgmmode.cpp                │fileattr.cpp                 ░║                            │                             ║
║chgprior.cpp                │fileedit.cpp                 ░║                            │                             ║
║clipboard.cpp               │filefilter.cpp               ▼║                            │                             ║
╟────────────────────────────┴─────────────────────────────╢╟────────────────────────────┴─────────────────────────────╢
║..                                    Вверх 11.06.10 08:07║║Far.exe                              1324 К 11.06.10 08:08║
╚═══════════ 6 017 272 (313) ═══ 2 623 037 440 ════════════╝╚════════════ 9 648 411 (15) ═══ 2 623 037 440 ════════════╝
User avatar
vkh
Posts: 226
Joined: Fri 13 Nov, 2009 07:48
Has thanked: 2 times
Been thanked: 1 time

Re: Безопасное извлечение запоминающих устройств для USB

Post by vkh »

хм.... сегодня совершенно случайно увидел что одна флэшка отображается и извлекается FAR`ом корректно.
а одна, с которой давным давно хожу и работаю вдруг перестала отображаться и извлекаться FAR`ом....
UJvu
Posts: 156
Joined: Tue 03 May, 2005 15:38
Location: Севастополь
Contact:

Re: Безопасное извлечение запоминающих устройств для USB

Post by UJvu »

vkh, а на ней один раздел или несколько?
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Безопасное извлечение запоминающих устройств для USB

Post by Smitis »

А зачем вообще для флешек использовать безопасное извлечение?
По умолчанию, кеширование сменных накопителей в винде отключено. Больше, кроме сброса буфера на диск, причин использовать "безопасное извлечение" нет.
Разум когда-нибудь победит.
User avatar
zg
zero-gravity
Posts: 6034
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

Re: Безопасное извлечение запоминающих устройств для USB

Post by zg »

Smitis wrote:А зачем вообще для флешек использовать безопасное извлечение?
в xp питание отключалось.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Безопасное извлечение запоминающих устройств для USB

Post by Smitis »

в xp питание отключалось.
Отключалось? Насклько я понимаю, если отключить питание USB порта, то порт будет недоступен до перезагрузки. Винда просто не сможет определить, подключено ли устройство к порту.

Да и вообще, если играться с питанием, надо делать не "безопасное отключение", а "безопасное включение".

П.С.
Диспетчер устройств, вкладка "power" для USB устройства показывает исчезновение питания только после физического извлечения устройства.
Разум когда-нибудь победит.
Post Reply

Return to “Глюки и баги”