Текущий архив: 2005.09.25;
Скачать: CL | DM;
Вниз
[Порка] Редактор диска своими руками (v1.01) Найти похожие ветки
← →
Kerk © (2005-08-30 18:54) [0]Покритикуйте статью плиз.. только не перестарайтесь.. я впечатлительный очень. :)))
http://kladovka.net.ru/index.cgi?pid=article&rid=1
← →
begin...end © (2005-08-30 19:45) [1]Голова уже не работает, поэтому в суть особо вникнуть не получилось.
Маленькие злобные замечания по стилю кода приветствуются?
← →
Kerk © (2005-08-30 19:47) [2]begin...end © (30.08.05 19:45) [1]
Маленькие злобные замечания по стилю кода приветствуются?
Давай. Думаю, не помешает. :))
← →
begin...end © (2005-08-30 19:59) [3]> Kerk © (30.08.05 19:47) [2]
1. Сложение при формировании флага нехорошо использовать, лучше or.
2. __Mul не все поймут, лучше использовать Int64, а для передачи по частям использовать приведение к типу Int64Rec.
3. В функциях ReadSectors/WriteSectors при неуспешной операции чтения/записи хэндл не закрывается.
4. Финализировать динамический массив непосредственно перед выходом из функции (как в GetDriveInfo при ReadSectors = 0) не надо -- он и сам застрелится.
Пока всё :)
← →
Джо © (2005-08-30 20:06) [4]Маленькое стилистическое замечание.
---
>>Таким образом, мы можем воспринимать физический диск как один большой файл.
ИМХО, слово "большой" здесь ни к чему. А если диск "маленький"? Предлагаю так:
"Таким образом, мы получаем возможность обращаться ко всему физическому диску как к единому файлу".
---
Если замечания такого рода нужны, позже еще погляжу, когда освобожусь.
← →
Kerk © (2005-08-30 20:08) [5]Любого рода замечания нужны.. если в статье толк вообще есть, то можно пошлифовать.
← →
Джо © (2005-08-30 20:17) [6]Реализацию возможности редактирования диска в программе оставляю в качестве домашнего задания.
Это, извини, набивший всем оскомину высокомерный штамп. Лучше, имхо, "пообещать" расмотреть этот вопрос в другой (следующей) статье. Если таковая, конечно, планируется. Тем более, что вопрос на самом деле не вполне тривиален (особенно с точки зрения синхронизации интерфейса и содержимого диска).
Придрался, да? ;)
← →
Kerk © (2005-08-30 20:20) [7]Джо © (30.08.05 20:17) [6]
Это, извини, набивший всем оскомину высокомерный штамп.
Да.. мне тоже так кажется :)
Но совсем не вижу смысла писать статью про запись на диск. Какие там могут быть сложности?
← →
Джо © (2005-08-30 20:27) [8]
> [7] Kerk © (30.08.05 20:20)
> Какие там могут быть сложности?
Да... впрочем, наверное, никаких особых. Сложности тут могут быть не у программиста, а у пользователя, ежели что не так пойдет :)
Btw, статья вполне полезная. Попозже посмотрю еще, возможно, мое незаконченное филологическое образование окажется не таким уж бесполезным ;)
Ну, не буду оффтопить.
← →
имя (2005-08-30 20:30) [9]Удалено модератором
← →
Джо © (2005-08-30 20:38) [10]Кстати, Керк, не обдумывал идею сделать вокруг этого кода обертку в виде класса TPhysicalDrive? А также итератор или список для дисков. Смотрелось бы отлично и очень удобно было бы использовать. Если есть желание, но нет времени, могу на досуге твой код заинкапсулировать до полного изнеможения :) А то за Делфи обидно - отличный ОО-язык, а пользуемся "голым" API, как дикари какие-то ;)
← →
begin...end © (2005-08-30 20:44) [11]> Kerk
Я тут это... открыл код по ссылке.
Вопрос у меня: зачем в llinfo.GetDrivesInfo строка SetLength(PhysicalDrives,High(PhysicalDrives)) ?
← →
Kerk © (2005-08-30 20:50) [12]begin...end © (30.08.05 20:44) [11]
Чтобы уменьшить длину массива на единицу. Ибо место под информацию о диске выделяется до получения этой информации естесственно. Если не удалось получить информацию, значит диска нет -> убираем лишний айтем с конца.
Вообще это практически копипаст моего кода двухлетней давности.. некоторые вещи чтоб вспомнить там приходится напрягаться. :))
Джо © (30.08.05 20:38) [10]
Кстати, Керк, не обдумывал идею сделать вокруг этого кода обертку в виде класса TPhysicalDrive?
А идея классная. :))
Я в ближайшие пару недель наверно не смогу взяться... Если сделаешь, то обязательно выкладывай в кладовку. :))
← →
Kerk © (2005-08-30 20:50) [13]begin...end © (30.08.05 20:44) [11]
Вопрос у меня: зачем в llinfo.GetDrivesInfo
Зачем буква выделена?
← →
Kerk © (2005-08-30 20:52) [14]
> Джо
Но для обертки наверно лучше брать код из MIXEd (ссылка в конце статьи). Там еще и про геометрию есть.
← →
Джо © (2005-08-30 20:54) [15]
> [14] Kerk © (30.08.05 20:52)
Посмотрю на досуге. Досуг известно какой - после полуночи каждый божий день :)
← →
begin...end © (2005-08-30 20:55) [16]> Kerk © (30.08.05 20:50) [12]
> Чтобы уменьшить длину массива на единицу.
Ясно, мне пора спать :))
> Kerk © (30.08.05 20:50) [13]
> Зачем буква выделена?
Чтобы не перепутать с GetDriveInfo :))
← →
TUser © (2005-08-30 21:07) [17]Очень интересная статья. Прочитаю обязательно.
← →
Kerk © (2005-08-30 23:37) [18]Подправил то, что показали. :)
← →
3DxFantastika © (2005-08-31 13:26) [19]любопытная статья .. ;-)
а с помощью её можно написать программу для восстановления удалённых файлов?
← →
Esu © (2005-08-31 13:41) [20]Эта... я бы наверное в title страницы все таки писал заголовок самой сатьи, а не общий для всего сайта, что б люди в букмаркс не потеряли (все равно на твой сайт так или иначе попадут) :)
← →
Kerk © (2005-08-31 15:49) [21]Esu © (31.08.05 13:41) [20]
Это в TODO листе есть.. со временем сделаю.
2 All
А по существу статьи мнений больше нет?
← →
begin...end © (2005-08-31 16:05) [22]> Kerk © (30.08.05 23:37) [18]
> Подправил то, что показали.
Не всё :)
← →
ANB © (2005-08-31 16:22) [23]
> Kerk © (30.08.05 18:54)
- а как бы почитать то ??? У меня к кладовке доступа нету :(((
← →
Kerk © (2005-08-31 16:24) [24]begin...end © (31.08.05 16:05) [22]
Хм. ты про __Mul ?
ANB © (31.08.05 16:22) [23]
Как нету? Я не банил никого. Если хочешь, мылом вышлю.
← →
begin...end © (2005-08-31 16:28) [25]> Kerk © (31.08.05 16:24) [24]
> ты про __Mul ?
Да, и, к тому же, неправильно проверяется наличие ошибки после SetFilePointer.
← →
ANB © (2005-08-31 16:29) [26]
> Kerk © (31.08.05 16:24) [24]
- это наш прокси не пущает. 4 сайта только открыто.
Belousov[sobaka]smartcard.ru
← →
Kerk © (2005-08-31 16:44) [27]begin...end © (31.08.05 16:28) [25]
> неправильно проверяется наличие ошибки после
> SetFilePointer.
Опять? Где?
ANB © (31.08.05 16:29) [26]
Отправил.
← →
begin...end © (2005-08-31 16:50) [28]> Kerk © (31.08.05 16:44) [27]
Ты проверяешь результат так: если SetFilePointer(hFile, TmpLo, @TmpHi, FILE_BEGIN) = TmpLo, то ошибки нет. Однако это не так. Пусть TmpLo = $FFFFFFFF, ведь $XXXXXXXXFFFFFFFF (здесь X -- любое значение бита) -- это нормальное значение для 64-разрядного числа. Если произошла ошибка, SetFilePointer возвращает значение INVALID_SET_FILE_POINTER = -1 = $FFFFFFFF. Это значение оказалось равно TmpLo, поэтому проверка неправильная.
Я бы сделал так:
const
INVALID_SET_FILE_POINTER = $FFFFFFFF;
var
Temp: Int64;
begin
...
Temp := StartingSector * BytesPerSector;
if not ((SetFilePointer(hFile, Temp, @Int64Rec(Temp).Hi, FILE_BEGIN) = INVALID_SET_FILE_POINTER) and (GetLastError <> NO_ERROR)) then
// Ошибки нет
...
end.
← →
Kerk © (2005-08-31 16:53) [29]begin...end © (31.08.05 16:50) [28]
Да. Ты прав. Что-то даже обидно такой глюк пропустить..
← →
ANB © (2005-08-31 17:38) [30]
> Kerk © (31.08.05 16:44) [27]
- спасибочки, получил, читаю. Надо бы проектик собрать. Если глюки вылезут - напишу. Давно хотел найти такую инфу. У меня был редактор, но еще под ДОС. А под вин даже не знал, как подойти.
← →
ANB © (2005-08-31 17:44) [31]Так. Полезненько и все разжевано. Только я функции по своему перепишу. Int64 и вправду уместнее здесь будет.
← →
vrem (2005-08-31 18:57) [32]>>Реализацию возможности редактирования диска в программе оставляю в
>>качестве домашнего задания.
>Это, извини, набивший всем оскомину высокомерный штамп
Это otmazka, если пользователь себе напортит - сам виноват. Сходу вопрос - если обычным образом создать файл, переместить в нём позицию (через seek) на [(количество свободных байтов на диске) - 1], записать один байт и закрыть файл, то чем это хуже предложенного метода? получили обычный файл, напортить не получится, прочитать всё нужное - пожалуйста. записать тоже - если для уничтожения информации. и не надо ставить штампы :)
← →
sinclair © (2005-09-01 17:27) [33]Мне понравилось :)
← →
Kerk © (2005-09-01 17:31) [34]Там кстати в разделе "Статьи" пополнение. :)
Приятно что народ активность проявляет. Очень. :)
← →
Ihor Osov'yak © (2005-09-02 01:16) [35]> Проще всего это делать в Windows 2000/XP
из-за буквоедства. Оное также пройдет в любой NT-based 32-битной версии Win, то есть от NT 3.1 и к win2003..
ps. а вот относительно W9x - там сие дело немного поинтереснее будет..
> // заполняем структуру DriveInfo.PartitionTable
Move(buf[PartitionTableOffset],DriveInfo.PartitionTable,SizeOf(TPartitionTable));
хм.. А IOCTL_DISK_GET_DRIVE_LAYOUT религия запрещает использовать?
зы.. это так, навскидку... для более углубленого анализа сейчас нет времени, прошу извинить..
Страницы: 1 вся ветка
Текущий архив: 2005.09.25;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.042 c