| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Остановка двигателя HDD |
| Автор: AndreyRus 11.6.2007, 10:28 |
| Здравствуйте! Известен ли кому нибудь способ остановки двигателя в жестком диске без использования DeviceIOControl? |
| Автор: misha_mike 11.6.2007, 13:35 |
| А чем DeviceIOControl не устраивает? Можно через порты, но это только в режиме ядра. |
| Автор: AndreyRus 11.6.2007, 13:42 |
| Знаете 100% способ с DeviceIOControl? Лично я нет. Например не могу на nForce с их "фирменными" драйверами. |
| Автор: misha_mike 11.6.2007, 13:55 | ||
А 100%-го способа и нет. Например у SCSI-дисков вообще этой функции нет (аппаратно), а если учесть что многие современные контроллеры не являются IDE/ATA-совместимыми, то у них это может быть как угодно, вплоть до "никак".... В прочем в режиме ядра можно попробовать, есть компонент IOPort, который динамически загружает свой драйвер и позволяет писать в порты. Еще есть что-то в ResKit-е для winnt, что открывает доступ к портам для ring3-приложения. Сам код имет примерно такой вид:
|
| Автор: AndreyRus 11.6.2007, 14:51 | ||||
Использование прямого доступа к портам жесткого диска очень опасно! Нужно использовать API, если не хотите разрушить файловую систему. |
| Автор: misha_mike 11.6.2007, 16:23 | ||||||||||||
Хорошо, выражусь помягче: ни разу не видел потушенный SCSI-драйв, зато много-много раз видел в BIOS-ах материнских плат в разделе Power Management коммент типа "Parameter 'HDD Power Down' not affected for SCSI hard drives", так что по крайней мере единого интерфейса управления питанием нет (или не было в течении весьма продолжительного времени).
В каком смысле? Используется стандартный IDE-порт? К сожалению даже тут никто и ничего не обещает. Взять к примеру IDE-контроллер, подключаемый посредством USB (или как его неграмотно называют "переходник USB-IDE"). С точки зрения системы он ничем не хуже привычного PCI-ного контроллера, но что из стандартного набора ATA-команд он там у себя внутри реализует, а что нет -- неизвестно, и это полностью лежит на совести производителя (или драйверописателя). Более того, я могу сказать что имеющийся у меня такой контроллер команду spindown не поддерживает. Вот и выходит: вроде и IDE/ATA, но не совсем.
Кто ж спорит?
API -- это и есть DeviceIOControl, так что или-или... |
| Автор: AndreyRus 11.6.2007, 18:36 | ||
Под API я имел функцию отличную от DeviceIOControl. |
| Автор: AndreyRus 14.6.2007, 19:33 |
| DeviceIOControl в купе с недокументированным кодом (2000, XP, XP SP1) и документированным (XP SP2, 2003, Vista) позволяет отправлять жесткому диску прямые ATA команды и соответственно проблем с остановкой двигателя нет. Проблема заключается в том, что в некоторых драйверах, вследствие их ущербности (nVidia, внешние контроллеры (S)ATA) такая возможность не реализована. |
| Автор: misha_mike 15.6.2007, 13:40 |
| Что я и говорил в своих постах от 11.6.2007, 16:23 и 11.6.2007, 13:55.... Приведенные там же три ассемблерных строчки делают то же самое, но в обход драйвера. При этом все равно не факт что сам котроллер (как железяка) поймет эту команду и отсановит диск. |
| Автор: AndreyRus 16.6.2007, 14:32 | ||
Стандартые команды ATA еще никто не отменил. Отключить ими двигатель легко и можно проктически на каждом винте без проблем. |
| Автор: misha_mike 16.6.2007, 21:46 | ||||
Правильно, и единственный гарантированный способ донести команду до контроллеа -- записать ее в соответсвующий порт. Я уже привел пример того, как IDE-контроллер не пропускает вполне стандартную и никем не отмененную ATA-команду, посланную средствами API. Если такое себе позволяет один, то чем другие "хуже"? Эра "стандартных команд" железа уходит, теперь драйвер -- царь и бог. А от железки требуется только поддержка самых базовых стандартных команд, чтобы ОС загрузилась (а если она интегрирована в материнку, то часто и этого не нужно). Если даже видеокарты не утруждают себя полноценной поддержкой VESA, то что говорить про другие девайсы. |
| Автор: misha_mike 17.6.2007, 14:55 | ||||
Контроллер -- это железка, а железки разные бывают. И некоторым из них стандартные порты по боку, у них свои диапазоны ввода-вывода, известные только драйверу.
Так IRP -- это как бы неотъемлемая часть именно взаимодействия с драйвером, на нем же она и заканчивается. Так что ИМХО само понятие "IRP в обход драйвера" лишено какого-либо смысла (примерно как вывод изображения в обход видеокарты). |
| Автор: AndreyRus 17.6.2007, 21:41 | ||
|
| Автор: misha_mike 18.6.2007, 10:12 |
| Так что такое в конце концов ATA-команда? Это некий байт, отправляемый в некий порт. И если наш контроллер просто физически не слушает этот порт/байт (или никто, включая драйвер, не знает какой порт/байт он слушает на предмет такой команды), то можно говорить что данную ATA-команду он не поддерживает, как не поддерживает spindown мой USB-контроллер на базе GL811... |
| Автор: AndreyRus 18.6.2007, 12:29 | ||||
|
| Автор: misha_mike 18.6.2007, 17:21 | ||||
Железный аргумент! А главное аргументированный...
Во-первых не нужно ставить в один ряд интерфейсы взаимодействия контроллера с системой (USB, PCI) и интерфейсы взаимодействия диска с контроллером (ATA, SAS, SCSI), это совершенно разные уровни. А во-вторых для системы нет никакой разницы в том, к как подключен контроллер: USB, PCI и ExpressCard абсолютно равны. И то что подключается к USB/FireWare тоже является IDE-контроллером, но на стандартные порты плюет с полным на то правом. |