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