]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
Support WinPE which contains pecmd.exe
authorlongpanda <admin@ventoy.net>
Thu, 15 Jul 2021 17:03:01 +0000 (01:03 +0800)
committerlongpanda <admin@ventoy.net>
Thu, 15 Jul 2021 17:03:01 +0000 (01:03 +0800)
EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/lzx.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c
INSTALL/ventoy/vtoyjump32.exe
INSTALL/ventoy/vtoyjump64.exe
INSTALL/ventoy_pack.sh
vtoyjump/vtoyjump/vtoyjump.c

index f9323cb933e5a86442e582e21a2540d9a257ba5a..2ba882b3e33bcd46bf0b89971064ee981b470643 100644 (file)
@@ -483,6 +483,8 @@ EFI_STATUS EFIAPI ventoy_block_io_read_real
         secNum = VirtSec - Lba;
     }
 
         secNum = VirtSec - Lba;
     }
 
+    debug("XXX block_io_read_real sector:%u count:%u Buffer:%p", (UINT32)Lba, (UINT32)BufferSize / 2048, Buffer);
+
     if (secNum > g_sector_flag_num)
     {
         cur_flag = AllocatePool(secNum * sizeof(ventoy_sector_flag));
     if (secNum > g_sector_flag_num)
     {
         cur_flag = AllocatePool(secNum * sizeof(ventoy_sector_flag));
index 56dd7dd25efb2ec65ad00ac3cde1df8c239b3c5e..732a96f2a1d7e2ef41290b4eef2e7a3cf9562c74 100644 (file)
@@ -462,6 +462,8 @@ static int lzx_uncompressed ( struct lzx *lzx ) {
        if ( len % 2 )
                lzx->input.offset++;
 
        if ( len % 2 )
                lzx->input.offset++;
 
+    lzx->output.offset += len;
+
        return 0;
 }
 
        return 0;
 }
 
@@ -614,7 +616,7 @@ ssize_t lzx_decompress ( const void *data, size_t len, void *buf ) {
        /* Sanity check */
        if ( len % 2 ) {
                DBG ( "LZX cannot handle odd-length input data\n" );
        /* Sanity check */
        if ( len % 2 ) {
                DBG ( "LZX cannot handle odd-length input data\n" );
-               return -1;
+               //return -1;
        }
 
        /* Initialise global state, if required */
        }
 
        /* Initialise global state, if required */
index 5d08fa68c0b91b00b9dbfe375ec03f34754162f6..3bcadc4d95672ad07f7e035090fae7d085b86ee9 100644 (file)
@@ -548,6 +548,8 @@ static int ventoy_read_resource(grub_file_t fp, wim_header *wimhdr, wim_resource
     chunk_num = (head->raw_size + WIM_CHUNK_LEN - 1) / WIM_CHUNK_LEN;
     cur_offset = (chunk_num - 1) * 4;
     chunk_offset = (grub_uint32_t *)buffer_compress;
     chunk_num = (head->raw_size + WIM_CHUNK_LEN - 1) / WIM_CHUNK_LEN;
     cur_offset = (chunk_num - 1) * 4;
     chunk_offset = (grub_uint32_t *)buffer_compress;
+
+    //debug("%llu %llu chunk_num=%lu", (ulonglong)head->size_in_wim, (ulonglong)head->raw_size, chunk_num);
     
     cur_dst = buffer_decompress;
     
     
     cur_dst = buffer_decompress;
     
@@ -600,9 +602,11 @@ static int ventoy_read_resource(grub_file_t fp, wim_header *wimhdr, wim_resource
             decompress_len = (int)lzx_decompress(buffer_compress + cur_offset, head->size_in_wim - cur_offset, cur_dst);
         }
     }
             decompress_len = (int)lzx_decompress(buffer_compress + cur_offset, head->size_in_wim - cur_offset, cur_dst);
         }
     }
-    
+
     cur_dst += decompress_len;
     total_decompress += decompress_len;
     cur_dst += decompress_len;
     total_decompress += decompress_len;
+    
+    //debug("last chunk_size:%u decompresslen:%d tot:%d\n", last_chunk_size, decompress_len, total_decompress);
 
     if (cur_dst != buffer_decompress + head->raw_size)
     {
 
     if (cur_dst != buffer_decompress + head->raw_size)
     {
@@ -656,25 +660,31 @@ static wim_directory_entry * search_full_wim_dirent
 
 static wim_directory_entry * search_replace_wim_dirent(void *meta_data, wim_directory_entry *dir)
 {
 
 static wim_directory_entry * search_replace_wim_dirent(void *meta_data, wim_directory_entry *dir)
 {
-    wim_directory_entry *wim_dirent = NULL;
+    wim_directory_entry *wim_dirent1 = NULL;
+    wim_directory_entry *wim_dirent2 = NULL;
+    const char *pecmd_path[] = { "Windows", "System32", "pecmd.exe", NULL };
+    const char *wpeinit_path[] = { "Windows", "System32", "wpeinit.exe", NULL };
     const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL };
     const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL };
-    //const char *native_path[] = { "Windows", "System32", "native.exe", NULL };
 
 
-    wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path);
-    debug("search winpeshl.exe %p\n", wim_dirent);
-    if (wim_dirent)
+    wim_dirent1 = search_full_wim_dirent(meta_data, dir, pecmd_path);
+    debug("search pecmd.exe %p\n", wim_dirent1);
+    if (wim_dirent1)
     {
     {
-        return wim_dirent;
+        wim_dirent2 = search_full_wim_dirent(meta_data, dir, wpeinit_path);
+        debug("search wpeinit.exe %p\n", wim_dirent1);
+        if (wim_dirent2)
+        {
+            return wim_dirent2;
+        }
+        return wim_dirent1;
     }
 
     }
 
-    #if 0
-    wim_dirent = search_full_wim_dirent(meta_data, dir, native_path);
-    debug("search native.exe %p\n", wim_dirent);
-    if (wim_dirent)
+    wim_dirent1 = search_full_wim_dirent(meta_data, dir, winpeshl_path);
+    debug("search winpeshl.exe %p\n", wim_dirent1);
+    if (wim_dirent1)
     {
     {
-        return wim_dirent;
+        return wim_dirent1;
     }
     }
-    #endif
 
     return NULL;
 }
 
     return NULL;
 }
index 1c7bea1f15a5527639bee37e42c16c3348bdd62f..d0535a502cda3ec07cc3415e211a3fb4b31b5a8c 100644 (file)
Binary files a/INSTALL/ventoy/vtoyjump32.exe and b/INSTALL/ventoy/vtoyjump32.exe differ
index a0d605629b30d3b2b6524fe45f4b54f12ac2af8e..73cd8eed4260824b3ae1ea0f9cad19f69d137036 100644 (file)
Binary files a/INSTALL/ventoy/vtoyjump64.exe and b/INSTALL/ventoy/vtoyjump64.exe differ
index 08e2121d9f4449034039d406f3b8f743defe367d..e9b1a1c507154d4ef4796b598c5dfce4b1e985f6 100644 (file)
@@ -146,6 +146,7 @@ chmod +x $tmpdir/VentoyWeb.sh
 chmod +x $tmpdir/VentoyWebDeepin.sh
 #chmod +x $tmpdir/Ventoy.desktop
 chmod +x $tmpdir/CreatePersistentImg.sh
 chmod +x $tmpdir/VentoyWebDeepin.sh
 #chmod +x $tmpdir/Ventoy.desktop
 chmod +x $tmpdir/CreatePersistentImg.sh
+chmod +x $tmpdir/ExtendPersistentImg.sh
 
 tar -czvf ventoy-${curver}-linux.tar.gz $tmpdir
 
 
 tar -czvf ventoy-${curver}-linux.tar.gz $tmpdir
 
index 9b10d1af5d55f7e036a4272d75fcccd7896f6576..eb9bb02268d618cab1449f21cab055751b3f9e18 100644 (file)
@@ -309,11 +309,44 @@ static int Utf8ToUtf16(const char* src, WCHAR * dst)
     return MultiByteToWideChar(CP_UTF8, 0, src, -1, dst, size + 1);\r
 }\r
 \r
     return MultiByteToWideChar(CP_UTF8, 0, src, -1, dst, size + 1);\r
 }\r
 \r
-static BOOL IsPathExist(BOOL Dir, const char *Fmt, ...)\r
+static BOOL IsDirExist(const char *Fmt, ...)\r
+{\r
+    va_list Arg;    \r
+    DWORD Attr;\r
+    int UTF8 = 0;\r
+    CHAR FilePathA[MAX_PATH];\r
+    WCHAR FilePathW[MAX_PATH];\r
+\r
+    va_start(Arg, Fmt);\r
+    vsnprintf_s(FilePathA, sizeof(FilePathA), sizeof(FilePathA), Fmt, Arg);\r
+    va_end(Arg);\r
+\r
+    UTF8 = IsUTF8Encode(FilePathA);\r
+\r
+    if (UTF8)\r
+    {\r
+        Utf8ToUtf16(FilePathA, FilePathW);\r
+        Attr = GetFileAttributesW(FilePathW);\r
+    }\r
+    else\r
+    {\r
+        Attr = GetFileAttributesA(FilePathA);\r
+    }\r
+    \r
+    if (Attr != INVALID_FILE_ATTRIBUTES && (Attr & FILE_ATTRIBUTE_DIRECTORY))\r
+    {\r
+        return TRUE;\r
+    }\r
+\r
+    return FALSE;\r
+}\r
+\r
+static BOOL IsFileExist(const char *Fmt, ...)\r
 {\r
        va_list Arg;\r
        HANDLE hFile;\r
        DWORD Attr;\r
 {\r
        va_list Arg;\r
        HANDLE hFile;\r
        DWORD Attr;\r
+    BOOL bRet = FALSE;\r
     int UTF8 = 0;\r
        CHAR FilePathA[MAX_PATH];\r
        WCHAR FilePathW[MAX_PATH];\r
     int UTF8 = 0;\r
        CHAR FilePathA[MAX_PATH];\r
        WCHAR FilePathW[MAX_PATH];\r
@@ -335,7 +368,7 @@ static BOOL IsPathExist(BOOL Dir, const char *Fmt, ...)
     }\r
        if (INVALID_HANDLE_VALUE == hFile)\r
        {\r
     }\r
        if (INVALID_HANDLE_VALUE == hFile)\r
        {\r
-               return FALSE;\r
+        goto out;\r
        }\r
 \r
        CloseHandle(hFile);\r
        }\r
 \r
        CloseHandle(hFile);\r
@@ -349,22 +382,16 @@ static BOOL IsPathExist(BOOL Dir, const char *Fmt, ...)
         Attr = GetFileAttributesA(FilePathA);\r
     }\r
        \r
         Attr = GetFileAttributesA(FilePathA);\r
     }\r
        \r
-       if (Dir)\r
-       {\r
-               if ((Attr & FILE_ATTRIBUTE_DIRECTORY) == 0)\r
-               {\r
-                       return FALSE;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               if (Attr & FILE_ATTRIBUTE_DIRECTORY)\r
-               {\r
-                       return FALSE;\r
-               }\r
-       }\r
+    if (Attr & FILE_ATTRIBUTE_DIRECTORY)\r
+    {\r
+        goto out;\r
+    }\r
 \r
 \r
-       return TRUE;\r
+    bRet = TRUE;\r
+\r
+out:\r
+    Log("File <%s> %s", FilePathA, (bRet ? "exist" : "NOT exist"));\r
+    return bRet;\r
 }\r
 \r
 static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *DiskExtent)\r
 }\r
 \r
 static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *DiskExtent)\r
@@ -425,6 +452,121 @@ static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *Dis
        return 0;\r
 }\r
 \r
        return 0;\r
 }\r
 \r
+static int VentoyMountAnywhere(HANDLE Handle)\r
+{\r
+    DWORD Status;\r
+    ATTACH_VIRTUAL_DISK_PARAMETERS AttachParameters;\r
+\r
+    Log("VentoyMountAnywhere");\r
+\r
+    memset(&AttachParameters, 0, sizeof(AttachParameters));\r
+    AttachParameters.Version = ATTACH_VIRTUAL_DISK_VERSION_1;\r
+\r
+    Status = AttachVirtualDisk(Handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, 0, &AttachParameters, NULL);\r
+    if (Status != ERROR_SUCCESS)\r
+    {\r
+        Log("Failed to attach virtual disk ErrorCode:%u", Status);\r
+        return 1;\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+int VentoyMountY(HANDLE Handle)\r
+{\r
+    int  i;\r
+    BOOL  bRet = FALSE;\r
+    DWORD Status;\r
+    DWORD physicalDriveNameSize;\r
+    CHAR *Pos = NULL;\r
+    WCHAR physicalDriveName[MAX_PATH];\r
+    CHAR physicalDriveNameA[MAX_PATH];\r
+    CHAR cdromDriveName[MAX_PATH];\r
+    ATTACH_VIRTUAL_DISK_PARAMETERS AttachParameters;\r
+\r
+    Log("VentoyMountY");\r
+\r
+    memset(&AttachParameters, 0, sizeof(AttachParameters));\r
+    AttachParameters.Version = ATTACH_VIRTUAL_DISK_VERSION_1;\r
+\r
+    Status = AttachVirtualDisk(Handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER | ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, 0, &AttachParameters, NULL);\r
+    if (Status != ERROR_SUCCESS)\r
+    {\r
+        Log("Failed to attach virtual disk ErrorCode:%u", Status);\r
+        return 1;\r
+    }\r
+\r
+    memset(physicalDriveName, 0, sizeof(physicalDriveName));\r
+    memset(physicalDriveNameA, 0, sizeof(physicalDriveNameA));\r
+\r
+    physicalDriveNameSize = MAX_PATH;\r
+    Status = GetVirtualDiskPhysicalPath(Handle, &physicalDriveNameSize, physicalDriveName);\r
+    if (Status != ERROR_SUCCESS)\r
+    {\r
+        Log("Failed GetVirtualDiskPhysicalPath ErrorCode:%u", Status);\r
+        return 1;\r
+    }\r
+\r
+    for (i = 0; physicalDriveName[i]; i++)\r
+    {\r
+        physicalDriveNameA[i] = toupper((CHAR)(physicalDriveName[i]));\r
+    }\r
+\r
+    Log("physicalDriveNameA=<%s>", physicalDriveNameA);\r
+\r
+    Pos = strstr(physicalDriveNameA, "CDROM");\r
+    if (!Pos)\r
+    {\r
+        Log("Not cdrom phy drive");\r
+        return 1;\r
+    }\r
+\r
+    sprintf_s(cdromDriveName, sizeof(cdromDriveName), "\\Device\\%s", Pos);\r
+    Log("cdromDriveName=<%s>", cdromDriveName);\r
+\r
+    for (i = 0; i < 3 && (bRet == FALSE); i++)\r
+    {\r
+        Sleep(1000);\r
+        bRet = DefineDosDeviceA(DDD_RAW_TARGET_PATH, "Y:", cdromDriveName);\r
+        Log("DefineDosDeviceA %s", bRet ? "success" : "failed");\r
+    }\r
+\r
+    return bRet ? 0 : 1;\r
+}\r
+\r
+static BOOL VentoyNeedMountY(const char *IsoPath)\r
+{\r
+    /* TBD */\r
+    return FALSE;\r
+}\r
+\r
+static int VentoyAttachVirtualDisk(HANDLE Handle, const char *IsoPath)\r
+{\r
+    int DriveYFree;\r
+    DWORD Drives;\r
+    \r
+    Drives = GetLogicalDrives();\r
+    if ((1 << 24) & Drives)\r
+    {\r
+        Log("Y: is occupied");\r
+        DriveYFree = 0;\r
+    }\r
+    else\r
+    {\r
+        Log("Y: is free now");\r
+        DriveYFree = 1;\r
+    }\r
+\r
+    if (DriveYFree && VentoyNeedMountY(IsoPath))\r
+    {\r
+        return VentoyMountY(Handle);\r
+    }\r
+    else\r
+    {\r
+        return VentoyMountAnywhere(Handle);\r
+    }\r
+}\r
+\r
 int VentoyMountISOByAPI(const char *IsoPath)\r
 {\r
        HANDLE Handle;\r
 int VentoyMountISOByAPI(const char *IsoPath)\r
 {\r
        HANDLE Handle;\r
@@ -432,7 +574,6 @@ int VentoyMountISOByAPI(const char *IsoPath)
        WCHAR wFilePath[512] = { 0 };\r
        VIRTUAL_STORAGE_TYPE StorageType;\r
        OPEN_VIRTUAL_DISK_PARAMETERS OpenParameters;\r
        WCHAR wFilePath[512] = { 0 };\r
        VIRTUAL_STORAGE_TYPE StorageType;\r
        OPEN_VIRTUAL_DISK_PARAMETERS OpenParameters;\r
-       ATTACH_VIRTUAL_DISK_PARAMETERS AttachParameters;\r
 \r
        Log("VentoyMountISOByAPI <%s>", IsoPath);\r
 \r
 \r
        Log("VentoyMountISOByAPI <%s>", IsoPath);\r
 \r
@@ -447,10 +588,8 @@ int VentoyMountISOByAPI(const char *IsoPath)
 \r
        memset(&StorageType, 0, sizeof(StorageType));\r
        memset(&OpenParameters, 0, sizeof(OpenParameters));\r
 \r
        memset(&StorageType, 0, sizeof(StorageType));\r
        memset(&OpenParameters, 0, sizeof(OpenParameters));\r
-       memset(&AttachParameters, 0, sizeof(AttachParameters));\r
-\r
+       \r
        OpenParameters.Version = OPEN_VIRTUAL_DISK_VERSION_1;\r
        OpenParameters.Version = OPEN_VIRTUAL_DISK_VERSION_1;\r
-       AttachParameters.Version = ATTACH_VIRTUAL_DISK_VERSION_1;\r
 \r
        Status = OpenVirtualDisk(&StorageType, wFilePath, VIRTUAL_DISK_ACCESS_READ, 0, &OpenParameters, &Handle);\r
        if (Status != ERROR_SUCCESS)\r
 \r
        Status = OpenVirtualDisk(&StorageType, wFilePath, VIRTUAL_DISK_ACCESS_READ, 0, &OpenParameters, &Handle);\r
        if (Status != ERROR_SUCCESS)\r
@@ -468,7 +607,7 @@ int VentoyMountISOByAPI(const char *IsoPath)
 \r
        Log("OpenVirtualDisk success");\r
 \r
 \r
        Log("OpenVirtualDisk success");\r
 \r
-       Status = AttachVirtualDisk(Handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, 0, &AttachParameters, NULL);\r
+    Status = VentoyAttachVirtualDisk(Handle, IsoPath);\r
        if (Status != ERROR_SUCCESS)\r
        {\r
                Log("Failed to attach virtual disk ErrorCode:%u", Status);\r
        if (Status != ERROR_SUCCESS)\r
        {\r
                Log("Failed to attach virtual disk ErrorCode:%u", Status);\r
@@ -476,6 +615,8 @@ int VentoyMountISOByAPI(const char *IsoPath)
                return 1;\r
        }\r
 \r
                return 1;\r
        }\r
 \r
+    Log("VentoyAttachVirtualDisk success");\r
+\r
        CloseHandle(Handle);\r
        return 0;\r
 }\r
        CloseHandle(Handle);\r
        return 0;\r
 }\r
@@ -789,7 +930,7 @@ static int DeleteVentoyPart2MountPoint(DWORD PhyDrive)
     Drives = GetLogicalDrives();\r
     while (Drives)\r
     {\r
     Drives = GetLogicalDrives();\r
     while (Drives)\r
     {\r
-        if ((Drives & 0x01) && IsPathExist(FALSE, "%C:\\ventoy\\ventoy.cpio", Letter))\r
+        if ((Drives & 0x01) && IsFileExist("%C:\\ventoy\\ventoy.cpio", Letter))\r
         {\r
             Log("File %C:\\ventoy\\ventoy.cpio exist", Letter);\r
 \r
         {\r
             Log("File %C:\\ventoy\\ventoy.cpio exist", Letter);\r
 \r
@@ -1010,7 +1151,7 @@ static int VentoyHook(ventoy_os_param *param)
         if (Drives & 0x01)\r
         {\r
             sprintf_s(IsoPath, sizeof(IsoPath), "%C:\\%s", Letter, param->vtoy_img_path);\r
         if (Drives & 0x01)\r
         {\r
             sprintf_s(IsoPath, sizeof(IsoPath), "%C:\\%s", Letter, param->vtoy_img_path);\r
-            if (IsPathExist(FALSE, "%s", IsoPath))\r
+            if (IsFileExist("%s", IsoPath))\r
             {\r
                 Log("File exist under %C:", Letter);\r
                 if (GetPhyDiskUUID(Letter, UUID, &DiskExtent) == 0)\r
             {\r
                 Log("File exist under %C:", Letter);\r
                 if (GetPhyDiskUUID(Letter, UUID, &DiskExtent) == 0)\r
@@ -1050,7 +1191,7 @@ static int VentoyHook(ventoy_os_param *param)
     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
     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
-        if (IsPathExist(FALSE, "%s", IsoPath))\r
+        if (IsFileExist("%s", IsoPath))\r
         {\r
             Log("use auto install script %s...", IsoPath);\r
             ProcessUnattendedInstallation(IsoPath);\r
         {\r
             Log("use auto install script %s...", IsoPath);\r
             ProcessUnattendedInstallation(IsoPath);\r
@@ -1068,7 +1209,7 @@ static int VentoyHook(ventoy_os_param *param)
     if (g_windows_data.injection_archive[0])\r
     {\r
         sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", Letter, g_windows_data.injection_archive);\r
     if (g_windows_data.injection_archive[0])\r
     {\r
         sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", Letter, g_windows_data.injection_archive);\r
-        if (IsPathExist(FALSE, "%s", IsoPath))\r
+        if (IsFileExist("%s", IsoPath))\r
         {\r
             Log("decompress injection archive %s...", IsoPath);\r
             DecompressInjectionArchive(IsoPath, DiskExtent.DiskNumber);\r
         {\r
             Log("decompress injection archive %s...", IsoPath);\r
             DecompressInjectionArchive(IsoPath, DiskExtent.DiskNumber);\r
@@ -1173,12 +1314,12 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
        CHAR ExeFileName[MAX_PATH];\r
 \r
        sprintf_s(ExeFileName, sizeof(ExeFileName), "%s", argv[0]);\r
        CHAR ExeFileName[MAX_PATH];\r
 \r
        sprintf_s(ExeFileName, sizeof(ExeFileName), "%s", argv[0]);\r
-       if (!IsPathExist(FALSE, "%s", ExeFileName))\r
+       if (!IsFileExist("%s", ExeFileName))\r
        {\r
                Log("File %s NOT exist, now try %s.exe", ExeFileName, ExeFileName);\r
                sprintf_s(ExeFileName, sizeof(ExeFileName), "%s.exe", argv[0]);\r
 \r
        {\r
                Log("File %s NOT exist, now try %s.exe", ExeFileName, ExeFileName);\r
                sprintf_s(ExeFileName, sizeof(ExeFileName), "%s.exe", argv[0]);\r
 \r
-               Log("File %s exist ? %s", ExeFileName, IsPathExist(FALSE, "%s", ExeFileName) ? "YES" : "NO");\r
+               Log("File %s exist ? %s", ExeFileName, IsFileExist("%s", ExeFileName) ? "YES" : "NO");\r
        }\r
 \r
        if (ReadWholeFile2Buf(ExeFileName, (void **)&Buffer, &FileSize))\r
        }\r
 \r
        if (ReadWholeFile2Buf(ExeFileName, (void **)&Buffer, &FileSize))\r
@@ -1189,8 +1330,13 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
        g_64bit_system = IsPe64(Buffer);\r
     Log("VentoyJump %dbit", g_64bit_system ? 64 : 32);\r
 \r
        g_64bit_system = IsPe64(Buffer);\r
     Log("VentoyJump %dbit", g_64bit_system ? 64 : 32);\r
 \r
-       if (!IsPathExist(TRUE, "ventoy"))\r
+    if (IsDirExist("ventoy"))\r
+    {\r
+        Log("ventoy directory already exist");\r
+    }\r
+    else\r
        {\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
                if (!CreateDirectoryA("ventoy", NULL))\r
                {\r
                        Log("Failed to create ventoy directory err:%u", GetLastError());\r
@@ -1226,6 +1372,14 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
 \r
                        PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data);\r
                        sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName));\r
 \r
                        PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data);\r
                        sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName));\r
+\r
+            if (IsFileExist("%s", LunchFile))\r
+            {\r
+                Log("vtoyjump multiple call...");\r
+                rc = 0;\r
+                goto End;\r
+            }\r
+\r
                        SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart);\r
                        break;\r
                }\r
                        SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart);\r
                        break;\r
                }\r
@@ -1256,6 +1410,120 @@ End:
        return rc;\r
 }\r
 \r
        return rc;\r
 }\r
 \r
+static int GetPecmdParam(const char *argv, char *CallParamBuf, DWORD BufLen)\r
+{\r
+    HKEY hKey;\r
+    LSTATUS Ret;\r
+    DWORD dw;\r
+    DWORD Type;\r
+    CHAR *Pos = NULL;\r
+    CHAR CallParam[256] = { 0 };\r
+    CHAR FileName[MAX_PATH];\r
+\r
+    Log("GetPecmdParam <%s>", argv);\r
+\r
+    *CallParamBuf = 0;\r
+\r
+    strcpy_s(FileName, sizeof(FileName), argv);\r
+    for (dw = 0, Pos = FileName; *Pos; Pos++)\r
+    {\r
+        dw++;\r
+        *Pos = toupper(*Pos);\r
+    }\r
+\r
+    Log("dw=%lu argv=<%s>", dw, FileName);\r
+\r
+    if (dw >= 9 && strcmp(FileName + dw - 9, "PECMD.EXE") == 0)\r
+    {\r
+        Log("Get parameters for pecmd.exe");\r
+        Ret = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "System\\Setup", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dw);\r
+        if (ERROR_SUCCESS == Ret)\r
+        {\r
+            memset(FileName, 0, sizeof(FileName));\r
+            dw = sizeof(FileName);\r
+            Ret = RegQueryValueEx(hKey, "CmdLine", NULL, &Type, FileName, &dw);\r
+            if (ERROR_SUCCESS == Ret && Type == REG_SZ)\r
+            {\r
+                strcpy_s(CallParam, sizeof(CallParam), FileName);\r
+                Log("CmdLine:<%s>", CallParam);\r
+\r
+                if (_strnicmp(CallParam, "PECMD.EXE", 9) == 0)\r
+                {\r
+                    Pos = CallParam + 9;\r
+                    if (*Pos == ' ' || *Pos == '\t')\r
+                    {\r
+                        Pos++;\r
+                    }\r
+                }\r
+                else\r
+                {\r
+                    Pos = CallParam;\r
+                }\r
+\r
+                Log("CmdLine2:<%s>", Pos);\r
+                sprintf_s(CallParamBuf, BufLen, " %s", Pos);\r
+            }\r
+            else\r
+            {\r
+                Log("Failed to RegQueryValueEx %lu %lu", Ret, Type);\r
+            }\r
+\r
+            RegCloseKey(hKey);\r
+            return 1;\r
+        }\r
+        else\r
+        {\r
+            Log("Failed to create reg key %lu", Ret);\r
+        }\r
+    }\r
+    else\r
+    {\r
+        Log("This is NOT pecmd.exe");\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+static int GetWpeInitParam(char **argv, int argc, char *CallParamBuf, DWORD BufLen)\r
+{\r
+    int i;\r
+    DWORD dw;\r
+    CHAR *Pos = NULL;\r
+    CHAR FileName[MAX_PATH];\r
+\r
+    Log("GetWpeInitParam argc=%d", argc);\r
+\r
+    *CallParamBuf = 0;\r
+\r
+    strcpy_s(FileName, sizeof(FileName), argv[0]);\r
+    for (dw = 0, Pos = FileName; *Pos; Pos++)\r
+    {\r
+        dw++;\r
+        *Pos = toupper(*Pos);\r
+    }\r
+\r
+    Log("dw=%lu argv=<%s>", dw, FileName);\r
+\r
+    if (dw >= 11 && strcmp(FileName + dw - 11, "WPEINIT.EXE") == 0)\r
+    {\r
+        Log("Get parameters for WPEINIT.EXE");\r
+        for (i = 1; i < argc; i++)\r
+        {\r
+            strcat_s(CallParamBuf, BufLen, " ");\r
+            strcat_s(CallParamBuf, BufLen, argv[i]);\r
+        }\r
+\r
+        return 1;\r
+    }\r
+    else\r
+    {\r
+        Log("This is NOT wpeinit.exe");\r
+    }\r
+    \r
+    return 0;\r
+}\r
+\r
+\r
 int main(int argc, char **argv)\r
 {\r
     int i = 0;\r
 int main(int argc, char **argv)\r
 {\r
     int i = 0;\r
@@ -1263,6 +1531,7 @@ int main(int argc, char **argv)
        CHAR *Pos = NULL;\r
        CHAR CurDir[MAX_PATH];\r
        CHAR LunchFile[MAX_PATH];\r
        CHAR *Pos = NULL;\r
        CHAR CurDir[MAX_PATH];\r
        CHAR LunchFile[MAX_PATH];\r
+    CHAR CallParam[1024] = { 0 };\r
        STARTUPINFOA Si;\r
        PROCESS_INFORMATION Pi;\r
 \r
        STARTUPINFOA Si;\r
        PROCESS_INFORMATION Pi;\r
 \r
@@ -1297,6 +1566,11 @@ int main(int argc, char **argv)
                Log("Current directory = <%s>", CurDir);\r
        }\r
 \r
                Log("Current directory = <%s>", CurDir);\r
        }\r
 \r
+    if (0 == GetWpeInitParam(argv, argc, CallParam, sizeof(CallParam)))\r
+    {\r
+        GetPecmdParam(argv[0], CallParam, sizeof(CallParam));\r
+    }\r
+\r
     GetStartupInfoA(&Si);\r
 \r
     memset(LunchFile, 0, sizeof(LunchFile));\r
     GetStartupInfoA(&Si);\r
 \r
     memset(LunchFile, 0, sizeof(LunchFile));\r
@@ -1310,6 +1584,8 @@ int main(int argc, char **argv)
         rc = VentoyJump(argc, argv, LunchFile);\r
     }\r
 \r
         rc = VentoyJump(argc, argv, LunchFile);\r
     }\r
 \r
+    Log("LunchFile=<%s> CallParam=<%s>", LunchFile, CallParam);\r
+\r
     if (g_os_param_reserved[0] == 3)\r
     {\r
         Log("Open log for debug ...");\r
     if (g_os_param_reserved[0] == 3)\r
     {\r
         Log("Open log for debug ...");\r
@@ -1317,28 +1593,35 @@ int main(int argc, char **argv)
     }\r
     else\r
     {\r
     }\r
     else\r
     {\r
-        if (NULL == strstr(LunchFile, "setup.exe"))\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
             Log("Not setup.exe, hide windows.");\r
             Si.dwFlags |= STARTF_USESHOWWINDOW;\r
             Si.wShowWindow = SW_HIDE;\r
-        }\r
-        \r
+        }        \r
+\r
         Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed");\r
     }\r
     \r
     Log("Now launch <%s> ...", LunchFile);\r
         Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed");\r
     }\r
     \r
     Log("Now launch <%s> ...", LunchFile);\r
-       CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
 \r
 \r
-    while (rc)\r
+    //sprintf_s(LunchFile, sizeof(LunchFile), "%s", "cmd.exe");\r
+    CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+\r
+    for (i = 0; rc && i < 10; i++)\r
     {\r
         Log("Ventoy hook failed, now wait and retry ...");\r
         Sleep(1000);\r
     {\r
         Log("Ventoy hook failed, now wait and retry ...");\r
         Sleep(1000);\r
-\r
         rc = VentoyHook(&g_os_param);\r
     }\r
 \r
         rc = VentoyHook(&g_os_param);\r
     }\r
 \r
-       WaitForSingleObject(Pi.hProcess, INFINITE);\r
+    Log("Wait process...");\r
+    WaitForSingleObject(Pi.hProcess, INFINITE);\r
 \r
 \r
+    Log("vtoyjump finished");\r
        return 0;\r
 }\r
        return 0;\r
 }\r