/****************************************************************************** * WinDialog.c * * Copyright (c) 2020, longpanda * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . * */ #include #include #include "resource.h" #include "Language.h" #include "Ventoy2Disk.h" HINSTANCE g_hInst; HWND g_DialogHwnd; HWND g_ComboxHwnd; HWND g_StaticLocalVerHwnd; HWND g_StaticDiskVerHwnd; HWND g_BtnInstallHwnd; HWND g_BtnUpdateHwnd; HWND g_ProgressBarHwnd; HWND g_StaticStatusHwnd; CHAR g_CurVersion[64]; HANDLE g_ThreadHandle = NULL; void GetExeVersionInfo(const char *FilePath) { UINT length; DWORD verBufferSize; CHAR verBuffer[2048]; VS_FIXEDFILEINFO *verInfo = NULL; verBufferSize = GetFileVersionInfoSizeA(FilePath, NULL); if (verBufferSize > 0 && verBufferSize <= sizeof(verBuffer)) { if (GetFileVersionInfoA(FilePath, 0, verBufferSize, (LPVOID)verBuffer)) { VerQueryValueA(verBuffer, "\\", &verInfo, &length); safe_sprintf(g_CurVersion, "%u.%u.%u.%u", HIWORD(verInfo->dwProductVersionMS), LOWORD(verInfo->dwProductVersionMS), HIWORD(verInfo->dwProductVersionLS), LOWORD(verInfo->dwProductVersionLS)); } } } void SetProgressBarPos(int Pos) { CHAR Ratio[64]; if (Pos >= PT_FINISH) { Pos = PT_FINISH; } SendMessage(g_ProgressBarHwnd, PBM_SETPOS, Pos, 0); safe_sprintf(Ratio, "Status - %.0lf%%", Pos * 100.0 / PT_FINISH); SetWindowTextA(g_StaticStatusHwnd, Ratio); } static void OnComboxSelChange(HWND hCombox) { int nCurSelected; PHY_DRIVE_INFO *CurDrive = NULL; SetWindowTextA(g_StaticLocalVerHwnd, GetLocalVentoyVersion()); EnableWindow(g_BtnInstallHwnd, FALSE); EnableWindow(g_BtnUpdateHwnd, FALSE); nCurSelected = SendMessage(hCombox, CB_GETCURSEL, 0, 0); if (CB_ERR == nCurSelected) { return; } CurDrive = GetPhyDriveInfoById(nCurSelected); if (!CurDrive) { return; } SetWindowTextA(g_StaticDiskVerHwnd, CurDrive->VentoyVersion); if (g_ForceOperation == 0) { if (CurDrive->VentoyVersion[0]) { //only can update EnableWindow(g_BtnInstallHwnd, FALSE); EnableWindow(g_BtnUpdateHwnd, TRUE); } else { //only can install EnableWindow(g_BtnInstallHwnd, TRUE); EnableWindow(g_BtnUpdateHwnd, FALSE); } } else { EnableWindow(g_BtnInstallHwnd, TRUE); EnableWindow(g_BtnUpdateHwnd, TRUE); } InvalidateRect(g_DialogHwnd, NULL, TRUE); UpdateWindow(g_DialogHwnd); } static void LanguageInit(void) { SetWindowText(GetDlgItem(g_DialogHwnd, IDC_STATIC_DEV), _G(STR_DEVICE)); SetWindowText(GetDlgItem(g_DialogHwnd, IDC_STATIC_LOCAL), _G(STR_LOCAL_VER)); SetWindowText(GetDlgItem(g_DialogHwnd, IDC_STATIC_DISK), _G(STR_DISK_VER)); SetWindowText(g_StaticStatusHwnd, _G(STR_STATUS)); SetWindowText(g_BtnInstallHwnd, _G(STR_INSTALL)); SetWindowText(g_BtnUpdateHwnd, _G(STR_UPDATE)); } static BOOL InitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) { DWORD i; HANDLE hCombox; HFONT hStaticFont; CHAR Letter[32]; CHAR DeviceName[256]; HICON hIcon; g_DialogHwnd = hWnd; g_ComboxHwnd = GetDlgItem(hWnd, IDC_COMBO1); g_StaticLocalVerHwnd = GetDlgItem(hWnd, IDC_STATIC_LOCAL_VER); g_StaticDiskVerHwnd = GetDlgItem(hWnd, IDC_STATIC_DISK_VER); g_BtnInstallHwnd = GetDlgItem(hWnd, IDC_BUTTON4); g_BtnUpdateHwnd = GetDlgItem(hWnd, IDC_BUTTON3); g_ProgressBarHwnd = GetDlgItem(hWnd, IDC_PROGRESS1); g_StaticStatusHwnd = GetDlgItem(hWnd, IDC_STATIC_STATUS); hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON1)); SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon); SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon); SendMessage(g_ProgressBarHwnd, PBM_SETRANGE, (WPARAM)0, (LPARAM)(MAKELPARAM(0, PT_FINISH))); PROGRESS_BAR_SET_POS(PT_START); LanguageInit(); // Fill device combox hCombox = GetDlgItem(hWnd, IDC_COMBO1); for (i = 0; i < g_PhyDriveCount; i++) { if (g_PhyDriveList[i].Id < 0) { continue; } if (g_PhyDriveList[i].FirstDriveLetter >= 0) { safe_sprintf(Letter, "%C: ", g_PhyDriveList[i].FirstDriveLetter); } else { Letter[0] = 0; } safe_sprintf(DeviceName, "%s[%dGB] %s %s", Letter, GetHumanReadableGBSize(g_PhyDriveList[i].SizeInBytes), g_PhyDriveList[i].VendorId, g_PhyDriveList[i].ProductId ); SendMessageA(hCombox, CB_ADDSTRING, 0, (LPARAM)DeviceName); } SendMessage(hCombox, CB_SETCURSEL, 0, 0); // Set static text & font hStaticFont = CreateFont(26, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH&FF_SWISS, TEXT("Courier New")); SendMessage(g_StaticLocalVerHwnd, WM_SETFONT, (WPARAM)hStaticFont, TRUE); SendMessage(g_StaticDiskVerHwnd, WM_SETFONT, (WPARAM)hStaticFont, TRUE); OnComboxSelChange(g_ComboxHwnd); SetFocus(g_ProgressBarHwnd); return TRUE; } static DWORD WINAPI InstallVentoyThread(void* Param) { int rc; PHY_DRIVE_INFO *pPhyDrive = (PHY_DRIVE_INFO *)Param; rc = InstallVentoy2PhyDrive(pPhyDrive); if (rc) { Log("This time install failed, now wait and retry..."); Sleep(10000); Log("Now retry to install..."); rc = InstallVentoy2PhyDrive(pPhyDrive); } if (rc == 0) { PROGRESS_BAR_SET_POS(PT_FINISH); MessageBox(g_DialogHwnd, _G(STR_INSTALL_SUCCESS), _G(STR_INFO), MB_OK | MB_ICONINFORMATION); safe_strcpy(pPhyDrive->VentoyVersion, GetLocalVentoyVersion()); } else { PROGRESS_BAR_SET_POS(PT_FINISH); MessageBox(g_DialogHwnd, _G(STR_INSTALL_FAILED), _G(STR_ERROR), MB_OK | MB_ICONERROR); } PROGRESS_BAR_SET_POS(PT_START); g_ThreadHandle = NULL; SetWindowText(g_StaticStatusHwnd, _G(STR_STATUS)); OnComboxSelChange(g_ComboxHwnd); return 0; } static DWORD WINAPI UpdateVentoyThread(void* Param) { int rc; PHY_DRIVE_INFO *pPhyDrive = (PHY_DRIVE_INFO *)Param; rc = UpdateVentoy2PhyDrive(pPhyDrive); if (rc) { Log("This time update failed, now wait and retry..."); Sleep(10000); Log("Now retry to update..."); rc = UpdateVentoy2PhyDrive(pPhyDrive); } if (rc == 0) { PROGRESS_BAR_SET_POS(PT_FINISH); MessageBox(g_DialogHwnd, _G(STR_UPDATE_SUCCESS), _G(STR_INFO), MB_OK | MB_ICONINFORMATION); safe_strcpy(pPhyDrive->VentoyVersion, GetLocalVentoyVersion()); } else { PROGRESS_BAR_SET_POS(PT_FINISH); MessageBox(g_DialogHwnd, _G(STR_UPDATE_FAILED), _G(STR_ERROR), MB_OK | MB_ICONERROR); } PROGRESS_BAR_SET_POS(PT_START); g_ThreadHandle = NULL; SetWindowText(g_StaticStatusHwnd, _G(STR_STATUS)); OnComboxSelChange(g_ComboxHwnd); return 0; } static void OnInstallBtnClick(void) { int nCurSel; PHY_DRIVE_INFO *pPhyDrive = NULL; if (MessageBox(g_DialogHwnd, _G(STR_INSTALL_TIP), _G(STR_WARNING), MB_YESNO | MB_ICONWARNING) != IDYES) { return; } if (MessageBox(g_DialogHwnd, _G(STR_INSTALL_TIP2), _G(STR_WARNING), MB_YESNO | MB_ICONWARNING) != IDYES) { return; } if (g_ThreadHandle) { Log("Another thread is runing"); return; } nCurSel = SendMessage(g_ComboxHwnd, CB_GETCURSEL, 0, 0); if (CB_ERR == nCurSel) { Log("Failed to get combox sel"); return;; } pPhyDrive = GetPhyDriveInfoById(nCurSel); if (!pPhyDrive) { return; } EnableWindow(g_BtnInstallHwnd, FALSE); EnableWindow(g_BtnUpdateHwnd, FALSE); g_ThreadHandle = CreateThread(NULL, 0, InstallVentoyThread, (LPVOID)pPhyDrive, 0, NULL); } static void OnUpdateBtnClick(void) { int nCurSel; PHY_DRIVE_INFO *pPhyDrive = NULL; if (MessageBox(g_DialogHwnd, _G(STR_UPDATE_TIP), _G(STR_INFO), MB_YESNO | MB_ICONQUESTION) != IDYES) { return; } if (g_ThreadHandle) { Log("Another thread is runing"); return; } nCurSel = SendMessage(g_ComboxHwnd, CB_GETCURSEL, 0, 0); if (CB_ERR == nCurSel) { Log("Failed to get combox sel"); return;; } pPhyDrive = GetPhyDriveInfoById(nCurSel); if (!pPhyDrive) { return; } EnableWindow(g_BtnInstallHwnd, FALSE); EnableWindow(g_BtnUpdateHwnd, FALSE); g_ThreadHandle = CreateThread(NULL, 0, UpdateVentoyThread, (LPVOID)pPhyDrive, 0, NULL); } INT_PTR CALLBACK DialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) { WORD NotifyCode; WORD CtrlID; switch (Message) { case WM_COMMAND: { NotifyCode = HIWORD(wParam); CtrlID = LOWORD(wParam); if (CtrlID == IDC_COMBO1 && NotifyCode == CBN_SELCHANGE) { OnComboxSelChange((HWND)lParam); } if (CtrlID == IDC_BUTTON4 && NotifyCode == BN_CLICKED) { OnInstallBtnClick(); } else if (CtrlID == IDC_BUTTON3 && NotifyCode == BN_CLICKED) { OnUpdateBtnClick(); } break; } case WM_INITDIALOG: { InitDialog(hWnd, wParam, lParam); break; } case WM_CTLCOLORSTATIC: { if (GetDlgItem(hWnd, IDC_STATIC_LOCAL_VER) == (HANDLE)lParam || GetDlgItem(hWnd, IDC_STATIC_DISK_VER) == (HANDLE)lParam) { SetBkMode((HDC)wParam, TRANSPARENT); SetTextColor((HDC)wParam, RGB(255, 0, 0)); return (LRESULT)(HBRUSH)(GetStockObject(HOLLOW_BRUSH)); } else { break; } } case WM_CLOSE: { if (g_ThreadHandle) { MessageBox(g_DialogHwnd, _G(STR_WAIT_PROCESS), _G(STR_INFO), MB_OK | MB_ICONINFORMATION); } else { EndDialog(hWnd, 0); } break; } } return 0; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); if (!IsFileExist(VENTOY_FILE_VERSION)) { MessageBox(NULL, _G(STR_INCORRECT_DIR), _G(STR_ERROR), MB_OK | MB_ICONERROR); return ERROR_NOT_FOUND; } GetExeVersionInfo(__argv[0]); Log("\n################################ Ventoy2Disk %s ################################", g_CurVersion); ParseCmdLineOption(lpCmdLine); DumpWindowsVersion(); Ventoy2DiskInit(); g_hInst = hInstance; DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc); Ventoy2DiskDestroy(); return 0; }