Получить код скорости вращения образца диска - PullRequest
5 голосов
/ 28 апреля 2011

Я не очень хорош в VC ++, но есть ли у кого-нибудь пример кода для получения скорости вращения диска в компьютере.Я работал над обнаружением SSD-накопителей, и одним из решений исследования в течение всего дня было получение скорости вращения, а поскольку SSD имеет 0 об / мин, это может быть единственным способом обнаружения SSD-накопителей.

Ответы [ 2 ]

7 голосов
/ 28 апреля 2011

С google wmi ssd обнаружить

Для ReadyDrive , который является новым для Vista, используется интерфейс диспетчера кэша NV .Я думаю, что он тестирует значения NVRedeSpeed ​​и NVWrtSpeed ​​NV_FEATURE_PARAMETER.

Windows 7 обнаруживает твердотельные накопители с помощью идентификатора ATA8-ACS, обозначающего слово 217: номинальная скорость вращения носителя, со значением 0001h как невращающиеся носители, такие как твердотельные устройства.Но не все твердотельные накопители соответствуют разделу 7.16.7.77 спецификации ATA8-ACS1, некоторые могут нуждаться в обновлениях прошивки.

Если вы хотите больше полагаться на отправку команд ATA в Windows, я предлагаю вам покопаться на платформе храненияФорум АТА.Этот форум архивируется, поэтому действуйте быстро.


Также очень поучительно:

http://blogs.msdn.com/b/e7/archive/2009/05/05/support-and-q-a-for-solid-state-drives-and.aspx

Будет ли дефрагментация диска по умолчанию отключенана SSD?

Да.Автоматическое планирование дефрагментации исключит разделы на устройствах, которые объявляют себя твердотельными накопителями.Кроме того, если системный диск имеет характеристики производительности случайного чтения выше порога 8 МБ / с, то он также будет исключен.Порог был определен внутренним анализом.

1 голос
/ 21 июля 2015

Вам, вероятно, лучше искать команду TRIM.

BOOL IsDriveSSD(){

    DWORD dwBytesReturned;

    HANDLE volhand = INVALID_HANDLE_VALUE;
    try{
        volhand = CreateFile("\\\\.\\PHYSICALDRIVE0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    }
    catch(...){
        volhand = INVALID_HANDLE_VALUE;
    }

    if (volhand == INVALID_HANDLE_VALUE) return FALSE;


    // Test 1: See if we have a TRIM command, if so, we're SSD.
    STORAGE_PROPERTY_QUERY spq;
    DEVICE_TRIM_DESCRIPTOR dtr;
    memset(&dtr,0,sizeof(DEVICE_TRIM_DESCRIPTOR));
    memset(&spq,0,sizeof(STORAGE_PROPERTY_QUERY));
    spq.PropertyId=StorageDeviceTrimProperty;
    spq.QueryType=PropertyStandardQuery;

    BOOL ret = DeviceIoControl(volhand, IOCTL_STORAGE_QUERY_PROPERTY,
        &spq,sizeof(spq),
        &dtr,sizeof(dtr),
        &dwBytesReturned,FALSE);

    if(ret){
        ret = dtr.TrimEnabled;
    }

    CloseHandle(volhand);

    return ret;
}
...