From 9118d5fe45d00d036a7767efc43f012a537989c4 Mon Sep 17 00:00:00 2001 From: longpanda Date: Thu, 17 Feb 2022 10:49:56 +0800 Subject: [PATCH] Add check for vlnk file suffix in save as --- Vlnk/src/main_windows.c | 49 +++++++++++++++++++++- Vlnk/vs/VentoyVlnk/Release/VentoyVlnk.exe | Bin 120832 -> 121344 bytes 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/Vlnk/src/main_windows.c b/Vlnk/src/main_windows.c index ba195f2..34f7548 100644 --- a/Vlnk/src/main_windows.c +++ b/Vlnk/src/main_windows.c @@ -37,6 +37,7 @@ typedef enum MSGID MSGID_VLNK_POINT_TO, MSGID_VLNK_NO_DST, MSGID_FILE_NAME_TOO_LONG, + MSGID_INVALID_SUFFIX, MSGID_BUTT }MSGID; @@ -61,6 +62,7 @@ const WCHAR *g_msg_cn[MSGID_BUTT] = L"´Ë vlnk ÎļþÖ¸Ïò ", L"´Ë vlnk Ö¸ÏòµÄÎļþ²»´æÔÚ£¡", L"Îļþ·¾¶Ì«³¤£¡", + L"·Ç·¨µÄvlnkÎļþºó׺Ãû!", }; const WCHAR *g_msg_en[MSGID_BUTT] = { @@ -81,6 +83,7 @@ const WCHAR *g_msg_en[MSGID_BUTT] = L"The vlnk file point to ", L"The file pointed by the vlnk does NOT exist!", L"The file full path is too long!", + L"Invalid vlnk file suffix!", }; const WCHAR **g_msg_lang = NULL; @@ -382,6 +385,38 @@ static BOOL VentoyGetSaveFileName(HWND hWnd, WCHAR *szFile) return GetSaveFileName(&ofn); } +static BOOL IsSupportedVlnkSuffix(WCHAR *FileName) +{ + int len; + + len = lstrlen(FileName); + + if (len > 9) + { + if (lstrcmp(FileName - 9, L".vlnk.iso") == 0 || + lstrcmp(FileName - 9, L".vlnk.img") == 0 || + lstrcmp(FileName - 9, L".vlnk.wim") == 0 || + lstrcmp(FileName - 9, L".vlnk.vhd") == 0 || + lstrcmp(FileName - 9, L".vlnk.efi") == 0 || + lstrcmp(FileName - 9, L".vlnk.dat") == 0) + { + return TRUE; + } + } + + + if (len > 10) + { + if (lstrcmp(FileName - 10, L".vlnk.vhdx") == 0 || + lstrcmp(FileName - 9, L".vlnk.vtoy") == 0) + { + return TRUE; + } + } + + return FALSE; +} + static int CreateVlnk(HWND hWnd, WCHAR *Dir, WCHAR *InFile, WCHAR *OutFile) { int i; @@ -542,8 +577,17 @@ static int CreateVlnk(HWND hWnd, WCHAR *Dir, WCHAR *InFile, WCHAR *OutFile) wcscpy_s(szFile, MAX_PATH, DstFullPath); if (VentoyGetSaveFileName(hWnd, szFile)) { - wcscpy_s(DstFullPath, MAX_PATH, szFile); - SetOutFile = TRUE; + if (IsSupportedVlnkSuffix(szFile)) + { + wcscpy_s(DstFullPath, MAX_PATH, szFile); + SetOutFile = TRUE; + } + else + { + VtoyMessageBox(hWnd, g_msg_lang[MSGID_INVALID_SUFFIX], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); + LogA("Invalid vlnk suffix\n"); + goto end; + } } else { @@ -577,6 +621,7 @@ static int CreateVlnk(HWND hWnd, WCHAR *Dir, WCHAR *InFile, WCHAR *OutFile) VtoyMessageBox(hWnd, g_msg_lang[MSGID_CREATE_FILE_ERR], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); } + end: free(Buf); } diff --git a/Vlnk/vs/VentoyVlnk/Release/VentoyVlnk.exe b/Vlnk/vs/VentoyVlnk/Release/VentoyVlnk.exe index 4e37e435c2ed61067fac1a026baeb5213237e6ae..ac8bfa3c2fa1e8faafa4af353ce9bd728bb98794 100644 GIT binary patch delta 9624 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 q|EG&V09nZ-(nc