2011-04-28 76 views
5

我不是很擅長VC++,但沒有人有一個示例代碼來獲得計算機中磁盤的旋轉速度。我一直致力於檢測SSD驅動器,並且一整天都在研究獲得轉速的解決方案,並且由於SSD的轉速爲0 rpm,因此這可能是檢測SSD驅動器的唯一方法。獲取磁盤示例代碼的旋轉速度

+4

我相信這是強烈OS專用的,所以你應該指定一個操作系統,你有興趣。 – Kos 2011-04-28 06:14:24

+0

我的目標操作系統是Windows 7。 – patlimosnero 2011-04-28 06:37:50

回答

7

google wmi ssd detect

有一個NV高速緩存管理器interface used for ReadyDrive這是一個新的Vista操作系統。我認爲它正在測試NV_FEATURE_PARAMETER的NVReadSpeed和NVWrtSpeed值。

Windows 7通過使用ATA8-ACS識別字217檢測SSD:標稱介質旋轉速率,值0001h作爲非旋轉介質(如固態設備)。但並非所有SSD都符合ATA8-ACS1規範第7.16.7.77節,有些可能需要固件更新。

如果您想更多地瞭解如何在Windows中發送ATA命令,我建議您挖掘一下Storage Platform ATA論壇。此論壇正在歸檔,因此請儘快採取行動。


而且很有啓發:

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

威爾磁盤碎片整理默認情況下,在SSD上被禁用?

是的。碎片整理的自動調度將排除將自己聲明爲SSD的設備上的分區。此外,如果系統磁盤的隨機讀取性能特徵高於8 MB /秒的閾值,那麼它也將被排除。閾值由內部分析確定。

1

你很可能會更好尋找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; 
}