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");
文章標籤
全站熱搜