По коду, как я могу отправить жесткий диск в спящий режим - PullRequest
6 голосов
/ 14 мая 2009

В моем компьютере много жестких дисков (7).

Когда они не используются, опция питания через некоторое время отправляет их в спящий режим. Но поскольку все создает много шума, я хотел бы отправить их спать, когда захочу, а не только после того, как истекло время ожидания по умолчанию.

В Windows (XP и выше), предпочтительно в C #,

Как отправить код в спящий режим по коду?

Заранее большое спасибо за помощь ...

Ответы [ 4 ]

1 голос
/ 14 мая 2009

AFAIK, это команда ATA, которая устанавливает * время замедления8 - то есть отключается сам привод. Вы можете использовать IOCTL_ATA_PASS_THROUGH для отправки команд непосредственно на накопитель - но я боюсь, что вы не сделаете ничего лучше, чем просто установите для него минимальное значение (которое я не знаю, что это такое, но это должно быть в спецификации ATA ).

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

-y Заставьте диск IDE немедленно перейти в режим ожидания с низким энергопотреблением, что обычно приводит к его замедлению.

-Y Принудительно заставить IDE-диск немедленно перейти в спящий режим с наименьшим энергопотреблением, что приведет к его полному отключению. Перед повторным доступом к диску требуется жесткий или программный сброс (драйвер IDE для Linux автоматически обрабатывает сброс, если / когда это необходимо).

Поскольку hdparm (и базовое ядро ​​Linux, которое он использует для связи с дисководом) - это GPL - вы сможете писать подробности оттуда, если у вас нет под рукой спецификации ATA.

Или просто используйте порт win32 .

1 голос
/ 14 мая 2009

Я не знаю API, чтобы сделать это напрямую, но есть инструменты, которые могут это сделать. Я видел Hard Disk Sleeper . Я не использовал его на своих машинах, поэтому не могу говорить о его качестве или эффективности.

1 голос
/ 14 мая 2009

Это можно сделать, если вы отправляете команды ATA непосредственно на привод с помощью IOCTL_ATA_PASS_THROUGH . Вам нужно будет передать команду SLEEP.

Я не думаю, что это проект для C #.

0 голосов
/ 14 мая 2009

Честно говоря, я не думаю, что это можно сделать, используя только C # (то есть .NET Framework).

Несмотря на это, я бы начал с изучения WMI и ACPI .

Как правило, это та вещь, которая требует от вас углубления в язык более низкого уровня (по крайней мере, для выяснения вызовов API для использования с P \ Invoke), потому что обычно это предполагает тесное взаимодействие с операционной системой или, возможно, напрямую с водителем.

Возможно, вы могли бы начать с изучения функций управления питанием Windows , хотя я не думаю, что это позволяет контролировать отдельные жесткие диски.

...