X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/9118d5fe45d00d036a7767efc43f012a537989c4..HEAD:/Vlnk/src/main_windows.c diff --git a/Vlnk/src/main_windows.c b/Vlnk/src/main_windows.c index 34f7548..bf9f8af 100644 --- a/Vlnk/src/main_windows.c +++ b/Vlnk/src/main_windows.c @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -45,24 +45,24 @@ typedef enum MSGID const WCHAR *g_msg_cn[MSGID_BUTT] = { - L"´íÎó", - L"ÌáÐÑ", - L"´´½¨", - L"½âÎö", - L"Ö¸¶¨µÄÎļþ²»´æÔÚ", - L"²»Ö§³ÖΪ´ËÎļþ´´½¨vlnk", - L"²»Ö§³ÖµÄÎļþϵͳ", - L"²»Ö§³ÖµÄÎļþºó׺Ãû", - L"»ñÈ¡´ÅÅÌÐÅϢʱ·¢Éú´íÎó", - L"Vlnk Îļþ´´½¨³É¹¦¡£", - L"ÇëÏȹرÕÕýÔÚÔËÐÐµÄ VentoyVlnk ³ÌÐò£¡", - L"´´½¨Îļþʧ°Ü", - L"´ËÎļþÒѾ­ÊÇÒ»¸övlnkÎļþÁË£¡", - L"·Ç·¨µÄvlnkÎļþ!", - L"´Ë vlnk ÎļþÖ¸Ïò ", - L"´Ë vlnk Ö¸ÏòµÄÎļþ²»´æÔÚ£¡", - L"Îļþ·¾¶Ì«³¤£¡", - L"·Ç·¨µÄvlnkÎļþºó׺Ãû!", + L"错误", + L"提醒", + L"创建", + L"解析", + L"指定的文件不存在", + L"不支持为此文件创建vlnk", + L"不支持的文件系统", + L"不支持的文件后缀名", + L"获取磁盘信息时发生错误", + L"Vlnk 文件创建成功。", + L"请先关闭正在运行的 VentoyVlnk 程序!", + L"创建文件失败", + L"此文件已经是一个vlnk文件了!", + L"非法的vlnk文件!", + L"æ­¤ vlnk 文件指向 ", + L"æ­¤ vlnk 指向的文件不存在!", + L"文件路径太长!", + L"非法的vlnk文件后缀名!", }; const WCHAR *g_msg_en[MSGID_BUTT] = { @@ -105,62 +105,62 @@ static int VtoyMessageBox return MessageBox(hWnd, lpText, lpCaption, uType); } - -static void Log2File(const char *log) -{ - time_t stamp; - struct tm ttm; - FILE *fp; - - time(&stamp); - localtime_s(&ttm, &stamp); - - fopen_s(&fp, g_LogFile, "a+"); - if (fp) - { - fprintf_s(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", - ttm.tm_year + 1900, ttm.tm_mon + 1, ttm.tm_mday, - ttm.tm_hour, ttm.tm_min, ttm.tm_sec, log); - fclose(fp); - } -} - -void LogW(const WCHAR *Fmt, ...) -{ - WCHAR log[512]; - CHAR alog[2048]; - va_list arg; - - if (g_LogFile[0] == 0) - { - return; - } - - va_start(arg, Fmt); - vswprintf_s(log, 512, Fmt, arg); - va_end(arg); - - WideCharToMultiByte(CP_UTF8, 0, log, -1, alog, 2048, 0, 0); - - Log2File(alog); + +static void Log2File(const char *log) +{ + time_t stamp; + struct tm ttm; + FILE *fp; + + time(&stamp); + localtime_s(&ttm, &stamp); + + fopen_s(&fp, g_LogFile, "a+"); + if (fp) + { + fprintf_s(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year + 1900, ttm.tm_mon + 1, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, log); + fclose(fp); + } +} + +void LogW(const WCHAR *Fmt, ...) +{ + WCHAR log[512]; + CHAR alog[2048]; + va_list arg; + + if (g_LogFile[0] == 0) + { + return; + } + + va_start(arg, Fmt); + vswprintf_s(log, 512, Fmt, arg); + va_end(arg); + + WideCharToMultiByte(CP_UTF8, 0, log, -1, alog, 2048, 0, 0); + + Log2File(alog); } - -void LogA(const CHAR *Fmt, ...) -{ - CHAR log[512]; - va_list arg; - - if (g_LogFile[0] == 0) - { - return; - } - - va_start(arg, Fmt); - vsprintf_s(log, 512, Fmt, arg); - va_end(arg); - - Log2File(log); + +void LogA(const CHAR *Fmt, ...) +{ + CHAR log[512]; + va_list arg; + + if (g_LogFile[0] == 0) + { + return; + } + + va_start(arg, Fmt); + vsprintf_s(log, 512, Fmt, arg); + va_end(arg); + + Log2File(log); } static int Utf8ToUtf16(const char* src, WCHAR * dst) @@ -393,12 +393,12 @@ static BOOL IsSupportedVlnkSuffix(WCHAR *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) + if (lstrcmp(FileName + len - 9, L".vlnk.iso") == 0 || + lstrcmp(FileName + len - 9, L".vlnk.img") == 0 || + lstrcmp(FileName + len - 9, L".vlnk.wim") == 0 || + lstrcmp(FileName + len - 9, L".vlnk.vhd") == 0 || + lstrcmp(FileName + len - 9, L".vlnk.efi") == 0 || + lstrcmp(FileName + len - 9, L".vlnk.dat") == 0) { return TRUE; } @@ -407,8 +407,8 @@ static BOOL IsSupportedVlnkSuffix(WCHAR *FileName) if (len > 10) { - if (lstrcmp(FileName - 10, L".vlnk.vhdx") == 0 || - lstrcmp(FileName - 9, L".vlnk.vtoy") == 0) + if (lstrcmp(FileName + len - 10, L".vlnk.vhdx") == 0 || + lstrcmp(FileName + len - 10, L".vlnk.vtoy") == 0) { return TRUE; } @@ -831,6 +831,59 @@ static int ParseCmdLine(LPSTR lpCmdLine) return argc; } + +// +//copy from Rufus +//Copyright © 2011-2021 Pete Batard +// +#include +// For delay-loaded DLLs, use LOAD_LIBRARY_SEARCH_SYSTEM32 to avoid DLL search order hijacking. +FARPROC WINAPI dllDelayLoadHook(unsigned dliNotify, PDelayLoadInfo pdli) +{ + if (dliNotify == dliNotePreLoadLibrary) { + // Windows 7 without KB2533623 does not support the LOAD_LIBRARY_SEARCH_SYSTEM32 flag. + // That is is OK, because the delay load handler will interrupt the NULL return value + // to mean that it should perform a normal LoadLibrary. + return (FARPROC)LoadLibraryExA(pdli->szDll, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); + } + return NULL; +} + +#if defined(_MSC_VER) +// By default the Windows SDK headers have a `const` while MinGW does not. +const +#endif +PfnDliHook __pfnDliNotifyHook2 = dllDelayLoadHook; + +typedef BOOL(WINAPI *SetDefaultDllDirectories_t)(DWORD); +static void DllProtect(void) +{ + SetDefaultDllDirectories_t pfSetDefaultDllDirectories = NULL; + + // Disable loading system DLLs from the current directory (sideloading mitigation) + // PS: You know that official MSDN documentation for SetDllDirectory() that explicitly + // indicates that "If the parameter is an empty string (""), the call removes the current + // directory from the default DLL search order"? Yeah, that doesn't work. At all. + // Still, we invoke it, for platforms where the following call might actually work... + SetDllDirectoryA(""); + + // For libraries on the KnownDLLs list, the system will always load them from System32. + // For other DLLs we link directly to, we can delay load the DLL and use a delay load + // hook to load them from System32. Note that, for this to work, something like: + // 'somelib.dll;%(DelayLoadDLLs)' must be added to the 'Delay Loaded Dlls' option of + // the linker properties in Visual Studio (which means this won't work with MinGW). + // For all other DLLs, use SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32). + // Finally, we need to perform the whole gymkhana below, where we can't call on + // SetDefaultDllDirectories() directly, because Windows 7 doesn't have the API exposed. + // Also, no, Coverity, we never need to care about freeing kernel32 as a library. + // coverity[leaked_storage] + + pfSetDefaultDllDirectories = (SetDefaultDllDirectories_t) + GetProcAddress(LoadLibraryW(L"kernel32.dll"), "SetDefaultDllDirectories"); + if (pfSetDefaultDllDirectories != NULL) + pfSetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32); +} + int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow) { DWORD dwAttrib; @@ -838,6 +891,8 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi UNREFERENCED_PARAMETER(hPrevInstance); + DllProtect(); + if (GetUserDefaultUILanguage() == 0x0804) { g_msg_lang = g_msg_cn; @@ -879,6 +934,13 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi return 1; } + if (!IsSupportedVlnkSuffix(g_CmdOutFile)) + { + LogW(L"File <<%ls>> contains invalid vlnk suffix!\n", g_CmdOutFile); + VtoyMessageBox(NULL, g_msg_lang[MSGID_INVALID_SUFFIX], g_msg_lang[MSGID_ERROR], MB_OK | MB_ICONERROR); + return 1; + } + return CreateVlnk(NULL, g_CurDirW, g_CmdInFile, g_CmdOutFile); } else