是否有一种“编程”方式来确定磁盘是否正在旋转(旋转,不一定是读取/写入)?
答案1
磁盘是否旋转取决于其电源模式;通常主轴电机将在“活动”和“空闲”模式下运行,并在“待机”和“睡眠”模式下停止。(对于具有 NV 缓存电源管理的驱动器,情况会变得有点复杂,我对此了解不多,无法在此介绍。)
如果驱动器处于睡眠状态,它肯定不会旋转(或执行任何其他操作,包括与主机通信);否则您可以询问它的当前模式。
E5
对于 ATA 驱动器,“检查电源模式”命令将执行此操作。发送命令寄存器中的值,它将FF
在扇区计数寄存器中返回驱动器是处于活动状态还是空闲状态。
通过编程方式执行此操作会进入 Stack Overflow 领域,但这里有一个可以在 Windows 上执行此操作的 C 代码片段:
int isSpinning = -1;
HANDLE hDevice = CreateFile(TEXT("\\\\.\\PHYSICALDRIVE0"), GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (hDevice != INVALID_HANDLE_VALUE)
{
DWORD cb = 0;
ATA_PASS_THROUGH_EX cmd = {sizeof(ATA_PASS_THROUGH_EX)};
cmd.AtaFlags = ATA_FLAGS_DRDY_REQUIRED; /* Require drive to be ready */
cmd.TimeOutValue = 3; /* Arbitrary timeout (seconds) */
cmd.CurrentTaskFile[6] = 0xE5; /* "Check Power Mode" in command register */
if (DeviceIoControl(hDevice, IOCTL_ATA_PASS_THROUGH, &cmd, sizeof(cmd), &cmd, sizeof(cmd), &cb, 0))
{
/* FF in sector count register means the drive is
active or idle (and therefore spinning) */
isSpinning = cmd.CurrentTaskFile[1] == 0xFF;
}
}