Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

"Безопасное извлечение устойства"   Найти похожие ветки 

 
Германн ©   (2005-08-13 02:22) [0]

Кто знает, что скрывается за теми действиями в Винде, которые "нужно" выполнять перед извлечением флэшки из разъема USB?
Задача моя такая - юзер подключает флэшку, программа копирует на нее некие файлы, выполняет некие действия в соответствии с сабжем и после чего-то там информирует юзера, что он может извлечь флэшку с полной уверенностью, что вся скопированная информация на ней есть.


 
KilkennyCat ©   (2005-08-13 02:33) [1]

Кэшируется иногда...


 
Германн ©   (2005-08-13 02:50) [2]

Спасибо, конечно, что не прошел мимо, но то что "кто-то, где, у нас, порой", что-то кэширует, это и так известно. Известно и то, что "Свойства/Политика/Кэширование записи и безопасное удаление" - поэтому "можно отключить устройство и без использования значка "Безопасное удаление"" (цитирую WinXP).

Но я спрашивал о чуть-чуть другом.


 
KilkennyCat ©   (2005-08-13 02:58) [3]

Ну так и действия соответствующие. Перенос всех изменений в кэше на оригинал. Возможно, посылается сообщение на устройство об отказе ему в дальнейшем питании или команда нга отключение. Насколько помню описание USB, это (управление питанием со стороны материнки) возможно, но из практики - большинству материнских плат на это наплевать.


 
Германн ©   (2005-08-13 03:12) [4]

2 KilkennyCat ©   (13.08.05 02:58) [3]
Не. Ну я, конечно, физик по образованию. Но в данном случае, "физика процесса" меня весьма мало волнует!

Какие функции (и чьи они) нужно вызвать?
Как их нужно вызвать?
Какие сообщения нужно отловить?

И что из всего реально нужно?


 
GuAV ©   (2005-08-13 13:58) [5]

http://msdn.microsoft.com/library/en-us/install/hh/install/cfgmgrfn_2c8cc2aa-56fe-4ab3-8063-0db0dcbc3098.xml.asp
?


 
GuAV ©   (2005-08-13 14:34) [6]

Или может IOCTL_STORAGE_MEDIA_REMOVAL.

Как вариант, отключить кэш через IOCTL_STORAGE_SET_HOTPLUG_INFO:

The IOCTL_STORAGE_SET_HOTPLUG_INFO operation only sets the value of the DeviceHotplug member of this structure. If the value of that member is set, the removal policy of the specified device is set to ExpectSurpriseRemoval and all levels of caching are disabled. If the value of that member is not set, the removal policy of the specified device is set to ExpectOrderlyRemoval, and caching may be selectively enabled.


 
Ученик   (2005-08-13 19:37) [7]

>Германн ©   (13.08.05 02:22)  
Может пригодится как временное решение

WinExec("rundll32.exe shell32.dll,Control_RunDLL hotplug.dll", SW_SHOW);


 
Ученик   (2005-08-13 19:42) [8]

Еще информация How To Ejecting Removable Media in Windows NT/Windows 2000/Windows XP

http://support.microsoft.com/default.aspx?scid=kb;en-us;165721


 
Ученик   (2005-08-13 20:17) [9]

Вариант на Delphi


const
 IOCTL_STORAGE_BASE      = $0000002d;
 FILE_READ_ACCESS        = $0001;
 FILE_ANY_ACCESS         = $0000;
 FILE_DEVICE_FILE_SYSTEM = $00000009;
 METHOD_BUFFERED    = 0;
 IOCTL_STORAGE_MEDIA_REMOVAL = IOCTL_STORAGE_BASE shl 16 or
                               FILE_READ_ACCESS shl 14 or
                               $0201 shl 2 or METHOD_BUFFERED;
 IOCTL_STORAGE_EJECT_MEDIA   = IOCTL_STORAGE_BASE shl 16 or
                               FILE_READ_ACCESS shl 14 or
                               $0202 shl 2 or METHOD_BUFFERED;

 FSCTL_LOCK_VOLUME     = FILE_DEVICE_FILE_SYSTEM shl 16 or
                         FILE_ANY_ACCESS shl 14 or
                         6 shl 2 or METHOD_BUFFERED;
 FSCTL_DISMOUNT_VOLUME = FILE_DEVICE_FILE_SYSTEM shl 16 or
                         FILE_ANY_ACCESS shl 14 or
                         8 shl 2 or METHOD_BUFFERED;

procedure TForm1.Button1Click(Sender: TObject);
var
 dwBytesReturned: DWord;
 hVolume: THandle;
 PMRBuffer: Bool;
begin
 hVolume := CreateFile("\\.\Z:", GENERIC_READ or GENERIC_WRITE,
               FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
 PMRBuffer := False;
 if hVolume <> INVALID_HANDLE_VALUE then try
   if DeviceIoControl(hVolume, FSCTL_LOCK_VOLUME, nil, 0, nil, 0,
                              dwBytesReturned, nil) and
      DeviceIoControl(hVolume, FSCTL_DISMOUNT_VOLUME,
                              nil, 0, nil, 0,  dwBytesReturned, nil) and
      DeviceIoControl(hVolume, IOCTL_STORAGE_MEDIA_REMOVAL,
                          @PMRBuffer, sizeof(PMRBuffer), nil, 0,
                          dwBytesReturned, nil) and
      DeviceIoControl(hVolume, IOCTL_STORAGE_EJECT_MEDIA, nil, 0,
                                nil, 0, dwBytesReturned, nil) then
      ShowMessage("Media has been ejected safely")
   else
     ShowMessage(SysErrorMessage(GetLastError))
 finally
   CloseHandle(hVolume)
 end else
   ShowMessage(SysErrorMessage(GetLastError))
end;


 
Ученик   (2005-08-13 22:08) [10]

Вариант GuAV ©   (13.08.05 13:58) [5]


type
 SP_DEVINFO_DATA = packed record
   cbSize: DWord;
   ClassGuid: TGuid;
   DevInst: DWord;
   Reserved: Pointer;
 end;

function CM_Get_DevNode_Status(var ulStatus: DWord;
                              var ulProblemNumber: DWord;
                              dnDevInst: DWord;
                              ulFlags: Dword): DWord;
                              stdcall; external "setupapi.dll";

function CM_Request_Device_EjectA(dnDevInst: DWord;
                                 pVetoType: PDWord;
                                 pszVetoName: PChar;
                                 ulNameLength: DWord;
                                 ulFlags: DWord): DWord; stdcall; external "setupapi.dll";

function SetupDiGetClassDevsA(var ClassGuid: TGuid; Enumerator: PChar;
        hwndParent: HWnd; Flags: DWord): THandle; stdcall; external "setupapi.dll";

function SetupDiEnumDeviceInfo(DeviceInfoSet: THandle;
    MemberIndex: DWord; var DeviceInfoData: SP_DEVINFO_DATA): Bool;
    stdcall; external "setupapi.dll";

function SetupDiDestroyDeviceInfoList(DeviceInfoSet: THandle): Bool;
    stdcall; external "setupapi.dll";

const
 DIGCF_PRESENT         = $00000002;
 DIGCF_DEVICEINTERFACE = $00000010;
 DN_REMOVABLE         = $00004000;

procedure TForm1.Button2Click(Sender: TObject);
const
 GUID_CLASS_USB_DEVICE: TGuid = "{A5DCBF10-6530-11D2-901F-00C04FB951ED}";
var
 hDevInfo: THandle;
 DeviceInfoData: SP_DEVINFO_DATA;
 i, dwStatus, dwProblemNumber: DWord;
begin
 hDevInfo := SetupDiGetClassDevsA(GUID_CLASS_USB_DEVICE, nil, 0,
                                  DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
 if hDevInfo <> INVALID_HANDLE_VALUE then try
   DeviceInfoData.cbSize := sizeof(SP_DEVINFO_DATA);
   i := 0;
   while SetupDiEnumDeviceInfo(hDevInfo, i, DeviceInfoData) do begin
     if CM_Get_DevNode_Status(dwStatus, dwProblemNumber,
                              DeviceInfoData.DevInst, 0) = 0 then begin
       if (dwStatus and DN_REMOVABLE) <> 0 then begin
         dwStatus := CM_Request_Device_EjectA(DeviceInfoData.DevInst, nil, nil, 0, 0);
         if dwStatus = 0 then
           ShowMessage("Media has been ejected safely")
         else
           ShowMessage(SysErrorMessage(dwStatus))
       end
     end;
     Inc(i)
   end
 finally
   SetupDiDestroyDeviceInfoList(hDevInfo)
 end else
   ShowMessage(SysErrorMessage(GetLastError))
end;


 
Германн ©   (2005-08-14 01:31) [11]

Спасибо всем!
Буду читать и пробовать.

2 Ученик   (13.08.05 19:37) [7]
WinExec("rundll32.exe shell32.dll,Control_RunDLL hotplug.dll", SW_SHOW);
Если я правильно поняд, то вышеописанное - это вызов стандартного окна с предложением отключить некие устройства.
По ТЗ - это не приемлемо. Так что даже как "временное" решение это не годится. :(


 
DrPass ©   (2005-08-14 01:51) [12]

Думаю, достаточно после записи в файл вызвать функцию FlushFileBuffers, чтобы Windows сбросила на флешку всю закешированную информацию. После этого можно смело сообщать пользователю


 
Германн ©   (2005-08-14 02:17) [13]

2 DrPass ©   (14.08.05 01:51) [12]
Я тоже так думал, и больше того, так думаю и сейчас.


 
Adder ©   (2005-08-14 02:26) [14]

Ну, и мои три копейки -)

http://www.usb.org/developers/devclass_docs/usbmass-ufi10.pdf


 
Adder ©   (2005-08-14 02:57) [15]

http://www.microsoft.com/whdc/device/storage/usbfaq.mspx#EAAA


 
Германн ©   (2005-08-15 02:09) [16]

2 Adder
Спасибо Марина.

Ваши "три копейки" уж точно изучу в первую очередь.

Сразу прошу извинения за то, что Вам, имхо, пришлось лазить по И-нету за меня. :(


 
Adder ©   (2005-08-15 02:22) [17]

Не за что извиняться. Мне было интересно поискать -)


 
Германн ©   (2005-08-15 02:32) [18]

2 Adder ©   (15.08.05 02:22) [17]

Ещё раз спасибо.
А может и Вам это когда-нибудь пригодится!
Имхо, Вы ведь тоже порой имеете дело с "нестандартным" железом. Если я не ошибаюсь. :)

Хотя со столь "нестандартным" железом, имхо, ещё никто из здесь присутствующих ещё не сталкивался. :)
Если всё это заработает, с удовольствием оглашу "это", "решения" и "результаты" на какой-нибудь ММР.


 
neznauskas ©   (2005-10-05 17:43) [19]

Здарствуйте!
У меня возникла такаяже проблема, тольк плюс к этому нужно чтоб Флэшка извлекалась вне зависимости того, открыты с неё какието файлы или нет. Буду благодарен за помощь!


 
Игорь Шевченко ©   (2005-10-05 18:00) [20]

neznauskas ©   (05.10.05 17:43) [19]


>  тольк плюс к этому нужно чтоб Флэшка извлекалась вне зависимости
> того, открыты с неё какието файлы или нет


Извлекай рукой. При открытых файлах система запретит извлечение.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.058 c
14-1132487859
_Sergey_
2005-11-20 14:57
2005.12.11
Заочная олимпиада (г. Омск 2005 год)


2-1132844658
worldmen
2005-11-24 18:04
2005.12.11
BIOS.


3-1130395760
Карелин Артем
2005-10-27 10:49
2005.12.11
Как получить список серверов MS SQL в сети?


14-1132652928
DelphiN!
2005-11-22 12:48
2005.12.11
Бесплатный домен+хостинг с поддержкой ASP.NET или PHP


4-1129138447
Конст
2005-10-12 21:34
2005.12.11
FormatMessage и освобожение буфера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский