]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - Ventoy2Disk/Ventoy2Disk/WinDialog.c
7ee81350fa539aaf44c5733a9d64c2c2cbe19a8e
[Ventoy.git] / Ventoy2Disk / Ventoy2Disk / WinDialog.c
1 /******************************************************************************
2 * WinDialog.c
3 *
4 * Copyright (c) 2020, longpanda <admin@ventoy.net>
5 *
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.
10 *
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.
15 *
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/>.
18 *
19 */
20
21 #include <Windows.h>
22 #include <commctrl.h>
23 #include "resource.h"
24 #include "Language.h"
25 #include "Ventoy2Disk.h"
26
27 HINSTANCE g_hInst;
28
29 HWND g_DialogHwnd;
30 HWND g_ComboxHwnd;
31 HWND g_StaticLocalVerHwnd;
32 HWND g_StaticDiskVerHwnd;
33 HWND g_BtnInstallHwnd;
34 HWND g_BtnUpdateHwnd;
35 HWND g_ProgressBarHwnd;
36 HWND g_StaticStatusHwnd;
37 CHAR g_CurVersion[64];
38 HANDLE g_ThreadHandle = NULL;
39
40 void GetExeVersionInfo(const char *FilePath)
41 {
42 UINT length;
43 DWORD verBufferSize;
44 CHAR verBuffer[2048];
45 VS_FIXEDFILEINFO *verInfo = NULL;
46
47 verBufferSize = GetFileVersionInfoSizeA(FilePath, NULL);
48
49 if (verBufferSize > 0 && verBufferSize <= sizeof(verBuffer))
50 {
51 if (GetFileVersionInfoA(FilePath, 0, verBufferSize, (LPVOID)verBuffer))
52 {
53 VerQueryValueA(verBuffer, "\\", &verInfo, &length);
54
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));
60 }
61 }
62 }
63
64 void SetProgressBarPos(int Pos)
65 {
66 CHAR Ratio[64];
67
68 if (Pos >= PT_FINISH)
69 {
70 Pos = PT_FINISH;
71 }
72
73 SendMessage(g_ProgressBarHwnd, PBM_SETPOS, Pos, 0);
74
75 safe_sprintf(Ratio, "Status - %.0lf%%", Pos * 100.0 / PT_FINISH);
76 SetWindowTextA(g_StaticStatusHwnd, Ratio);
77 }
78
79 static void OnComboxSelChange(HWND hCombox)
80 {
81 int nCurSelected;
82 PHY_DRIVE_INFO *CurDrive = NULL;
83
84 SetWindowTextA(g_StaticLocalVerHwnd, GetLocalVentoyVersion());
85 EnableWindow(g_BtnInstallHwnd, FALSE);
86 EnableWindow(g_BtnUpdateHwnd, FALSE);
87
88 nCurSelected = SendMessage(hCombox, CB_GETCURSEL, 0, 0);
89 if (CB_ERR == nCurSelected)
90 {
91 return;
92 }
93
94 CurDrive = GetPhyDriveInfoById(nCurSelected);
95 if (!CurDrive)
96 {
97 return;
98 }
99
100 SetWindowTextA(g_StaticDiskVerHwnd, CurDrive->VentoyVersion);
101
102 if (g_ForceOperation == 0)
103 {
104 if (CurDrive->VentoyVersion[0])
105 {
106 //only can update
107 EnableWindow(g_BtnInstallHwnd, FALSE);
108 EnableWindow(g_BtnUpdateHwnd, TRUE);
109 }
110 else
111 {
112 //only can install
113 EnableWindow(g_BtnInstallHwnd, TRUE);
114 EnableWindow(g_BtnUpdateHwnd, FALSE);
115 }
116 }
117 else
118 {
119 EnableWindow(g_BtnInstallHwnd, TRUE);
120 EnableWindow(g_BtnUpdateHwnd, TRUE);
121 }
122
123 InvalidateRect(g_DialogHwnd, NULL, TRUE);
124 UpdateWindow(g_DialogHwnd);
125 }
126
127 static void LanguageInit(void)
128 {
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));
133
134 SetWindowText(g_BtnInstallHwnd, _G(STR_INSTALL));
135 SetWindowText(g_BtnUpdateHwnd, _G(STR_UPDATE));
136 }
137
138 static BOOL InitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
139 {
140 DWORD i;
141 HANDLE hCombox;
142 HFONT hStaticFont;
143 CHAR Letter[32];
144 CHAR DeviceName[256];
145 HICON hIcon;
146
147 g_DialogHwnd = hWnd;
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);
155
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);
159
160 SendMessage(g_ProgressBarHwnd, PBM_SETRANGE, (WPARAM)0, (LPARAM)(MAKELPARAM(0, PT_FINISH)));
161 PROGRESS_BAR_SET_POS(PT_START);
162
163 LanguageInit();
164
165 // Fill device combox
166 hCombox = GetDlgItem(hWnd, IDC_COMBO1);
167 for (i = 0; i < g_PhyDriveCount; i++)
168 {
169 if (g_PhyDriveList[i].Id < 0)
170 {
171 continue;
172 }
173
174 if (g_PhyDriveList[i].FirstDriveLetter >= 0)
175 {
176 safe_sprintf(Letter, "%C: ", g_PhyDriveList[i].FirstDriveLetter);
177 }
178 else
179 {
180 Letter[0] = 0;
181 }
182
183 safe_sprintf(DeviceName, "%s[%dGB] %s %s",
184 Letter,
185 GetHumanReadableGBSize(g_PhyDriveList[i].SizeInBytes),
186 g_PhyDriveList[i].VendorId,
187 g_PhyDriveList[i].ProductId
188 );
189 SendMessageA(hCombox, CB_ADDSTRING, 0, (LPARAM)DeviceName);
190 }
191
192 SendMessage(hCombox, CB_SETCURSEL, 0, 0);
193
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"));
199
200 SendMessage(g_StaticLocalVerHwnd, WM_SETFONT, (WPARAM)hStaticFont, TRUE);
201 SendMessage(g_StaticDiskVerHwnd, WM_SETFONT, (WPARAM)hStaticFont, TRUE);
202
203 OnComboxSelChange(g_ComboxHwnd);
204
205 SetFocus(g_ProgressBarHwnd);
206
207 return TRUE;
208 }
209
210 static DWORD WINAPI InstallVentoyThread(void* Param)
211 {
212 int rc;
213 PHY_DRIVE_INFO *pPhyDrive = (PHY_DRIVE_INFO *)Param;
214
215 rc = InstallVentoy2PhyDrive(pPhyDrive);
216 if (rc == 0)
217 {
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());
221 }
222 else
223 {
224 PROGRESS_BAR_SET_POS(PT_FINISH);
225 MessageBox(g_DialogHwnd, _G(STR_INSTALL_FAILED), _G(STR_ERROR), MB_OK | MB_ICONERROR);
226 }
227
228 PROGRESS_BAR_SET_POS(PT_START);
229 g_ThreadHandle = NULL;
230 SetWindowText(g_StaticStatusHwnd, _G(STR_STATUS));
231 OnComboxSelChange(g_ComboxHwnd);
232
233 return 0;
234 }
235
236 static DWORD WINAPI UpdateVentoyThread(void* Param)
237 {
238 int rc;
239 PHY_DRIVE_INFO *pPhyDrive = (PHY_DRIVE_INFO *)Param;
240
241 rc = UpdateVentoy2PhyDrive(pPhyDrive);
242 if (rc == 0)
243 {
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());
247 }
248 else
249 {
250 PROGRESS_BAR_SET_POS(PT_FINISH);
251 MessageBox(g_DialogHwnd, _G(STR_UPDATE_FAILED), _G(STR_ERROR), MB_OK | MB_ICONERROR);
252 }
253
254 PROGRESS_BAR_SET_POS(PT_START);
255 g_ThreadHandle = NULL;
256 SetWindowText(g_StaticStatusHwnd, _G(STR_STATUS));
257 OnComboxSelChange(g_ComboxHwnd);
258
259 return 0;
260 }
261
262
263
264 static void OnInstallBtnClick(void)
265 {
266 int nCurSel;
267 PHY_DRIVE_INFO *pPhyDrive = NULL;
268
269 if (MessageBox(g_DialogHwnd, _G(STR_INSTALL_TIP), _G(STR_WARNING), MB_YESNO | MB_ICONWARNING) != IDYES)
270 {
271 return;
272 }
273
274 if (MessageBox(g_DialogHwnd, _G(STR_INSTALL_TIP2), _G(STR_WARNING), MB_YESNO | MB_ICONWARNING) != IDYES)
275 {
276 return;
277 }
278
279 if (g_ThreadHandle)
280 {
281 Log("Another thread is runing");
282 return;
283 }
284
285 nCurSel = SendMessage(g_ComboxHwnd, CB_GETCURSEL, 0, 0);
286 if (CB_ERR == nCurSel)
287 {
288 Log("Failed to get combox sel");
289 return;;
290 }
291
292 pPhyDrive = GetPhyDriveInfoById(nCurSel);
293 if (!pPhyDrive)
294 {
295 return;
296 }
297
298 EnableWindow(g_BtnInstallHwnd, FALSE);
299 EnableWindow(g_BtnUpdateHwnd, FALSE);
300
301 g_ThreadHandle = CreateThread(NULL, 0, InstallVentoyThread, (LPVOID)pPhyDrive, 0, NULL);
302 }
303
304
305
306 static void OnUpdateBtnClick(void)
307 {
308 int nCurSel;
309 PHY_DRIVE_INFO *pPhyDrive = NULL;
310
311 if (MessageBox(g_DialogHwnd, _G(STR_UPDATE_TIP), _G(STR_INFO), MB_YESNO | MB_ICONQUESTION) != IDYES)
312 {
313 return;
314 }
315
316 if (g_ThreadHandle)
317 {
318 Log("Another thread is runing");
319 return;
320 }
321
322 nCurSel = SendMessage(g_ComboxHwnd, CB_GETCURSEL, 0, 0);
323 if (CB_ERR == nCurSel)
324 {
325 Log("Failed to get combox sel");
326 return;;
327 }
328
329 pPhyDrive = GetPhyDriveInfoById(nCurSel);
330 if (!pPhyDrive)
331 {
332 return;
333 }
334
335 EnableWindow(g_BtnInstallHwnd, FALSE);
336 EnableWindow(g_BtnUpdateHwnd, FALSE);
337
338 g_ThreadHandle = CreateThread(NULL, 0, UpdateVentoyThread, (LPVOID)pPhyDrive, 0, NULL);
339 }
340
341
342 INT_PTR CALLBACK DialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
343 {
344 WORD NotifyCode;
345 WORD CtrlID;
346
347 switch (Message)
348 {
349 case WM_COMMAND:
350 {
351 NotifyCode = HIWORD(wParam);
352 CtrlID = LOWORD(wParam);
353
354 if (CtrlID == IDC_COMBO1 && NotifyCode == CBN_SELCHANGE)
355 {
356 OnComboxSelChange((HWND)lParam);
357 }
358
359 if (CtrlID == IDC_BUTTON4 && NotifyCode == BN_CLICKED)
360 {
361 OnInstallBtnClick();
362 }
363 else if (CtrlID == IDC_BUTTON3 && NotifyCode == BN_CLICKED)
364 {
365 OnUpdateBtnClick();
366 }
367
368
369 break;
370 }
371 case WM_INITDIALOG:
372 {
373 InitDialog(hWnd, wParam, lParam);
374 break;
375 }
376 case WM_CTLCOLORSTATIC:
377 {
378 if (GetDlgItem(hWnd, IDC_STATIC_LOCAL_VER) == (HANDLE)lParam ||
379 GetDlgItem(hWnd, IDC_STATIC_DISK_VER) == (HANDLE)lParam)
380 {
381 SetBkMode((HDC)wParam, TRANSPARENT);
382 SetTextColor((HDC)wParam, RGB(255, 0, 0));
383 return (LRESULT)(HBRUSH)(GetStockObject(HOLLOW_BRUSH));
384 }
385 else
386 {
387 break;
388 }
389 }
390 case WM_CLOSE:
391 {
392 if (g_ThreadHandle)
393 {
394 MessageBox(g_DialogHwnd, _G(STR_WAIT_PROCESS), _G(STR_INFO), MB_OK | MB_ICONINFORMATION);
395 }
396 else
397 {
398 EndDialog(hWnd, 0);
399 }
400 break;
401 }
402 }
403
404 return 0;
405 }
406
407 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
408 {
409 UNREFERENCED_PARAMETER(hPrevInstance);
410
411 if (!IsFileExist(VENTOY_FILE_VERSION))
412 {
413 MessageBox(NULL, _G(STR_INCORRECT_DIR), _G(STR_ERROR), MB_OK | MB_ICONERROR);
414 return ERROR_NOT_FOUND;
415 }
416
417 GetExeVersionInfo(__argv[0]);
418
419 Log("\n################################ Ventoy2Disk %s ################################", g_CurVersion);
420
421 ParseCmdLineOption(lpCmdLine);
422
423 DumpWindowsVersion();
424
425 Ventoy2DiskInit();
426
427 g_hInst = hInstance;
428 DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
429
430 Ventoy2DiskDestroy();
431
432 return 0;
433 }