Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.55 MB
Время: 0.027 c
14-1125477040
ANB
2005-08-31 12:30
2005.09.25
Поставили новый мониторчик !


14-1125323191
БарЛог
2005-08-29 17:46
2005.09.25
Скрипты на СИ - можно ли?


1-1125586034
RzCoDer
2005-09-01 18:47
2005.09.25
NT сервисы


2-1124096978
СержК
2005-08-15 13:09
2005.09.25
Нужно что-то типа: "TimeToStr" ...


14-1125577447
Джо
2005-09-01 16:24
2005.09.25
Oberon System