Конференция "WinAPI" » Disk raw r&w
 
  • MultIfleX (24.01.12 07:05) [0]
    Доброго времени.
    Собрал некое устройство, пишущее и читающее данные на 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
  • MultIfleX (24.01.12 08:05) [1]
    Плюсом, сейчас обнаружил, что WM_DEVICECHANGE не приходит, если карт-ридер уже был подключен к ПК, а SD вставили позже... засада..
  • QAZ (24.01.12 10:23) [2]

    > необходимо производить RAW чтение и запись на ПК

    длянах?
  • MultIfleX (24.01.12 11:02) [3]

    > длянах?

    Это к сути вопроса не относится. Прибор достаточно сложный, требует больших объемов памяти для хранения различного рода данных. Объясню чтобы было понятно - длязах.
  • QAZ (24.01.12 14:18) [4]

    > Объясню чтобы было понятно

    ну как хош
  • megavoid © (24.01.12 14:27) [5]
    может быть, заставить прибор в начало карты писать самый примитивный фат (может даже с предвычисленными значениями всех полей), а потом уже те самые raw данные?
  • MultIfleX (24.01.12 20:42) [6]

    > ну как хош

    Ответ многогранен как и вопрос. Может переформулируете, чтоб донести суть?

    > может быть, заставить прибор в начало карты писать самый
    > примитивный фат (может даже с предвычисленными значениями
    > всех полей), а потом уже те самые raw данные?

    идея неплоха, рассмотрю обязательно. Просто используемый контроллер достаточно простой, и ресурсов на обработку файловой системы не найти... Использовать более дорогостоящее железо не представляется возможным. На самом деле на SD пишется подробный протокол работы, и очередь необработанных пользователем сообщений, а так же служебные данные о конфигурации среды, в которой предполагается работа.
  • MultIfleX (25.01.12 12:46) [7]
    Записал образ загрузочной дискеты, получил карту на 1.44 Мб. Вроде бы и ничего, но теперь при открытии \\.\Х: запись в области, лежащие за "границами" ФС недоступна... я конечно могу на время записи  сохранить ФС куда-либо, затем записать что необходимо, и восстановить как было..... но это попахивает одноколесным велосипедом без сидения... и педалей....
  • Inovet © (25.01.12 13:31) [8]
    > [6] MultIfleX   (24.01.12 20:42)
    > Просто используемый контроллер достаточно простой, и ресурсов
    > на обработку файловой системы не найти...

    FAT просто устроена, если доступ к диску монопольный, а он такой и будет на контроллере, то никакие там особые ресурсы не нужны. Пиши последовательно в кластеры и в табицы FAT тоже последовательно, может даже с каким-нибудь интервалом записанных кластеров для уменьшения количества циклов записи. Т.е. сразу файл большого размера создал и всё, потом только в область данных пишешь подряд.
  • brother © (25.01.12 14:52) [9]
    > пишущее и читающее данные на SD/SDHC  без использования
    > FAT


    значит ты пишешь данные на физическое устройство? если да - то никаких логических дисков там нет и быть не может, ибо, как ты сам сказал, файловая система там отсутствует...
    следовательно:
    в первых секторах физического устройства никто не мешает записать любую метку, например: MYFAT?
    далее, при появлении нового физ устройства, никто не помешает прочитать эти сектора, и если там наша метка, значит и наша карта?! а дальше... дело техники))))
  • brother © (25.01.12 14:54) [10]
    зы. если уж работаешь с физическим устройством, то логику (в частности файловую или другу систему) реализуешь только ты сам...и не надо тут примешивать стандартный фат итп...
  • MultIfleX (25.01.12 16:23) [11]

    >  если уж работаешь с физическим устройством, то логику (в
    > частности файловую или другу систему) реализуешь только
    > ты сам.

    Все верно, логика реализована и работает.


    > в первых секторах физического устройства никто не мешает
    > записать любую метку, например: MYFAT?

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

    Наверно все же я как то не так выразился... Попробую перезадать вопрос иначе.
    Проблема в том, что винды сразу назначают букву диску, и предлагают пользователю его отформатировать. Мне хотелось избежать этого, + узнать момент появления моего диска в системе. В случае встроенного картридера (к примеру их сейчас ставят на место старого доброго FDD), раздел всегда висит, даже если карта не вставлена. Есть конечно вариант постоянно проверять все REMOVEABLE и новые разделы, но это какое-то кривое решение...
  • MultIfleX (25.01.12 16:26) [12]

    > проверять все REMOVEABLE и новые разделы, но

    ерунду написал..
    ... проверять все REMOVEABLE и вновь появляющиеся в системе диски....
  • brother © (25.01.12 18:37) [13]
    тогда я не понял про:

    > На карте может содержаться более одного раздела

    понятие раздел - это логическое представление диска!
    > но теперь при открытии \\.\Х: запись в области, лежащие
    > за "границами" ФС недоступна

    код открытия и попытки доступа к секторам показывай...
  • CRLF (25.01.12 20:00) [14]
    можно извратнуться, создать один раздел с файловой системой, второй с whatever-you-want, винда не умеет работать с двумя и более разделами на флэшках, картах, etc. Из первого сектора определяешь наличие второго раздела и его смещение относительно начала дискового устройства, дальше дело техники.
  • QAZ (25.01.12 20:58) [15]

    > если да - то никаких логических дисков там нет и быть не
    > может, ибо, как ты сам сказал, файловая система там отсутствует...

    логические диски\разделы не имеют отношения к файловой системе вообще
    вопрос в другом, если чел сделал сам устройство для конкретной задачи,то с какого там должна оказаться карта с разделами? wtf?

    > Проблема в том, что винды сразу назначают букву диску, и
    > предлагают пользователю его отформатировать. Мне хотелось
    > избежать этого

    система предлагает форматировать только видимые разделы,если разделу поставить метку "скрытый" никто ничего не увидит,не спросит

    > узнать момент появления моего диска в системе. В случае
    > встроенного картридера (к примеру их сейчас ставят на место
    > старого доброго FDD), раздел всегда висит, даже если карта
    > не вставлена.

    это не проблема винды,это проблема устройства которое должно сообщить винде что в него чтото вставили
  • brother © (26.01.12 06:02) [16]
    > логические диски\разделы не имеют отношения к файловой системе
    > вообще

    в этом контексте я имел ввиду Partition Table
  • brother © (26.01.12 06:05) [17]
    автору: http://www.lib.csu.ru/DL/bases/prg/frolov/books/bsp/v01b/ch2.htm
    может пригодится при анализе вставленного флеш устройства....
  • MultIfleX (26.01.12 07:12) [18]

    > вопрос в другом, если чел сделал сам устройство для конкретной
    > задачи,то с какого там должна оказаться карта с разделами?
    >  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
         // lock drive
         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;

  • MultIfleX (26.01.12 07:18) [19]

    > автору: http://www.lib.csu.ru/DL/bases/prg/frolov/books/bsp/v01b/ch2.
    > htm
    > может пригодится при анализе вставленного флеш устройства.
    > ...

    Спасибо. Я когда искал информацию о разборе FAT, в сети навалом fat.c и fat.h реализаций для различного рода МК. Но я пришел к выводу, что использование ФС ощутимо замедляет работу девайса, точнее объем поступающих данных начинает превышать объем обрабатываемых (в критических ситуациях), и я отказался от ее использования.
 
Конференция "WinAPI" » Disk raw r&w
Есть новые Нет новых   [134430   +4][b:0][p:0.002]