-
Доброго времени. Собрал некое устройство, пишущее и читающее данные на SD/SDHC без использования FAT... из этого появляется задача - необходимо производить RAW чтение и запись на ПК. Пробывал так: hDevice := CreateFile('\\.\X:', GENERIC_ALL, FILE_ANY_ACCESS, nil,
OPEN_EXISTING, 0, 0 );
....
if not DeviceIoControl( hDevice,FSCTL_LOCK_VOLUME ,NIl,0,
nil, 0, btsIO,nil) then ...
if not DeviceIoControl( hDevice,FSCTL_DISMOUNT_VOLUME ,NIl,0,
nil, 0, btsIO,nil) then ......
...
затем уже SetFilePointerEx(hDevice,0,NIL,FILE_BEGIN);
ReadFile, WriteFile..... Появляются следующие проблемы: 1. На карте может содержаться более одного раздела? В таком случае, я не буду иметь доступ ко всей карте.. Как тут быть? 2. Открывая девайс через hDevice := CreateFile('\\.\PHYSICALDRIVE#',... , примонтированный раздел (G:,F:...) так-же не даст мне записывать в произвольную область карты, отмонтировать его у меня не получается.. 3. Если раздел все же один, и карта уже в картридере ПК, логично что ОС покажет диалог "диск не отформатирован".. есть ли способ, используя который я мог бы узнать о появлении диска в системе, определять - нужный ли это мне диск, и избежать появления данного диалога? WinXP,Win7, DelphiXE2
-
Плюсом, сейчас обнаружил, что WM_DEVICECHANGE не приходит, если карт-ридер уже был подключен к ПК, а SD вставили позже... засада..
-
> необходимо производить RAW чтение и запись на ПК
длянах?
-
> длянах?
Это к сути вопроса не относится. Прибор достаточно сложный, требует больших объемов памяти для хранения различного рода данных. Объясню чтобы было понятно - длязах.
-
> Объясню чтобы было понятно
ну как хош
-
может быть, заставить прибор в начало карты писать самый примитивный фат (может даже с предвычисленными значениями всех полей), а потом уже те самые raw данные?
-
> ну как хош
Ответ многогранен как и вопрос. Может переформулируете, чтоб донести суть?
> может быть, заставить прибор в начало карты писать самый > примитивный фат (может даже с предвычисленными значениями > всех полей), а потом уже те самые raw данные?
идея неплоха, рассмотрю обязательно. Просто используемый контроллер достаточно простой, и ресурсов на обработку файловой системы не найти... Использовать более дорогостоящее железо не представляется возможным. На самом деле на SD пишется подробный протокол работы, и очередь необработанных пользователем сообщений, а так же служебные данные о конфигурации среды, в которой предполагается работа.
-
Записал образ загрузочной дискеты, получил карту на 1.44 Мб. Вроде бы и ничего, но теперь при открытии \\.\Х: запись в области, лежащие за "границами" ФС недоступна... я конечно могу на время записи сохранить ФС куда-либо, затем записать что необходимо, и восстановить как было..... но это попахивает одноколесным велосипедом без сидения... и педалей....
-
> [6] MultIfleX (24.01.12 20:42) > Просто используемый контроллер достаточно простой, и ресурсов > на обработку файловой системы не найти...
FAT просто устроена, если доступ к диску монопольный, а он такой и будет на контроллере, то никакие там особые ресурсы не нужны. Пиши последовательно в кластеры и в табицы FAT тоже последовательно, может даже с каким-нибудь интервалом записанных кластеров для уменьшения количества циклов записи. Т.е. сразу файл большого размера создал и всё, потом только в область данных пишешь подряд.
-
> пишущее и читающее данные на SD/SDHC без использования > FAT
значит ты пишешь данные на физическое устройство? если да - то никаких логических дисков там нет и быть не может, ибо, как ты сам сказал, файловая система там отсутствует... следовательно: в первых секторах физического устройства никто не мешает записать любую метку, например: MYFAT? далее, при появлении нового физ устройства, никто не помешает прочитать эти сектора, и если там наша метка, значит и наша карта?! а дальше... дело техники))))
-
зы. если уж работаешь с физическим устройством, то логику (в частности файловую или другу систему) реализуешь только ты сам...и не надо тут примешивать стандартный фат итп...
-
> если уж работаешь с физическим устройством, то логику (в > частности файловую или другу систему) реализуешь только > ты сам.
Все верно, логика реализована и работает.
> в первых секторах физического устройства никто не мешает > записать любую метку, например: MYFAT?
да, в первом секторе находится заголовок с разметкой, где какие данные на флеш писать.
Наверно все же я как то не так выразился... Попробую перезадать вопрос иначе. Проблема в том, что винды сразу назначают букву диску, и предлагают пользователю его отформатировать. Мне хотелось избежать этого, + узнать момент появления моего диска в системе. В случае встроенного картридера (к примеру их сейчас ставят на место старого доброго FDD), раздел всегда висит, даже если карта не вставлена. Есть конечно вариант постоянно проверять все REMOVEABLE и новые разделы, но это какое-то кривое решение...
-
> проверять все REMOVEABLE и новые разделы, но
ерунду написал.. ... проверять все REMOVEABLE и вновь появляющиеся в системе диски....
-
тогда я не понял про:
> На карте может содержаться более одного раздела
понятие раздел - это логическое представление диска! > но теперь при открытии \\.\Х: запись в области, лежащие > за "границами" ФС недоступна
код открытия и попытки доступа к секторам показывай...
-
можно извратнуться, создать один раздел с файловой системой, второй с whatever-you-want, винда не умеет работать с двумя и более разделами на флэшках, картах, etc. Из первого сектора определяешь наличие второго раздела и его смещение относительно начала дискового устройства, дальше дело техники.
-
> если да - то никаких логических дисков там нет и быть не > может, ибо, как ты сам сказал, файловая система там отсутствует...
логические диски\разделы не имеют отношения к файловой системе вообще вопрос в другом, если чел сделал сам устройство для конкретной задачи,то с какого там должна оказаться карта с разделами? wtf?
> Проблема в том, что винды сразу назначают букву диску, и > предлагают пользователю его отформатировать. Мне хотелось > избежать этого
система предлагает форматировать только видимые разделы,если разделу поставить метку "скрытый" никто ничего не увидит,не спросит
> узнать момент появления моего диска в системе. В случае > встроенного картридера (к примеру их сейчас ставят на место > старого доброго FDD), раздел всегда висит, даже если карта > не вставлена.
это не проблема винды,это проблема устройства которое должно сообщить винде что в него чтото вставили
-
> логические диски\разделы не имеют отношения к файловой системе > вообще
в этом контексте я имел ввиду Partition Table
-
-
> вопрос в другом, если чел сделал сам устройство для конкретной > задачи,то с какого там должна оказаться карта с разделами? > wtf?
Покупаю я новую карту, мне нужно записать на нее конфигурацию для нормальной работы девайся, я вставляю ее в ридер, вставляю в ПК..... а оказывается что она продается с ФС на борту. > это не проблема винды,это проблема устройства которое должно > сообщить винде что в него чтото вставили
Отлично! Вот он и вопрос - что же такое сообщается проводнику(aka Explorer) что он через мгновение после вставки диска уже предлагает его форматнуть? > система предлагает форматировать только видимые разделы, > если разделу поставить метку "скрытый" никто ничего не увидит, > не спросит
Тип раздела(смещение в описании раздела 04h) = 1Bh(Скрытый ФАТ32) ? Что имелось ввиду под "меткой" ? > можно извратнуться, создать один раздел с файловой системой, > второй с whatever-you-want, винда не умеет работать с двумя > и более разделами на флэшках, картах, etc. Из первого сектора > определяешь наличие второго раздела и его смещение относительно > начала дискового устройства, дальше дело техники.
Изза большого количества сообщений от различного числа пользователей, видимо потерялась суть,... Мне то как раз не хочется никакого ФАТ и прочего.. Мне достаточно того, что там вообще нет ни MBR ни всего остального, а просто тихо мирно лежат мои данные.. Мне надо чтоб винды не терроризировали флеш (предлагая ее форматнуть, чтоб патриотически настроеный дядя оператор, искренне желая лучшего, не нажал "форматировать" и не послал часть данных на покой) + самый простой способ определения "вновь вставленного" в картридер SD-флеша. Просто рассматривая вариант с ФС в начале карты, а затем "то-что-я-хочу": К примеру, сейчас расположил десятимегабайтный ФАТ в начале. Теперь: 1. Открывая '\\.\X:' не получаю доступа к областям вне ФАТ раздела (тоесть ограничен этими 10 Мб) 2. Открывая '\\.\PHYSICALDRIVE#' я не могу записывать никуда кроме 0 сектора + читать дальше чем распологается FAT. Если я затираю первые сектора в начале карты - ФС карты не определяется, и я получаю доступ через '\\.\X:' или '\\.\PHYSICALDRIVE#' ко всей памяти карты. Казалось бы то что нужно. Но опять это гребаное предложение отформатировать. Что с ним сделать, как успеть перехватить? Кто просил код открытия. К примеру вот этот кусок тестового кода. Само открытие по сути как и везде:
hDevice := CreateFile( '\\.\L:', GENERIC_ALL,
FILE_ANY_ACCESS, nil, OPEN_EXISTING, 0, 0 );
if hDevice <> INVALID_HANDLE_VALUE then
try
DeviceIoControl( hDevice,FSCTL_LOCK_VOLUME ,NIl,0, nil, 0, btsIO,nil) ;
for i := $00 to $7FFFFF do
begin
FileSeek( hDevice, i shl 9 , FILE_BEGIN );
....
ReadFile( hDevice, buf, 512,btsIO,NIL);
....
WriteFile( hDevice, buf, 512,btsIO,NIL);
....
End;
-
> автору: http://www.lib.csu.ru/DL/bases/prg/frolov/books/bsp/v01b/ch2. > htm > может пригодится при анализе вставленного флеш устройства. > ...
Спасибо. Я когда искал информацию о разборе FAT, в сети навалом fat.c и fat.h реализаций для различного рода МК. Но я пришел к выводу, что использование ФС ощутимо замедляет работу девайса, точнее объем поступающих данных начинает превышать объем обрабатываемых (в критических ситуациях), и я отказался от ее использования.
-
> и я отказался от ее использования.
это может пригодиться, для ручной создания структуру partition table и fat (например раздел на 1мб ;) )
-
> это может пригодиться, для ручной создания структуру partition > table и fat (например раздел на 1мб ;) )
Да, спасибо =) В итоге меня сейчас все устраивает, за исключением возможности доступа пользователя к моему диску. Кстати, не в курсе, как форсируется демонтаж диска при форматировании (когда он пишет, что все дескрипторы стали не верны), ибо когда я пробую блокирую диск при открытых файлах, он не поддается (DeviceIoControl( hDevice,FSCTL_LOCK_VOLUME ,NIl,0, nil, 0, btsIO,nil) возвращает FALSE)
-
я бы форматнул под стандартную фат и создал один файл размером в весь раздел нашел его смещение и писал в обход фат
-
Попробывал сделать следующее: Просматриваю все REMOVEABLE диски на появление "моего RAW" , как только появляется - сразу блокирую ( DeviceIoControl с FSCTL_LOCK_VOLUME ). Все, теперь все вроде бы хорошо. Буду держать его заблокированным пока не выполню все операции и пользователь не извлечет диск. При попытках доступа ( в том числе форматирования средствами ОС) - выдается ошибка, что недостаточно привелегий.
Интересно вот что: если в процессе записи, извлечь флешку из картридера, появляется стандартное сообщение ОС об ошибке - НЕВЕРНЫЙ ТОМ(отмена,повтор,продолжить)... если вставить ее назад и нажать ПОВТОРИТЬ то запись продолжется. При этом, блокировка с диска не слетает.
Думаю я найду как захлопнуть это окно о "неформатированном диске"... Появление новых дисков отслежу по WM_DEVICECHANGE, ну а заранее примонтированные разделы картридера, в которые не вставили карту думаю придется опрашивать с интервалом...
-
эх... ну ведь форматнут эту флэшку, обязательно форматнут, вставят в дисковод и ответят «да» на запрос форматирования, а чего такого, не читается же. прикрутить фат к контроллеру — дело пяти минут гугления, пары часов изучения библиотеки и килобайта ОЗУ под пару кластеров.
-
зачем полностью фат реализовывать? нужно при старте найти начало файла (смещение) с нужным именем а далее писать по этому базовому смещению но это при жестком ограничении что файл один и максимального размера
читаться будет под любой осью с любыми правами обычными средствами чтения файла
-
или вапще фат не реализовавать а искать сигнатуру файла аля фпсевдокоде offset:=Pos(hDevice," SetFilePointerEx(hDevice,offset,NIL,FILE_BEGIN);
WriteFile где в Pos прыгаем по 512 байт (или размер сектора) и читаем первый x байт и сравниваем с сигнатурой
-
> Покупаю я новую карту, мне нужно записать на нее конфигурацию > для нормальной работы девайся, я вставляю ее в ридер, вставляю > в ПК..... а оказывается что она продается с ФС на борту.
запускаеш любой менеджер разделов,удаляеш нахрен все разделы .... и о чудо!!!
> Тип раздела(смещение в описании раздела 04h) = 1Bh(Скрытый > ФАТ32) ? Что имелось ввиду под "меткой" ?
просто отобрать у раздела букву
> Отлично! Вот он и вопрос - что же такое сообщается проводнику(aka > Explorer) что он через мгновение после вставки диска уже > предлагает его форматнуть?
проводник вообще не при чем он также получает WM_DEVICECHANGE как и все форматировать винда предлагет если есть диск с разделами с назначеной буквой,но с неподдерживаемым форматом фс
-
> Мне надо чтоб винды не терроризировали флеш (предлагая ее > форматнуть, чтоб патриотически настроеный дядя оператор, > искренне желая лучшего, не нажал "форматировать" и не послал > часть данных на покой) + самый простой способ определения > "вновь вставленного" в картридер SD-флеша. Они и не будут. Ну будет дядя оператор видеть 4-гиговую флэшку как 256-меговую (например), а остальные 3.75 гига в проводнике/файловом менеджере видно не будет. Если дядя оператор отформатирует "видимую" часть диска, твоим данным в остальной части карты это не повредит. Если же дядя оператор через diskpart возьмётся вручную редактировать таблицу разделов, то ты никакими своими ухищрениями ему не помешаешь.
-
> просто отобрать у раздела букву
Согласен, не вопрос! Но если не доступен ПК на котором будет все это исполняться? написать реализацию "отбора буквы" (как к примеру в управлении дисками), боюсь мне не под силу.
> Если же дядя оператор .....то ты никакими своими ухищрениями ему > не помешаешь.
Я хотел бы сделать защиту от неосторожности. От дурака защиту изобретать - неблагодарное дело, убеждался не раз =) поэтому полностью согласен.
> он также получает WM_DEVICECHANGE как и все
в том то и дело, что WM_DEVICECHANGE не приходит, если картридер уже был подключен (в этот момент получаем сообщение), а карту вставили уже значительно позже. Я писал об этом выше. Поэтому и привел этот проводник в пример, он то ведь узнает как то...
-
> Я хотел бы сделать защиту от неосторожности. Так чем плоха защита "вот тебе маленький раздел FAT, что бы ты с ним не делал, служебные данные ты не повредишь"?
-
> [19] MultIfleX (26.01.12 07:18) > Но я пришел к выводу, что использование ФС ощутимо замедляет > работу девайса
Ты ошибаешься. Читай выше мой пост об этом. Прочитать загрузочный сектор, там указано начало корневого раздела и начало FAT. Создать в корне запись о файле сразу на максимальный объём, прописать в FAT последоватьность с приращением +1, всё. Дальше пишешь подряд в область данных, как тебе и хочется.
Если файл уже создан неизвестно где и как, то в общем случае немного сложнее, но такой универсальности и не требуется в задаче.
Зато вставил такую флешку в картридер и сразу у тебя готовый файл с данными без всяких дополнительных примочек по считыванию.
-
> [22] Slym © (26.01.12 09:20) > я бы форматнул под стандартную фат и создал один файл размером > в весь раздел нашел его смещение и писал в обход фат
Тоже вариант. Только нужна гарантия созания этого файла в непрерывной последовательной области, лучше саздать на контроллере.
-
> [23] MultIfleX (26.01.12 09:30) > Думаю я найду как захлопнуть это окно о "неформатированном диске"...
и т.п. просто от нежелания или боязни разобраться, отсюда и попытки обойти стандартое поведение, отрезать, заткнуть, запретить, вместо того чтобы сделать как положено.
-
Как вариант Просят отформатировать - отформатируй. Затем создай один файл размером со всё доступное место на диске. И только в него потом пиши-читай.
-
> [34] icWasya © (26.01.12 14:24) > Затем создай один файл размером со всё доступное место на диске.
Больше 4 ГБ не получится.
-
мне решительно непонятна всеобщая боязнь полноценной поддержки FAT32 в этом треде. читать сектора SD/SDHC, значит, ресурсы у контроллера есть, а кластеры FAT — нет?
-
> в том то и дело, что WM_DEVICECHANGE не приходит, если картридер > уже был подключен (в этот момент получаем сообщение), а > карту вставили уже значительно позже. Я писал об этом выше. > Поэтому и привел этот проводник в пример, он то ведь узнает > как то...
проводнику приходит и при втыке и при вытыке карты - у меня тоже есть картридер ;)
-
> проводнику приходит и при втыке и при вытыке карты - у меня > тоже есть картридер ;)
А мне не приходит, вот жеж.....
> мне решительно непонятна всеобщая боязнь полноценной поддержки > FAT32 в этом треде. > читать сектора SD/SDHC, значит, ресурсы у контроллера есть, > а кластеры FAT — нет?
Попробовать стоит, вдруг получится ... случай с непрерывным файлом в принципе подходит.
> Тоже вариант. Только нужна гарантия созания этого файла > в непрерывной последовательной области, лучше саздать на > контроллере.
Да, буду пробовать...
> и т.п. просто от нежелания или боязни разобраться
это не в данном случае. На все есть свои сроки, целесообразность и ограничения. Рассматриваются и изучаются все варианты.
-
Использовал Petit FAT, пока полет нормальный, все читается и пишется. Буду разбираться дальше. Всем большое спасибо за советы. Еще вопрос - есть возможность реализовать ""гарантированное" занятие файлом на карте непрерывного пространства"? Если я ее форматнул, и следом записал два/три больших файла скажем по пол гигабайта, как мне узнать, непрерывно ли они расположены? Я не говорю про контроллер, я говорю про Win.
-
> [39] MultIfleX (27.01.12 09:43) > Если я ее форматнул, и следом записал два/три больших файла > скажем по пол гигабайта, как мне узнать, непрерывно ли они > расположены? Я не говорю про контроллер, я говорю про Win.
Вообще-то должны бы последовательно лечь, но какое там у Вин расположение звёзд в тот момент будет неизвестно. Так что я бы не полагался на её настроение. Проверить чтением таблиц(ы) FAT, может какой другой способ, утилита есть.
Всё имхо.
Ещё момент. У пользователя могут быть установлены какие-нибудь дефрагментаторы диска, которые могут сами или с его согласия начать оптимизировать флешку. Например Perfect Disk с настройками по умолчанию может так делать. Так что после вставки флешки в комп файл уже может оказаться НЕпоследовательно расположен.
Но если НЕ на контроллере гарантированно последовательный создавать, то на контроллере читать FAT и по нему уже совсем правильно записывать в цепочки кластеров файла, не закладываясь на его последовательое расположение. Что тоже не потребует каких-то сверресурсов.
-
> Что тоже не потребует каких-то сверресурсов.
Уже проверил, при максимальной расчетной нагрузке не успевает позиционироваться. Все в притык)
Про дефрагментаторы - я бы посоветовал удалить дефрагментатор, дефрагменирующий непрерывный файл ;)
-
> [41] MultIfleX (27.01.12 11:23) > Про дефрагментаторы - я бы посоветовал удалить дефрагментатор, > дефрагменирующий непрерывный файл ;)
Он его может начать перемещать, чтобы освободить кусок место под другие - обычное дело - а пользователь его остановит в средине процесса. И потом посоветовать ещё не значит, что такого не будет.
-
непрерывный файл вполне может оказаться фрагментированным после дефрагментации, если на разделе мало свободного места.
-
> [41] MultIfleX (27.01.12 11:23) > Уже проверил, при максимальной расчетной нагрузке не успевает > позиционироваться. Все в притык)
Странно это. По памяти ресурсов больше надо на размер сектора 512 байт вроде если не читать с запасом, по скорости ну чтение сектора из FAT иногда добавится, в самом худшем случае на запись каждого кластера, сколь он там 8192 допустим байта, одно чтение 512 байт. Это при последовательной записи.
-
я делал так: устройство при подключении флешки проверяет, "наша" или "не наша" (см.ниже). если не наша - тут же форматирует ее. Способ предельно простой (тут сверху уже подсказывали): один раздел, один том, один файл размером на весь свободный объем, фиксированная метка диска и тома. Файловая система только FAT16. Соответственно, обращение к флешке предельно упрощается + можно читать содержимое файла средствами ОС.
-
посмотрел Petit FAT FATFS fs; FRESULT res; DWORD sect;
res=pf_mount(&fs);
res=pf_open("/Data.txt");
res=pf_lseek (0);
sect=fs->dsect;
далее выбрасываем Petit FAT и работаем напрямую используя инфу из fs т.е. sect из последней строчки как расположить файл последовательно уже другая легко решаемая задача
-
> По памяти ресурсов больше надо на размер сектора 512 байт вроде ...
да, но когда у тебя 8 битный контроллер с 4 кб ОЗУ, дающий в лучшем случае 16MIPS ... не разгуляешься. Менять на более мощный и дорогой не вижу смысла - с основными задачами справляется.
> устройство при подключении флешки проверяет, "наша" или "не наша"
если не наша - девайс не должен работать, ибо опорных данных на флеше нет. Уже реализовал такого же смысла проверку =). Форматировать и записывать начальные данные буду на ПК. Проверить данные после записи на последовательность я могу. Обнаружение начального сектора файла и чтение/запись на девайсе со смещением уже отладил.
Всем спасибо большое за помощь.
-
> далее выбрасываем Petit FAT и работаем напрямую используя > инфу из fs т.е. sect из последней строчки
да, все так и сделал ;)
-
> А мне не приходит, вот жеж.....
буквально седня утром внедрил себе в софт данную плюшку ибо актуально :)
-
> буквально седня утром внедрил себе в софт данную плюшку > ибо актуально :)
И как отслеживаешь вставку флеша в ридер?
-
> MultIfleX (27.01.12 16:26) [50]
через WM_DEVICECHANGE :P
-
кстати, в гугле решения для этого случая не найдеш
-
так показывай код!
-
> через WM_DEVICECHANGE :P
Как обычно, осмысленный, несущий свет и просвещение пост...
Однако, пока вы плюшками баловались, нашел вариант - SHChangeNotifyRegister ;) Все, разрешите откланяться. Вопросов более нет.
|