Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Сб июн 24, 2017 10:06 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 6 сообщений ] 
Автор Сообщение
СообщениеДобавлено: Ср мар 18, 2009 11:14 pm 
Не в сети

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


Вернуться к началу
СообщениеДобавлено: Чт мар 19, 2009 1:34 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пн ноя 28, 2005 8:00 pm
Сообщения: 1601
Из ядра писать можно, а такие вещи целесообразней делать в ядре или драйверах - это раз.
Запись в файловую систему вовсе не ограничивается изменением соответствующих байт в файле - даже если ограничиваться только записью в файл без изменения размера, для полной корректности нужно ещё и скорректировать дату/время последней модификации в соответствующей файловой записи. А в основном запись подразумевает создание новых файлов или перезапись существующих файлов с нуля с потенциальным изменением размера, так что то, что тут предлагается, особого значения не имеет - это два.

_________________
Ушёл к умным, знающим и культурным людям.


Вернуться к началу
СообщениеДобавлено: Чт мар 19, 2009 4:03 pm 
Не в сети

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

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


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


Вернуться к началу
   
СообщениеДобавлено: Чт мар 19, 2009 4:37 pm 
Не в сети
Kernel Developer
Аватара пользователя

Зарегистрирован: Пн ноя 28, 2005 8:00 pm
Сообщения: 1601
Невозможна. Если очень хочется, то такую возможность можно добавить в ядро в отдельно взятой конфигурации, это следующие строчки:
fs/fs_lfn.inc, массив fs_HdServices: добавить в конец массива (непосредственно перед "fs_NumHdServices equ ...")
Код:
dd fs_HdDirectRead
dd fs_HdDirectWrite

И в любой из файлов ядра включить код типа
Код:
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, содержимое структуры:
Код:
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. Если (или, скорее, когда) добавятся ещё функции, то при таком добавлении номера соответственно сдвинутся вверх.

_________________
Ушёл к умным, знающим и культурным людям.


Вернуться к началу
СообщениеДобавлено: Чт мар 19, 2009 4:48 pm 
Не в сети

Зарегистрирован: Ср мар 18, 2009 10:52 pm
Сообщения: 9
Спасибо всем за ответы.
Ушел надолго, разбираться... Глаза боятся, руки делают... А боятся они сильно :)))


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 6 сообщений ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB