2011-04-28 68 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; 
}