簡體   English   中英

獲取磁盤轉速示例代碼

[英]Get Rotation Speed of Disk Sample Code

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

谷歌 wmi ssd 檢測

有一個 用於 ReadyDrive 的 NV 緩存管理器接口,這是 Vista 的新接口。 我認為它正在測試 NV_FEATURE_PARAMETER 的 NVReadSpeed 和 NVWrtSpeed 值。

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

如果您想了解更多關於在 Windows 中發送 ATA 命令的信息,我建議您在 Storage Platform ATA 論壇上進行挖掘。 此論壇正在歸檔中,請盡快行動。


也很有啟發性:

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

SSD 默認情況下會禁用磁盤碎片整理嗎?

是的。 碎片整理的自動調度將排除設備上聲明為 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(@"\\.\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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM