Подтвердить что ты не робот

Прокрутка жесткого диска программно в Windows?

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

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

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


Насколько я дошел до сих пор:

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


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

Update:

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


Дополнительная информация:

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

4b9b3361

Ответ 1

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

Это: 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. Просто пытаясь помочь, не стреляйте в мессенджера.

Ответ 2

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

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

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

EDIT:

В этом коде перечислены все диски в системе и диски, поддерживающие этот 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 файл и запустите его из командной строки.

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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