【问题标题】:Get Rotation Speed of Disk Sample Code获取磁盘转速示例代码
【发布时间】:2011-04-28 06:11:51
【问题描述】:

我不是很擅长 VC++,但是有没有人有一个示例代码来获取计算机中磁盘的旋转速度。我一直致力于检测 SSD 驱动器,整天研究的一个解决方案是获取旋转速度,由于 SSD 的转速为 0 rpm,这可能是检测 SSD 驱动器的唯一方法。

【问题讨论】:

  • 我认为这是特定于操作系统的,因此您应该指定您感兴趣的操作系统。

标签: c++ c visual-c++ device-driver


【解决方案1】:

来自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/秒的阈值,那么它也将被排除在外。阈值由内部分析确定。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我知道这是一个旧线程,但这将在 Windows 10 上运行

      ManagementScope scope = new ManagementScope(@"\\.\root\microsoft\windows\storage");
                  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();
      

      【讨论】:

      • 这可能是对未来访问者有用的答案,但它与 OP 要求的语言不同。
      • 哦,对不起,没注意到。但我确信在其他编程语言中也可以使用 WMI 命令
      猜你喜欢
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 2020-03-31
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      相关资源
      最近更新 更多