]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Support some special Win7PE
authorlongpanda <admin@ventoy.net>
Sat, 14 Aug 2021 03:49:51 +0000 (11:49 +0800)
committerlongpanda <admin@ventoy.net>
Sat, 14 Aug 2021 03:49:51 +0000 (11:49 +0800)
INSTALL/grub/grub.cfg
vtoyjump/vtoyjump/vtoyjump.c

index b5354c8cf635a4ab478c3806206ded444556f3d4..0ef39ea6b778cff203c88a89284b29dcbf4768c8 100644 (file)
@@ -130,6 +130,11 @@ function get_os_type {
 
 function vt_check_compatible_pe {
     #Check for PE without external tools
+    #set compatible if ISO file is less than 80MB
+    if [ $vt_chosen_size -gt 33554432 -a $vt_chosen_size -le 83886080 ]; then
+        set ventoy_compatible=YES
+    fi
+
     return
 }
 
index 1936143a1f865a7e6a268ab066df4390830b5be0..65e958976dec967dde42d81d6df4d8cef1159796 100644 (file)
@@ -36,6 +36,13 @@ static ventoy_guid g_ventoy_guid = VENTOY_GUID;
 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
+\r
 #define VTOY_PID_FILE "X:\\Windows\\System32\\pidventoy"\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
@@ -1342,6 +1349,24 @@ 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
@@ -1420,6 +1445,13 @@ 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
@@ -1496,6 +1528,7 @@ int main(int argc, char **argv)
     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
@@ -1504,6 +1537,27 @@ int main(int argc, char **argv)
     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
+\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
+\r
+        CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+        WaitForSingleObject(Pi.hProcess, INFINITE);\r
+        return 0;\r
+    }\r
+#endif\r
+\r
+    g_PecmdHasCmdLine = 0;\r
     g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK");\r
     g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK");\r
 \r
@@ -1589,6 +1643,14 @@ int main(int argc, char **argv)
 \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
+\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
@@ -1629,6 +1691,23 @@ int main(int argc, char **argv)
         sprintf_s(LunchFile, sizeof(LunchFile), "%s", "cmd.exe");\r
     }\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
+\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
+\r
     CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
 \r
     for (i = 0; rc && i < 1800; i++)\r