close

參考網址:http://stackoverflow.com/questions/23363115/detecting-ssd-in-windows

 

實作在MFC


    DWORD bytesReturned;
    CString wstrIndex = L"";
    m_EditIndexOfDrive.GetWindowTextW(wstrIndex);
    if ( wstrIndex.GetLength() > 1 || wstrIndex[0] < L'0' || wstrIndex[0] > L'9' ) {
        MessageBox(L"請輸入單一數字");
        m_EditIndexOfDrive.SetWindowTextW(L"");
        return;
    } // end if

    CString wstrDrivePath;
    wstrDrivePath = L"\\\\?\\PhysicalDrive";
    wstrDrivePath += wstrIndex;

    m_Listbox.InsertString(0,L"create file...");

    //As an example, let's test 1st physical drive
    HANDLE hDevice = ::CreateFile(wstrDrivePath,
        GENERIC_READ | GENERIC_WRITE,       //We need write access to send ATA command to read RPMs
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
        OPEN_EXISTING,  0, NULL);
    if(hDevice != INVALID_HANDLE_VALUE)
    {
        
    
        m_Listbox.InsertString(0,L"check TRIM start");
        //Check TRIM -- should be Y for SSD, N for Traditional HD
        //_tprintf(L"TRIM=");
        STORAGE_PROPERTY_QUERY spqTrim;
        spqTrim.PropertyId = (STORAGE_PROPERTY_ID)StorageDeviceTrimProperty;
        spqTrim.QueryType = PropertyStandardQuery;

        bytesReturned = 0;
        DEVICE_TRIM_DESCRIPTOR dtd = {0};
        if(::DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
            &spqTrim, sizeof(spqTrim), &dtd, sizeof(dtd), &bytesReturned, NULL) &&
            bytesReturned == sizeof(dtd)) {
                //Got it
                dtd.TrimEnabled ? m_Listbox.InsertString(0,L"TRIM=Y--SSD") : m_Listbox.InsertString(0,L"TRIM=N---HD");
        }
        else {
            CString str = L"error code : ";
            str.AppendFormat(L"%d", ::GetLastError());
            m_Listbox.InsertString(0,str);
        }

        m_Listbox.InsertString(0,L"check TRIM finish");
        m_Listbox.InsertString(0,L"check seekPenalty start");

        //Check the seek-penalty value -- should be N for SSD
        //_tprintf(L", seekPenalty=");
        STORAGE_PROPERTY_QUERY spqSeekP;
        spqSeekP.PropertyId = (STORAGE_PROPERTY_ID)StorageDeviceSeekPenaltyProperty;
        spqSeekP.QueryType = PropertyStandardQuery;

        bytesReturned = 0;
        DEVICE_SEEK_PENALTY_DESCRIPTOR dspd = {0};
        if(::DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
            &spqSeekP, sizeof(spqSeekP), &dspd, sizeof(dspd), &bytesReturned, NULL) &&
            bytesReturned == sizeof(dspd))
        {
            //Got it
            dspd.IncursSeekPenalty ? m_Listbox.InsertString(0,L"seekPenalty=Y---HD") : m_Listbox.InsertString(0,L"seekPenalty=N---SSD");
        }
        else
        {
            CString str = L"error code : ";
            str.AppendFormat(L"%d", ::GetLastError());
            m_Listbox.InsertString(0,str);
        }

        m_Listbox.InsertString(0,L"check seekPenalty finish");
    }
    else
        m_Listbox.InsertString(0,L"createfile error");
arrow
arrow

    跪著讀 發表在 痞客邦 留言(0) 人氣()