]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Improvement for some special WinPE
authorlongpanda <admin@ventoy.net>
Thu, 14 Oct 2021 03:27:22 +0000 (11:27 +0800)
committerlongpanda <admin@ventoy.net>
Thu, 14 Oct 2021 03:27:22 +0000 (11:27 +0800)
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c
INSTALL/ventoy/vtoyjump32.exe
INSTALL/ventoy/vtoyjump64.exe
vtoyjump/vtoyjump/vtoyjump.c
vtoyjump/vtoyjump/vtoyjump.vcxproj

index d7171bc0831d5167a5ebd5b49bb80a816c779d7b..1099cefb7087b6404f86f05cabcab4cc2cb60648 100644 (file)
@@ -21,6 +21,8 @@
 #ifndef __VENTOY_DEF_H__
 #define __VENTOY_DEF_H__
 
+#define VTOY_MAX_DIR_DEPTH  32
+
 #define VTOY_MAX_SCRIPT_BUF    (4 * 1024 * 1024)
 
 #define VTOY_PART_BUF_LEN  (128 * 1024)
index a35680aafaf740424610e39945b8e058ade515f2..e4c9aa6a93f2dfd2316e83cecab7451a1109b3ce 100644 (file)
@@ -776,6 +776,67 @@ end:
     return ret;
 }
 
+static int parse_custom_setup_path(char *cmdline, const char **path, char *exefile)
+{
+    int i = 0;
+    int len = 0;
+    char *pos1 = NULL;
+    char *pos2 = NULL;
+    
+    if ((cmdline[0] == 'x' || cmdline[0] == 'X') && cmdline[1] == ':')
+    {
+        pos1 = pos2 = cmdline + 3;
+
+        while (i < VTOY_MAX_DIR_DEPTH && *pos2)
+        {
+            while (*pos2 && *pos2 != '\\' && *pos2 != '/')
+            {
+                pos2++;
+            }
+
+            path[i++] = pos1;
+            
+            if (*pos2 == 0)
+            {                
+                break;
+            }
+
+            *pos2 = 0;
+            pos1 = pos2 + 1;
+            pos2 = pos1;
+        }
+
+        if (i == 0 || i >= VTOY_MAX_DIR_DEPTH)
+        {
+            return 1;
+        }
+    }
+    else
+    {
+        path[i++] = "Windows";
+        path[i++] = "System32";
+        path[i++] = cmdline;
+    }
+
+    pos1 = (char *)path[i - 1];
+    while (*pos1 != ' ' && *pos1 != '\t' && *pos1)
+    {
+        pos1++;
+    }
+    *pos1 = 0;
+
+    len = (int)grub_strlen(path[i - 1]);
+    if (len < 4 || grub_strcasecmp(path[i - 1] + len - 4, ".exe") != 0)
+    {
+        grub_snprintf(exefile, 256, "%s.exe", path[i - 1]);
+        path[i - 1] = exefile;            
+    }
+
+
+    debug("custom setup: %d <%s>\n", i, path[i - 1]);
+    return 0;
+}
+
 static wim_directory_entry * search_replace_wim_dirent
 (
     grub_file_t file, 
@@ -786,38 +847,44 @@ static wim_directory_entry * search_replace_wim_dirent
 )
 {
     int ret;
+    char exefile[256] = {0};
     char cmdline[256] = {0};
     wim_directory_entry *wim_dirent = NULL;
     wim_directory_entry *pecmd_dirent = NULL;
     const char *peset_path[] = { "Windows", "System32", "peset.exe", NULL };
     const char *pecmd_path[] = { "Windows", "System32", "pecmd.exe", NULL };
     const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL };
+    const char *custom_path[VTOY_MAX_DIR_DEPTH + 1] = { NULL };
 
     pecmd_dirent = search_full_wim_dirent(meta_data, dir, pecmd_path);
     debug("search pecmd.exe %p\n", pecmd_dirent);
 
     if (pecmd_dirent)
     {
-        ret = parse_registry_setup_cmdline(file, head, lookup, meta_data, dir, cmdline, sizeof(cmdline));
+        ret = parse_registry_setup_cmdline(file, head, lookup, meta_data, dir, cmdline, sizeof(cmdline) - 1);
         if (0 == ret)
         {
             debug("registry setup cmdline:<%s>\n", cmdline);
-            ventoy_str_toupper(cmdline);
             
-            if (grub_strncmp(cmdline, "PECMD", 5) == 0)
+            if (grub_strncasecmp(cmdline, "PECMD", 5) == 0)
             {
                 wim_dirent = pecmd_dirent;
             }
-            else if (grub_strncmp(cmdline, "PESET", 5) == 0)
+            else if (grub_strncasecmp(cmdline, "PESET", 5) == 0)
             {
                 wim_dirent = search_full_wim_dirent(meta_data, dir, peset_path);
                 debug("search peset.exe %p\n", wim_dirent);
             }
-            else if (grub_strncmp(cmdline, "WINPESHL", 8) == 0)
+            else if (grub_strncasecmp(cmdline, "WINPESHL", 8) == 0)
             {
                 wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path);
                 debug("search winpeshl.exe %p\n", wim_dirent);
             }
+            else if (0 == parse_custom_setup_path(cmdline, custom_path, exefile))
+            {
+                wim_dirent = search_full_wim_dirent(meta_data, dir, custom_path);
+                debug("search custom path %p\n", wim_dirent);
+            }
 
             if (wim_dirent)
             {
index 9541db5bd96c29f75e03ce1a68c3264eb055b9f1..7259ef24b347b74b6fbd94541efa6e5c35cc3452 100644 (file)
Binary files a/INSTALL/ventoy/vtoyjump32.exe and b/INSTALL/ventoy/vtoyjump32.exe differ
index 7e28387d9855be1afd9cb3956c381dd5910f81a0..4693f2e63091a4299c5d6f4e16320b498a2d546b 100644 (file)
Binary files a/INSTALL/ventoy/vtoyjump64.exe and b/INSTALL/ventoy/vtoyjump64.exe differ
index 68586a4a47bddadbbc5f5d02ea9b6895a84089f9..46a5fceb6a1cac0dc75e67a1d3d7f742e8a11ba2 100644 (file)
@@ -1,7 +1,7 @@
 /******************************************************************************\r
 * vtoyjump.c\r
 *\r
-* Copyright (c) 2020, longpanda <admin@ventoy.net>\r
+* Copyright (c) 2021, longpanda <admin@ventoy.net>\r
 *\r
 * This program is free software; you can redistribute it and/or\r
 * modify it under the terms of the GNU General Public License as\r
 static ventoy_os_param g_os_param;\r
 static ventoy_windows_data g_windows_data;\r
 static UINT8 g_os_param_reserved[32];\r
-static BOOL g_64bit_system = FALSE;\r
+static INT g_system_bit = VTOY_BIT;\r
 static ventoy_guid g_ventoy_guid = VENTOY_GUID;\r
 static HANDLE g_vtoylog_mutex = NULL;\r
 static HANDLE g_vtoyins_mutex = NULL;\r
 \r
-//Unicode "CmdLine"\r
-static BOOL g_PecmdHasCmdLine = FALSE;\r
-static UCHAR g_aucCmdLineHex[] = \r
-{\r
-    0x43, 0x00, 0x6D, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00\r
-};\r
+static CHAR g_prog_full_path[MAX_PATH];\r
+static CHAR g_prog_dir[MAX_PATH];\r
+static CHAR g_prog_name[MAX_PATH];\r
 \r
-#define VTOY_PID_FILE "X:\\Windows\\System32\\pidventoy"\r
+#define LOG_FILE  "X:\\Windows\\system32\\ventoy.log"\r
 #define MUTEX_LOCK(hmutex)  if (hmutex != NULL) LockStatus = WaitForSingleObject(hmutex, INFINITE)\r
 #define MUTEX_UNLOCK(hmutex)  if (hmutex != NULL && WAIT_OBJECT_0 == LockStatus) ReleaseMutex(hmutex)\r
 \r
+static const char * GetFileNameInPath(const char *fullpath)\r
+{\r
+       int i;\r
+\r
+       if (strstr(fullpath, ":"))\r
+       {\r
+               for (i = (int)strlen(fullpath); i > 0; i--)\r
+               {\r
+                       if (fullpath[i - 1] == '/' || fullpath[i - 1] == '\\')\r
+                       {\r
+                               return fullpath + i;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return fullpath;\r
+}\r
+\r
+static int split_path_name(char *fullpath, char *dir, char *name)\r
+{\r
+    CHAR ch;\r
+    CHAR *Pos = NULL;\r
+\r
+    Pos = (CHAR *)GetFileNameInPath(fullpath);\r
+\r
+    strcpy_s(name, MAX_PATH, Pos);\r
+\r
+    ch = *(Pos - 1);\r
+    *(Pos - 1) = 0;\r
+    strcpy_s(dir, MAX_PATH, fullpath);\r
+    *(Pos - 1) = ch;\r
+\r
+    return 0;\r
+}\r
+\r
+\r
 void Log(const char *Fmt, ...)\r
 {\r
        va_list Arg;\r
@@ -70,7 +103,7 @@ void Log(const char *Fmt, ...)
 \r
     MUTEX_LOCK(g_vtoylog_mutex);\r
 \r
-    fopen_s(&File, "ventoy.log", "a+");\r
+    fopen_s(&File, LOG_FILE, "a+");\r
     if (File)\r
     {\r
         fwrite(szBuf, 1, Len, File);\r
@@ -233,24 +266,6 @@ static BOOL CheckPeHead(BYTE *Head)
        return TRUE;\r
 }\r
 \r
-static BOOL IsPe64(BYTE *buffer)\r
-{\r
-       DWORD pe_off;\r
-\r
-       if (!CheckPeHead(buffer))\r
-       {\r
-               return FALSE;\r
-       }\r
-\r
-       pe_off = *(UINT32 *)(buffer + 60);\r
-       if (*(UINT16 *)(buffer + pe_off + 24) == 0x020b)\r
-       {\r
-               return TRUE;\r
-       }\r
-\r
-       return FALSE;\r
-}\r
-\r
 \r
 static BOOL CheckOsParam(ventoy_os_param *param)\r
 {\r
@@ -528,7 +543,7 @@ int VentoyMountY(HANDLE Handle)
 \r
     for (i = 0; physicalDriveName[i]; i++)\r
     {\r
-        physicalDriveNameA[i] = toupper((CHAR)(physicalDriveName[i]));\r
+        physicalDriveNameA[i] = (CHAR)toupper((CHAR)(physicalDriveName[i]));\r
     }\r
 \r
     Log("physicalDriveNameA=<%s>", physicalDriveNameA);\r
@@ -553,8 +568,10 @@ int VentoyMountY(HANDLE Handle)
     return bRet ? 0 : 1;\r
 }\r
 \r
-static BOOL VentoyNeedMountY(const char *IsoPath)\r
+static BOOL VentoyAPINeedMountY(const char *IsoPath)\r
 {\r
+       (void)IsoPath;\r
+\r
     /* TBD */\r
     return FALSE;\r
 }\r
@@ -576,7 +593,7 @@ static int VentoyAttachVirtualDisk(HANDLE Handle, const char *IsoPath)
         DriveYFree = 1;\r
     }\r
 \r
-    if (DriveYFree && VentoyNeedMountY(IsoPath))\r
+       if (DriveYFree && VentoyAPINeedMountY(IsoPath))\r
     {\r
         return VentoyMountY(Handle);\r
     }\r
@@ -744,7 +761,7 @@ static BOOL Is2K10PE(void)
        return bRet;\r
 }\r
 \r
-static CHAR GetMountLogicalDrive(void)\r
+static CHAR GetIMDiskMountLogicalDrive(void)\r
 {\r
        CHAR Letter = 'Y';\r
        DWORD Drives;\r
@@ -832,7 +849,7 @@ static int VentoyRunImdisk(const char *IsoPath, const char *imdiskexe)
 \r
        Log("VentoyRunImdisk <%s> <%s>", IsoPath, imdiskexe);\r
 \r
-       Letter = GetMountLogicalDrive();\r
+       Letter = GetIMDiskMountLogicalDrive();\r
        sprintf_s(Cmdline, sizeof(Cmdline), "%s -a -o ro -f \"%s\" -m %C:", imdiskexe, IsoPath, Letter);\r
        Log("mount iso to %C: use imdisk cmd <%s>", Letter, Cmdline);\r
 \r
@@ -909,7 +926,7 @@ int VentoyMountISOByImdisk(const char *IsoPath, DWORD PhyDrive)
 \r
        if (0 == fl_attach_media(VentoyFatDiskRead, NULL))\r
        {\r
-               if (g_64bit_system)\r
+               if (g_system_bit == 64)\r
                {\r
                        CopyFileFromFatDisk("/ventoy/imdisk/64/imdisk.sys", "ventoy\\imdisk.sys");\r
                        CopyFileFromFatDisk("/ventoy/imdisk/64/imdisk.exe", "ventoy\\imdisk.exe");\r
@@ -1132,7 +1149,7 @@ static int DecompressInjectionArchive(const char *archive, DWORD PhyDrive)
 \r
     if (0 == fl_attach_media(VentoyFatDiskRead, NULL))\r
     {\r
-        if (g_64bit_system)\r
+               if (g_system_bit == 64)\r
         {\r
             CopyFileFromFatDisk("/ventoy/7z/64/7za.exe", "ventoy\\7za.exe");\r
         }\r
@@ -1345,24 +1362,6 @@ static int VentoyHook(ventoy_os_param *param)
     return 0;\r
 }\r
 \r
-const char * GetFileNameInPath(const char *fullpath)\r
-{\r
-       int i;\r
-       const char *pos = NULL;\r
-\r
-       if (strstr(fullpath, ":"))\r
-       {\r
-               for (i = (int)strlen(fullpath); i > 0; i--)\r
-               {\r
-                       if (fullpath[i - 1] == '/' || fullpath[i - 1] == '\\')\r
-                       {\r
-                               return fullpath + i;\r
-                       }\r
-               }\r
-       }\r
-       \r
-       return fullpath;\r
-}\r
 \r
 int VentoyJumpWimboot(INT argc, CHAR **argv, CHAR *LunchFile)\r
 {\r
@@ -1371,13 +1370,7 @@ int VentoyJumpWimboot(INT argc, CHAR **argv, CHAR *LunchFile)
     DWORD size = 0;\r
     DWORD Pos;\r
 \r
-#ifdef VTOY_32\r
-    g_64bit_system = FALSE;\r
-#else\r
-    g_64bit_system = TRUE;\r
-#endif\r
-    \r
-    Log("VentoyJumpWimboot %dbit", g_64bit_system ? 64 : 32);\r
+       Log("VentoyJumpWimboot %dbit", g_system_bit);\r
 \r
     sprintf_s(LunchFile, MAX_PATH, "X:\\setup.exe");\r
 \r
@@ -1441,24 +1434,6 @@ static int ventoy_check_create_directory(void)
     return 0;\r
 }\r
 \r
-static BOOL VentoyFindCmdLineStr(BYTE *buf, DWORD size)\r
-{\r
-    DWORD i = 0;\r
-    UINT32 uiDataChk;\r
-    UINT32 uiDataHex = *(UINT32 *)(g_aucCmdLineHex);\r
-\r
-    for (i = 0; i < size - sizeof(g_aucCmdLineHex); i += 16)\r
-    {\r
-        uiDataChk = *(UINT32 *)(buf + i);\r
-        if (uiDataChk == uiDataHex && memcmp(buf + i, g_aucCmdLineHex, sizeof(g_aucCmdLineHex)) == 0)\r
-        {\r
-            return TRUE;\r
-        }\r
-    }\r
-    \r
-    return FALSE;\r
-}\r
-\r
 int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)\r
 {\r
        int rc = 1;\r
@@ -1484,8 +1459,7 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
                goto End;\r
        }\r
        \r
-       g_64bit_system = IsPe64(Buffer);\r
-    Log("VentoyJump %dbit", g_64bit_system ? 64 : 32);\r
+       Log("VentoyJump %dbit", g_system_bit);\r
 \r
     MUTEX_LOCK(g_vtoyins_mutex);\r
     stat = ventoy_check_create_directory();\r
@@ -1537,13 +1511,6 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
                        SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart);\r
             MUTEX_UNLOCK(g_vtoyins_mutex);\r
 \r
-        #ifdef VTOY_REJUMP_SUPPORTED\r
-            if (_stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0)\r
-            {\r
-                g_PecmdHasCmdLine = VentoyFindCmdLineStr(Buffer + PeStart, FileSize - PeStart);\r
-            }\r
-        #endif\r
-\r
                        break;\r
                }\r
        }\r
@@ -1574,244 +1541,176 @@ End:
 }\r
 \r
 \r
-\r
-static int ventoy_append_process_id(const char *pidfile)\r
+int real_main(int argc, char **argv)\r
 {\r
-    DWORD PID = 0;\r
-    FILE *fp = NULL;\r
-\r
-    PID = GetCurrentProcessId();\r
-\r
-    fopen_s(&fp, pidfile, "a+");\r
-    if (!fp)\r
-    {\r
-        return 1;\r
-    }\r
-\r
-    fprintf_s(fp, "%u\n", PID);\r
-\r
-    fclose(fp);\r
-    return 0;\r
-}\r
-\r
-static int ventoy_get_instance_id(const char *pidfile)\r
-{\r
-    int instance = 0;\r
-    FILE *fp = NULL;\r
-    char line[256];\r
+       int i = 0;\r
+       int rc = 0;\r
+       CHAR NewFile[MAX_PATH];\r
+       CHAR LunchFile[MAX_PATH];\r
+       CHAR CallParam[1024] = { 0 };\r
+       STARTUPINFOA Si;\r
+       PROCESS_INFORMATION Pi;\r
 \r
-    fopen_s(&fp, pidfile, "r");\r
-    if (!fp)\r
-    {\r
-        return 1;\r
-    }\r
+       Log("#### real_main #### argc = %d", argc);\r
+    Log("program full path: <%s>", g_prog_full_path);\r
+    Log("program dir: <%s>", g_prog_dir);\r
+    Log("program name:: <%s>", g_prog_name);\r
 \r
-    while (fgets(line, sizeof(line), fp))\r
-    {\r
-        instance++;\r
-    }\r
+    Log("argc = %d", argc);\r
+       for (i = 0; i < argc; i++)\r
+       {\r
+               Log("argv[%d]=<%s>", i, argv[i]);\r
+               if (i > 0)\r
+               {\r
+                       strcat_s(CallParam, sizeof(CallParam), " ");\r
+                       strcat_s(CallParam, sizeof(CallParam), argv[i]);\r
+               }\r
+       }\r
 \r
-    fclose(fp);\r
-    return instance + 1;\r
-}\r
+       GetStartupInfoA(&Si);\r
+       memset(LunchFile, 0, sizeof(LunchFile));\r
 \r
-int main(int argc, char **argv)\r
-{\r
-    int i = 0;\r
-    int rc = 0;\r
-    int id = 0;\r
-    BOOL ReJump = FALSE;\r
-    CHAR *Pos = NULL;\r
-    CHAR CurDir[MAX_PATH];\r
-    CHAR LunchFile[MAX_PATH];\r
-    CHAR CallParam[1024] = { 0 };\r
-    DWORD LockStatus = 0;\r
-    STARTUPINFOA Si;\r
-    PROCESS_INFORMATION Pi;\r
-\r
-#ifdef VTOY_REJUMP_SUPPORTED\r
-    if (argv[0] && strcmp(argv[0], "ventoy\\WinLogon.exe") == 0)\r
-    {\r
-        GetStartupInfoA(&Si);\r
-        Si.dwFlags |= STARTF_USESHOWWINDOW;\r
-        Si.wShowWindow = SW_HIDE;\r
+       if (strstr(argv[0], "vtoyjump.exe"))\r
+       {\r
+               rc = VentoyJumpWimboot(argc, argv, LunchFile);\r
+       }\r
+       else\r
+       {\r
+               rc = VentoyJump(argc, argv, LunchFile);\r
+       }\r
 \r
-        sprintf_s(LunchFile, sizeof(LunchFile), "PECMD.EXE");\r
-        for (i = 1; i < argc; i++)\r
-        {\r
-            strcat_s(LunchFile, sizeof(LunchFile), " ");\r
-            strcat_s(LunchFile, sizeof(LunchFile), argv[i]);\r
-        }\r
+       Log("LunchFile=<%s> CallParam=<%s>", LunchFile, CallParam);\r
 \r
-        CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
-        WaitForSingleObject(Pi.hProcess, INFINITE);\r
-        return 0;\r
-    }\r
-#endif\r
+       if (_stricmp(g_prog_name, "winpeshl.exe") != 0 && IsFileExist("ventoy\\%s", g_prog_name))\r
+       {\r
+               sprintf_s(NewFile, sizeof(NewFile), "%s_BACK.EXE", g_prog_full_path);\r
+               MoveFileA(g_prog_full_path, NewFile);\r
+               Log("Move <%s> to <%s>", g_prog_full_path, NewFile);\r
 \r
-    g_PecmdHasCmdLine = 0;\r
-    g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK");\r
-    g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK");\r
+               sprintf_s(NewFile, sizeof(NewFile), "ventoy\\%s", g_prog_name);\r
+               CopyFileA(NewFile, g_prog_full_path, TRUE);\r
+               Log("Copy <%s> to <%s>", NewFile, g_prog_full_path);\r
 \r
-    MUTEX_LOCK(g_vtoyins_mutex);\r
-    if (IsFileExist(VTOY_PID_FILE))\r
-    {\r
-        id = ventoy_get_instance_id(VTOY_PID_FILE);\r
-    }\r
+               sprintf_s(LunchFile, sizeof(LunchFile), "%s", g_prog_full_path);\r
+               Log("Final lunchFile is <%s>", LunchFile);\r
+       }\r
     else\r
     {\r
-        id = 1;\r
+        Log("We don't need to recover original <%s>", g_prog_name);\r
     }\r
-    ventoy_append_process_id(VTOY_PID_FILE);\r
-    MUTEX_UNLOCK(g_vtoyins_mutex);\r
 \r
-    if (argv[0] && argv[0][0] && argv[0][1] == ':')\r
-    {\r
-        GetCurrentDirectoryA(sizeof(CurDir), CurDir);\r
+       if (g_os_param_reserved[0] == 3)\r
+       {\r
+               Log("Open log for debug ...");\r
+               sprintf_s(LunchFile, sizeof(LunchFile), "%s", "notepad.exe ventoy.log");\r
+       }\r
+       else\r
+       {\r
+               if (CallParam[0])\r
+               {\r
+                       strcat_s(LunchFile, sizeof(LunchFile), CallParam);\r
+               }\r
+               else if (NULL == strstr(LunchFile, "setup.exe"))\r
+               {\r
+                       Log("Not setup.exe, hide windows.");\r
+                       Si.dwFlags |= STARTF_USESHOWWINDOW;\r
+                       Si.wShowWindow = SW_HIDE;\r
+               }\r
 \r
-        strcpy_s(LunchFile, sizeof(LunchFile), argv[0]);\r
-        Pos = (char *)GetFileNameInPath(LunchFile);\r
+               Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed");\r
+       }\r
 \r
-        strcat_s(CurDir, sizeof(CurDir), "\\");\r
-        strcat_s(CurDir, sizeof(CurDir), Pos);\r
+       Log("Now launch <%s> ...", LunchFile);\r
 \r
-        if (_stricmp(argv[0], CurDir) != 0)\r
-        {\r
-            *Pos = 0;\r
-            SetCurrentDirectoryA(LunchFile);\r
-        }\r
-    }\r
+       if (g_os_param_reserved[0] == 4)\r
+       {\r
+               Log("Open cmd for debug ...");\r
+               sprintf_s(LunchFile, sizeof(LunchFile), "%s", "cmd.exe");\r
+       }\r
 \r
-#ifdef VTOY_32\r
-    Log("######## VentoyJump 32bit [%d] ##########", id);\r
-#else\r
-    Log("######## VentoyJump 64bit [%d] ##########", id);\r
-#endif\r
+    Log("Backup log at this point");\r
+    CopyFileA(LOG_FILE, "X:\\Windows\\ventoy.backup", TRUE);\r
 \r
-    Log("argc = %d", argc);\r
-    for (i = 0; i < argc; i++)\r
-    {\r
-        Log("argv[%d]=<%s>", i, argv[i]);\r
-        if (i > 0)\r
-        {\r
-            strcat_s(CallParam, sizeof(CallParam), " ");\r
-            strcat_s(CallParam, sizeof(CallParam), argv[i]);\r
-        }\r
-    }\r
+       CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
 \r
-       if (Pos && *Pos == 0)\r
-       {\r
-               Log("Old current directory = <%s>", CurDir);\r
-               Log("New current directory = <%s>", LunchFile);\r
-       }\r
-       else\r
+       for (i = 0; rc && i < 1800; i++)\r
        {\r
-               GetCurrentDirectoryA(sizeof(CurDir), CurDir);\r
-               Log("Current directory = <%s>", CurDir);\r
+               Log("Ventoy hook failed, now wait and retry ...");\r
+               Sleep(1000);\r
+               rc = VentoyHook(&g_os_param);\r
        }\r
 \r
-    GetStartupInfoA(&Si);\r
+       Log("Wait process...");\r
+       WaitForSingleObject(Pi.hProcess, INFINITE);\r
 \r
-    memset(LunchFile, 0, sizeof(LunchFile));\r
+       Log("vtoyjump finished");\r
+       return 0;\r
+}\r
 \r
-    if (strstr(argv[0], "vtoyjump.exe"))\r
-    {\r
-        rc = VentoyJumpWimboot(argc, argv, LunchFile);\r
-    }\r
-    else\r
-    {\r
-        rc = VentoyJump(argc, argv, LunchFile);\r
-    }\r
 \r
-    Log("id=%d LunchFile=<%s> CallParam=<%s>", id, LunchFile, CallParam);\r
+int main(int argc, char **argv)\r
+{\r
+       int i;\r
+       STARTUPINFOA Si;\r
+       PROCESS_INFORMATION Pi;\r
+       CHAR CurDir[MAX_PATH];\r
+    CHAR NewArgv0[MAX_PATH];\r
+       CHAR CallParam[1024] = { 0 };\r
 \r
-    if (id == 1 && _stricmp(argv[0], "PECMD.EXE") == 0 && _stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0)\r
-    {\r
-        MUTEX_LOCK(g_vtoyins_mutex);\r
-        id = ventoy_get_instance_id(VTOY_PID_FILE);\r
-        MUTEX_UNLOCK(g_vtoyins_mutex);\r
+       g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK");\r
+       g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK");\r
 \r
-        Log("Current instance id is: %d", id);\r
+       Log("######## VentoyJump %dbit ##########", g_system_bit);\r
 \r
-        if (id == 2)\r
-        {\r
-            #ifdef VTOY_REJUMP_SUPPORTED\r
-            if (g_PecmdHasCmdLine)\r
-            {\r
-                ReJump = TRUE;\r
-                CopyFileA("PECMD.EXE", "ventoy\\WinLogon.exe", TRUE);\r
-            }\r
-            #endif\r
+       GetCurrentDirectoryA(sizeof(CurDir), CurDir);\r
+       Log("Current directory is <%s>", CurDir);\r
+       \r
+       GetModuleFileNameA(NULL, g_prog_full_path, MAX_PATH);\r
+    split_path_name(g_prog_full_path, g_prog_dir, g_prog_name);\r
 \r
-            MoveFileA("PECMD.EXE", "PECMD_BACK.EXE");\r
-            CopyFileA("ventoy\\PECMD.EXE", "PECMD.EXE", TRUE);            \r
-            sprintf_s(LunchFile, sizeof(LunchFile), "%s", "PECMD.EXE");\r
-            Log("Move original PECMD.EXE <%s>", LunchFile);\r
-        }\r
-        else\r
-        {\r
-            Log("%d instance started, don't move PECMD.EXE", id);\r
-        }\r
-    }\r
+       Log("EXE path: <%s> dir:<%s> name:<%s>", g_prog_full_path, g_prog_dir, g_prog_name);\r
 \r
-    if (g_os_param_reserved[0] == 3)\r
-    {\r
-        Log("Open log for debug ...");\r
-        sprintf_s(LunchFile, sizeof(LunchFile), "%s", "notepad.exe ventoy.log");\r
-    }\r
-    else\r
-    {\r
-        if (CallParam[0])\r
-        {\r
-            strcat_s(LunchFile, sizeof(LunchFile), CallParam);\r
-        }\r
-        else if (NULL == strstr(LunchFile, "setup.exe"))\r
-        {\r
-            Log("Not setup.exe, hide windows.");\r
-            Si.dwFlags |= STARTF_USESHOWWINDOW;\r
-            Si.wShowWindow = SW_HIDE;\r
-        }        \r
+       if (_stricmp(g_prog_name, "WinLogon.exe") == 0)\r
+       {\r
+               Log("This time is rejump back ...");\r
+               \r
+               strcpy_s(g_prog_full_path, sizeof(g_prog_full_path), argv[1]);\r
+        split_path_name(g_prog_full_path, g_prog_dir, g_prog_name);\r
 \r
-        Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed");\r
-    }\r
-    \r
-    Log("Now launch <%s> ...", LunchFile);\r
+               return real_main(argc - 1, argv + 1);\r
+       }\r
+       else if (_stricmp(g_prog_name, "PECMD.exe") == 0)\r
+       {\r
+               Log("We need to rejump for pecmd ...");\r
 \r
-    if (g_os_param_reserved[0] == 4)\r
-    {\r
-        Log("Open cmd for debug ...");\r
-        sprintf_s(LunchFile, sizeof(LunchFile), "%s", "cmd.exe");\r
-    }\r
+               ventoy_check_create_directory();\r
+               CopyFileA(g_prog_full_path, "ventoy\\WinLogon.exe", TRUE);\r
 \r
-#ifdef VTOY_REJUMP_SUPPORTED\r
-    if (ReJump)\r
-    {\r
-        sprintf_s(CallParam, sizeof(CallParam), "ventoy\\WinLogon.exe%s", LunchFile + strlen("PECMD.EXE"));\r
-        Log("Now rejump to pecmd.exe <%s> ...", CallParam);\r
+               sprintf_s(CallParam, sizeof(CallParam), "ventoy\\WinLogon.exe %s", g_prog_full_path);\r
+               for (i = 1; i < argc; i++)\r
+               {\r
+                       strcat_s(CallParam, sizeof(CallParam), " ");\r
+                       strcat_s(CallParam, sizeof(CallParam), argv[i]);\r
+               }\r
 \r
-        CreateProcessA(NULL, CallParam, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+               Log("Now rejump to <%s> ...", CallParam);\r
+               GetStartupInfoA(&Si);\r
+               CreateProcessA(NULL, CallParam, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
 \r
-        Log("Wait rejump process...");\r
-        WaitForSingleObject(Pi.hProcess, INFINITE);\r
-        Log("rejump finished");\r
-        return 0;\r
-    }\r
-#else\r
-    (void)ReJump;\r
-#endif\r
+               Log("Wait rejump process...");\r
+               WaitForSingleObject(Pi.hProcess, INFINITE);\r
+               Log("rejump finished");\r
+               return 0;\r
+       }\r
+       else\r
+       {\r
+               Log("We don't need to rejump ...");\r
 \r
-    CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+        strcpy_s(NewArgv0, sizeof(NewArgv0), g_prog_full_path);\r
+        argv[0] = NewArgv0;\r
 \r
-    for (i = 0; rc && i < 1800; i++)\r
-    {\r
-        Log("Ventoy hook failed, now wait and retry ...");\r
-        Sleep(1000);\r
-        rc = VentoyHook(&g_os_param);\r
-    }\r
+               return real_main(argc, argv);\r
+       }\r
+}\r
 \r
-    Log("Wait process...");\r
-    WaitForSingleObject(Pi.hProcess, INFINITE);\r
 \r
-    Log("vtoyjump finished");\r
-       return 0;\r
-}\r
index eeef6d987cc45db749999a4d05f2732095f7adef..9659c449c5c8264c39a49105878955041e5f7a30 100644 (file)
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>VTOY_32;FATFS_INC_FORMAT_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>VTOY_BIT=32;FATFS_INC_FORMAT_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
     </ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <FunctionLevelLinking>true</FunctionLevelLinking>
       <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>VTOY_64;FATFS_INC_FORMAT_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PreprocessorDefinitions>VTOY_BIT=64;FATFS_INC_FORMAT_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <SDLCheck>true</SDLCheck>
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
     </ClCompile>