-------------------------------------------------
2013-02-07

Купил новый хард (WD RE 2TB) и решил потестить его (винда у меня Win7 x64).
Скачал с сайта hdd-911.com утилиту Victoria 4.46b , но при попытке просканировать
поверхность получил ошибку "Privileged Instruction". Начал догадываться, что
утилита хочет работать с портами ввода-вывода напрямую из user-mode.
Скачал версию Victoria 4.3b , которая нормально начала процесс сканировая.
Но всё же хотелось последнюю версию заюзать.
Значит будем "ломать" утилиту ради исправления бага.

При исследовании двух версий выяснилось, что в одном месте не проверяется режим
работы утилиты (API/PIO). В версии 4.3 проверка корректная, а в версии 4.46
разраб что то нето съел что ли.

Пропатчил exe'шник, упаковал его и всё. Можно юзать 4.46 версию на x64 виндах.

Патченный код приведён в файлике patch1.txt

-------------------------------------------------
2013-02-07

Хотел было создать драйвер porttalk.sys для x64 систем, но как выяснилось драйвер
это использует функции Ke386SetIoAccessMap и Ke386IoSetAccessProcess , которых
в x64 виндах просто нету (MS их убрала ради повышения безопасности).

Но пробежав бегло по коду самой утилиты нашёл всего 11 функций, которые
используют для своей работы порты ввода-вывода. Т.е. если очень очень захотеть,
то можно вынести эти функции в драйвер porttalk64.sys и пропатчить код этих
функций.
Но оставим эту работу автору утилиты.
Вдруг у него снова проснётся желание делиться с народом своими наработками.

-------------------------------------------------
2013-02-11

При тестировании утилиты был найден досадный баг:
При проверке поверхности иногда процесс просто останавливается в произвольном 
месте и нужно останавливать поток принудительно. Это явно выражается при 
тестировании в режиме verify , т.к. используются минимальные задержки. 
Причём выбранные опции используемых таймеров на это никак не влияют. 
На версии 4.3 данный баг воспроизвести не удалось.

Ну что, будем фиксить досадный баг.
Под IDA легко отлавливается данный баг. Как оказалось генирируются исключения,
которые автор решил игнорировать. При этом поток, занимающийся сканированием, 
просто убивается и юзеру никак это не сообщается.
Исключения вызваны либо попыткой деления на ноль, либо переполнением числа 
типа Byte (не более 255).
А всё из-за того, что автор утилиты забыл учесть, что запросы к контроллеру
могут выполниться так быстро, что системная функция GetTickCount вернёт 
такое же значение, что и перед началом запроса. Соответственно получим разницу
в 0 милисекунд. Вот и деление на 0.
Ну а если разница меньше 7, то получим переполнение в вычислении Byte.

Патченный код приведён в файлике patch2.txt

-------------------------------------------------
2013-02-12

Вот нашёл время для теста нового харда. Для начала некоторые рекомендуют 
выполнить 5 минут операцию случайной DDD-записи. Ну коли рекомендуют, значит
будем выполнять. Но не тут то было. При выполнении случайной записи или чтения
секторов происходит очень много ошибок. При этом сама утилита сообщает что 
пытается прочитать/записать сектор с отрицательным LBA !!!
Опять таки знатоки в тырнете во избежании сия бага советуют сканировать
большие диски (более 1TB) за несколько проходов (каждый по 1TB).
Но это как то не правильно.
Сразу видно, что ошибка кроется в коде, который вычисляет случайные числа.
Нашёл в коде функцию, генерирующую случаные числа (Syatem_RandInt). Нашёл
код, который вычисляет CurrentLBA по значениям BeginLBA и EndLBA.
Пропатчил бинарник и всё готово.

Патченный код приведён в файлике patch3.txt

-------------------------------------------------
2013-02-13

Замечен ещё баг: при сворачивании окна сканирование останавливается.
Восникает это снова по причине возникновения исключения (всё тогоже самого, 
что фиксили чуть выше).
Решил вообше убрать эту проверку. Ну если и получаем число больше 255, то 
будем считаем что получили число 255.
Так же теперь сканирование не должно останавливаться при любом размере блока.
Свободно указывайте хоть 32 сектора на блок, хоть 2048.

Патченный код приведён в файлике patch4.txt

-------------------------------------------------
2013-02-14

Самый серъёзный баг утилиты: невозможность сканирования больших дисков 
(более 1TB) за одну итерацию. При сканировании 2TB дисков процесс
сканирования просто останавливается на отметке 71%. При этом утилита отжирает
у системы 1700MB виртуальной памяти (может больше).
А всё из-за того, что визуальное отображение списка блоков постоянно отъедает 
память. Сразу назревает вопрос: а зачем вообще отображать разноцветные блоки
при сканировании такого количества секторов?  Мне сложно представить человека,
скролющего список в поиске какого то сектора.
Поэтому решено сделать так: будем отображать разноцветные блоки, только при
сканировании менее 10,000,000 секторов. При случайном и Buttrefly-сканировании
будем отожражать разноцветные блоки всегда.
Сказано -> сделано.

Патченный код приведён в файлике patch5_v2.txt 

-------------------------------------------------
2013-02-16

Решил ругательства на драйвер PortTalk отправлять в лог. Теперь при запуске
утилиты не нужно 3 раза кликать на "Ok". Но нужно запускать под полным админом,
т.к. манифест с требованием полного админа не получилось встроить в бинарник.
Так же решил увеличить Minor'ную часть версии. Теперь патченная Victoria 4.46b
будет значиться как Victoria 4.47 (исправлений то куча, да и отличать нужно их
как то).

Патченный код приведён в файлике patch6.txt 

-------------------------------------------------
2013-02-20

Решил при сканировании более 10,000,000 секторов реализовать переключение на
режим отображения скорости доступа, т.к. неподготовленный разум некоторых
может испугаться отсутствия отображения разноцветных блоков.

Патченный код приведён в файлике patch7.txt 





