Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Вниз

[Порка] Редактор диска своими руками (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.053 c
14-1125252689
Twister1222
2005-08-28 22:11
2005.09.25
Сомнения Delphi2005


1-1125925860
Гена
2005-09-05 17:11
2005.09.25
Вопрос про savedialog


14-1124762580
Композитор
2005-08-23 06:03
2005.09.25
Программирование - это не творчество


14-1125600161
Ego
2005-09-01 22:42
2005.09.25
Для тех, кому нужен профессиональный web-дизан.


5-1100683634
Stanislav
2004-11-17 12:27
2005.09.25
Не добавляется компонент





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский