Текущий архив: 2005.12.11;
Скачать: CL | DM;
Вниз"Безопасное извлечение устойства" Найти похожие ветки
← →
Германн © (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 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.036 c