Como você pode saber se um disco está girando (sem som / toque)?

2

Existe uma maneira "programática" para determinar se um disco está girando ou não (girando, não necessariamente lendo / escrevendo)?

    
por Coldblackice 23.02.2014 / 00:04

1 resposta

0

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;
    }
}
    
por 23.02.2014 / 07:31