-
Доброго времени. Собрал некое устройство, пишущее и читающее данные на 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 реализаций для различного рода МК. Но я пришел к выводу, что использование ФС ощутимо замедляет работу девайса, точнее объем поступающих данных начинает превышать объем обрабатываемых (в критических ситуациях), и я отказался от ее использования.
|