В Windows программно замедлить вращение жесткого диска?

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

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

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


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

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


Прочтите:

Обновление:

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


Больше информации:

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


person user541686    schedule 20.03.2011    source источник
comment
Это серьезный вопрос!   -  person Fábio Batista    schedule 20.03.2011
comment
Итак, вы хотите дать указание подсистеме управления питанием перевести HD в спящий режим, а не напрямую инструктировать HD переходить в спящий режим?   -  person Gabe    schedule 20.03.2011
comment
@ Фабио: Спасибо. :) @Gabe: Совершенно верно.   -  person user541686    schedule 20.03.2011
comment
Если вы перейдете на msdn.microsoft.com/en-us/library/aa373163 вы увидите, что там GetDevicePowerState, но нет SetDevicePowerState, что означает, что это либо невозможно, либо требуется недокументированный API.   -  person Gabe    schedule 20.03.2011
comment
@Gabe: Как это может быть невозможно, если Windows сама раскручивает жесткий диск, когда он простаивает? И я сомневаюсь, что API режима ядра будет недокументированным - он определенно понадобится людям, которые пишут драйверы для дисков. (На этой странице перечислены только API пользовательского режима.)   -  person user541686    schedule 20.03.2011
comment
Не могли бы вы добавить параграф с объяснением, почему обычный подход (например, «позволить ОС управлять этим за вас в соответствии с системной и пользовательской политикой») не подходит для вашего сценария? Заранее спасибо!   -  person Donal Fellows    schedule 20.03.2011
comment
@Donal: Потому что крутящий момент, который жесткий диск прикладывает ко мне на колени, заставляет меня вращаться, травмируя позвоночник. (Шучу.) Серьезно, это потому, что я хочу, чтобы мой компьютер делал то, что я хочу, очень просто. Не имеет значения, заключается ли проблема в экономии заряда батареи, предотвращении накопления тепла или избавлении от шума (кстати, это все и многое другое); дело не в том, следует мне это делать? но как мне это сделать ?. Политика пользователя и системная политика имеют значение только в многопользовательской среде. Когда у вас есть личный ноутбук, которым никто не пользуется, эти правила не имеют смысла.   -  person user541686    schedule 20.03.2011
comment
Если вас не волнует call-this-method-to-spin-down-hard-disk-now, вы можете добиться аналогичного эффекта, установив время замедления. Посмотрите документы для CallNtPowerInformation и SystemPowerPolicyAc   -  person Zabba    schedule 20.03.2011
comment
@ Забба: Спасибо, но мне просто любопытно ... вы случайно не прочитали мой 3-й абзац?   -  person user541686    schedule 20.03.2011
comment
@Mehrdad: Я контролирую подобные вещи на своих машинах через политику управления питанием, установленную в ОС (или это в драйверах материнской платы? Я не знаю и не забочусь.) независимо от числа пользователей указанной машины. Политики предназначены не только для системных администраторов!   -  person Donal Fellows    schedule 20.03.2011
comment
@Donal: Ну, я думаю, что то, как я управляю подобными вещами на моем собственном компьютере, отличается от вашего. Ваш метод работает для вас, но он не работает для меня, потому что я хочу получить полный контроль над своим ноутбуком, а вы хотите установить его и забыть о приближении. Я не ставлю под сомнение ваш метод, поэтому я бы также предпочел, чтобы мы не спорили и о справедливости моего вопроса, поскольку ни один из них никому не полезен. Если у вас есть какие-либо конкретные решения, я бы хотел их услышать.   -  person user541686    schedule 20.03.2011
comment
@ Mehrdad: Я не говорю, что то, что вы делаете, недействительно. Мне просто было любопытно, почему вы ищете такой уровень контроля, ведь очень мало вариантов использования, которые действительно нуждаются в нем (т. Е. Я не мог придумать ни одного навскидку ;-)) - я знаю, что это, вероятно, сократит срок службы диска из-за повышенного износа из-за дополнительных циклов раскрутки и замедления. Так как я не знал ответа на вопрос, зачем вам это нужно, я спросил. :-D   -  person Donal Fellows    schedule 20.03.2011
comment
@Donal: Я написал ответ несколько комментариев назад: экономия заряда батареи, предотвращение накопления тепла и избавление от шума. Это не то, что я бы использовал часто (именно из-за проблемы с износом), но в определенных ситуациях это очень полезно, например, когда я что-то изучаю в очень тихой комнате ... Я определенно мог бы использовать меньше шума и сэкономить немного времени работы от батареи. . Это может оказаться менее полезным, чем я думал, но я все же хочу попробовать; Я бы предпочел иметь больше контроля, чем меньше.   -  person user541686    schedule 20.03.2011
comment
Итак, вы хотите продолжить использовать ноутбук и не хотите, чтобы жесткий диск вращался? Удачи с этим.   -  person    schedule 05.04.2011
comment
@Mehr: Почему вы думаете, что это делает Windows? (Конечно, понятия не имею).   -  person    schedule 05.04.2011
comment
@Moron: Потому что Windows определяет, простаивает ли система? И типа, почему это вообще имеет значение? Дело в том, что жесткий диск остановился, независимо от того, кто это на самом деле сделал.   -  person user541686    schedule 05.04.2011
comment
@Moron: Взгляните на ссылку, которую я только что разместил, и поищите в ней hard disk burst ignore time. Эта функция полностью зависит от Windows.   -  person user541686    schedule 05.04.2011
comment
@Mehrdad: Это может быть драйвер, который этим занимается. Поэтому, если вы ищете API пользовательского режима или даже API ядра, вам может быть сложно его найти. В любом случае это может помочь: download.microsoft.com/download/9/c/5/. И действительно, удачи в этом. (Может помочь уведомление о выключении питания на странице 4)   -  person    schedule 05.04.2011
comment
@Moron: Забавно, что вы только что опубликовали то, что я опубликовал около 30 секунд назад (см. Мой предыдущий комментарий). :) Кроме того, в том же разделе, о котором вы говорили, сказано: Если в течение, по крайней мере, текущего тайм-аута простоя диска не было активности, диспетчер питания отправляет на диск уведомление об отключении питания. стек программных драйверов, указывающий, что диск должен замедлиться. Уведомление принимает форму пакета запроса питания устройства ввода-вывода (IRP) для состояния питания устройства D3. диспетчер питания является частью ядра, а не зависит от драйвера.   -  person user541686    schedule 05.04.2011
comment
@Moron: Поддерживать это - одно дело, но выдача команды не зависит от драйвера, поскольку ядру на самом деле все равно, какой именно драйвер работает.   -  person user541686    schedule 05.04.2011
comment
@Mehr: Я связался со страницей CE, на которой, казалось, есть протокол, поэтому я удалил предыдущий комментарий. Я имел в виду, что даже если вы вызываете API режима ядра, драйвер может не согласиться и продолжать вращать диск :-). И есть вероятность перезапуска диска при переключении контекста на ваш pdf-ридер и т. Д. (Это то, что я имел в виду в своем первом комментарии).   -  person    schedule 05.04.2011
comment
@Moron: А ... ну, я ничего не могу поделать с этой ситуацией, но я все же хотел бы знать ответ для 90% других случаев, когда драйвер действительно сотрудничает.   -  person user541686    schedule 05.04.2011
comment
Я считаю, что самый простой способ достичь поставленных вами целей: диск не вращается, экономит заряд батареи, предотвращает перегрев и избавляется от шума - это установить твердотельный диск. Вы даже получаете значительный прирост производительности.   -  person Ben Voigt    schedule 05.04.2011
comment
@Ben: Я полагаю, что более дешевый способ - это прочитать книгу и перевести ноутбук в спящий режим :-)   -  person    schedule 05.04.2011
comment
@Ben: Я был бы счастлив сделать это, если бы вы могли купить мне SSD на 256 ГБ! : D @Moron: Лол, да, но тогда мне пришлось бы пойти напечатать его ... и это не очень весело, если это что-то вроде Руководства разработчика программного обеспечения Intel, которое составляет почти 4000 страниц, ха-ха ...   -  person user541686    schedule 05.04.2011
comment
@Mehr: 4000 страниц? Надеюсь, вы не потратите все свое время на чтение, пытаясь выключить диск :-)   -  person    schedule 05.04.2011
comment
Наверное, мало помогает, но эта бесплатная утилита утверждает, что может замедлять работу жесткого диска по запросу.   -  person StackExchange saddens dancek    schedule 07.04.2011
comment
@dancek: Интересно ... похоже, что эта утилита также вызывает замедление, посылая прямую команду, что не очень хорошо работает с диспетчером питания (сразу после этого запускается). Тем не менее, спасибо.   -  person user541686    schedule 07.04.2011
comment
Что случилось со всеми потерями голосов за ответы на этот вопрос? - Я не видел столько голосов с тех пор, как оскорбил C ++ :-)   -  person Danny Varod    schedule 08.04.2011
comment
@ Дэнни: Лол. Это потому, что люди либо (1) предлагают что-то совершенно нелепое (например, выключение моего загрузочного диска), либо (2) повторение того, что я уже упоминал, не работает в вопросе (имеется в виду не только они даже не читали вопрос, но они также не узнали из других голосов против). : \   -  person user541686    schedule 08.04.2011


Ответы (5)


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

Это: 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

Я думаю, эта документация описывает то, что вы ищете.

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

person Dima    schedule 10.04.2011
comment
@ Дима: Ха-ха, мне понравился твой постскриптум. :) Я не голосую против, если это окажется бесполезным, я делаю это только в том случае, если ответ полностью неправильный (например, выключите загрузочный диск!) Или если он повторяет то, что я уже упоминал, не работать в вопросе (например, Установить значение тайм-аута). Твоего тоже вроде нет, так что ты в безопасности. ;) (И, кстати, это вроде как полезно ... посмотрим, сработает ли это.) - person user541686; 10.04.2011
comment
:) хорошо, вздох облегчения - дайте мне знать, если это произойдет (мне любопытно) - хотя тот факт, что MS не решила реализовать эти методы, должен кое-что сказать нам о проблеме. - person Dima; 10.04.2011
comment
@ Дима: Ха-ха, рад, что тебе стало легче. :-) Я попытался ввести CIM_Controller в WMIC, и он просто сказал _2 _... знаете ли вы, как использовать его в WMIC и / или VBScript? - person user541686; 10.04.2011
comment
@Dima: Я не могу понять, как заставить его работать (я никогда не понимал, как заставить работать WMI-запросы) ... какие-нибудь идеи? (Полагаю, я все равно столкнусь с ошибкой «Не реализовано», но попробовать стоит.) - person user541686; 10.04.2011
comment
Проверьте это, чтобы получить представление: .com / wmi / ROOT% 5Ccimv2 / CIM_ManagedSystemElement / - я не тратил много времени на работу над этим материалом - ближе всего работал с драйверами принтера через wmi и напрямую с самими принтерами через какую-то общую структуру (не могу запомнил имя, было слишком долго). - person Dima; 10.04.2011
comment
@Dima: Ах, спасибо за ссылку, по крайней мере, на этот раз я получил доступ к объекту диска. :) Я попробовал это, но там написано "Несоответствие типов"; Я предполагаю, что тип данных datetime передается неправильно. Есть предположения? - person user541686; 10.04.2011
comment
@Dima: Не уверен, что вы подразумеваете под значением интервала (не слишком знаком с VBS) ... вы имеете в виду использование DateDiff? Я пробовал это, но это не сработало. (В документации указано when, поэтому я предполагаю, что это не временной интервал, а момент времени.) - person user541686; 10.04.2011
comment
Я читал это: указывает, когда должно быть установлено состояние питания, либо как обычное значение даты и времени, либо как значение интервала (где интервал начинается при получении вызова метода). - Я бы принял целое число в секундах? миллисекунды? - person Dima; 10.04.2011
comment
@Dima: Пробовал, но я получаю несоответствие типа. :( - person user541686; 10.04.2011
comment
Эхо дает вам правильный формат даты и времени? Если это так, я предполагаю, что, поскольку это не реализовано как обычная ваниль, вы получаете ошибку ... вероятно, драйвер жесткого диска реализовал это - какой у вас диск? - person Dima; 10.04.2011
comment
Хотел отредактировать предыдущий комментарий, чтобы добавить: И, да, лол, я знаю, что мы не хотим отдавать диску прямую команду (просто изучаем варианты). - person Dima; 10.04.2011
comment
@Dima: На самом деле, теперь, когда вы это упомянули, нет - формат был неправильным; Я получил 00000101000000.000000+000. У меня есть жесткий диск Seagate; однако это не похоже на серьезную проблему, просто несоответствие типа параметра. Он просто продолжает говорить мне Type mismatch, так что я не думаю, что он вообще доходит до диска. - person user541686; 10.04.2011
comment
@ Дима: Лол. На самом деле, отправка драйверу команды прямого изменения состояния питания не так уж плоха, как отправка приводу прямой команды (которая будет использовать сквозной запрос для обхода Водитель). Это шаг к цели, поэтому было бы неплохо, если бы мы больше ничего не могли сделать. - person user541686; 10.04.2011
comment
@ Дима: Ах ... хорошая идея. Я попробовал, и это сработало! Итак, теперь я получил ожидаемую ошибку: This method is not implemented in any class. Так что да, это не работает. Спасибо хоть! - person user541686; 10.04.2011
comment
Лол, я дам тебе знать, если найду что-нибудь еще относительно реализации Seagate :) - person Dima; 10.04.2011
comment
@ Дима: Лол, ладно, спасибо. :) (Я не думаю, что это будет зависеть от диска ... это не похоже на то, что подсистема управления питанием заботится о типе диска.) - person user541686; 10.04.2011
comment
На самом деле, можете ли вы проверить, возвращает ли свойство PowerManagementCapabilities CIM_DiskDrive что-нибудь полезное? Подробности здесь: scriptinternals.de/new/us/Support/Internal/ < / а> - person Dima; 10.04.2011
comment
... вздох, это не многообещающе - person Dima; 10.04.2011
comment
@ Дима: лол, да ... Я очень старался найти ответ, пока наконец не сдался и не написал на SO. :) - person user541686; 10.04.2011
comment
Спасибо за награду; извините, это не совсем сработало ... и, видя, что никто другой тоже не знает, это может быть невозможно без фактической реализации этого метода :( - person Dima; 12.04.2011
comment
@Dima: Ну, я определенно не думаю, что это невозможно, потому что, если Windows удастся это сделать, это возможно. :-) Я попытаюсь понять, смогу ли я использовать для этого какой-нибудь трюк с режимом ядра. - person user541686; 12.04.2011
comment
Если все-таки разобрались, дайте нам знать :) - person Dima; 12.04.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 и запустите его из командной строки.

person Shamit Verma    schedule 11.04.2011
comment
Это то же самое, что ответил Дима. - person user541686; 11.04.2011
comment
@Mehrdad: добавлен специальный код, который сообщает, предоставляет ли конкретный диск эту возможность или нет. - person Shamit Verma; 13.04.2011
comment
Я думаю, что MS не реализует это через WMI, но я попробую, спасибо. - person user541686; 13.04.2011
comment
Это зависит от конкретного устройства. Например, SD-карта не может изменять состояние питания. Единственный способ убедиться в этом - запросить возможности, чтобы проверить, реализовано ли это конкретным устройством (и драйвером). - person Shamit Verma; 13.04.2011
comment
Похоже, мой накопитель не поддерживает вызов WMI. - person user541686; 13.04.2011

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

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

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

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

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

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

person user4195968    schedule 29.10.2014

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

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

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

person Gabe    schedule 20.03.2011
comment
Разве вы не сами спрашивали, So you want to instruct the power management subsystem to put the HD to sleep, not directly instruct the HD to go to sleep?? Я думал, вы очень хорошо поняли вопрос ... почему вы только что разместили то, что я уже упоминал не работает в моем вопросе? - person user541686; 20.03.2011

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

person quixver    schedule 05.04.2011
comment
Это интересно! Не могли бы вы уточнить, какие переключатели мне следует использовать? - person user541686; 06.04.2011
comment
Запуск devcon с переключателем состояния выводит список доступных устройств. например, статус devcon . Затем вы можете отключить нужное устройство с помощью remove. Например, на моей машине в статусе devcon * перечислены IDE \ DISKST31000528AS ____________________________ CC38 ____ \ 5 & 5C6CFD6 & 0 & 1.1.0. Я могу извлечь его, выполнив команду devcon remove IDE \ DISKST3100. - person quixver; 06.04.2011
comment
эээ - извините за форматирование - не могу понять, как это исправить. обратите внимание, что в конце частичного имени устройства (подстановочный знак) должен быть символ «*» или, конечно, вы можете указать полное имя устройства. - person quixver; 06.04.2011
comment
Эээ ... так ты предлагаешь отключить загрузочный диск? - person user541686; 06.04.2011
comment
Отключение загрузочного диска может быть не очень разумной идеей, вы можете попробовать его на дополнительном диске. - person quixver; 06.04.2011
comment
@quixver: А ??? !!! Вся суть этого вопроса заключалась в том, чтобы отключить only диск в моем ноутбуке ... - person user541686; 06.04.2011