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

Assembler programming questions
  • Из ядра писать можно, а такие вещи целесообразней делать в ядре или драйверах - это раз.
    Запись в файловую систему вовсе не ограничивается изменением соответствующих байт в файле - даже если ограничиваться только записью в файл без изменения размера, для полной корректности нужно ещё и скорректировать дату/время последней модификации в соответствующей файловой записи. А в основном запись подразумевает создание новых файлов или перезапись существующих файлов с нуля с потенциальным изменением размера, так что то, что тут предлагается, особого значения не имеет - это два.
    Ушёл к умным, знающим и культурным людям.
  • Спасибо за ответ. С датой-временем поразбираюсь.
    "так что то, что тут предлагается, особого значения не имеет - это два." - вот этого не понял.
    Я бы и хотел "предложить", да попрошаек тут не жалуют. Вопрос был о том, как лучше решить частную задачу.
    Занимаюсь ремонтом компов, особенно люблю гонять вирусей. Для этого часто гружусь с WinPE и работаю с реестром винды. Или подгружаю куст, или напрямую с файлами кустов. Меня бесит долгая загрузка PE (а загружаться приходится не по одному разу).
    Извините за офтоп, но как "ремонтной" системе Kolibri цены бы не было, будь реализована запись на ntfs.
    Понимаю, что у вас другие приоритеты, вот и решил попробовать действовать самостоятельно. Только опыта низкоуровнего кодинга у меня ноль (и вообще я не кодер).

    Я правильно понял, что в КолибриОС невозможна запись на диск без использования драйвера?
  • Flinta
    В ядре есть процедуры работы с отдельными секторами жесткого диска, но в виде функции API это не доступно. В принципе ничто не мешает сделать сборку для себя любимого и ввести новые функции, которые смогут самостоятельно делать чтение и запись отдельных секторов. Разумеется никакой гарантии отсутствия конфликтов с уже существующими сервисами (кодом драйверов файловых систем) при этом не обеспечивается. Все на свой страх и риск.
  • Невозможна. Если очень хочется, то такую возможность можно добавить в ядро в отдельно взятой конфигурации, это следующие строчки:
    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. Если (или, скорее, когда) добавятся ещё функции, то при таком добавлении номера соответственно сдвинутся вверх.
    Ушёл к умным, знающим и культурным людям.
  • Спасибо всем за ответы.
    Ушел надолго, разбираться... Глаза боятся, руки делают... А боятся они сильно :)))
  • Who is online

    Users browsing this forum: No registered users and 3 guests