Перейти к содержанию
    

Delphi. Функция ReadFile ошибка 87 (0x57) ?

Windows 7 (32-bit).

Функцией CreateFile открываю физический диск (Compact Flash Card в кардридере USB).

Функцией ReadFile пытаюсь прочитать первый сектор.

Всё отлично работает если :

  карта не отформатирована вообще,

  отформатирована в Windows (FAT любой),

  на карте какой либо бред записан.

И только если карта отформатирована в Linux, то при попытке чтения возникает ошибка 87.

 

Почему это происходит?  Как побороть?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Коллега, вы словно "первый раз замужем" ;-) Во что отформатирована? FAT32 (угадал?), воообще-то, не родной линуксячий формат, а "винда" знать-не знает про ext-"что там у вас".
Напомнило:
- Доктор, когда эдак делаю - больно...
- Вот и не делайте эдак...

Мораль: носитель будет использован в "винде"? - форматируйте там.
Ну и CreateFile разве открывает физический диск?

Функцией ReadFile пытаюсь прочитать первый сектор.


Первый сектор чего? Диска? \-8Ж

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сэр, Вы пьяны?

29 minutes ago, Obam said:

носитель будет использован в "винде"? - форматируйте там.

Где бы он не использовался в дальнейшем, а прочитать/записать я его хочу в винде и сейчас!

 

29 minutes ago, Obam said:

Ну и CreateFile разве открывает физический диск?

Именно такая возможность у этой функции и есть. Вы не знали?

30 minutes ago, Obam said:

Первый сектор чего? Диска? \-8Ж

Да, его родимого. Первый сектор диска размером 512 байт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сэр, Вы пьяны?


Отнюдь, мсьё...

" а прочитать/записать я его хочу в винде и сейчас!" да на здоровье, только, в линуксе под "виндовые" форматы не форматируйте: не открывали всем подряд "микрософты" FAT-ы и прочие NTFS-ы.
Вы ж спрашивали "Почему это происходит?" - вот потому...
"Как побороть?" Образ каким-нибудь ImageWriter-oм снять и WinHex-ом вытянуть первый сектор (ну или "в лоб" WinHex-ом).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, Obam said:

"Как побороть?" Образ каким-нибудь ImageWriter-oм снять и WinHex-ом вытянуть первый сектор (ну или "в лоб" WinHex-ом).

Какие-нибудь imagewriterЫ и winhexЫ прекрасно читают и пишут такие диски.

Под вопросом "как побороть" я имел ввиду - как это побороть в программе написанной мной на Delphi с использованием Windows API?

Что такого особенного эти imagewriterЫ и winhexЫ делают что у них такой проблемы на возникает?

 

to SSerge  к чему Ваши ссылки?

 

Попутный вопрос : можно ли как-то из под винды прочитать содержимое идентификационного сектора CF карты?

Того сектора который карта по CF-ATA команде "Identify Device" (0xEC) выдаёт ?

 

PS.

Как выяснилось :

если на CF карте вообще нет никакой файловой системы, то винда разрешает её и читать и писать.

если на карте любая FS от винды, то её можно только читать, а запись запрещена.

если от FS от линукса, то ни прочитать ни записать карту невозможно.

 

Мне нужно написать программу которая могла бы читать/писать образы дисков с/на CFMC карты независимо от содержимого на оных.

Подскажите куда копать?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата

function CreateFile
Создает или открывает следующие объекты и возвращает Хендл (handle), для получения доступа к объекту:
· файлам
· каналам (pipes)
· mailslots

· коммуникационные ресурсы (communications resources)
· Дисковым устройствам (только для Windows NT)
· консолям (consoles)
· папкам (только открытие)

 

Источник: WINAPI ФУНКЦИЯ CREATEFILE

Вы пытаетесь с помощью данной функции получить доступ к диску, что возможно только из под Windows.
Это информация по ссылке в цитате, есть смысл посмотреть делфийский хелп..

Изменено пользователем Droid 77

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Droid 77 said:

Вы пытаетесь с помощью данной функции получить доступ к диску, что возможно только из под Windows.

А я, по Вашему, из под чего пытаюсь получить доступ к диску?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне нужно написать программу которая могла бы читать/писать образы дисков с/на CFMC карты независимо от содержимого на оных.


Дык, много лет как есть: Win32DiskImager (я её по склерозу ImageWriter-ом обзывал) - образы считывает\записывает, не взирая на отформатированность сменного носителя.

Про PS: в первом случае проводник винды должен выдать диалог на форматирование (ну не бывает в винде используемого неформатированного носителя Ж8-Р); третий случай - всё правильно: ext2 и проч. в мире M$ не существуют, а вот второй... чёт не верится.

Попутный вопрос : можно ли как-то из под винды прочитать содержимое идентификационного сектора CF карты?


Того сектора который карта по CF-ATA команде "Identify Device" (0xEC) выдаёт ?


Вот, вы даже ATA-команду знаете, значит искать какие ф-ии WinAPI параметры винчестера получают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, Obam said:


Дык, много лет как есть: Win32DiskImager (я её по склерозу ImageWriter-ом обзывал) - образы считывает\записывает, не взирая на отформатированность сменного носителя.

Да есть. Уже лет 100 как её пользую. :biggrin:

Только мне нужно свою подобную прогу накалякать. Со своим функционалом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

тогда только один выход: законтачиваться с авторами этого "ImageWriter" ;-) благо не проприентарная программа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

печальный вывод. :shok:

21 minutes ago, Obam said:

третий случай - всё правильно: ext2 и проч. в мире M$ не существуют,

И тем не менее M$ ведёт себя по разному ... и не считает что на них нет никакой FS :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ага, "три-разА": винда на SD-шках от "малины" видит только загрузочный раздел; на винчестере линуксовый раздел просто не существует ни для какой винды, а NTFS-раздел от XP в Win98 виден как недоступный-неформатированный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Obam said:

а вот второй... чёт не верится.

Таки да, писать разрешает, но только если приложение открывает диск без разрешения совместного доступа на запись.

Для FAT16/32 это помогает, для NTFS нет.

 

Копаю дальше.

Вот такая функция еще имеется DeviceIoControl и вроде как с кодом IOCTL_DISK_DELETE_DRIVE_LAYOUT

должна заставить винду забыть о всех настройках диска в системе (если я правильно понял описание).

Но Delphi не знает такой константы.

Где взять конкретное её значение?

 

Quote

Removes the boot signature from the master boot record, so that the disk will be formatted from sector zero to the end of the disk.

Partition information is no longer stored in sector zero.

To perform this operation, call the DeviceIoControl function with the following parameters.

 

BOOL DeviceIoControl(
  (HANDLE) hDevice,                 // handle to device
  IOCTL_DISK_DELETE_DRIVE_LAYOUT,   // dwIoControlCode
  NULL,                             // lpInBuffer
  0,                                // nInBufferSize
  NULL,                             // lpOutBuffer
  0,                                // nOutBufferSize
  (LPDWORD) lpBytesReturned,        // number of bytes returned
  (LPOVERLAPPED) lpOverlapped       // OVERLAPPED structure
);
 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...