Вот собственно в чем вопрос, реально ли написать БЕЗГЛЮЧНЫЙ NTFS писальщик с прямым доступом к диску? Т.е. без использования всяких драйверов NTFS. Всего то записать один файл требуется. Сама струтура не сложная после вниматеоьного изучения, но вот присутствие паралельно ещо одного писальщика (я про windows) навод на мысль о будущей глючности данного решения. Хотя на крайни случай можно найти сектора на диске которые уже заняты другим файлом и на их место записать свой файл, разумеется меньего размера, что бы не трогать системный файл занятого места на диске и не трогать MFT. ПыСы: Ну думаю этот вопрос очень близок одному местному обитателю
И вот еще что, всякие дефрагментаторы работают же тоже напрямую и вроде как не глючат, хотя они работают по упрощенной схеме. Может есть какой нибудь контрол ид, для синхронизации драйвера NTFS виндовса и изменениями на диске?
Denwer Как дефрагментаторы работают точно не знаю, но всё-таки мне кажется что они юзают одно и то же API Если файл уже открыт, то будет плохо А если нет, то скорее всего можно произвести замену без последствий. То же самое с дирой, если она открыта в винде на запись, то возможны всякие эксцессы. А насчёт синхронизации, то думаю обновить несколько полей и хватит. Update sequance если не ошибаюсь.
Для дефрагментаторов существует специальные IOCTL. Для записи/чтения файлов таких ioctl-ей я не видел, но они д.б.
IOCTL для записи и чтения файлов я вот не знаю, и мне кажется их нет, но даже если и будут то, какое устройство нада отрыть для отправки этого IOCTL? По идее драйвер NTFS, но вот он не имеет символической ссылки для его открытия.
Ага, нету ioctl- ей NtWriteFile использует IopSynchronousServiceTail -> IoCallDriver -> IofCallDriver <- а это указатель, инициализируемый при запуске.
Denwer Для своего проекта посекторной записи на НТФС диски использовал для основы дифрагментатор Руссоновича. Помоищи его мож и тебе поможет.
Denwer *) структура NTFS действительно проста, особенно если писать резидентные файлы; *) на всякий случай можно пускать после записи чек-диск, если что он исправит; *) наличие еще одного писальщика обходится размонитированием и блокированием тома; *) системный диск хрен размонтируешь, тут нужно курить траву, уточни задачу, plz;
Уточняю, нужно записать файл, драйвер в директорию виндовс, причем сделать это таким оборазом что бы запись прошла мимо драйвера NTFS, хотя если еще точнее, то мимо фильтра-драйвера, котрый ставят некоторые проги в стек NTFS. Вот и пришла в голову идея прямой записи на диск, можно даже записать поверх существующего файла, но потом его просто восстановить.
а как насчет прохучить FtDisk/IRP_MJ_WRITE? А там уже синхронизируемся на мьютексе, заставляем всех ждать, сами делаем свое черное дело, и отпускаем... имхо просто, и не нужно никаких особых контролов...
Denwer записать напрямую файл можно, но NTFS-драйвер об этом сразу не узнает, а как заставить его принудительно перечитать $MFT и индексы с диска - хз, ну разве что перезагружаться.
стоп стоп, а как раз ничего не нада перезачитывать если я просто найду нужные сектора на диске и запишу туда свои данные, ну т.е. подменю данные существующего файла.
Это делается ИЗ ДРАЙВЕРА, а если я уже загрузил драйвер то ничего уже не нужно мудрить. Вся катавасия как раз с загрузкой драйвера.
AFAIR в одной из статей MsRem'а это описывалось. Там говорилось о raw-чтении, но при наличии прав, тем же методом IMHO можно и писать. Defragment API в msdn туда же для полноты ощущений.