1 /******************************************************************************
4 * Copyright (c) 2020, longpanda <admin@ventoy.net>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 3 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
25 #include "Ventoy2Disk.h"
31 HWND g_StaticLocalVerHwnd
;
32 HWND g_StaticDiskVerHwnd
;
33 HWND g_BtnInstallHwnd
;
35 HWND g_ProgressBarHwnd
;
36 HWND g_StaticStatusHwnd
;
37 CHAR g_CurVersion
[64];
38 HANDLE g_ThreadHandle
= NULL
;
40 void GetExeVersionInfo(const char *FilePath
)
45 VS_FIXEDFILEINFO
*verInfo
= NULL
;
47 verBufferSize
= GetFileVersionInfoSizeA(FilePath
, NULL
);
49 if (verBufferSize
> 0 && verBufferSize
<= sizeof(verBuffer
))
51 if (GetFileVersionInfoA(FilePath
, 0, verBufferSize
, (LPVOID
)verBuffer
))
53 VerQueryValueA(verBuffer
, "\\", &verInfo
, &length
);
55 safe_sprintf(g_CurVersion
, "%u.%u.%u.%u",
56 HIWORD(verInfo
->dwProductVersionMS
),
57 LOWORD(verInfo
->dwProductVersionMS
),
58 HIWORD(verInfo
->dwProductVersionLS
),
59 LOWORD(verInfo
->dwProductVersionLS
));
64 void SetProgressBarPos(int Pos
)
73 SendMessage(g_ProgressBarHwnd
, PBM_SETPOS
, Pos
, 0);
75 safe_sprintf(Ratio
, "Status - %.0lf%%", Pos
* 100.0 / PT_FINISH
);
76 SetWindowTextA(g_StaticStatusHwnd
, Ratio
);
79 static void OnComboxSelChange(HWND hCombox
)
82 PHY_DRIVE_INFO
*CurDrive
= NULL
;
84 SetWindowTextA(g_StaticLocalVerHwnd
, GetLocalVentoyVersion());
85 EnableWindow(g_BtnInstallHwnd
, FALSE
);
86 EnableWindow(g_BtnUpdateHwnd
, FALSE
);
88 nCurSelected
= SendMessage(hCombox
, CB_GETCURSEL
, 0, 0);
89 if (CB_ERR
== nCurSelected
)
94 CurDrive
= GetPhyDriveInfoById(nCurSelected
);
100 SetWindowTextA(g_StaticDiskVerHwnd
, CurDrive
->VentoyVersion
);
102 if (g_ForceOperation
== 0)
104 if (CurDrive
->VentoyVersion
[0])
107 EnableWindow(g_BtnInstallHwnd
, FALSE
);
108 EnableWindow(g_BtnUpdateHwnd
, TRUE
);
113 EnableWindow(g_BtnInstallHwnd
, TRUE
);
114 EnableWindow(g_BtnUpdateHwnd
, FALSE
);
119 EnableWindow(g_BtnInstallHwnd
, TRUE
);
120 EnableWindow(g_BtnUpdateHwnd
, TRUE
);
123 InvalidateRect(g_DialogHwnd
, NULL
, TRUE
);
124 UpdateWindow(g_DialogHwnd
);
127 static void LanguageInit(void)
129 SetWindowText(GetDlgItem(g_DialogHwnd
, IDC_STATIC_DEV
), _G(STR_DEVICE
));
130 SetWindowText(GetDlgItem(g_DialogHwnd
, IDC_STATIC_LOCAL
), _G(STR_LOCAL_VER
));
131 SetWindowText(GetDlgItem(g_DialogHwnd
, IDC_STATIC_DISK
), _G(STR_DISK_VER
));
132 SetWindowText(g_StaticStatusHwnd
, _G(STR_STATUS
));
134 SetWindowText(g_BtnInstallHwnd
, _G(STR_INSTALL
));
135 SetWindowText(g_BtnUpdateHwnd
, _G(STR_UPDATE
));
138 static BOOL
InitDialog(HWND hWnd
, WPARAM wParam
, LPARAM lParam
)
144 CHAR DeviceName
[256];
148 g_ComboxHwnd
= GetDlgItem(hWnd
, IDC_COMBO1
);
149 g_StaticLocalVerHwnd
= GetDlgItem(hWnd
, IDC_STATIC_LOCAL_VER
);
150 g_StaticDiskVerHwnd
= GetDlgItem(hWnd
, IDC_STATIC_DISK_VER
);
151 g_BtnInstallHwnd
= GetDlgItem(hWnd
, IDC_BUTTON4
);
152 g_BtnUpdateHwnd
= GetDlgItem(hWnd
, IDC_BUTTON3
);
153 g_ProgressBarHwnd
= GetDlgItem(hWnd
, IDC_PROGRESS1
);
154 g_StaticStatusHwnd
= GetDlgItem(hWnd
, IDC_STATIC_STATUS
);
156 hIcon
= LoadIcon(g_hInst
, MAKEINTRESOURCE(IDI_ICON1
));
157 SendMessage(hWnd
, WM_SETICON
, ICON_BIG
, (LPARAM
)hIcon
);
158 SendMessage(hWnd
, WM_SETICON
, ICON_SMALL
, (LPARAM
)hIcon
);
160 SendMessage(g_ProgressBarHwnd
, PBM_SETRANGE
, (WPARAM
)0, (LPARAM
)(MAKELPARAM(0, PT_FINISH
)));
161 PROGRESS_BAR_SET_POS(PT_START
);
165 // Fill device combox
166 hCombox
= GetDlgItem(hWnd
, IDC_COMBO1
);
167 for (i
= 0; i
< g_PhyDriveCount
; i
++)
169 if (g_PhyDriveList
[i
].Id
< 0)
174 if (g_PhyDriveList
[i
].FirstDriveLetter
>= 0)
176 safe_sprintf(Letter
, "%C: ", g_PhyDriveList
[i
].FirstDriveLetter
);
183 safe_sprintf(DeviceName
, "%s[%dGB] %s %s",
185 GetHumanReadableGBSize(g_PhyDriveList
[i
].SizeInBytes
),
186 g_PhyDriveList
[i
].VendorId
,
187 g_PhyDriveList
[i
].ProductId
189 SendMessageA(hCombox
, CB_ADDSTRING
, 0, (LPARAM
)DeviceName
);
192 SendMessage(hCombox
, CB_SETCURSEL
, 0, 0);
194 // Set static text & font
195 hStaticFont
= CreateFont(26, 0, 0, 0, FW_BOLD
, FALSE
, FALSE
, 0,
196 ANSI_CHARSET
, OUT_DEFAULT_PRECIS
,
197 CLIP_DEFAULT_PRECIS
, DEFAULT_QUALITY
,
198 DEFAULT_PITCH
&FF_SWISS
, TEXT("Courier New"));
200 SendMessage(g_StaticLocalVerHwnd
, WM_SETFONT
, (WPARAM
)hStaticFont
, TRUE
);
201 SendMessage(g_StaticDiskVerHwnd
, WM_SETFONT
, (WPARAM
)hStaticFont
, TRUE
);
203 OnComboxSelChange(g_ComboxHwnd
);
205 SetFocus(g_ProgressBarHwnd
);
210 static DWORD WINAPI
InstallVentoyThread(void* Param
)
213 PHY_DRIVE_INFO
*pPhyDrive
= (PHY_DRIVE_INFO
*)Param
;
215 rc
= InstallVentoy2PhyDrive(pPhyDrive
);
218 PROGRESS_BAR_SET_POS(PT_FINISH
);
219 MessageBox(g_DialogHwnd
, _G(STR_INSTALL_SUCCESS
), _G(STR_INFO
), MB_OK
| MB_ICONINFORMATION
);
220 safe_strcpy(pPhyDrive
->VentoyVersion
, GetLocalVentoyVersion());
224 PROGRESS_BAR_SET_POS(PT_FINISH
);
225 MessageBox(g_DialogHwnd
, _G(STR_INSTALL_FAILED
), _G(STR_ERROR
), MB_OK
| MB_ICONERROR
);
228 PROGRESS_BAR_SET_POS(PT_START
);
229 g_ThreadHandle
= NULL
;
230 SetWindowText(g_StaticStatusHwnd
, _G(STR_STATUS
));
231 OnComboxSelChange(g_ComboxHwnd
);
236 static DWORD WINAPI
UpdateVentoyThread(void* Param
)
239 PHY_DRIVE_INFO
*pPhyDrive
= (PHY_DRIVE_INFO
*)Param
;
241 rc
= UpdateVentoy2PhyDrive(pPhyDrive
);
244 PROGRESS_BAR_SET_POS(PT_FINISH
);
245 MessageBox(g_DialogHwnd
, _G(STR_UPDATE_SUCCESS
), _G(STR_INFO
), MB_OK
| MB_ICONINFORMATION
);
246 safe_strcpy(pPhyDrive
->VentoyVersion
, GetLocalVentoyVersion());
250 PROGRESS_BAR_SET_POS(PT_FINISH
);
251 MessageBox(g_DialogHwnd
, _G(STR_UPDATE_FAILED
), _G(STR_ERROR
), MB_OK
| MB_ICONERROR
);
254 PROGRESS_BAR_SET_POS(PT_START
);
255 g_ThreadHandle
= NULL
;
256 SetWindowText(g_StaticStatusHwnd
, _G(STR_STATUS
));
257 OnComboxSelChange(g_ComboxHwnd
);
264 static void OnInstallBtnClick(void)
267 PHY_DRIVE_INFO
*pPhyDrive
= NULL
;
269 if (MessageBox(g_DialogHwnd
, _G(STR_INSTALL_TIP
), _G(STR_WARNING
), MB_YESNO
| MB_ICONWARNING
) != IDYES
)
274 if (MessageBox(g_DialogHwnd
, _G(STR_INSTALL_TIP2
), _G(STR_WARNING
), MB_YESNO
| MB_ICONWARNING
) != IDYES
)
281 Log("Another thread is runing");
285 nCurSel
= SendMessage(g_ComboxHwnd
, CB_GETCURSEL
, 0, 0);
286 if (CB_ERR
== nCurSel
)
288 Log("Failed to get combox sel");
292 pPhyDrive
= GetPhyDriveInfoById(nCurSel
);
298 EnableWindow(g_BtnInstallHwnd
, FALSE
);
299 EnableWindow(g_BtnUpdateHwnd
, FALSE
);
301 g_ThreadHandle
= CreateThread(NULL
, 0, InstallVentoyThread
, (LPVOID
)pPhyDrive
, 0, NULL
);
306 static void OnUpdateBtnClick(void)
309 PHY_DRIVE_INFO
*pPhyDrive
= NULL
;
311 if (MessageBox(g_DialogHwnd
, _G(STR_UPDATE_TIP
), _G(STR_INFO
), MB_YESNO
| MB_ICONQUESTION
) != IDYES
)
318 Log("Another thread is runing");
322 nCurSel
= SendMessage(g_ComboxHwnd
, CB_GETCURSEL
, 0, 0);
323 if (CB_ERR
== nCurSel
)
325 Log("Failed to get combox sel");
329 pPhyDrive
= GetPhyDriveInfoById(nCurSel
);
335 EnableWindow(g_BtnInstallHwnd
, FALSE
);
336 EnableWindow(g_BtnUpdateHwnd
, FALSE
);
338 g_ThreadHandle
= CreateThread(NULL
, 0, UpdateVentoyThread
, (LPVOID
)pPhyDrive
, 0, NULL
);
342 INT_PTR CALLBACK
DialogProc(HWND hWnd
, UINT Message
, WPARAM wParam
, LPARAM lParam
)
351 NotifyCode
= HIWORD(wParam
);
352 CtrlID
= LOWORD(wParam
);
354 if (CtrlID
== IDC_COMBO1
&& NotifyCode
== CBN_SELCHANGE
)
356 OnComboxSelChange((HWND
)lParam
);
359 if (CtrlID
== IDC_BUTTON4
&& NotifyCode
== BN_CLICKED
)
363 else if (CtrlID
== IDC_BUTTON3
&& NotifyCode
== BN_CLICKED
)
373 InitDialog(hWnd
, wParam
, lParam
);
376 case WM_CTLCOLORSTATIC
:
378 if (GetDlgItem(hWnd
, IDC_STATIC_LOCAL_VER
) == (HANDLE
)lParam
||
379 GetDlgItem(hWnd
, IDC_STATIC_DISK_VER
) == (HANDLE
)lParam
)
381 SetBkMode((HDC
)wParam
, TRANSPARENT
);
382 SetTextColor((HDC
)wParam
, RGB(255, 0, 0));
383 return (LRESULT
)(HBRUSH
)(GetStockObject(HOLLOW_BRUSH
));
394 MessageBox(g_DialogHwnd
, _G(STR_WAIT_PROCESS
), _G(STR_INFO
), MB_OK
| MB_ICONINFORMATION
);
407 int APIENTRY
WinMain(HINSTANCE hInstance
, HINSTANCE hPrevInstance
, LPSTR lpCmdLine
, INT nCmdShow
)
409 UNREFERENCED_PARAMETER(hPrevInstance
);
411 if (!IsFileExist(VENTOY_FILE_VERSION
))
413 MessageBox(NULL
, _G(STR_INCORRECT_DIR
), _G(STR_ERROR
), MB_OK
| MB_ICONERROR
);
414 return ERROR_NOT_FOUND
;
417 GetExeVersionInfo(__argv
[0]);
419 Log("\n################################ Ventoy2Disk %s ################################", g_CurVersion
);
421 ParseCmdLineOption(lpCmdLine
);
423 DumpWindowsVersion();
428 DialogBox(hInstance
, MAKEINTRESOURCE(IDD_DIALOG1
), NULL
, DialogProc
);
430 Ventoy2DiskDestroy();