获取磁盘示例代码的旋转速度

Get Rotation Speed of Disk Sample Code

本文关键字:旋转 速度 代码 磁盘 获取      更新时间:2023-10-16

我不太擅长vc++,但有没有人有一个示例代码来获得计算机中磁盘的旋转速度?我一直在研究检测SSD驱动器和一个解决方案,从研究一整天是得到旋转速度,因为SSD有0 rpm这可能是检测SSD驱动器的唯一方法。

From google wmi ssd detect

有一个NV缓存管理器接口用于ReadyDrive,这是新的Vista。我认为它正在测试NV_FEATURE_PARAMETER的NVReadSpeed和NVWrtSpeed值。

Windows 7使用ATA8-ACS识别字217:标称介质旋转速率,值0001h为非旋转介质,如固态设备。但并不是所有的ssd都符合ATA8-ACS1规范7.16.7.77,有些可能需要固件更新。

如果你想了解更多关于在Windows中发送ATA命令的信息,我建议你去查看存储平台ATA论坛。本论坛正在存档,请尽快行动。


也很有启发性:

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

硬盘碎片整理是否默认禁用?

是的。碎片整理的自动调度将排除声明自己为ssd的设备上的分区。此外,如果系统磁盘的随机读取性能特征高于8 MB/秒的阈值,那么它也将被排除在外。阈值由内部分析确定。

您最好查找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;
}

我知道这是一个旧的线程,但这将在Windows 10上工作

ManagementScope scope = new ManagementScope(@"\.rootmicrosoftwindowsstorage");
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM MSFT_PhysicalDisk");
            scope.Connect();
            searcher.Scope = scope;
            string type = "";
            foreach (ManagementObject queryObj in searcher.Get())
            {
                switch (Convert.ToInt16(queryObj["MediaType"]))
                {
                    case 1:
                        type = "Unspecified";
                        break;
                    case 3:
                        type = "HDD";
                        break;
                    case 4:
                        type = "SSD";
                        break;
                    case 5:
                        type = "SCM";
                        break;
                    default:
                        type = "Unspecified";
                        break;
                }
            }
            searcher.Dispose();