/*---------------------------------------------------------------------------*/ // Author : hiyohiyo // Mail : hiyohiyo@crystalmark.info // Web : https://crystalmark.info/ // License : MIT License /*---------------------------------------------------------------------------*/ #include "stdafx.h" #include "DiskMark.h" #include "DiskMarkDlg.h" #include "DiskBench.h" #include #include #include #pragma comment(lib,"winmm.lib") #pragma warning(disable : 4996) static CString TestFilePath; static CString TestFileDir; static CString DiskSpdExe; static HANDLE hFile; static int DiskTestCount; static UINT64 DiskTestSize; static int BenchType[9]; static int BenchSize[9]; static int BenchQueues[9]; static int BenchThreads[9]; // static int Affinity; static BOOL MixMode; static int MixRatio; static void ShowErrorMessage(CString message); static void Interval(void* dlg); static BOOL Init(void* dlg); static void DiskSpd(void* dlg, DISK_SPD_CMD cmd); static UINT Exit(void* dlg); static void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); static volatile BOOL WaitFlag; #define DISK_SPD_EXE_32 L"CdmResource\\diskspd\\diskspd32.exe" #define DISK_SPD_EXE_64 L"CdmResource\\diskspd\\diskspd64.exe" #define DISK_SPD_EXE_32_LEGACY L"CdmResource\\diskspd\\diskspd32L.exe" #define DISK_SPD_EXE_64_LEGACY L"CdmResource\\diskspd\\diskspd64L.exe" #define DISK_SPD_EXE_ARM32 L"CdmResource\\diskspd\\diskspdA32.exe" #define DISK_SPD_EXE_ARM64 L"CdmResource\\diskspd\\diskspdA64.exe" PROCESS_INFORMATION pi; int ExecAndWait(TCHAR *pszCmd, BOOL bNoWindow, double *latency) { DWORD Code = 0; BOOL bSuccess; STARTUPINFO si; memset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); if (bNoWindow) { si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; } CString name; name.Format(L"CrystalDiskMark%08X", GetCurrentProcessId()); auto size = 8; HANDLE hSharedMemory = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, NULL, size, name.GetString()); if (hSharedMemory != NULL) { auto pMemory = (double*)MapViewOfFile(hSharedMemory, FILE_MAP_ALL_ACCESS, NULL, NULL, size); if (pMemory != NULL) { bSuccess = CreateProcess(NULL, pszCmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); if (bSuccess != TRUE) { UnmapViewOfFile(pMemory); CloseHandle(hSharedMemory); return 0; } WaitForInputIdle(pi.hProcess, INFINITE); WaitForSingleObject(pi.hProcess, INFINITE); GetExitCodeProcess(pi.hProcess, &Code); CloseHandle(pi.hThread); CloseHandle(pi.hProcess); pi.hProcess = NULL; *latency = (double)*pMemory * 1000; // milli sec to micro sec UnmapViewOfFile(pMemory); CloseHandle(hSharedMemory); } } return Code; } void ShowErrorMessage(CString message) { DWORD lastErrorCode = GetLastError(); CString errorMessage; LPVOID lpMessageBuffer; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, lastErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL); errorMessage.Format(L"0x%08X:%s", lastErrorCode, (LPTSTR) lpMessageBuffer); AfxMessageBox(message + L"\r\n" + errorMessage); LocalFree( lpMessageBuffer ); } void Interval(void* dlg) { int intervalTime = ((CDiskMarkDlg*) dlg)->m_IntervalTime; CString title; for (int i = 0; i < intervalTime; i++) { if (!((CDiskMarkDlg*) dlg)->m_DiskBenchStatus) { return; } title.Format(L"Interval Time %d/%d sec", i, intervalTime); ::PostMessage(((CDiskMarkDlg*) dlg)->GetSafeHwnd(), WM_UPDATE_MESSAGE, (WPARAM) &title, 0); Sleep(1000); } } UINT ExecDiskBenchAll(LPVOID dlg) { int benchmark = ((CDiskMarkDlg*)dlg)->m_Benchmark; if(Init(dlg)) { if (benchmark & BENCHMARK_READ) { DiskSpd(dlg, TEST_READ_0); Interval(dlg); DiskSpd(dlg, TEST_READ_1); Interval(dlg); DiskSpd(dlg, TEST_READ_2); Interval(dlg); DiskSpd(dlg, TEST_READ_3); } if ((benchmark & BENCHMARK_READ) && (benchmark & BENCHMARK_WRITE)) { Interval(dlg); } if (benchmark & BENCHMARK_WRITE) { DiskSpd(dlg, TEST_WRITE_0); Interval(dlg); DiskSpd(dlg, TEST_WRITE_1); Interval(dlg); DiskSpd(dlg, TEST_WRITE_2); Interval(dlg); DiskSpd(dlg, TEST_WRITE_3); } #ifdef MIX_MODE if (MixMode) { Interval(dlg); DiskSpd(dlg, TEST_MIX_0); Interval(dlg); DiskSpd(dlg, TEST_MIX_1); Interval(dlg); DiskSpd(dlg, TEST_MIX_2); Interval(dlg); DiskSpd(dlg, TEST_MIX_3); } #endif } return Exit(dlg); } UINT ExecDiskBenchAllPeak(LPVOID dlg) { int benchmark = ((CDiskMarkDlg*)dlg)->m_Benchmark; if (Init(dlg)) { if (benchmark & BENCHMARK_READ) { DiskSpd(dlg, TEST_READ_4); Interval(dlg); DiskSpd(dlg, TEST_READ_5); } if ((benchmark & BENCHMARK_READ) && (benchmark & BENCHMARK_WRITE)) { Interval(dlg); } if (benchmark & BENCHMARK_WRITE) { DiskSpd(dlg, TEST_WRITE_4); Interval(dlg); DiskSpd(dlg, TEST_WRITE_5); } #ifdef MIX_MODE if (MixMode) { Interval(dlg); DiskSpd(dlg, TEST_MIX_4); Interval(dlg); DiskSpd(dlg, TEST_MIX_5); } #endif } return Exit(dlg); } UINT ExecDiskBenchAllReal(LPVOID dlg) { int benchmark = ((CDiskMarkDlg*)dlg)->m_Benchmark; if (Init(dlg)) { if (benchmark & BENCHMARK_READ) { DiskSpd(dlg, TEST_READ_6); Interval(dlg); DiskSpd(dlg, TEST_READ_7); } if ((benchmark & BENCHMARK_READ) && (benchmark & BENCHMARK_WRITE)) { Interval(dlg); } if (benchmark & BENCHMARK_WRITE) { DiskSpd(dlg, TEST_WRITE_6); Interval(dlg); DiskSpd(dlg, TEST_WRITE_7); } #ifdef MIX_MODE if (MixMode) { Interval(dlg); DiskSpd(dlg, TEST_MIX_6); Interval(dlg); DiskSpd(dlg, TEST_MIX_7); } #endif } return Exit(dlg); } UINT ExecDiskBenchAllDemo(LPVOID dlg) { int benchmark = ((CDiskMarkDlg*)dlg)->m_Benchmark; if (Init(dlg)) { if (benchmark & BENCHMARK_READ) { DiskSpd(dlg, TEST_READ_8); } if ((benchmark & BENCHMARK_READ) && (benchmark & BENCHMARK_WRITE)) { Interval(dlg); } if (benchmark & BENCHMARK_WRITE) { DiskSpd(dlg, TEST_WRITE_8); } } return Exit(dlg); } UINT ExecDiskBench0(LPVOID dlg) { int benchmark = ((CDiskMarkDlg*)dlg)->m_Benchmark; if (Init(dlg)) { if (benchmark & BENCHMARK_READ) { DiskSpd(dlg, TEST_READ_0); } if ((benchmark & BENCHMARK_READ) && (benchmark & BENCHMARK_WRITE)) { Interval(dlg); } if (benchmark & BENCHMARK_WRITE) { DiskSpd(dlg, TEST_WRITE_0); } #ifdef MIX_MODE if (MixMode) { Interval(dlg); DiskSpd(dlg, TEST_MIX_0); } #endif } return Exit(dlg); } UINT ExecDiskBench1(LPVOID dlg) { int benchmark = ((CDiskMarkDlg*)dlg)->m_Benchmark; if (Init(dlg)) { if (benchmark & BENCHMARK_READ) { DiskSpd(dlg, TEST_READ_1); } if ((benchmark & BENCHMARK_READ) && (benchmark & BENCHMARK_WRITE)) { Interval(dlg); } if (benchmark & BENCHMARK_WRITE) { DiskSpd(dlg, TEST_WRITE_1); } #ifdef MIX_MODE if (MixMode) { Interval(dlg); DiskSpd(dlg, TEST_MIX_1); } #endif } return Exit(dlg); } UINT ExecDiskBench2(LPVOID dlg) { int benchmark = ((CDiskMarkDlg*)dlg)->m_Benchmark; if (Init(dlg)) { if (benchmark & BENCHMARK_READ) { DiskSpd(dlg, TEST_READ_2); } if ((benchmark & BENCHMARK_READ) && (benchmark & BENCHMARK_WRITE)) { Interval(dlg); } if (benchmark & BENCHMARK_WRITE) { DiskSpd(dlg, TEST_WRITE_2); } #ifdef MIX_MODE if (MixMode) { Interval(dlg); DiskSpd(dlg, TEST_MIX_2); } #endif } return Exit(dlg); } UINT ExecDiskBench3(LPVOID dlg) { int benchmark = ((CDiskMarkDlg*)dlg)->m_Benchmark; if (Init(dlg)) { if (benchmark & BENCHMARK_READ) { DiskSpd(dlg, TEST_READ_3); } if ((benchmark & BENCHMARK_READ) && (benchmark & BENCHMARK_WRITE)) { Interval(dlg); } if (benchmark & BENCHMARK_WRITE) { DiskSpd(dlg, TEST_WRITE_3); } #ifdef MIX_MODE if (MixMode) { Interval(dlg); DiskSpd(dlg, TEST_MIX_3); } #endif } return Exit(dlg); } UINT ExecDiskBench4(LPVOID dlg) { int benchmark = ((CDiskMarkDlg*)dlg)->m_Benchmark; if (Init(dlg)) { if (benchmark & BENCHMARK_READ) { DiskSpd(dlg, TEST_READ_4); } if ((benchmark & BENCHMARK_READ) && (benchmark & BENCHMARK_WRITE)) { Interval(dlg); } if (benchmark & BENCHMARK_WRITE) { DiskSpd(dlg, TEST_WRITE_4); } #ifdef MIX_MODE if (MixMode) { Interval(dlg); DiskSpd(dlg, TEST_MIX_4); } #endif } return Exit(dlg); } UINT ExecDiskBench5(LPVOID dlg) { int benchmark = ((CDiskMarkDlg*)dlg)->m_Benchmark; if (Init(dlg)) { if (benchmark & BENCHMARK_READ) { DiskSpd(dlg, TEST_READ_5); } if ((benchmark & BENCHMARK_READ) && (benchmark & BENCHMARK_WRITE)) { Interval(dlg); } if (benchmark & BENCHMARK_WRITE) { DiskSpd(dlg, TEST_WRITE_5); } #ifdef MIX_MODE if (MixMode) { Interval(dlg); DiskSpd(dlg, TEST_MIX_5); } #endif } return Exit(dlg); } UINT ExecDiskBench6(LPVOID dlg) { int benchmark = ((CDiskMarkDlg*)dlg)->m_Benchmark; if (Init(dlg)) { if (benchmark & BENCHMARK_READ) { DiskSpd(dlg, TEST_READ_6); } if ((benchmark & BENCHMARK_READ) && (benchmark & BENCHMARK_WRITE)) { Interval(dlg); } if (benchmark & BENCHMARK_WRITE) { DiskSpd(dlg, TEST_WRITE_6); } #ifdef MIX_MODE if (MixMode) { Interval(dlg); DiskSpd(dlg, TEST_MIX_6); } #endif } return Exit(dlg); } UINT ExecDiskBench7(LPVOID dlg) { int benchmark = ((CDiskMarkDlg*)dlg)->m_Benchmark; if (Init(dlg)) { if (benchmark & BENCHMARK_READ) { DiskSpd(dlg, TEST_READ_7); } if ((benchmark & BENCHMARK_READ) && (benchmark & BENCHMARK_WRITE)) { Interval(dlg); } if (benchmark & BENCHMARK_WRITE) { DiskSpd(dlg, TEST_WRITE_7); } #ifdef MIX_MODE if (MixMode) { Interval(dlg); DiskSpd(dlg, TEST_MIX_7); } #endif } return Exit(dlg); } BOOL Init(void* dlg) { BOOL FlagArc; BOOL result; static CString cstr; TCHAR drive; ULARGE_INTEGER freeBytesAvailableToCaller; ULARGE_INTEGER totalNumberOfBytes; ULARGE_INTEGER totalNumberOfFreeBytes; // Init m_Ini TCHAR *ptrEnd; TCHAR temp[MAX_PATH]; ::GetModuleFileName(NULL, temp, MAX_PATH); if ((ptrEnd = _tcsrchr(temp, '\\')) != NULL) { *ptrEnd = '\0'; } pi.hProcess = NULL; #ifdef _M_ARM DiskSpdExe.Format(L"%s\\%s", temp, DISK_SPD_EXE_ARM32); #elif _M_ARM64 DiskSpdExe.Format(L"%s\\%s", temp, DISK_SPD_EXE_ARM64); #elif _M_X64 if(IsWin8orLater()) { DiskSpdExe.Format(L"%s\\%s", temp, DISK_SPD_EXE_64); } else { DiskSpdExe.Format(L"%s\\%s", temp, DISK_SPD_EXE_64_LEGACY); } #else if (IsWin8orLater()) { DiskSpdExe.Format(L"%s\\%s", temp, DISK_SPD_EXE_32); } else { DiskSpdExe.Format(L"%s\\%s", temp, DISK_SPD_EXE_32_LEGACY); } #endif if (! IsFileExist(DiskSpdExe)) { AfxMessageBox(((CDiskMarkDlg*) dlg)->m_MesDiskSpdNotFound); ((CDiskMarkDlg*) dlg)->m_DiskBenchStatus = FALSE; return FALSE; } DiskTestCount = ((CDiskMarkDlg*) dlg)->m_IndexTestCount + 1; CString testSize = ((CDiskMarkDlg*)dlg)->m_ValueTestSize; if (testSize.Find(L"M") == -1) // GiB { DiskTestSize = (UINT64)_tstoi(testSize) * 1024; } else // MiB { DiskTestSize = (UINT64)_tstoi(testSize); } for (int i = 0; i < 9; i++) { BenchType[i] = ((CDiskMarkDlg*)dlg)->m_BenchType[i]; BenchSize[i] = ((CDiskMarkDlg*)dlg)->m_BenchSize[i]; BenchQueues[i] = ((CDiskMarkDlg*)dlg)->m_BenchQueues[i]; BenchThreads[i] = ((CDiskMarkDlg*)dlg)->m_BenchThreads[i]; } MixMode = ((CDiskMarkDlg*)dlg)->m_MixMode; MixRatio = ((CDiskMarkDlg*)dlg)->m_MixRatio; CString RootPath; if(((CDiskMarkDlg*)dlg)->m_MaxIndexTestDrive != ((CDiskMarkDlg*)dlg)->m_IndexTestDrive) { drive = ((CDiskMarkDlg*)dlg)->m_ValueTestDrive.GetAt(0); cstr.Format(L"%C:\\", drive); GetDiskFreeSpaceEx(cstr, &freeBytesAvailableToCaller, &totalNumberOfBytes, &totalNumberOfFreeBytes); if (totalNumberOfBytes.QuadPart < ((ULONGLONG)8 * 1024 * 1024 * 1024)) // < 8 GB { ((CDiskMarkDlg*)dlg)->m_TestDriveInfo.Format(L"%C: %.1f%% (%.1f/%.1f MiB)", drive, (double)(totalNumberOfBytes.QuadPart - totalNumberOfFreeBytes.QuadPart) / (double)totalNumberOfBytes.QuadPart * 100, (totalNumberOfBytes.QuadPart - totalNumberOfFreeBytes.QuadPart) / 1024 / 1024.0, totalNumberOfBytes.QuadPart / 1024 / 1024.0); } else { ((CDiskMarkDlg*)dlg)->m_TestDriveInfo.Format(L"%C: %.1f%% (%.1f/%.1f GiB)", drive, (double)(totalNumberOfBytes.QuadPart - totalNumberOfFreeBytes.QuadPart) / (double)totalNumberOfBytes.QuadPart * 100, (totalNumberOfBytes.QuadPart - totalNumberOfFreeBytes.QuadPart) / 1024 / 1024 / 1024.0, totalNumberOfBytes.QuadPart / 1024 / 1024 / 1024.0); } RootPath.Format(L"%c:\\", drive); } else { RootPath = ((CDiskMarkDlg*)dlg)->m_TestTargetPath; RootPath += L"\\"; } TestFileDir.Format(L"%sCrystalDiskMark%08X", (LPTSTR)RootPath.GetString(), timeGetTime()); CreateDirectory(TestFileDir, NULL); TestFilePath.Format(L"%s\\CrystalDiskMark%08X.tmp", (LPTSTR)TestFileDir.GetString(), timeGetTime()); DWORD FileSystemFlags; GetVolumeInformation(RootPath, NULL, NULL, NULL, NULL, &FileSystemFlags, NULL, NULL); if(FileSystemFlags & FS_VOL_IS_COMPRESSED) { FlagArc = TRUE; } else { FlagArc = FALSE; } // Check Disk Capacity // OSVERSIONINFO osVersionInfo; osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osVersionInfo); ULARGE_INTEGER FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes; GetDiskFreeSpaceEx(RootPath, &FreeBytesAvailableToCaller, &TotalNumberOfBytes, &TotalNumberOfFreeBytes); if(DiskTestSize > TotalNumberOfFreeBytes.QuadPart / 1024 / 1024 ) { AfxMessageBox(((CDiskMarkDlg*)dlg)->m_MesDiskCapacityError); ((CDiskMarkDlg*)dlg)->m_DiskBenchStatus = FALSE; return FALSE; } CString title; title.Format(L"Preparing... Create Test File"); ::PostMessage(((CDiskMarkDlg*)dlg)->GetSafeHwnd(), WM_UPDATE_MESSAGE, (WPARAM)& title, 0); // Preapare Test File hFile = ::CreateFile(TestFilePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_NO_BUFFERING|FILE_FLAG_SEQUENTIAL_SCAN, NULL); if(hFile == INVALID_HANDLE_VALUE) { AfxMessageBox(((CDiskMarkDlg*)dlg)->m_MesDiskCreateFileError); ((CDiskMarkDlg*)dlg)->m_DiskBenchStatus = FALSE; return FALSE; } // Set End Of File to prevent fragmentation of test file LARGE_INTEGER nFileSize; nFileSize.QuadPart = 1024 * 1024 * DiskTestSize; LARGE_INTEGER nStart; nStart.QuadPart = 0; SetFilePointerEx(hFile, nFileSize, NULL, FILE_BEGIN); SetEndOfFile(hFile); SetFilePointerEx(hFile, nStart, NULL, FILE_BEGIN); // COMPRESSION_FORMAT_NONE USHORT lpInBuffer = COMPRESSION_FORMAT_NONE; DWORD lpBytesReturned = 0; DeviceIoControl(hFile, FSCTL_SET_COMPRESSION, (LPVOID) &lpInBuffer, sizeof(USHORT), NULL, 0, (LPDWORD)&lpBytesReturned, NULL); // Fill Test Data char* buf = NULL; int BufSize; int Loop; int i; DWORD writesize; BufSize = 1024 * 1024; Loop = (int)DiskTestSize; buf = (char*) VirtualAlloc(NULL, BufSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); if (buf == NULL) { AfxMessageBox(L"Failed VirtualAlloc()."); ((CDiskMarkDlg*) dlg)->m_DiskBenchStatus = FALSE; return FALSE; } if (((CDiskMarkDlg*) dlg)->m_TestData == TEST_DATA_ALL0X00) { for (i = 0; i < BufSize; i++) { buf[i] = 0; } } else { // Compatible with DiskSpd for (i = 0; i < BufSize; i++) { buf[i] = (char) (rand() % 256); } } for (i = 0; i < Loop; i++) { if (((CDiskMarkDlg*) dlg)->m_DiskBenchStatus) { result = WriteFile(hFile, buf, BufSize, &writesize, NULL); } else { CloseHandle(hFile); VirtualFree(buf, 0, MEM_RELEASE); ((CDiskMarkDlg*) dlg)->m_DiskBenchStatus = FALSE; return FALSE; } } VirtualFree(buf, 0, MEM_RELEASE); CloseHandle(hFile); return TRUE; } void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { if(idEvent == TIMER_ID) { WaitFlag = FALSE; KillTimer(hwnd, idEvent); } } UINT Exit(void* dlg) { DeleteFile(TestFilePath); RemoveDirectory(TestFileDir); static CString cstr; cstr = L""; if(((CDiskMarkDlg*)dlg)->m_TestData == TEST_DATA_ALL0X00) { cstr = ALL_0X00_0FILL; } ::PostMessage(((CDiskMarkDlg*)dlg)->GetSafeHwnd(), WM_UPDATE_MESSAGE, NULL, (LPARAM)&cstr); ::PostMessage(((CDiskMarkDlg*)dlg)->GetSafeHwnd(), WM_EXIT_BENCHMARK, 0, 0); ((CDiskMarkDlg*)dlg)->m_DiskBenchStatus = FALSE; ((CDiskMarkDlg*)dlg)->m_WinThread = NULL; return 0; } void DiskSpd(void* dlg, DISK_SPD_CMD cmd) { static CString cstr; double *maxScore = NULL; double *minLatency = NULL; CString command; CString title; CString option; CString bufOption; int duration = 5; int index = 0; int j = 0; if (!((CDiskMarkDlg*) dlg)->m_DiskBenchStatus) { return; } if (((CDiskMarkDlg*) dlg)->m_TestData == TEST_DATA_ALL0X00) { bufOption += L" -Z"; } else { switch (cmd) { case TEST_WRITE_0: case TEST_WRITE_1: case TEST_WRITE_2: case TEST_WRITE_3: case TEST_WRITE_4: case TEST_WRITE_5: case TEST_WRITE_6: case TEST_WRITE_7: case TEST_WRITE_8: index = cmd - TEST_WRITE_0; cstr.Format(L" -Z%dK", BenchSize[index]); bufOption += cstr; break; case TEST_MIX_0: case TEST_MIX_1: case TEST_MIX_2: case TEST_MIX_3: case TEST_MIX_4: case TEST_MIX_5: case TEST_MIX_6: case TEST_MIX_7: case TEST_MIX_8: index = cmd - TEST_MIX_0; cstr.Format(L" -Z%dK", BenchSize[index]); bufOption += cstr; break; } } switch (cmd) { case TEST_READ_0: case TEST_READ_1: case TEST_READ_2: case TEST_READ_3: case TEST_READ_4: case TEST_READ_5: case TEST_READ_6: case TEST_READ_7: case TEST_READ_8: index = cmd - TEST_READ_0; if (BenchType[index]) { title.Format(L"Random Read"); option.Format(L"-b%dK -o%d -t%d -W0 -S -w0 -r", BenchSize[index], BenchQueues[index], BenchThreads[index]); } else { title.Format(L"Sequential Read"); option.Format(L"-b%dK -o%d -t%d -W0 -S -w0", BenchSize[index], BenchQueues[index], BenchThreads[index]); } maxScore = &(((CDiskMarkDlg*) dlg)->m_ReadScore[index]); minLatency = &(((CDiskMarkDlg*)dlg)->m_ReadLatency[index]); break; case TEST_WRITE_0: case TEST_WRITE_1: case TEST_WRITE_2: case TEST_WRITE_3: case TEST_WRITE_4: case TEST_WRITE_5: case TEST_WRITE_6: case TEST_WRITE_7: case TEST_WRITE_8: index = cmd - TEST_WRITE_0; if (BenchType[index]) { title.Format(L"Random Write"); option.Format(L"-b%dK -o%d -t%d -W0 -S -w100 -r", BenchSize[index], BenchQueues[index], BenchThreads[index]); } else { title.Format(L"Sequential Write"); option.Format(L"-b%dK -o%d -t%d -W0 -S -w100", BenchSize[index], BenchQueues[index], BenchThreads[index]); } option += bufOption; maxScore = &(((CDiskMarkDlg*)dlg)->m_WriteScore[index]); minLatency = &(((CDiskMarkDlg*)dlg)->m_WriteLatency[index]); break; #ifdef MIX_MODE case TEST_MIX_0: case TEST_MIX_1: case TEST_MIX_2: case TEST_MIX_3: case TEST_MIX_4: case TEST_MIX_5: case TEST_MIX_6: case TEST_MIX_7: case TEST_MIX_8: index = cmd - TEST_MIX_0; if (BenchType[index]) { title.Format(L"Random Mix"); option.Format(L"-b%dK -o%d -t%d -W0 -S -w%d -r", BenchSize[index], BenchQueues[index], BenchThreads[index], MixRatio); } else { title.Format(L"Sequential Mix"); option.Format(L"-b%dK -o%d -t%d -W0 -S -w%d", BenchSize[index], BenchQueues[index], BenchThreads[index], MixRatio); } option += bufOption; maxScore = &(((CDiskMarkDlg*)dlg)->m_MixScore[index]); minLatency = &(((CDiskMarkDlg*)dlg)->m_MixLatency[index]); break; #endif } option += L" -ag"; if(IsWin8orLater() && BenchType[index] == 0 && BenchThreads[index] > 1) // Sequential { option += L" -si"; } double score = 0.0; double latency = 0.0; if (maxScore == NULL || minLatency == NULL) { return ; } *maxScore = 0.0; *minLatency = -1.0; for (j = 0; j <= DiskTestCount; j++) { if (j == 0) { duration = ((CDiskMarkDlg*)dlg)->m_MeasureTime; cstr.Format(L"Preparing... %s", title.GetString()); } else { duration = ((CDiskMarkDlg*)dlg)->m_MeasureTime; cstr.Format(L"%s (%d/%d)", title.GetString(), j, DiskTestCount); } ::PostMessage(((CDiskMarkDlg*) dlg)->GetSafeHwnd(), WM_UPDATE_MESSAGE, (WPARAM) &cstr, 0); command.Format(L"\"%s\" %s -d%d -A%d -L \"%s\"", (LPTSTR)DiskSpdExe.GetString(), (LPTSTR)option.GetString(), duration, GetCurrentProcessId(), (LPTSTR)TestFilePath.GetString()); score = ExecAndWait((TCHAR*) (command.GetString()), TRUE, &latency) / 10 / 1000.0; if (j > 0 && score > *maxScore) { *maxScore = score; ::PostMessage(((CDiskMarkDlg*) dlg)->GetSafeHwnd(), WM_UPDATE_SCORE, 0, 0); } if (j > 0 && score > 0.0 && (latency < *minLatency || *minLatency < 0)) { *minLatency = latency; ::PostMessage(((CDiskMarkDlg*)dlg)->GetSafeHwnd(), WM_UPDATE_SCORE, 0, 0); } if (!((CDiskMarkDlg*) dlg)->m_DiskBenchStatus) { return; } } ::PostMessage(((CDiskMarkDlg*) dlg)->GetSafeHwnd(), WM_UPDATE_SCORE, 0, 0); }