Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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-приложения. Сам код имет примерно такой вид:

Код

  mov al, 0E6h
  mov dx, 1F7h
  out dx, al  

Автор: AndreyRus 11.6.2007, 14:51
Цитата

Например у SCSI-дисков вообще этой функции нет (аппаратно)
Терзают меня смутные сомненья.

Цитата

а если учесть что многие современные контроллеры не являются IDE/ATA-совместимыми
Ситуация прямо противополжная.

Использование прямого доступа к портам жесткого диска очень опасно! Нужно использовать API, если не хотите разрушить файловую систему.

Автор: misha_mike 11.6.2007, 16:23
Цитата
Цитата

Например у SCSI-дисков вообще этой функции нет (аппаратно)
Терзают меня смутные сомненья.

Хорошо, выражусь помягче: ни разу не видел потушенный SCSI-драйв, зато много-много раз видел в BIOS-ах материнских плат в разделе Power Management коммент типа "Parameter 'HDD Power Down' not affected for SCSI hard drives", так что по крайней мере единого интерфейса управления питанием нет (или не было в течении весьма продолжительного времени).

Цитата
Цитата

а если учесть что многие современные контроллеры не являются IDE/ATA-совместимыми
Ситуация прямо противополжная.

В каком смысле? Используется стандартный IDE-порт? К сожалению даже тут никто и ничего не обещает. 

Взять к примеру IDE-контроллер, подключаемый посредством USB (или как его неграмотно называют "переходник USB-IDE"). С точки зрения системы он ничем не хуже привычного PCI-ного контроллера, но что из стандартного набора ATA-команд он там у себя внутри реализует, а что нет -- неизвестно, и это полностью лежит на совести производителя (или драйверописателя). Более того, я могу сказать что имеющийся у меня такой контроллер команду spindown не поддерживает. Вот и выходит: вроде и IDE/ATA, но не совсем.

Цитата
Использование прямого доступа к портам жесткого диска очень опасно!

Кто ж спорит?

Цитата
Нужно использовать API, если не хотите разрушить файловую систему.

API -- это и есть DeviceIOControl, так что или-или...

Автор: AndreyRus 11.6.2007, 18:36
Цитата
API -- это и есть DeviceIOControl, так что или-или...

Под 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
Цитата(misha_mike @ 15.6.2007,  13:40)
При этом все равно не факт что сам котроллер (как железяка) поймет эту команду и отсановит диск.

Стандартые команды ATA еще никто не отменил. Отключить ими двигатель легко и можно проктически на каждом винте без проблем.

Автор: misha_mike 16.6.2007, 21:46
Цитата(AndreyRus @ 16.6.2007,  14:32)
Цитата(misha_mike @ 15.6.2007,  13:40)
При этом все равно не факт что сам котроллер (как железяка) поймет эту команду и отсановит диск.

Стандартые команды ATA еще никто не отменил. Отключить ими двигатель легко и можно проктически на каждом винте без проблем.

Правильно, и единственный гарантированный способ донести команду до контроллеа -- записать ее в соответсвующий порт. Я уже привел пример того, как IDE-контроллер не пропускает вполне стандартную и никем не отмененную ATA-команду, посланную средствами API. Если такое себе позволяет один, то чем другие "хуже"?

Эра "стандартных команд" железа уходит, теперь драйвер -- царь и бог. А от железки требуется только поддержка самых базовых стандартных команд, чтобы ОС загрузилась (а если она интегрирована в материнку, то часто и этого не нужно). Если даже видеокарты не утруждают себя полноценной поддержкой VESA, то что говорить про другие девайсы.

Автор: AndreyRus 17.6.2007, 13:46
Цитата(misha_mike @  16.6.2007,  21:46 Найти цитируемый пост)
Я уже привел пример того, как IDE-контроллер не пропускает вполне стандартную и никем не отмененную ATA-команду, посланную средствами API.
Не контроллер, а драйвер! Контроллер по большому счету просто порт и ему без разницы, что в него шлют.

Знает ли кто-нибудь как отправить IRP'ы - IRP_MJ_POWER, IRP_MN_SET_POWER без использования драйвера?

Автор: misha_mike 17.6.2007, 14:55
Цитата
Цитата(misha_mike @  16.6.2007,  21:46 Найти цитируемый пост)
Я уже привел пример того, как IDE-контроллер не пропускает вполне стандартную и никем не отмененную ATA-команду, посланную средствами API.
Не контроллер, а драйвер! Контроллер по большому счету просто порт и ему без разницы, что в него шлют.

Контроллер -- это железка, а железки разные бывают. И некоторым из них стандартные порты по боку, у них свои диапазоны ввода-вывода, известные только драйверу.

Цитата
Знает ли кто-нибудь как отправить IRP'ы - IRP_MJ_POWER, IRP_MN_SET_POWER без использования драйвера?

Так IRP -- это как бы неотъемлемая часть именно взаимодействия с драйвером, на нем же она и заканчивается. Так что ИМХО само понятие "IRP в обход драйвера" лишено какого-либо смысла (примерно как вывод изображения в обход видеокарты).

Автор: AndreyRus 17.6.2007, 21:41
Цитата(misha_mike @  17.6.2007,  14:55 Найти цитируемый пост)
Контроллер -- это железка, а железки разные бывают. И некоторым из них стандартные порты по боку, у них свои диапазоны ввода-вывода, известные только драйверу.
Порты да, бываю разные, но ведь вы говорили о ATA командах. smile 

Автор: misha_mike 18.6.2007, 10:12
Так что такое в конце концов ATA-команда? Это некий байт, отправляемый в некий порт. И если наш контроллер просто физически не слушает этот порт/байт (или никто, включая драйвер, не знает какой порт/байт он слушает на предмет такой команды), то можно говорить что данную ATA-команду он не поддерживает, как не поддерживает spindown мой USB-контроллер на базе GL811...

Автор: AndreyRus 18.6.2007, 12:29
Цитата(misha_mike @  18.6.2007,  10:12 Найти цитируемый пост)
И если наш контроллер просто физически не слушает этот порт/байт (или никто, включая драйвер, не знает какой порт/байт он слушает на предмет такой команды), то можно говорить что данную ATA-команду он не поддерживает
Бред.

Цитата(misha_mike @  18.6.2007,  10:12 Найти цитируемый пост)
 как не поддерживает spindown мой USB-контроллер на базе GL811...
Речь не идет о USB, SCSI, SAS.

Автор: misha_mike 18.6.2007, 17:21
Цитата
Цитата(misha_mike @  18.6.2007,  10:12 Найти цитируемый пост)
И если наш контроллер просто физически не слушает этот порт/байт (или никто, включая драйвер, не знает какой порт/байт он слушает на предмет такой команды), то можно говорить что данную ATA-команду он не поддерживает
Бред.

Железный аргумент! А главное аргументированный...

Цитата
Цитата(misha_mike @  18.6.2007,  10:12 Найти цитируемый пост)
 как не поддерживает spindown мой USB-контроллер на базе GL811...
Речь не идет о USB, SCSI, SAS.

Во-первых не нужно ставить в один ряд интерфейсы взаимодействия контроллера с системой (USB, PCI) и интерфейсы взаимодействия диска с контроллером (ATA, SAS, SCSI), это совершенно разные уровни. А во-вторых для системы нет никакой разницы в том, к как подключен контроллер:  USB, PCI и ExpressCard абсолютно равны. И то что подключается к USB/FireWare тоже является IDE-контроллером, но на стандартные порты плюет с полным на то правом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)