]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Compatibility improvement for some WinPE
authorlongpanda <admin@ventoy.net>
Tue, 3 Aug 2021 06:53:29 +0000 (14:53 +0800)
committerlongpanda <admin@ventoy.net>
Tue, 3 Aug 2021 06:53:29 +0000 (14:53 +0800)
INSTALL/grub/grub.cfg
INSTALL/ventoy/vtoyjump32.exe
INSTALL/ventoy/vtoyjump64.exe
vtoyjump/vtoyjump/vtoyjump.c

index eb35fa5ae7b5b1f25eebea50af940f3ab0b17fba..51bb8ef251b3347faac4e15399c3b2a14a200fbc 100644 (file)
@@ -921,7 +921,7 @@ function legacy_windows_menu_func {
             loopback loop "$1$2"
         fi
         
-        for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD"; do
+        for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD" "boot/bce"; do
             vt_windows_collect_wim_patch bcd (loop)/$file                
         done
         
index 9c0cf8dd143688acd781017c8ab9aa60a80a52a5..0bd00292cd4573e8b64f1f94d5e6884ef890cf07 100644 (file)
Binary files a/INSTALL/ventoy/vtoyjump32.exe and b/INSTALL/ventoy/vtoyjump32.exe differ
index 3c95c985264beb282f9c97f307845718b8cc51e5..8ec830feac9ad1624bf1ee0b444bb452c8cb0e80 100644 (file)
Binary files a/INSTALL/ventoy/vtoyjump64.exe and b/INSTALL/ventoy/vtoyjump64.exe differ
index efc2acb83f46c1f66f4dd06ae5d7d0b6a1680733..d539888fbceb1a633f7c1368ac51da3576792011 100644 (file)
@@ -33,6 +33,12 @@ static ventoy_windows_data g_windows_data;
 static UINT8 g_os_param_reserved[32];\r
 static BOOL g_64bit_system = FALSE;\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
+#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
 \r
 void Log(const char *Fmt, ...)\r
 {\r
@@ -41,6 +47,7 @@ void Log(const char *Fmt, ...)
        FILE *File = NULL;\r
        SYSTEMTIME Sys;\r
        char szBuf[1024];\r
+    DWORD LockStatus = 0;\r
     DWORD PID = GetCurrentProcessId();\r
 \r
        GetLocalTime(&Sys);\r
@@ -54,6 +61,8 @@ void Log(const char *Fmt, ...)
        Len += vsnprintf_s(szBuf + Len, sizeof(szBuf)-Len, sizeof(szBuf)-Len, Fmt, Arg);\r
        va_end(Arg);\r
 \r
+    MUTEX_LOCK(g_vtoylog_mutex);\r
+\r
     fopen_s(&File, "ventoy.log", "a+");\r
     if (File)\r
     {\r
@@ -61,6 +70,8 @@ void Log(const char *Fmt, ...)
         fwrite("\n", 1, 1, File);\r
         fclose(File);\r
     }\r
+\r
+    MUTEX_UNLOCK(g_vtoylog_mutex);\r
 }\r
 \r
 \r
@@ -1305,12 +1316,33 @@ End:
     return rc;\r
 }\r
 \r
+static int ventoy_check_create_directory(void)\r
+{\r
+    if (IsDirExist("ventoy"))\r
+    {\r
+        Log("ventoy directory already exist");\r
+    }\r
+    else\r
+    {\r
+        Log("ventoy directory not exist, now create it.");\r
+        if (!CreateDirectoryA("ventoy", NULL))\r
+        {\r
+            Log("Failed to create ventoy directory err:%u", GetLastError());\r
+            return 1;\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
 int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)\r
 {\r
        int rc = 1;\r
+    int stat = 0;\r
        DWORD Pos;\r
        DWORD PeStart;\r
     DWORD FileSize;\r
+    DWORD LockStatus = 0;\r
        BYTE *Buffer = NULL; \r
        CHAR ExeFileName[MAX_PATH];\r
 \r
@@ -1331,19 +1363,14 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
        g_64bit_system = IsPe64(Buffer);\r
     Log("VentoyJump %dbit", g_64bit_system ? 64 : 32);\r
 \r
-    if (IsDirExist("ventoy"))\r
+    MUTEX_LOCK(g_vtoyins_mutex);\r
+    stat = ventoy_check_create_directory();\r
+    MUTEX_UNLOCK(g_vtoyins_mutex);\r
+\r
+    if (stat != 0)\r
     {\r
-        Log("ventoy directory already exist");\r
+        goto End;\r
     }\r
-    else\r
-       {\r
-        Log("ventoy directory not exist, now create it.");\r
-               if (!CreateDirectoryA("ventoy", NULL))\r
-               {\r
-                       Log("Failed to create ventoy directory err:%u", GetLastError());\r
-                       goto End;\r
-               }\r
-       }\r
 \r
        for (PeStart = 0; PeStart < FileSize; PeStart += 16)\r
        {\r
@@ -1374,14 +1401,18 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
                        PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data);\r
                        sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName));\r
 \r
+            MUTEX_LOCK(g_vtoyins_mutex);\r
             if (IsFileExist("%s", LunchFile))\r
             {\r
-                Log("vtoyjump multiple call...");\r
+                Log("vtoyjump multiple call ...");\r
                 rc = 0;\r
+                MUTEX_UNLOCK(g_vtoyins_mutex);\r
                 goto End;\r
             }\r
 \r
                        SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart);\r
+            MUTEX_UNLOCK(g_vtoyins_mutex);\r
+\r
                        break;\r
                }\r
        }\r
@@ -1411,17 +1442,76 @@ End:
        return rc;\r
 }\r
 \r
+\r
+\r
+static int ventoy_append_process_id(const char *pidfile)\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
+\r
+    fopen_s(&fp, pidfile, "r");\r
+    if (!fp)\r
+    {\r
+        return 1;\r
+    }\r
+\r
+    while (fgets(line, sizeof(line), fp))\r
+    {\r
+        instance++;\r
+    }\r
+\r
+    fclose(fp);\r
+    return instance + 1;\r
+}\r
+\r
 int main(int argc, char **argv)\r
 {\r
     int i = 0;\r
     int rc = 0;\r
+    int id = 0;\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
+    g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK");\r
+    g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK");\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
+    else\r
+    {\r
+        id = 1;\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
@@ -1439,7 +1529,7 @@ int main(int argc, char **argv)
         }\r
     }\r
 \r
-    Log("######## VentoyJump ##########");\r
+    Log("######## VentoyJump [%d] ##########", id);\r
     Log("argc = %d", argc);\r
     for (i = 0; i < argc; i++)\r
     {\r
@@ -1475,14 +1565,27 @@ int main(int argc, char **argv)
         rc = VentoyJump(argc, argv, LunchFile);\r
     }\r
 \r
-    Log("LunchFile=<%s> CallParam=<%s>", LunchFile, CallParam);\r
+    Log("id=%d LunchFile=<%s> CallParam=<%s>", id, LunchFile, CallParam);\r
 \r
-    if (_stricmp(argv[0], "PECMD.EXE") == 0 && _stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0)\r
+    if (id == 1 && _stricmp(argv[0], "PECMD.EXE") == 0 && _stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0)\r
     {\r
-        MoveFileA("PECMD.EXE", "PECMD_BACK.EXE");\r
-        MoveFileA("ventoy\\PECMD.EXE", "PECMD.EXE");\r
-        sprintf_s(LunchFile, sizeof(LunchFile), "%s", "PECMD.EXE");\r
-        Log("Move original PECMD.EXE <%s>", LunchFile);\r
+        MUTEX_LOCK(g_vtoyins_mutex);\r
+        id = ventoy_get_instance_id(VTOY_PID_FILE);\r
+        MUTEX_UNLOCK(g_vtoyins_mutex);\r
+\r
+        Log("Current instance id is: %d", id);\r
+\r
+        if (id == 2)\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
 \r
     if (g_os_param_reserved[0] == 3)\r