Добавлена папка source в CristalDiskMark
This commit is contained in:
@@ -0,0 +1,935 @@
|
||||
/*---------------------------------------------------------------------------*/
|
||||
// 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 <afxmt.h>
|
||||
#include <winioctl.h>
|
||||
#include <mmsystem.h>
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user