Спиннинг жесткого диска программно в Windows? - PullRequest
20 голосов
/ 20 марта 2011

Как вы запрашиваете Windows, чтобы закрутить жесткий диск программно? Есть ли какая-либо функция пользовательского режима, которую я могу вызвать (или функция режима ядра для вызова или IRP для отправки), чтобы это произошло?

Я пытался создать программу для отправки команды ATA STANDBY непосредственно на жесткий диск, но проблема в том, что этот метод не информирует систему и, следовательно, всякий раз, когда система нуждается в сбросе. кеш, он снова разбудит жесткий диск. Как мне сказать system , чтобы сделать это для меня? (Если система сделает это, она сохранит кэш и «разгрузит» данные, когда станет слишком большой, вместо записи небольшими шагами.)

(Весь смысл в том, чтобы сделать это напрямую , , а не , изменив тайм-аут замедления в масштабе всей системы на 1-секундный период и ожидая вращения диска вниз. Мне нужна функция, которую я могу вызвать в определенный момент времени, когда использую свой ноутбук, а не что-то общее, что не подходит в 95% случаев.)


Как далеко я дошел:

У меня такое ощущение, что PoCallDriver и IRP_MJ_POWER могут быть полезны для этого, но у меня очень ограниченный опыт программирования в режиме ядра (и практически нулевой опыт работы с драйверами), поэтому я действительно понятия не имею.


Пожалуйста, прочитайте:

Обновление

Люди, кажется, неоднократно упоминают о решениях, которые я уже упоминал, не работают. Как я уже говорил выше, я уже пробовал"хакерских" решений, которые изменяют значение тайм-аута или которые напрямую запускают команду привода, и причина Я задал этот вопрос вот что те не делали то, что мне было нужно. Пожалуйста, прочитайте весь вопрос (особенно параграфы 2 и 3), прежде чем повторять то, что я уже сказал в ваших ответах - это вся сложность в вопросе .


Подробнее:

Я нашел этот документ об обнаружении простоя диска полезным, но моего ответа там нет. В нем говорится, что Power Manager отправляет IRP драйверу диска (поэтому я подозреваю, что IRP_MJ_POWER будет полезным), но я понятия не имею, как использовать информацию.

Ответы [ 5 ]

5 голосов
/ 10 апреля 2011

Надеюсь, это поможет:

Это: http://msdn.microsoft.com/en-us/library/aa394173%28VS.85%29.aspx

Приводит к этому: http://msdn.microsoft.com/en-us/library/aa394132%28VS.85%29.aspx#properties

Затем вы можете перейти к этому: http://msdn.microsoft.com/en-us/library/aa393485(v=VS.85).aspx

Кажется, эта документация обрисовывает в общих чертах то, что вы ищете.

PS Просто пытаясь помочь, не стреляйте в мессенджер.

2 голосов
/ 11 апреля 2011

Вы пробовали WMI?Основываясь на документации MSDN, вы сможете отправлять команду spindown на жесткий диск через WMI:

http://msdn.microsoft.com/en-us/library/aa393493%28v=VS.85%29.aspx

uint32 SetPowerState(
  [in]  uint16 PowerState,
  [in]  datetime Time
);

РЕДАКТИРОВАТЬ:

В этом коде перечислены все дискиСистема и диски, поддерживающие этот API:

strServer = "."

Set objWMI = GetObject("winmgmts://" & strServer & "/root\cimv2")
rem Set objInstances = objWMI.InstancesOf("CIM_DiskDrive",48)
Set objInstances = objWMI.ExecQuery("Select * from CIM_DiskDrive",,48) 
On Error Resume Next
For Each objInstance in objInstances
    With objInstance
        WScript.Echo Join(.Capabilities, ", ")
        WScript.Echo Join(.CapabilityDescriptions, ", ")
        WScript.Echo .Caption
        WScript.Echo .PNPDeviceID
        WScript.Echo "PowerManagementCapabilities: "  & .PowerManagementCapabilities
        WScript.Echo "PowerManagement Supported: " & .PowerManagementSupported
        WScript.Echo .Status
        WScript.Echo .StatusInfo
    End With
On Error Goto 0
Next

Просто сохраните этот код в виде файла .vbs и запустите его из командной строки.

0 голосов
/ 30 октября 2014

У меня нет ответа на конкретный вопрос, который задал Мехрдад.

Однако, чтобы помочь другим, которые находят эту страницу, когда пытаются выяснить, как перевести их диск в режим ожидания, когда он должен, но не делает 't:

  1. Я обнаружил, что на USB-диске MS PwrTest утверждает, что диск выключен, но на самом деле он все еще вращается.Это происходит даже при очень коротких глобальных тайм-аутах диска в win 7. (Это подразумевает, что, даже если система думает, что он выключил диск, он на самом деле не может быть выключен. Следовательно, первоначальная цель Mehrdad может не работать, даже еслинайден правильный способ сделать это. Это может быть связано с тем, как различные контроллеры USB-дисков реализуют состояние питания.)

  2. Я также обнаружил, что программа HDDScan может успешно выключить диски может успешно установить значение тайм-аута, которое диск учитывает.Кроме того, диск раскручивается, когда к нему обращается операционная система, и это хорошо, если вам нужно его использовать, но не так хорошо, если вы беспокоитесь о том, что он постоянно вращается, чтобы сбросить буферы размером 1 КБ. (Я решил установить время простоя в HDDScan на 1 минуту больше, чем время ожидания менеджера питания системы. Это, мы надеемся, гарантирует, что система не будет думать, что диск вращается, когда это не так.)

Я отмечаю, что powercfg имеет возможность предотвратить перезапуск бездействующих часов при небольших нечастых записях на диск. (называется «время игнорирования пакета».)

Вы можете получить HDDScan здесь: HDDScan.com и PwrTest здесь: Windows Driver Kit .К сожалению, PwrTest заставляет вас сначала установить множество других программ для MS, но все это бесплатно, если вы можете узнать, как загрузить его с их запутанных веб-страниц.

0 голосов
/ 06 апреля 2011

Я считаю, что Утилита командной строки Devcon должна быть в состоянии выполнить то, что вам нужно сделать.Если это так - исходный код доступен в Windows Ddk.

0 голосов
/ 20 марта 2011

Хотя не существует очевидного способа сделать то, о чем вы просите (например, сказать, что управление питанием «действует так, как если бы таймер вращения диска истек»), возможно, есть несколько способов смоделировать его:

  1. Вызовите FlushFileBuffers на накопителе (вам нужно подняться, чтобы открыть \\.\C), затем введите команду STANDBY на накопитель.*

  2. Выполните вызов API, который устанавливает время ожидания вращения диска до 1 секунды, а затем увеличьте его до прежнего значения через 1 секунду.Обратите внимание, что вам может потребоваться увеличить предыдущее значение, а не сразу перейти к нему.

...