From 12387fff816c50e016bb6c22d1411f71af1a15e4 Mon Sep 17 00:00:00 2001 From: longpanda Date: Thu, 7 May 2026 11:17:57 +0800 Subject: [PATCH] Fix the boot issue for some WinPE iso. --- INSTALL/ventoy/vtoyjump32.exe | Bin 151040 -> 151040 bytes INSTALL/ventoy/vtoyjump64.exe | Bin 173568 -> 173568 bytes vtoyjump/build.bat | 58 ++++++++++++++ vtoyjump/vtoyjump/vtoyjump.c | 146 +++++++++++++++++++--------------- 4 files changed, 141 insertions(+), 63 deletions(-) create mode 100644 vtoyjump/build.bat diff --git a/INSTALL/ventoy/vtoyjump32.exe b/INSTALL/ventoy/vtoyjump32.exe index 64a66e8356ea2e3d0b3bd5a914d71edbd2bed970..ff94de4d35e444bd5a253b4d33a45fc3794158e0 100644 GIT binary patch delta 13961 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 JoxS4q{{Y|4VkH0o delta 13778 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 VthJ_#=6h%zM{p`Dc&y+g{|glNA?yGE diff --git a/INSTALL/ventoy/vtoyjump64.exe b/INSTALL/ventoy/vtoyjump64.exe index 3b118a4c1329e734611e4708cd9a3b9e5f3af97b..fb6ea27f417adfc49c048c858cd45c784059d30b 100644 GIT binary patch delta 19031 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 diff --git a/vtoyjump/build.bat b/vtoyjump/build.bat new file mode 100644 index 00000000..6904fe6b --- /dev/null +++ b/vtoyjump/build.bat @@ -0,0 +1,58 @@ +@echo off +chcp 65001 +echo ============================================== +echo VS 命令行双架构编译脚本 +echo ============================================== + +:: ====================== 【必须改这里】====================== +:: 1. 你的 VS 版本对应的 VsDevCmd.bat 路径(看下面的路径对照表) +set "VS_DEV_CMD=%VS120COMNTOOLS%VsDevCmd.bat" +:: 2. 你的 VS 解决方案文件名(.sln) +set "SLN_FILE=vtoyjump.sln" +:: ========================================================== + +:: 初始化VS编译环境(必须第一步) +echo 正在初始化 VS 编译环境... +call "%VS_DEV_CMD%" -no_logo +if %errorlevel% neq 0 ( + echo 错误:VS环境初始化失败!检查路径是否正确 + pause + exit /b 1 +) + +:: ============== 编译 Release Win32 (x86) ============== +echo. +echo 正在编译:Release Win32 +MSBuild "%SLN_FILE%" /t:Build /p:Configuration=Release;Platform=Win32 /m +if %errorlevel% neq 0 ( + echo 编译 Release Win32 失败! + pause + exit /b 1 +) + + +:: ============== 编译 Release x64 ============== +echo. +echo 正在编译:Release x64 +MSBuild "%SLN_FILE%" /t:Build /p:Configuration=Release;Platform=x64 /m +if %errorlevel% neq 0 ( + echo 编译 Release x64 失败! + pause + exit /b 1 +) + +del ..\INSTALL\ventoy\vtoyjump32.exe +del ..\INSTALL\ventoy\vtoyjump64.exe + +copy Release\vtoyjump32.exe ..\INSTALL\ventoy\vtoyjump32.exe +copy x64\Release\vtoyjump64.exe ..\INSTALL\ventoy\vtoyjump64.exe + + +echo. +echo ============================================== +echo ✅ 2架构编译完成! +echo ============================================== +echo. +pause + + diff --git a/vtoyjump/vtoyjump/vtoyjump.c b/vtoyjump/vtoyjump/vtoyjump.c index a70486a0..eebaff52 100644 --- a/vtoyjump/vtoyjump/vtoyjump.c +++ b/vtoyjump/vtoyjump/vtoyjump.c @@ -68,7 +68,7 @@ static void BreakAndLaunchCmd(int line) PROCESS_INFORMATION Pi; Log("Break at line:%d", line); - + GetStartupInfoA(&Si); Si.dwFlags |= STARTF_USESHOWWINDOW; Si.wShowWindow = SW_NORMAL; @@ -129,7 +129,7 @@ static void TrimString(CHAR *String, BOOL TrimLeft) } if (TrimLeft) - { + { while (*Pos1 == ' ' || *Pos1 == '\t') { Pos1++; @@ -420,7 +420,7 @@ static BOOL CheckOsParam(ventoy_os_param *param) { Sum += *((BYTE *)param + i); } - + if (Sum) { return FALSE; @@ -472,7 +472,7 @@ static int IsUTF8Encode(const char *src) return 1; } } - + return 0; } @@ -494,7 +494,7 @@ static int Utf8ToUtf16(const char* src, WCHAR * dst) BOOL IsDirExist(const char *Fmt, ...) { - va_list Arg; + va_list Arg; DWORD Attr; int UTF8 = 0; CHAR FilePathA[MAX_PATH]; @@ -515,7 +515,7 @@ BOOL IsDirExist(const char *Fmt, ...) { Attr = GetFileAttributesA(FilePathA); } - + if (Attr != INVALID_FILE_ATTRIBUTES && (Attr & FILE_ATTRIBUTE_DIRECTORY)) { return TRUE; @@ -564,7 +564,7 @@ BOOL IsFileExist(const char *Fmt, ...) { Attr = GetFileAttributesA(FilePathA); } - + if (Attr & FILE_ATTRIBUTE_DIRECTORY) { goto out; @@ -613,7 +613,7 @@ static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, UINT32 *DiskSig, CloseHandle(Handle); memcpy(DiskExtent, DiskExtents.Extents, sizeof(DISK_EXTENT)); - Log("%C: is in PhysicalDrive%d Offset:%llu", LogicalDrive, DiskExtents.Extents[0].DiskNumber, + Log("%C: is in PhysicalDrive%d Offset:%llu", LogicalDrive, DiskExtents.Extents[0].DiskNumber, (ULONGLONG)(DiskExtents.Extents[0].StartingOffset.QuadPart)); sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\PhysicalDrive%d", DiskExtents.Extents[0].DiskNumber); @@ -630,7 +630,7 @@ static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, UINT32 *DiskSig, CloseHandle(Handle); return 1; } - + memcpy(UUID, SectorBuf + 0x180, 16); if (DiskSig) { @@ -735,7 +735,7 @@ static int VentoyAttachVirtualDisk(HANDLE Handle, const char *IsoPath) { int DriveYFree; DWORD Drives; - + Drives = GetLogicalDrives(); if ((1 << 24) & Drives) { @@ -782,7 +782,7 @@ int VentoyMountISOByAPI(const char *IsoPath) memset(&StorageType, 0, sizeof(StorageType)); memset(&OpenParameters, 0, sizeof(OpenParameters)); - + OpenParameters.Version = OPEN_VIRTUAL_DISK_VERSION_1; for (i = 0; i < 10; i++) @@ -937,7 +937,7 @@ static CHAR GetIMDiskMountLogicalDrive(const char *suffix) Drives = GetLogicalDrives(); Log("Drives=0x%x", Drives); - + while (Mask) { if ((Drives & Mask) == 0) @@ -955,8 +955,8 @@ static CHAR GetIMDiskMountLogicalDrive(const char *suffix) UINT64 GetVentoyEfiPartStartSector(HANDLE hDrive) { BOOL bRet; - DWORD dwSize; - MBR_HEAD MBR; + DWORD dwSize; + MBR_HEAD MBR; VTOY_GPT_INFO *pGpt = NULL; UINT64 StartSector = 0; @@ -981,7 +981,7 @@ UINT64 GetVentoyEfiPartStartSector(HANDLE hDrive) } SetFilePointer(hDrive, 0, NULL, FILE_BEGIN); - bRet = ReadFile(hDrive, pGpt, sizeof(VTOY_GPT_INFO), &dwSize, NULL); + bRet = ReadFile(hDrive, pGpt, sizeof(VTOY_GPT_INFO), &dwSize, NULL); if ((!bRet) || (dwSize != sizeof(VTOY_GPT_INFO))) { Log("Failed to read gpt info %d %u %d", bRet, dwSize, LASTERR); @@ -1013,7 +1013,7 @@ static int VentoyCopyImdisk(DWORD PhyDrive, CHAR *ImPath) if (IsFileExist("X:\\Windows\\System32\\imdisk.exe")) { Log("imdisk.exe already exist, no need to copy..."); - strcpy_s(ImPath, MAX_PATH, "imdisk.exe"); + strcpy_s(ImPath, MAX_PATH, "imdisk.exe"); return 0; } @@ -1065,7 +1065,7 @@ static int VentoyCopyImdisk(DWORD PhyDrive, CHAR *ImPath) strcat_s(PhyPath, sizeof(PhyPath), "\\ventoy\\imdisk.sys"); if (LoadNtDriver(PhyPath) == 0) - { + { strcpy_s(ImPath, MAX_PATH, "ventoy\\imdisk.exe"); rc = 0; } @@ -1090,7 +1090,7 @@ static int VentoyRunImdisk(const char *suffix, const char *IsoPath, const char * Letter = GetIMDiskMountLogicalDrive(suffix); - sprintf_s(Cmdline, sizeof(Cmdline), "%s -a -o %s -f \"%s\" -m %C:", imdiskexe, opt, IsoPath, Letter); + sprintf_s(Cmdline, sizeof(Cmdline), "%s -a -o %s -f \"%s\" -m %C:", imdiskexe, opt, IsoPath, Letter); Log("mount iso to %C: use imdisk cmd <%s>", Letter, Cmdline); if (IsUTF8Encode(IsoPath)) @@ -1156,7 +1156,7 @@ static int GetIsoId(CONST CHAR *IsoPath, IsoId *ids) SetFilePointer(hFile, 2048 * 16 + 8, NULL, FILE_BEGIN); bRet[n++] = ReadFile(hFile, ids->SystemId, 32, &dwSize, NULL); - + SetFilePointer(hFile, 2048 * 16 + 40, NULL, FILE_BEGIN); bRet[n++] = ReadFile(hFile, ids->VolumeId, 32, &dwSize, NULL); @@ -1183,7 +1183,7 @@ static int GetIsoId(CONST CHAR *IsoPath, IsoId *ids) TrimString(ids->PulisherId, FALSE); TrimString(ids->PreparerId, FALSE); - Log("ISO ID: System<%s> Volume<%s> Pulisher<%s> Preparer<%s>", + Log("ISO ID: System<%s> Volume<%s> Pulisher<%s> Preparer<%s>", ids->SystemId, ids->VolumeId, ids->PulisherId, ids->PreparerId); return 0; @@ -1546,7 +1546,7 @@ static int UnattendNeedVarExpand(const char *script) } szLine[0] = szLine[4095] = 0; - + while (fgets(szLine, sizeof(szLine) - 1, fp)) { if (strstr(szLine, "$$VT_")) @@ -1554,10 +1554,10 @@ static int UnattendNeedVarExpand(const char *script) fclose(fp); return 1; } - + szLine[0] = szLine[4095] = 0; } - + fclose(fp); return 0; } @@ -1572,7 +1572,7 @@ static int ExpandSingleVar(VarDiskInfo *pDiskInfo, int DiskNum, const char *var, UINT64 uiMaxDelta = ULLONG_MAX; value[0] = 0; - + if (strcmp(var, "VT_WINDOWS_DISK_1ST_NONVTOY") == 0) { for (i = 0; i < DiskNum; i++) @@ -1615,14 +1615,14 @@ static int ExpandSingleVar(VarDiskInfo *pDiskInfo, int DiskNum, const char *var, { uiDst = strtoul(var + 24, NULL, 10); uiDst = uiDst * (1024ULL * 1024ULL * 1024ULL); - + for (i = 0; i < DiskNum; i++) { if (pDiskInfo[i].Capacity == 0) { continue; } - + if (pDiskInfo[i].Capacity > uiDst) { uiDelta = pDiskInfo[i].Capacity - uiDst; @@ -1631,7 +1631,7 @@ static int ExpandSingleVar(VarDiskInfo *pDiskInfo, int DiskNum, const char *var, { uiDelta = uiDst - pDiskInfo[i].Capacity; } - + if (uiDelta < uiMaxDelta) { uiMaxDelta = uiDelta; @@ -1678,7 +1678,7 @@ static int ExpandSingleVar(VarDiskInfo *pDiskInfo, int DiskNum, const char *var, Log("Invalid var name <%s>", var); sprintf_s(value, len, "$$%s$$", var); } - + if (value[0] == 0) { sprintf_s(value, len, "$$%s$$", var); @@ -1784,12 +1784,12 @@ static int EnumerateAllDisk(VarDiskInfo **ppDiskInfo, int *pDiskNum) DWORD dwBytes; VarDiskInfo *pDiskInfo = NULL; HANDLE Handle = INVALID_HANDLE_VALUE; - CHAR PhyDrive[128]; + CHAR PhyDrive[128]; GET_LENGTH_INFORMATION LengthInfo; STORAGE_PROPERTY_QUERY Query; STORAGE_DESCRIPTOR_HEADER DevDescHeader; STORAGE_DEVICE_DESCRIPTOR *pDevDesc; - + if (GetRegDwordValue(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Services\\disk\\Enum", "Count", &Value) == 0) { DiskNum = (int)Value; @@ -1819,7 +1819,7 @@ static int EnumerateAllDisk(VarDiskInfo **ppDiskInfo, int *pDiskNum) SAFE_CLOSE_HANDLE(Handle); safe_sprintf(PhyDrive, "\\\\.\\PhysicalDrive%d", i); - Handle = CreateFileA(PhyDrive, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + Handle = CreateFileA(PhyDrive, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); Log("Create file Handle:%p %s status:%u", Handle, PhyDrive, LASTERR); if (Handle == INVALID_HANDLE_VALUE) @@ -1954,7 +1954,7 @@ static int UnattendVarExpand(const char *script, const char *tmpfile) Log("Failed to EnumerateAllDisk"); return 1; } - + fopen_s(&fp, script, "r"); if (!fp) { @@ -1971,7 +1971,7 @@ static int UnattendVarExpand(const char *script, const char *tmpfile) } szLine[0] = szLine[4095] = 0; - + while (fgets(szLine, sizeof(szLine) - 1, fp)) { start = strstr(szLine, "$$VT_"); @@ -1988,14 +1988,14 @@ static int UnattendVarExpand(const char *script, const char *tmpfile) *end = 0; ExpandSingleVar(pDiskInfo, DiskNum, start + 2, szValue, sizeof(szValue) - 1); fprintf(fout, "%s", szValue); - + fprintf(fout, "%s", end + 2); } else { fprintf(fout, "%s", szLine); } - + szLine[0] = szLine[4095] = 0; } @@ -2033,7 +2033,7 @@ static int ProcessUnattendedInstallation(const char *script, DWORD PhyDrive) CHAR ImPath[MAX_PATH]; Log("Copy unattended XML ..."); - + GetCurrentDirectory(sizeof(CurDir), CurDir); Letter = CurDir[0]; if ((Letter >= 'A' && Letter <= 'Z') || (Letter >= 'a' && Letter <= 'z')) @@ -2055,7 +2055,7 @@ static int ProcessUnattendedInstallation(const char *script, DWORD PhyDrive) { sprintf_s(TmpFile, sizeof(TmpFile), "%C:\\__Autounattend", Letter); UnattendVarExpand(script, TmpFile); - + Log("Expand Copy file <%s> --> <%s>", script, CurDir); CopyFileA(TmpFile, CurDir, FALSE); } @@ -2175,7 +2175,7 @@ End: static BOOL VentoyIsNeedBypass(const char *isofile, const char MntLetter) { - UINT16 Major; + UINT16 Major; BOOL bRet = FALSE; CHAR CheckFile[MAX_PATH]; @@ -2231,7 +2231,7 @@ End: static int Windows11Bypass(const char *isofile, const char MntLetter, UINT8 Check, UINT8 NRO) { - int Ret = 1; + int Ret = 1; HKEY hKey = NULL; HKEY hSubKey = NULL; LSTATUS Status; @@ -2246,7 +2246,7 @@ static int Windows11Bypass(const char *isofile, const char MntLetter, UINT8 Chec } //bugfix: change VTOYEFI partition attribute - + //Now we really need to bypass windows 11 check. create registry @@ -2298,13 +2298,13 @@ static int Windows11Bypass(const char *isofile, const char MntLetter, UINT8 Chec SetupMonNroStart(isofile); } - + Ret = 0; End: - - return Ret; + + return Ret; } static BOOL CheckVentoyDisk(DWORD DiskNum) @@ -2393,7 +2393,7 @@ static BOOL VentoyIsLenovoRecovery(CHAR *IsoPath, CHAR *VTLRIPath) } } } - + return FALSE; } @@ -2401,9 +2401,9 @@ static int MountVTLRI(CHAR *ImgPath, DWORD PhyDrive) { STARTUPINFOA Si; PROCESS_INFORMATION Pi; - CHAR Cmdline[256]; - CHAR ImDiskPath[256]; - + CHAR Cmdline[256]; + CHAR ImDiskPath[256]; + Log("MountVTLRI <%s> %u", ImgPath, PhyDrive); VentoyCopyImdisk(PhyDrive, ImDiskPath); @@ -2545,7 +2545,7 @@ static int VentoyHook(ventoy_os_param *param) } Log("Find ISO file <%s>", IsoPath); - + //Find VtoyLetter in Vlnk Mode if (g_os_param_reserved[6] == 1) { @@ -2563,7 +2563,7 @@ static int VentoyHook(ventoy_os_param *param) memset(UUID, 0, sizeof(UUID)); memset(&VtoyDiskExtent, 0, sizeof(VtoyDiskExtent)); DiskSig = 0; - + if (GetPhyDiskUUID(VtoyLetter, UUID, &DiskSig, &VtoyDiskExtent) == 0) { Log("[%d] DiskSig=%08X PartStart=%lld", i, DiskSig, VtoyDiskExtent.StartingOffset.QuadPart); @@ -2595,7 +2595,7 @@ static int VentoyHook(ventoy_os_param *param) if (vtoyfind == FALSE) // vlnk mode Ventoy partition has no letter { Log("Warning: Ventoy partition has no drive letter, assume C: and find by sig"); - VtoyLetter = 'C'; + VtoyLetter = 'C'; vtoyfind = FindVentoyDiskBySig(VtoySig, &VtoyDiskExtent.DiskNumber); } @@ -2629,7 +2629,7 @@ static int VentoyHook(ventoy_os_param *param) Drives = GetLogicalDrives(); Log("Drives before mount: 0x%x", Drives); - + if (VentoyIsLenovoRecovery(IsoPath, VTLRIPath)) { Log("This is lenovo recovery image, mount VTLRI file."); @@ -2676,7 +2676,7 @@ static int VentoyHook(ventoy_os_param *param) // for protect rc = DeleteVentoyPart2MountPoint(VtoyDiskNum); Log("Delete ventoy mountpoint: %s", rc == 0 ? "SUCCESS" : "NO NEED"); - + if (g_windows_data.auto_install_script[0]) { if (IsFileExist("%s", VTOY_AUTO_FILE)) @@ -2771,7 +2771,7 @@ static int ExtractWindowsDataFile(char *databuf) filedata += pdata->auto_install_len; len = pdata->auto_install_len; } - + return len; } @@ -2803,7 +2803,7 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) DWORD PeStart; DWORD FileSize; DWORD LockStatus = 0; - BYTE *Buffer = NULL; + BYTE *Buffer = NULL; CHAR ExeFileName[MAX_PATH]; sprintf_s(ExeFileName, sizeof(ExeFileName), "%s", argv[0]); @@ -2819,7 +2819,7 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) { goto End; } - + Log("VentoyJump %dbit", g_system_bit); MUTEX_LOCK(g_vtoyins_mutex); @@ -2833,13 +2833,13 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) for (PeStart = 0; PeStart < FileSize; PeStart += 16) { - if (CheckOsParam((ventoy_os_param *)(Buffer + PeStart)) && + if (CheckOsParam((ventoy_os_param *)(Buffer + PeStart)) && CheckPeHead(Buffer, FileSize, PeStart + sizeof(ventoy_os_param))) { Log("Find os pararm at %u", PeStart); memcpy(&g_os_param, Buffer + PeStart, sizeof(ventoy_os_param)); - memcpy(&g_windows_data, Buffer + PeStart + sizeof(ventoy_os_param), sizeof(ventoy_windows_data)); + memcpy(&g_windows_data, Buffer + PeStart + sizeof(ventoy_os_param), sizeof(ventoy_windows_data)); exlen = ExtractWindowsDataFile(Buffer + PeStart + sizeof(ventoy_os_param)); memcpy(g_os_param_reserved, g_os_param.vtoy_reserved, sizeof(g_os_param_reserved)); @@ -2849,7 +2849,7 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) goto End; } - // convert / to \\ + // convert '/' for (Pos = 0; Pos < sizeof(g_os_param.vtoy_img_path) && g_os_param.vtoy_img_path[Pos]; Pos++) { if (g_os_param.vtoy_img_path[Pos] == '/') @@ -2902,6 +2902,26 @@ End: return rc; } +static BOOL is_exe_need_recover(const char *prog_name) +{ + if (_stricmp(g_prog_name, "winpeshl.exe") == 0) + { + // if setup.exe not exist, it's not a standard Windows ISO, maybe PE. + if (!IsFileExist("X:\\setup.exe") && IsFileExist("ventoy\\%s", g_prog_name)) + { + return TRUE; + } + } + else + { + if (IsFileExist("ventoy\\%s", g_prog_name)) + { + return TRUE; + } + } + + return FALSE; +} int real_main(int argc, char **argv) { @@ -2936,7 +2956,7 @@ int real_main(int argc, char **argv) Log("LunchFile=<%s> CallParam=<%s>", LunchFile, CallParam); - if (_stricmp(g_prog_name, "winpeshl.exe") != 0 && IsFileExist("ventoy\\%s", g_prog_name)) + if (is_exe_need_recover(g_prog_name)) { sprintf_s(NewFile, sizeof(NewFile), "%s\\VTOYJUMP.EXE", g_prog_dir); MoveFileA(g_prog_full_path, NewFile); @@ -3105,7 +3125,7 @@ int main(int argc, char **argv) GetCurrentDirectoryA(sizeof(CurDir), CurDir); Log("Current directory is <%s>", CurDir); - + GetModuleFileNameA(NULL, g_prog_full_path, MAX_PATH); split_path_name(g_prog_full_path, g_prog_dir, g_prog_name); @@ -3130,7 +3150,7 @@ int main(int argc, char **argv) if (_stricmp(g_prog_name, "WinLogon.exe") == 0) { Log("This time is rejump back ..."); - + strcpy_s(g_prog_full_path, sizeof(g_prog_full_path), argv[1]); split_path_name(g_prog_full_path, g_prog_dir, g_prog_name); @@ -3140,7 +3160,7 @@ int main(int argc, char **argv) { strcpy_s(NewArgv0, sizeof(NewArgv0), g_prog_dir); VentoyToUpper(NewArgv0); - + if (NULL == strstr(NewArgv0, "SYSTEM32") && IsFileExist(ORG_PECMD_BK_PATH)) { Log("Just call original pecmd.exe"); @@ -3155,7 +3175,7 @@ int main(int argc, char **argv) sprintf_s(CallParam, sizeof(CallParam), "ventoy\\WinLogon.exe %s", g_prog_full_path); } - + for (i = 1; i < argc; i++) { strcat_s(CallParam, sizeof(CallParam), " ");