![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с винчестером напрямую [D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]
Tristania © (2005-10-15 19:47:00)Доброго времеи суток, господа!
Не знал куда разместить этот пост, поэтому расположил сюда(по железу отдельной ветки, вроде бы нет).
Подскажите, кто знает какие-нибудь методы для чтения/записи секторов винчестера из своей программы. В ДОС все это выполняло 13-е прерывание БИОСа, а как можно это реализовать в Винде? Особый интерес представляет ВинНТ/ХР/2000.
Если кто знает - подскажите, это для добрых целей и хотелось бы узнать по-больше методов.
Заранее всем благодарен.
Игорь Шевченко (2005-10-19 16:32:00) [1]
> Мне нужно написать прогу, которая будет перехватывать обращения
> других прог к винчестеру(к его секторам, etc) и при необходимости
> делать редирект.
Мониторинг обращения к портам тебе в этом случае не поможет. Никаким образом. По сути тебе надо написать некий аналог драйвера логического диска, а он с портами не работает, он работает с драйвером физического диска, обмениваясь пакетами. Тоже самое, чем занимается, например драйвер поддержки зеркалирования и т.д.
Tristania (2005-10-19 16:26:00) [2]Да, Игорь. Но таким образом мне не удасться перехватить всю работу с винтом. Т.к. драйвер или прога сможет обратиться к нему через порты и весь перехват накроется...
А за ссылки, большое спасибо
Игорь Шевченко (2005-10-18 10:34:00) [3]Tristania © (17.10.05 19:52) [31]
> Пойду искать протоколы работы с винтом через порты ввода/вывода
> и пора бы уже начинать драйвер писать
Я очень извиняюсь, а нафига ? Путь гландам лежит не через задницу, а через рот, соответственно, путь к работе с винтом лежит через функции CreateFile, ReadFile, Writefile, DeviceIoControl
Idx (2005-10-18 07:00:00) [4]Tristania © (17.10.05 19:52) [31]
Пример драйвера на DELPHI:
http://forum.sources.ru/index.php?showtopic=115758
Alex Konshin (2005-10-17 23:36:00) [5]А чего их искать? для IDE смотри http://www.t13.org/
Tristania (2005-10-17 19:52:00) [6]Ок. Всем спасибо за помощь. Пойду искать протоколы работы с винтом через порты ввода/вывода и пора бы уже начинать драйвер писать :)
Eraser (2005-10-17 19:38:00) [7]
> Tristania © (17.10.05 19:23) [29]
В первой редакции были, во второй может есть.
В этой книге всего 1 полноценный пример! зато теория очень доходчиво изложена, подробно описаны базовые функции. Книгу советую.
Tristania (2005-10-17 19:23:00) [8]Тут вот в Инете попались комментарии об этой книге. Там говорят, что в книге настолько много ошибок в исходных кодах, что лучше их не использовать. Это так?
Eraser (2005-10-17 17:39:00) [9]
> Idx © (17.10.05 17:34) [27]
Спасибо за ссылочку. В печатном виде у меня есть, но иногда удобнее в эл. виде.
Idx (2005-10-17 17:34:00) [10]Tristania
Запомни одно! При записи в порты всегда есть задержка
благодаря этому ты сможешь обнулить команду.
Пример записи сектора : (Кусок кода из моего модуля)
ATAFeatures := 0;
ATAAdressMode := 1;
ATASectorCount := nSector;
ATASectorNumber := Sector and $FF; ;
ATACylinder := (Sector shr 8) and $FFFF;;
ATAHead := Sector shr 24;
ATACommand := $30;
-------------------------------------------------------------------
ЭТО УНИВЕРСАЛЬНАЯ Ф-ЦИЯ!
В блоке этой ф-ций задержка составляет 20 мк.
SendCommandToHDD(CmdHddPacked);
-------------------------------------------------------------------
// Проверить код ошибки
IF DevErrorCode <> 0 Then
BEGIN
Result:=True;
ErrorCode;
Exit;
END;
CurrentChannel:=ATABasePortAddr+7;
В это ф-ций проходит цикл пока порт не освободится
в это время проходит время и если оно превосходит 10-сикунд
тогда таймаут! Естественно в ней контролируется и другие ошибки
например: Сектор заданным адресом не найдет или поврежден …
IF HddWaitCompleet(True) THEN
Begin
Result:=True;
EXIT;
end;
---------------------------------------------------------------------
CurrentChannel:=ATABasePortAddr;
For i := 0 to 255 do
OutPortW(CurrentChannel,Buf256_HDDID[i]);
END;
end;
Главное не успеть, а сделать правильно!
Мой мониторинг просто просматривал команду
и если команда принадлежит к “O” то я просто
сбрасывал контролер жесткого диска, а также
делал резервную копию сектора для надежности
затем записывал его туда куда указывала команда.
Я тебе рассказал достаточно информаций
что бы самому в этом разобраться.
Eraser © (17.10.05 15:10) [25]
Книга также доступно электроном варианте.
http://ms-rem.dot-link.net/stuff/soldatov/content.html
Tristania (2005-10-17 15:45:00) [11]Спасибо, уже заказал :)
Eraser (2005-10-17 15:10:00) [12]
> Tristania © (17.10.05 15:05) [24]
Советую купить книжку по написанию драйверов, вот эту http://www.my-shop.ru/shop/books/47027.htmlхотя бы. Есть ещё несколько неплохих книг, + изучай справку из DDK.
Tristania (2005-10-17 15:05:00) [13]Если я все правильно понял(пока еще изучаю), то через них можно настроить обработчик исключения при обращении к портам I/O и тем самым перехватить то, что в них будет записано. А порты ввода/вывода кажись и есть самый низкий уровень работы с винтом, так что можно надеяться на полный перехват.
Может я что-то напутал, но вроде все так.
Игорь Шевченко (2005-10-17 15:01:00) [14]Tristania © (17.10.05 13:41) [18]
А каким образом отладочные регистры помогут в этой задаче ? Я вот честно не понимаю.
Tristania (2005-10-17 14:52:00) [15]Да, есть такое, но ничего по моей теме там нет. Точнее по самой теме(subj) есть, но хотелось бы что-то поближе к DiskMon'у, т.е. о перехвате.
Eraser (2005-10-17 14:45:00) [16]
> Tristania © (17.10.05 13:08) [16]
На sysinternals.com есть ряд программ с открытым исходным кодом.
см. http://www.sysinternals.com/SourceCode.html
Tristania (2005-10-17 14:43:00) [17]Ты имеешь ввиду постоянное сканирование из-под драйвера? А успеет ли моя прога там что-то изменить при необходимости? Ну например, запретить какому-то приложению запись в загрузочный сектор таким образом?
Idx (2005-10-17 14:00:00) [18]Когда – то я занимался дисковой системой, это было лет 5 назад.
Были свои модули и драйвера, а также мониторинги, но этого уже нет.
Все что я могу посоветовать это постоянное сканирование портов I/O
по 1Fx/17x это базовые порты ATA и ATAPI хотя чаще всего применяются
для ATA, но по значению ты можешь свободно определить какая операция
выполняется и с каким диском.
Для примера работы с портами ввода / вывода, а точнее дисковыми
ты можешь найти на сайте http://AinCity.narod.ru
Tristania (2005-10-17 13:41:00) [19]Спасибо, Игорь. А не подскажешь, где можно почитать про применение отладочных регистров? Желательно, конечно, приминительно к моей задаче....
Игорь Шевченко (2005-10-17 13:31:00) [20]Tristania © (17.10.05 13:08) [16]
> Т.е. прога видимо переходит в нулевое кольцо без драйвера.
> ...
Нет, она загружает свой драйвер.