Page 1 of 1

Прямой доступ к диску (для записи на ntfs)

Posted: Wed Mar 18, 2009 11:14 pm
by Flinta
Здравствуйте. Хочу попытаться написать утилитку, под KolibriOS. Проблема (помимо моей квалификации :D ) в отсутствии возможности писать на ntfs штатными средствами. Возникла идея прочитать нужный файл, выяснить какие байты следует поменять. Затем проанализировать MFT и выяснить, в каком секторе и с каким смещением находится искомый байт.
А вот дальше я не знаю. Приходит на ум сохранить смещения где-нибудь в boot-секторе (благо, там места хватает), прописать в нем же свой код (ни разу этого не делал, вероятно, не так это просто). Или загрузиться уже в DOS с поддержкой ntfs, считать сохраненные данные и из-под DOS и скорректировать нужный файл. Или существует нормальный способ поменять немного байт в файле, используя какой-то механизм прямого доступа к диску из KolibriOS?
Меклкокалиберная впечатлила меня скоростью загрузки, и, тут же, огорчила неполной поддержкой ntfs. Абыдна, да?

Re: Прямой доступ к диску (для записи на ntfs)

Posted: Thu Mar 19, 2009 1:34 pm
by diamond
Из ядра писать можно, а такие вещи целесообразней делать в ядре или драйверах - это раз.
Запись в файловую систему вовсе не ограничивается изменением соответствующих байт в файле - даже если ограничиваться только записью в файл без изменения размера, для полной корректности нужно ещё и скорректировать дату/время последней модификации в соответствующей файловой записи. А в основном запись подразумевает создание новых файлов или перезапись существующих файлов с нуля с потенциальным изменением размера, так что то, что тут предлагается, особого значения не имеет - это два.

Re: Прямой доступ к диску (для записи на ntfs)

Posted: Thu Mar 19, 2009 4:03 pm
by Flinta
Спасибо за ответ. С датой-временем поразбираюсь.
"так что то, что тут предлагается, особого значения не имеет - это два." - вот этого не понял.
Я бы и хотел "предложить", да попрошаек тут не жалуют. Вопрос был о том, как лучше решить частную задачу.
Занимаюсь ремонтом компов, особенно люблю гонять вирусей. Для этого часто гружусь с WinPE и работаю с реестром винды. Или подгружаю куст, или напрямую с файлами кустов. Меня бесит долгая загрузка PE (а загружаться приходится не по одному разу).
Извините за офтоп, но как "ремонтной" системе Kolibri цены бы не было, будь реализована запись на ntfs.
Понимаю, что у вас другие приоритеты, вот и решил попробовать действовать самостоятельно. Только опыта низкоуровнего кодинга у меня ноль (и вообще я не кодер).

Я правильно понял, что в КолибриОС невозможна запись на диск без использования драйвера?

Re: Прямой доступ к диску (для записи на ntfs)

Posted: Thu Mar 19, 2009 4:34 pm
by Mario
Flinta
В ядре есть процедуры работы с отдельными секторами жесткого диска, но в виде функции API это не доступно. В принципе ничто не мешает сделать сборку для себя любимого и ввести новые функции, которые смогут самостоятельно делать чтение и запись отдельных секторов. Разумеется никакой гарантии отсутствия конфликтов с уже существующими сервисами (кодом драйверов файловых систем) при этом не обеспечивается. Все на свой страх и риск.

Re: Прямой доступ к диску (для записи на ntfs)

Posted: Thu Mar 19, 2009 4:37 pm
by diamond
Невозможна. Если очень хочется, то такую возможность можно добавить в ядро в отдельно взятой конфигурации, это следующие строчки:
fs/fs_lfn.inc, массив fs_HdServices: добавить в конец массива (непосредственно перед "fs_NumHdServices equ ...")

Code: Select all

dd fs_HdDirectRead
dd fs_HdDirectWrite
И в любой из файлов ядра включить код типа

Code: Select all

fs_HdDirectRead:
mov  eax, [ebx]
mov  ebx, edx
call hd_read
xor  eax, eax
cmp  [hd_error], eax
jz   @f
mov  al, 11 ; device error
@@:
ret
и аналогичный для fs_HdDirectWrite с единственной заменой hd_read на hd_write, то появятся две новые системные функции, 70.10 и 70.11 для соответственно прямого чтения с раздела диска и прямой записи на раздел диска: eax = 70, ebx -> структура fileinfo, содержимое структуры:

Code: Select all

dd номер подфункции (10 или 11)
dd номер сектора (0 = первый сектор раздела)
dd игнорируется
dd игнорируется (здесь мог бы быть размер)
dd указатель на буфер для данных или буфер с данными
n*db ASCIIZ-строка либо db 0 / dd указатель на ASCIIZ-строку с указанием имени устройства (/hdX/Y либо /bdX/Y)
Можно ввести дополнительно число секторов для чтения - поле, помеченное "здесь мог бы быть размер", передаётся в fs_HdDirectRead/fs_HdDirectWrite в регистре ecx и можно добавить соответствующий код (мне лень).
Не включено таких возможностей в стандартное ядро, потому что не стоит кому попало давать возможности по прямому доступу к диску. Но для разработки и тестирования на отдельно взятом компе - нормально.

P.S. Номера 10 и 11 - это в текущем ядре, где существуют функции от 0 до 9. Если (или, скорее, когда) добавятся ещё функции, то при таком добавлении номера соответственно сдвинутся вверх.

Re: Прямой доступ к диску (для записи на ntfs)

Posted: Thu Mar 19, 2009 4:48 pm
by Flinta
Спасибо всем за ответы.
Ушел надолго, разбираться... Глаза боятся, руки делают... А боятся они сильно :)))