]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - vtoyjump/vtoyjump/vtoyjump.c
--xdg improvement
[Ventoy.git] / vtoyjump / vtoyjump / vtoyjump.c
index 68586a4a47bddadbbc5f5d02ea9b6895a84089f9..7c3d80377ce2012ad466ff0fce8aa160f1ea0c3f 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_PECMD_PATH      "X:\\Windows\\system32\\ventoy\\PECMD.EXE"\r
+#define ORG_PECMD_PATH       "X:\\Windows\\system32\\PECMD.EXE"\r
+#define ORG_PECMD_BK_PATH    "X:\\Windows\\system32\\PECMD.EXE_BACK.EXE"\r
+\r
+#define AUTO_RUN_BAT    "X:\\VentoyAutoRun.bat"\r
+#define AUTO_RUN_LOG    "X:\\VentoyAutoRun.log"\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 +110,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 +273,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
@@ -413,7 +435,7 @@ out:
     return bRet;\r
 }\r
 \r
-static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *DiskExtent)\r
+static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, UINT32 *DiskSig, DISK_EXTENT *DiskExtent)\r
 {\r
        BOOL Ret;\r
        DWORD dwSize;\r
@@ -448,8 +470,9 @@ static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *Dis
        }\r
        CloseHandle(Handle);\r
 \r
-       memcpy(DiskExtent, DiskExtents.Extents, sizeof(DiskExtent));\r
-       Log("%C: is in PhysicalDrive%d ", LogicalDrive, DiskExtents.Extents[0].DiskNumber);\r
+    memcpy(DiskExtent, DiskExtents.Extents, sizeof(DISK_EXTENT));\r
+    Log("%C: is in PhysicalDrive%d Offset:%llu", LogicalDrive, DiskExtents.Extents[0].DiskNumber, \r
+        (ULONGLONG)(DiskExtents.Extents[0].StartingOffset.QuadPart));\r
 \r
        sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\PhysicalDrive%d", DiskExtents.Extents[0].DiskNumber);\r
        Handle = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);\r
@@ -467,6 +490,11 @@ static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *Dis
        }\r
        \r
        memcpy(UUID, SectorBuf + 0x180, 16);\r
+    if (DiskSig)\r
+    {\r
+        memcpy(DiskSig, SectorBuf + 0x1B8, 4);\r
+    }\r
+\r
        CloseHandle(Handle);\r
        return 0;\r
 }\r
@@ -528,7 +556,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 +581,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 +606,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 +774,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 +862,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 +939,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
@@ -1090,11 +1120,31 @@ static BOOL check_tar_archive(const char *archive, CHAR *tarName)
     return FALSE;\r
 }\r
 \r
+static UCHAR *g_unxz_buffer = NULL;\r
+static int g_unxz_len = 0;\r
+\r
+static void unxz_error(char *x)\r
+{\r
+    Log("%s", x);\r
+}\r
+\r
+static int unxz_flush(void *src, unsigned int size)\r
+{\r
+    memcpy(g_unxz_buffer + g_unxz_len, src, size);\r
+    g_unxz_len += (int)size;\r
+\r
+    return (int)size;\r
+}\r
+\r
 static int DecompressInjectionArchive(const char *archive, DWORD PhyDrive)\r
 {\r
     int rc = 1;\r
+    int writelen = 0;\r
+    UCHAR *Buffer = NULL;\r
+    UCHAR *RawBuffer = NULL;\r
     BOOL bRet;\r
     DWORD dwBytes;\r
+    DWORD dwSize;\r
     HANDLE hDrive;\r
     HANDLE hOut;\r
     DWORD flags = CREATE_NO_WINDOW;\r
@@ -1132,13 +1182,42 @@ 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.xz", "ventoy\\7za.xz");\r
+        }\r
+        else\r
+        {\r
+            CopyFileFromFatDisk("/ventoy/7z/32/7za.xz", "ventoy\\7za.xz");\r
+        }\r
+\r
+        ReadWholeFile2Buf("ventoy\\7za.xz", &Buffer, &dwSize);\r
+        Log("7za.xz file size:%u", dwSize);\r
+\r
+        RawBuffer = malloc(SIZE_1MB * 4);\r
+        if (RawBuffer)\r
         {\r
-            CopyFileFromFatDisk("/ventoy/7z/64/7za.exe", "ventoy\\7za.exe");\r
+            g_unxz_buffer = RawBuffer;\r
+            g_unxz_len = 0;\r
+            unxz(Buffer, (int)dwSize, NULL, unxz_flush, NULL, &writelen, unxz_error);\r
+            if (writelen == (int)dwSize)\r
+            {\r
+                Log("Decompress success 7za.xz(%u) ---> 7za.exe(%d)", dwSize, g_unxz_len);\r
+            }\r
+            else\r
+            {\r
+                Log("Decompress failed 7za.xz(%u) ---> 7za.exe(%u)", dwSize, dwSize);\r
+            }\r
+\r
+            SaveBuffer2File("ventoy\\7za.exe", RawBuffer, (DWORD)g_unxz_len);\r
+\r
+            g_unxz_buffer = NULL;\r
+            g_unxz_len = 0;\r
+            free(RawBuffer);\r
         }\r
         else\r
         {\r
-            CopyFileFromFatDisk("/ventoy/7z/32/7za.exe", "ventoy\\7za.exe");\r
+            Log("Failed to alloc 4MB memory");\r
         }\r
 \r
         sprintf_s(StrBuf, sizeof(StrBuf), "ventoy\\7za.exe x -y -aoa -oX:\\ %s", archive);\r
@@ -1228,14 +1307,167 @@ static int ProcessUnattendedInstallation(const char *script)
     return 0;\r
 }\r
 \r
+static int Windows11BypassCheck(const char *isofile, const char MntLetter)\r
+{\r
+    int Ret = 1;\r
+    DWORD dwHandle;\r
+    DWORD dwSize;\r
+    DWORD dwValue = 1;\r
+    UINT VerLen = 0;\r
+    CHAR *Buffer = NULL;\r
+    VS_FIXEDFILEINFO* VerInfo = NULL;\r
+    CHAR CheckFile[MAX_PATH];\r
+    UINT16 Major, Minor, Build, Revision;\r
+\r
+    Log("Windows11BypassCheck for <%s> %C:", isofile, MntLetter);\r
+\r
+    if (FALSE == IsFileExist("%C:\\sources\\boot.wim", MntLetter) ||\r
+        FALSE == IsFileExist("%C:\\sources\\compatresources.dll", MntLetter))\r
+    {\r
+        Log("boot.wim/compatresources.dll not exist, this is not a windows install media.");\r
+        goto End;\r
+    }\r
+\r
+    if (FALSE == IsFileExist("%C:\\sources\\install.wim", MntLetter) && \r
+        FALSE == IsFileExist("%C:\\sources\\install.esd", MntLetter))\r
+    {\r
+        Log("install.wim/install.esd not exist, this is not a windows install media.");\r
+        goto End;\r
+    }\r
+\r
+    sprintf_s(CheckFile, sizeof(CheckFile), "%C:\\sources\\compatresources.dll", MntLetter);\r
+    dwSize = GetFileVersionInfoSizeA(CheckFile, &dwHandle);\r
+    if (0 == dwSize)\r
+    {\r
+        Log("Failed to get file version info size: %u", LASTERR);\r
+        goto End;\r
+    }\r
+\r
+    Buffer = malloc(dwSize);\r
+    if (!Buffer)\r
+    {\r
+        goto End;\r
+    }\r
+\r
+    if (FALSE == GetFileVersionInfoA(CheckFile, dwHandle, dwSize, Buffer))\r
+    {\r
+        Log("Failed to get file version info : %u", LASTERR);\r
+        goto End;\r
+    }\r
+\r
+    if (VerQueryValueA(Buffer, "\\", (LPVOID)&VerInfo, &VerLen) && VerLen != 0)\r
+    {\r
+        if (VerInfo->dwSignature == VS_FFI_SIGNATURE)\r
+        {\r
+            Major = HIWORD(VerInfo->dwFileVersionMS);\r
+            Minor = LOWORD(VerInfo->dwFileVersionMS);\r
+            Build = HIWORD(VerInfo->dwFileVersionLS);\r
+            Revision = LOWORD(VerInfo->dwFileVersionLS);\r
+\r
+            Log("FileVersionze: <%u %u %u %u>", Major, Minor, Build, Revision);\r
+\r
+            if (Major == 10 && Build > 20000)\r
+            {\r
+                Major = 11;\r
+            }\r
+\r
+            if (Major != 11)\r
+            {\r
+                Log("This is not Windows 11, not need to bypass.", Major);\r
+                goto End;\r
+            }\r
+        }\r
+    }\r
+\r
+    //Now we really need to bypass windows 11 check. create registry\r
+    HKEY hKey = NULL;\r
+    HKEY hSubKey = NULL;\r
+    LSTATUS Status;\r
+\r
+    Status = RegCreateKeyExA(HKEY_LOCAL_MACHINE, "System\\Setup", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwSize);\r
+    if (ERROR_SUCCESS != Status)\r
+    {\r
+        Log("Failed to create reg key System\\Setup %u %u", LASTERR, Status);\r
+        goto End;\r
+    }\r
+\r
+    Status = RegCreateKeyExA(hKey, "LabConfig", 0, NULL, 0, KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_CREATE_SUB_KEY, NULL, &hSubKey, &dwSize);\r
+    if (ERROR_SUCCESS != Status)\r
+    {\r
+        Log("Failed to create LabConfig reg  %u %u", LASTERR, Status);\r
+        goto End;\r
+    }\r
+\r
+    //set reg value\r
+    Status += RegSetValueExA(hSubKey, "BypassRAMCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+    Status += RegSetValueExA(hSubKey, "BypassTPMCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+    Status += RegSetValueExA(hSubKey, "BypassSecureBootCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+    Status += RegSetValueExA(hSubKey, "BypassStorageCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+    Status += RegSetValueExA(hSubKey, "BypassCPUCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+\r
+    Log("Create bypass registry %s %u", (Status == ERROR_SUCCESS) ? "SUCCESS" : "FAILED", Status);\r
+\r
+    Ret = 0;\r
+\r
+End:\r
+    if (Buffer)\r
+    {\r
+        free(Buffer);\r
+    }\r
+    \r
+    return Ret; \r
+}\r
+\r
+static BOOL CheckVentoyDisk(DWORD DiskNum)\r
+{\r
+    DWORD dwSize = 0;\r
+    CHAR PhyPath[128];\r
+    UINT8 SectorBuf[512];\r
+    HANDLE Handle;\r
+    UINT8 check[8] = { 0x56, 0x54, 0x00, 0x47, 0x65, 0x00, 0x48, 0x44 };\r
+\r
+    sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\PhysicalDrive%d", DiskNum);\r
+    Handle = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);\r
+    if (Handle == INVALID_HANDLE_VALUE)\r
+    {\r
+        Log("Could not open the disk<%s>, error:%u", PhyPath, GetLastError());\r
+        return FALSE;\r
+    }\r
+\r
+    if (!ReadFile(Handle, SectorBuf, sizeof(SectorBuf), &dwSize, NULL))\r
+    {\r
+        Log("ReadFile failed, dwSize:%u  error:%u", dwSize, GetLastError());\r
+        CloseHandle(Handle);\r
+        return FALSE;\r
+    }\r
+\r
+    CloseHandle(Handle);\r
+\r
+    if (memcmp(SectorBuf + 0x190, check, 8) == 0)\r
+    {\r
+        return TRUE;\r
+    }\r
+\r
+    return FALSE;\r
+}\r
+\r
+\r
 static int VentoyHook(ventoy_os_param *param)\r
 {\r
     int i;\r
     int rc;\r
     BOOL find = FALSE;\r
+    BOOL vtoyfind = FALSE;\r
     CHAR Letter;\r
+    CHAR MntLetter;\r
+    CHAR VtoyLetter;\r
     DWORD Drives;\r
+    DWORD NewDrives;\r
+    DWORD VtoyDiskNum;\r
+    UINT32 DiskSig;\r
+    UINT32 VtoySig;\r
        DISK_EXTENT DiskExtent;\r
+    DISK_EXTENT VtoyDiskExtent;\r
        UINT8 UUID[16];\r
        CHAR IsoPath[MAX_PATH];\r
 \r
@@ -1260,7 +1492,9 @@ static int VentoyHook(ventoy_os_param *param)
                 if (IsFileExist("%s", IsoPath))\r
                 {\r
                     Log("File exist under %C:", Letter);\r
-                    if (GetPhyDiskUUID(Letter, UUID, &DiskExtent) == 0)\r
+                    memset(UUID, 0, sizeof(UUID));\r
+                    memset(&DiskExtent, 0, sizeof(DiskExtent));\r
+                    if (GetPhyDiskUUID(Letter, UUID, NULL, &DiskExtent) == 0)\r
                     {\r
                         if (memcmp(UUID, param->vtoy_disk_guid, 16) == 0)\r
                         {\r
@@ -1299,16 +1533,121 @@ static int VentoyHook(ventoy_os_param *param)
 \r
        Log("Find ISO file <%s>", IsoPath);\r
     \r
-    rc = MountIsoFile(IsoPath, DiskExtent.DiskNumber);\r
+    //Find VtoyLetter in Vlnk Mode\r
+    if (g_os_param_reserved[6] == 1)\r
+    {\r
+        memcpy(&VtoySig, g_os_param_reserved + 7, 4);\r
+        for (i = 0; i < 5; i++)\r
+        {\r
+            VtoyLetter = 'A';\r
+            Drives = GetLogicalDrives();\r
+            Log("Logic Drives: 0x%x  VentoySig:%08X", Drives, VtoySig);\r
+\r
+            while (Drives)\r
+            {\r
+                if (Drives & 0x01)\r
+                {\r
+                    memset(UUID, 0, sizeof(UUID));\r
+                    memset(&VtoyDiskExtent, 0, sizeof(VtoyDiskExtent));\r
+                    DiskSig = 0;\r
+                    if (GetPhyDiskUUID(VtoyLetter, UUID, &DiskSig, &VtoyDiskExtent) == 0)\r
+                    {\r
+                        Log("DiskSig=%08X PartStart=%lld", DiskSig, VtoyDiskExtent.StartingOffset.QuadPart);\r
+                        if (DiskSig == VtoySig && VtoyDiskExtent.StartingOffset.QuadPart == SIZE_1MB)\r
+                        {\r
+                            Log("Ventoy Disk Sig match");\r
+                            vtoyfind = TRUE;\r
+                            break;\r
+                        }\r
+                    }\r
+                }\r
+\r
+                Drives >>= 1;\r
+                VtoyLetter++;\r
+            }\r
+\r
+            if (vtoyfind)\r
+            {\r
+                Log("Find Ventoy Letter: %C", VtoyLetter);\r
+                break;\r
+            }\r
+            else\r
+            {\r
+                Log("Now wait and retry ...");\r
+                Sleep(1000);\r
+            }\r
+        }\r
+\r
+        if (vtoyfind == FALSE)\r
+        {\r
+            Log("Failed to find ventoy disk");\r
+            return 1;\r
+        }\r
+\r
+        VtoyDiskNum = VtoyDiskExtent.DiskNumber;\r
+    }\r
+    else\r
+    {\r
+        VtoyLetter = Letter;\r
+        Log("No vlnk mode %C", Letter);\r
+\r
+        VtoyDiskNum = DiskExtent.DiskNumber;\r
+    }\r
+\r
+    if (CheckVentoyDisk(VtoyDiskNum))\r
+    {\r
+        Log("Disk check OK %C: %u", VtoyLetter, VtoyDiskNum);\r
+    }\r
+    else\r
+    {\r
+        Log("Failed to check ventoy disk %u", VtoyDiskNum);\r
+        return 1;\r
+    }\r
+\r
+    Drives = GetLogicalDrives();\r
+    Log("Drives before mount: 0x%x", Drives);\r
+\r
+    rc = MountIsoFile(IsoPath, VtoyDiskNum);\r
+\r
+    NewDrives = GetLogicalDrives();\r
+    Log("Drives after mount: 0x%x (0x%x)", NewDrives, (NewDrives ^ Drives));\r
+\r
+    MntLetter = 'A';\r
+    NewDrives = (NewDrives ^ Drives);\r
+    while (NewDrives)\r
+    {\r
+        if (NewDrives & 0x01)\r
+        {\r
+            if ((NewDrives >> 1) == 0)\r
+            {\r
+                Log("The ISO file is mounted at %C:", MntLetter);\r
+            }\r
+            else\r
+            {\r
+                Log("Maybe the ISO file is mounted at %C:", MntLetter);\r
+            }\r
+            break;\r
+        }\r
+\r
+        NewDrives >>= 1;\r
+        MntLetter++;\r
+    }\r
+\r
     Log("Mount ISO FILE: %s", rc == 0 ? "SUCCESS" : "FAILED");\r
 \r
+    //Windows 11 bypass check\r
+    if (g_windows_data.windows11_bypass_check == 1)\r
+    {\r
+        Windows11BypassCheck(IsoPath, MntLetter);\r
+    }\r
+\r
     // for protect\r
-    rc = DeleteVentoyPart2MountPoint(DiskExtent.DiskNumber);\r
+    rc = DeleteVentoyPart2MountPoint(VtoyDiskNum);\r
     Log("Delete ventoy mountpoint: %s", rc == 0 ? "SUCCESS" : "NO NEED");\r
     \r
     if (g_windows_data.auto_install_script[0])\r
     {\r
-        sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", Letter, g_windows_data.auto_install_script);\r
+        sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", VtoyLetter, g_windows_data.auto_install_script);\r
         if (IsFileExist("%s", IsoPath))\r
         {\r
             Log("use auto install script %s...", IsoPath);\r
@@ -1326,11 +1665,51 @@ static int VentoyHook(ventoy_os_param *param)
 \r
     if (g_windows_data.injection_archive[0])\r
     {\r
-        sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", Letter, g_windows_data.injection_archive);\r
+        sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", VtoyLetter, g_windows_data.injection_archive);\r
         if (IsFileExist("%s", IsoPath))\r
         {\r
             Log("decompress injection archive %s...", IsoPath);\r
-            DecompressInjectionArchive(IsoPath, DiskExtent.DiskNumber);\r
+            DecompressInjectionArchive(IsoPath, VtoyDiskNum);\r
+\r
+            if (IsFileExist("%s", AUTO_RUN_BAT))\r
+            {\r
+                HANDLE hOut;\r
+                DWORD flags = CREATE_NO_WINDOW;\r
+                CHAR StrBuf[1024];\r
+                STARTUPINFOA Si;\r
+                PROCESS_INFORMATION Pi;\r
+                SECURITY_ATTRIBUTES Sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };\r
+\r
+                Log("%s exist, now run it...", AUTO_RUN_BAT);\r
+\r
+                GetStartupInfoA(&Si);\r
+\r
+                hOut = CreateFileA(AUTO_RUN_LOG,\r
+                    FILE_APPEND_DATA,\r
+                    FILE_SHARE_WRITE | FILE_SHARE_READ,\r
+                    &Sa,\r
+                    OPEN_ALWAYS,\r
+                    FILE_ATTRIBUTE_NORMAL,\r
+                    NULL);\r
+\r
+                Si.dwFlags |= STARTF_USESTDHANDLES;\r
+                if (hOut != INVALID_HANDLE_VALUE)\r
+                {\r
+                    Si.hStdError = hOut;\r
+                    Si.hStdOutput = hOut;\r
+                }\r
+\r
+                sprintf_s(IsoPath, sizeof(IsoPath), "%C:\\%s", Letter, param->vtoy_img_path);\r
+                sprintf_s(StrBuf, sizeof(StrBuf), "cmd.exe /c %s \"%s\" %C", AUTO_RUN_BAT, IsoPath, MntLetter);\r
+                CreateProcessA(NULL, StrBuf, NULL, NULL, TRUE, flags, NULL, NULL, &Si, &Pi);\r
+                WaitForSingleObject(Pi.hProcess, INFINITE);\r
+\r
+                SAFE_CLOSE_HANDLE(hOut);\r
+            }\r
+            else\r
+            {\r
+                Log("%s not exist...", AUTO_RUN_BAT);\r
+            }\r
         }\r
         else\r
         {\r
@@ -1345,24 +1724,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 +1732,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 +1796,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 +1821,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 +1873,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 +1903,196 @@ 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
-\r
-    fopen_s(&fp, pidfile, "r");\r
-    if (!fp)\r
-    {\r
-        return 1;\r
-    }\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
-    while (fgets(line, sizeof(line), fp))\r
-    {\r
-        instance++;\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
-    fclose(fp);\r
-    return instance + 1;\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
-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
+       GetStartupInfoA(&Si);\r
+       memset(LunchFile, 0, sizeof(LunchFile));\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
+static void VentoyToUpper(CHAR *str)\r
+{\r
+    int i;\r
+    for (i = 0; str[i]; i++)\r
     {\r
-        rc = VentoyJump(argc, argv, LunchFile);\r
+        str[i] = (CHAR)toupper(str[i]);\r
     }\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
+       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
+               return real_main(argc - 1, argv + 1);\r
+       }\r
+       else if (_stricmp(g_prog_name, "PECMD.exe") == 0)\r
+       {\r
+        strcpy_s(NewArgv0, sizeof(NewArgv0), g_prog_dir);\r
+        VentoyToUpper(NewArgv0);\r
+        \r
+        if (NULL == strstr(NewArgv0, "SYSTEM32") && IsFileExist(ORG_PECMD_BK_PATH))\r
         {\r
-            strcat_s(LunchFile, sizeof(LunchFile), CallParam);\r
+            Log("Just call original pecmd.exe");\r
+            strcpy_s(CallParam, sizeof(CallParam), ORG_PECMD_PATH);\r
         }\r
-        else if (NULL == strstr(LunchFile, "setup.exe"))\r
+        else\r
         {\r
-            Log("Not setup.exe, hide windows.");\r
-            Si.dwFlags |= STARTF_USESHOWWINDOW;\r
-            Si.wShowWindow = SW_HIDE;\r
-        }        \r
-\r
-        Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed");\r
-    }\r
-    \r
-    Log("Now launch <%s> ...", LunchFile);\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
+        }\r
+               \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