Se um disco está girando depende do seu modo de energia; Normalmente, o motor do fuso estará operando nos modos “Ativo” e “Inativo” e parado nos modos “Espera” e “Descanso”. (É um pouco mais complicado com drives com gerenciamento de energia de cache NV, que eu não sei o suficiente para cobrir aqui.)
Se uma unidade estiver adormecida, ela definitivamente não estará girando (ou fazendo qualquer outra coisa, inclusive se comunicando com o host); caso contrário, você pode interrogá-lo sobre seu modo atual.
Para uma unidade ATA, o comando “Check Power Mode” fará isso. Envie o valor E5
no registro de comando, e ele retornará FF
no registrador de contagem setorial se o drive estiver ativo ou inativo.
Fazer isso programaticamente está se aventurando no território do Stack Overflow, mas aqui está um trecho de C que fará isso no Windows:
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;
}
}