Compare commits

...

93 Commits

Author SHA1 Message Date
longpanda
d72bb15956 1.0.53 release 2021-09-27 21:00:08 +08:00
longpanda
89a34bac18 optimization for deepin/uos latest release 2021-09-25 11:22:55 +08:00
longpanda
8cecdae8f9 Support shrink persistence dat file for ext4 filesystem. 2021-09-24 10:07:32 +08:00
longpanda
471432fc50 Optimization for VentoyGUI 2021-09-22 14:44:50 +08:00
Thomas De Rocker
a78e19608b Update languages.json (Dutch translations) (#1105) 2021-09-18 09:13:38 +08:00
Anton Grouchtchak
5e97d56033 Update Ukrainian and Russian translations (#1104) 2021-09-17 15:29:40 +08:00
albanobattistella
a5041ad43c Update languages.json (#1103) 2021-09-17 10:02:17 +08:00
3149a67599 Modify Japanese Localization (#1102)
* modify Japanese localization

- Corrected duplicate punctuation.
- Changed the font to one that is compatible with Japanese.
- Unified the terminology.
- Newly translated untranslated strings.

* modify Japanese localization

- Unified the terminology.
2021-09-17 10:01:43 +08:00
MELERIX
d0b7927b51 Update languages.json (#1088)
- Renamed "disk" to "device" for consistency, due not all devices are essentially disks.

- Minor changes in Spanish translation.
2021-09-17 09:58:36 +08:00
longpanda
8775684367 1.0.52 release 2021-09-13 18:48:09 +08:00
longpanda
d148139227 Add QT GUI install program 2021-09-13 16:41:51 +08:00
longpanda
dd2411d7d4 Add Linux native GUI program for Ventoy2Disk.
x86_64    gtk2/gtk3
i386      gtk2/gtk3
aarch64   gtk3
mips64el  gtk3
2021-09-08 10:44:41 +08:00
longpanda
7db83dc0f1 Update README.md 2021-08-31 19:50:35 +08:00
longpanda
787d950f28 Update README.md 2021-08-31 19:47:38 +08:00
longpanda
892a819da4 Add support for Emergency Boot Kit 2021-08-31 19:43:30 +08:00
longpanda
bfc5eaebb9 Continue to boot even the ISO file size is invalid. 2021-08-31 17:04:09 +08:00
longpanda
e7d05df9fa Update issue_template.yml 2021-08-31 16:47:40 +08:00
Oğuz Ersen
ca07b52cb2 Update languages.json (Turkish) (#1077) 2021-08-30 18:06:57 +08:00
longpanda
1a2a35f5bc add cryptsetup 2021-08-30 10:54:16 +08:00
longpanda
d71514f23e 1.0.51 release 2021-08-27 20:36:32 +08:00
longpanda
c5af17e04e experimental support for chromium os (fydeos/cloudready) 2021-08-26 14:17:44 +08:00
longpanda
05e208ea2a Support Lenovo EasyStartup 2021-08-23 16:56:17 +08:00
longpanda
112c557428 Show a warning message if the path of /ventoy/ventoy.json case mismatch. 2021-08-19 11:40:23 +08:00
longpanda
92db873b5c misc update 2021-08-18 23:00:11 +08:00
longpanda
3c01eec4af Add F4-->Search and boot xorboot 2021-08-17 14:44:43 +08:00
Vladimir Ulianitsky
5c6d18fcd4 Fix for PATH with spaces (#1060) 2021-08-17 10:01:42 +08:00
longpanda
84ec4b0de4 Support escaped quotes (\") in ventoy.json. (#1062) 2021-08-17 09:25:00 +08:00
longpanda
9615e7eaa0 Support 2k10 PE x86 series 2021-08-16 00:39:26 +08:00
longpanda
6a244ff260 Fix the mount issue for 2K10 Win7x64 PE 2021-08-16 00:00:21 +08:00
longpanda
b5503a7375 1.0.50 release 2021-08-14 20:30:28 +08:00
longpanda
0b7fa630a4 Support some special Win7PE 2021-08-14 11:49:51 +08:00
longpanda
7babe823d6 Add F5-->Tools-->Ventoy UEFI Utilities-->Show EFI Drivers feature. 2021-08-12 19:47:43 +08:00
longpanda
6db513a067 Fix the boot issue for Windows UEFI on some Dell server. (introduced since 1.0.48) 2021-08-12 14:26:47 +08:00
longpanda
bafac7479d Fix the boot issue for Untangle ISO in legacy bios mode. (#1054) 2021-08-11 09:44:09 +08:00
longpanda
d3138479d7 Fixe the boot issue for Untangle ISO (#1054) 2021-08-10 09:18:35 +08:00
longpanda
56a1543f7d Fix an issue when install some Lite Windows version with special file name.
We need to wrap the file name in quotation marks when use imdisk to mount the iso file.
2021-08-07 10:55:41 +08:00
longpanda
659ac1cfe3 Fix "Failed to open random seed file" error message for arch linux 2021-08-04 18:53:09 +08:00
longpanda
c83daa86b6 Fix the check media issue for SUSE/openSUSE 2021-08-04 11:24:50 +08:00
longpanda
dfcfaa9967 issue template update 2021-08-04 09:20:02 +08:00
longpanda
188f9e707c Change rufus 3.15beta+ to 3.15+ 2021-08-04 09:14:18 +08:00
longpanda
8b975b5e80 1.0.49 release 2021-08-03 17:31:39 +08:00
MELERIX
2ab717cc66 Updated Spanish Translation (#1039) 2021-08-03 14:53:57 +08:00
longpanda
88793d548a Compatibility improvement for some WinPE 2021-08-03 14:53:29 +08:00
longpanda
5fea6eab7e Add Bulgarian language 2021-08-03 10:05:01 +08:00
Ida Bagus
5d55dc68ae Indonesian update (#1038) 2021-08-03 08:58:17 +08:00
VlatkoS
2c320aad60 Updated Macedonian language (#1037)
Updated Macedonian language
2021-08-03 08:57:54 +08:00
Hoàng Điềm Tĩnh
b63034b2c7 Update languages.json (#1036) 2021-08-03 08:57:43 +08:00
longpanda
6c113880e5 Fixed the boot issue for "StorageCraft Recovery Environment CrossPlatform" in UEFI mode. 2021-08-02 22:50:38 +08:00
longpanda
e2656c287b Compatibility improvement for some WinPE 2021-08-02 21:03:43 +08:00
longpanda
d8433985e7 1.0.48 release 2021-08-01 21:50:36 +08:00
Diacius
b003105925 Improve English Language (#963)
Changed `clear` to `clearing` and `detail` to `details`
2021-07-31 09:21:57 +08:00
fossdd
2ca2c83b6b Let the link to build from source also work on gitee and local copies. (#1009)
The Link linked to a GitHub page. But markdown also support link in the directory: Now the link works in your local markdown viewer, github and gitee, to their own page instead that all redirect to GitHub
2021-07-31 09:21:02 +08:00
VenusGirl
dff7e495ca Update languages.json (#1003)
Update Korean
2021-07-31 09:20:43 +08:00
VenusGirl
cf0f395c56 Update languages.json (#1002)
Update Korean
2021-07-31 09:20:23 +08:00
Tayfun Akkoyun
69bc90da42 Update languages.json (#1004)
New Lines of language.json file was translated for Turkish language. Can you update language.json file?
2021-07-31 09:20:06 +08:00
Hoàng Điềm Tĩnh
ffc40234ca Update Vietnamese for languages.json (#1018)
* Update languages.json

Update Vietnamese for languages.json

* Update languages.json

* Update languages.json
2021-07-31 09:19:52 +08:00
Thomas De Rocker
e57daa5065 Update languages.json (#1014) 2021-07-31 09:19:32 +08:00
ensag-dev
5c733a20f8 Update occitan (#1012) 2021-07-31 09:19:13 +08:00
longpanda
069342ab9a change ownership when cpio pack 2021-07-27 22:18:39 +08:00
longpanda
32a964eded add vtoytool 01 2021-07-27 21:28:47 +08:00
longpanda
51b92f398a misc update 2021-07-27 19:10:30 +08:00
longpanda
5d0ebf4510 support custom arch iso (#1021) 2021-07-27 19:08:40 +08:00
longpanda
cf94487ad5 misc update 2021-07-26 15:31:56 +08:00
longpanda
af83f46a3d Merge branch 'master' of https://github.com/ventoy/Ventoy 2021-07-26 15:30:54 +08:00
啊o额iu鱼
4910e9f380 Mirror action check owner (#1016) 2021-07-25 20:00:23 +08:00
longpanda
fb38b321c2 Code Optimization 2021-07-24 19:03:09 +08:00
longpanda
7b78fe555e Support nested boot.
For example: Ventoy-->rEFInd.iso-->Ventoy-->Windows.iso
2021-07-24 18:47:39 +08:00
longpanda
094ba61848 Fix Windows boot issue when Ventoy is booted from rEFInd 2021-07-24 18:45:51 +08:00
longpanda
faa0e46d3a Fix the missing program issue for EasyU 2021-07-23 23:26:27 +08:00
longpanda
537f0eaa7e 1.0.47 release 2021-07-17 17:42:06 +08:00
longpanda
c8cf9b7ce2 Speedup md5sum/sha1sum/sha256sum/sha512sum command 2021-07-16 01:36:10 +08:00
longpanda
4c71d7c190 Support WinPE which contains pecmd.exe 2021-07-16 01:03:01 +08:00
longpanda
47f9f2c42c Add support for MocaccinoOS distro 2021-07-15 17:48:03 +08:00
longpanda
fc3a5fae36 Fixed HBCD boot issue. (#992) 2021-07-11 10:14:16 +08:00
longpanda
b3982d4930 Fixed a bug when booting big boot.wim file. 2021-07-11 01:02:00 +08:00
longpanda
c280baae27 Add Ventoy Sparse Image Option 2021-07-10 09:41:52 +08:00
longpanda
425d640480 Fixed a bug for ventoy_openwrt.xz check. 2021-07-10 09:20:54 +08:00
longpanda
07d4140cf4 Optimization for booting openwrt 2021-07-09 17:35:19 +08:00
longpanda
90ae07d227 Update README.md 2021-07-08 16:39:32 +08:00
longpanda
e3e21eb6e6 issue template 2021-07-06 22:52:26 +08:00
longpanda
c8ce2ae85a issue template 2021-07-06 22:51:27 +08:00
longpanda
c02a6955c3 Add check for the built-in browser in WebDeepin.sh 2021-07-06 10:10:59 +08:00
David P
6b78603dd3 fix Parabola rEFInd booting (#989)
newer Parabola rEFInd ISOs need to run vt_linux_get_main_initrd_index to actually work, just like the systemd-boot ISOs
2021-07-06 10:07:21 +08:00
longpanda
07a386c963 Add issue template 2021-07-05 16:49:31 +08:00
longpanda
eb048c0075 Remove the 2TB limit for the reserved space in Ventoy2Disk.exe 2021-07-05 13:40:19 +08:00
longpanda
37ac3f312f Optimization for booting openwrt 2021-06-28 15:15:39 +08:00
longpanda
092cff8429 Support some floppy image in Memdisk mode 2021-06-25 12:34:28 +08:00
longpanda
b347c1b5da Optimization for booting OpenWrt 2021-06-25 11:49:45 +08:00
longpanda
da746c608f Set hidden attribute for VTOYEFI part in GPT partition style 2021-06-21 13:27:41 +08:00
longpanda
81aa56955a optimization for boot openwrt 2021-06-20 21:44:37 +08:00
longpanda
d1679871a6 optimization for booting openwrt 2021-06-20 20:20:17 +08:00
longpanda
f383052013 add debug info 2021-06-20 11:28:19 +08:00
longpanda
667f5bcc1b Fix the Memdisk/WIMBOOT mode/... tip message display error
When VTOY_DEFAULT_IMAGE was set to F6>xxxx, if you press F1 or ctrl+w, the tip message will show ??
2021-06-18 10:41:41 +08:00
158 changed files with 24822 additions and 837 deletions

1
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1 @@
blank_issues_enabled: false

View File

@@ -0,0 +1,100 @@
name: Issue Report
description: File an issue report
title: "[issue]: "
assignees:
- octocat
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this issue report!
- type: checkboxes
id: faq
attributes:
label: Official FAQ
description: Have you checked the official FAQ at [https://www.ventoy.net/en/faq.html](https://www.ventoy.net/en/faq.html) ?
options:
- label: I have checked the official FAQ.
required: true
- type: input
id: version
attributes:
label: Ventoy Version
description: What version of ventoy are you running?
placeholder: 1.0.51
validations:
required: true
- type: dropdown
id: latestrelease
attributes:
label: What about latest release
description: Have you tried with the latest release of Ventoy?
options:
- Yes. I have tried the latest release, but the bug still exist.
- No. I didn't try the latest release.
validations:
required: true
- type: dropdown
id: bios
attributes:
label: BIOS Mode
description: In which BIOS mode did you find the bug?
options:
- Legacy BIOS Mode
- UEFI Mode
- Both
validations:
required: true
- type: dropdown
id: partstyle
attributes:
label: Partition Style
description: Which partition style did you select when you install Ventoy?
options:
- MBR
- GPT
validations:
required: true
- type: input
id: capacity
attributes:
label: Disk Capacity
description: What is the capacity of the disk installed with Ventoy?
placeholder: 32GB
validations:
required: true
- type: input
id: vendor
attributes:
label: Disk Manufacturer
description: What is the manufacturer of the disk installed with Ventoy? (e.g. SanDisk/Kingston...)
validations:
required: false
- type: dropdown
id: checksum
attributes:
label: Image file checksum (if applicable)
description: Have you checked the image file in Ventoy's menu as [https://www.ventoy.net/en/faq.html#faq_boot_checksum](https://www.ventoy.net/en/faq.html#faq_boot_checksum) ?
options:
- Yes.
- No.
validations:
required: false
- type: input
id: link
attributes:
label: Image file download link (if applicable)
description: What is the image file download link?
placeholder: https://xxx
validations:
required: false
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Tell me what happened. It's highly recommended to include some photo or video about the bug.
placeholder: Tell us what you see!
value: "A bug happened!"
validations:
required: true

View File

@@ -11,6 +11,7 @@ on:
jobs: jobs:
run: run:
name: Sync-GitHub-to-Gitee name: Sync-GitHub-to-Gitee
if: ${{ github.repository_owner == 'ventoy' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Mirror the Github repos to Gitee. - name: Mirror the Github repos to Gitee.

View File

@@ -34,6 +34,7 @@
#include <Protocol/BlockIo.h> #include <Protocol/BlockIo.h>
#include <Protocol/RamDisk.h> #include <Protocol/RamDisk.h>
#include <Protocol/SimpleFileSystem.h> #include <Protocol/SimpleFileSystem.h>
#include <Protocol/DriverBinding.h>
#include <Ventoy.h> #include <Ventoy.h>
BOOLEAN gDebugPrint = FALSE; BOOLEAN gDebugPrint = FALSE;
@@ -362,10 +363,22 @@ EFI_HANDLE EFIAPI ventoy_get_parent_handle(IN EFI_DEVICE_PATH_PROTOCOL *pDevPath
return Handle; return Handle;
} }
STATIC ventoy_ram_disk g_backup_ramdisk_param;
STATIC ventoy_os_param g_backup_os_param_var;
EFI_STATUS EFIAPI ventoy_save_ramdisk_param(VOID) EFI_STATUS EFIAPI ventoy_save_ramdisk_param(VOID)
{ {
UINTN DataSize;
EFI_STATUS Status = EFI_SUCCESS; EFI_STATUS Status = EFI_SUCCESS;
EFI_GUID VarGuid = VENTOY_GUID; EFI_GUID VarGuid = VENTOY_GUID;
DataSize = sizeof(g_backup_ramdisk_param);
Status = gRT->GetVariable(L"VentoyRamDisk", &VarGuid, NULL, &DataSize, &g_backup_ramdisk_param);
if (!EFI_ERROR(Status))
{
debug("find previous ramdisk variable <%llu>", g_backup_ramdisk_param.DiskSize);
}
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid, Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
@@ -379,21 +392,38 @@ EFI_STATUS EFIAPI ventoy_delete_ramdisk_param(VOID)
{ {
EFI_STATUS Status = EFI_SUCCESS; EFI_STATUS Status = EFI_SUCCESS;
EFI_GUID VarGuid = VENTOY_GUID; EFI_GUID VarGuid = VENTOY_GUID;
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid, if (g_backup_ramdisk_param.DiskSize > 0 && g_backup_ramdisk_param.PhyAddr > 0)
{
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
sizeof(g_backup_ramdisk_param), &g_backup_ramdisk_param);
debug("resotre ramdisk variable %r", Status);
}
else
{
Status = gRT->SetVariable(L"VentoyRamDisk", &VarGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
0, NULL); 0, NULL);
debug("delete efi variable %r", Status); debug("delete ramdisk variable %r", Status);
}
return Status; return Status;
} }
EFI_STATUS EFIAPI ventoy_save_variable(VOID) EFI_STATUS EFIAPI ventoy_save_variable(VOID)
{ {
UINTN DataSize;
EFI_STATUS Status = EFI_SUCCESS; EFI_STATUS Status = EFI_SUCCESS;
EFI_GUID VarGuid = VENTOY_GUID; EFI_GUID VarGuid = VENTOY_GUID;
DataSize = sizeof(g_backup_os_param_var);
Status = gRT->GetVariable(L"VentoyOsParam", &VarGuid, NULL, &DataSize, &g_backup_os_param_var);
if (!EFI_ERROR(Status))
{
debug("find previous efi variable <%a>", g_backup_os_param_var.vtoy_img_path);
}
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid, Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
sizeof(g_chain->os_param), &(g_chain->os_param)); sizeof(g_chain->os_param), &(g_chain->os_param));
@@ -406,11 +436,21 @@ EFI_STATUS EFIAPI ventoy_delete_variable(VOID)
{ {
EFI_STATUS Status = EFI_SUCCESS; EFI_STATUS Status = EFI_SUCCESS;
EFI_GUID VarGuid = VENTOY_GUID; EFI_GUID VarGuid = VENTOY_GUID;
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid, if (0 == CompareMem(&(g_backup_os_param_var.guid), &VarGuid, sizeof(EFI_GUID)))
{
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
sizeof(g_backup_os_param_var), &(g_backup_os_param_var));
debug("restore efi variable %r", Status);
}
else
{
Status = gRT->SetVariable(L"VentoyOsParam", &VarGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
0, NULL); 0, NULL);
debug("delete efi variable %r", Status); debug("delete efi variable %r", Status);
}
return Status; return Status;
} }
@@ -1085,6 +1125,8 @@ EFI_STATUS EFIAPI VentoyEfiMain
return Status; return Status;
} }
ventoy_disable_ex_filesystem();
if (gMemdiskMode) if (gMemdiskMode)
{ {
g_ramdisk_param.PhyAddr = (UINT64)(UINTN)g_iso_data_buf; g_ramdisk_param.PhyAddr = (UINT64)(UINTN)g_iso_data_buf;
@@ -1159,6 +1201,8 @@ EFI_STATUS EFIAPI VentoyEfiMain
grub_env_set("vtoy_dotefi_retry", "YES"); grub_env_set("vtoy_dotefi_retry", "YES");
} }
ventoy_enable_ex_filesystem();
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@@ -169,7 +169,6 @@ typedef struct ventoy_virt_chunk
{ 0x37b87ac6, 0xc180, 0x4583, { 0xa7, 0x05, 0x41, 0x4d, 0xa8, 0xf7, 0x7e, 0xd2 }} { 0x37b87ac6, 0xc180, 0x4583, { 0xa7, 0x05, 0x41, 0x4d, 0xa8, 0xf7, 0x7e, 0xd2 }}
#define VTOY_BLOCK_DEVICE_PATH_NAME L"ventoy"
#if defined (MDE_CPU_IA32) #if defined (MDE_CPU_IA32)
#define VENTOY_UEFI_DESC L"IA32 UEFI" #define VENTOY_UEFI_DESC L"IA32 UEFI"
@@ -344,6 +343,14 @@ typedef struct ventoy_system_wrapper
EFI_LOCATE_DEVICE_PATH OriLocateDevicePath; EFI_LOCATE_DEVICE_PATH OriLocateDevicePath;
} ventoy_system_wrapper; } ventoy_system_wrapper;
#define MAX_DRIVER_BIND_WRAPPER 64
typedef struct DriverBindWrapper
{
EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;
EFI_DRIVER_BINDING_SUPPORTED pfOldSupport;
}DRIVER_BIND_WRAPPER;
#define ventoy_wrapper(bs, wrapper, func, newfunc) \ #define ventoy_wrapper(bs, wrapper, func, newfunc) \
{\ {\
wrapper.Ori##func = bs->func;\ wrapper.Ori##func = bs->func;\
@@ -351,6 +358,22 @@ typedef struct ventoy_system_wrapper
bs->func = wrapper.New##func;\ bs->func = wrapper.New##func;\
} }
#define VENTOY_GET_COMPONENT_NAME(Protocol, DriverName) \
{\
DriverName = NULL;\
Status = Protocol->GetDriverName(Protocol, "en", &DriverName);\
if (EFI_ERROR(Status) || NULL == DriverName) \
{\
DriverName = NULL;\
Status = Protocol->GetDriverName(Protocol, "eng", &DriverName);\
if (EFI_ERROR(Status) || NULL == DriverName) \
{\
continue;\
}\
}\
}
extern BOOLEAN gDebugPrint; extern BOOLEAN gDebugPrint;
VOID EFIAPI VtoyDebug(IN CONST CHAR8 *Format, ...); VOID EFIAPI VtoyDebug(IN CONST CHAR8 *Format, ...);
EFI_STATUS EFIAPI ventoy_wrapper_system(VOID); EFI_STATUS EFIAPI ventoy_wrapper_system(VOID);
@@ -396,6 +419,8 @@ EFI_STATUS ventoy_hook_keyboard_stop(VOID);
BOOLEAN ventoy_is_cdrom_dp_exist(VOID); BOOLEAN ventoy_is_cdrom_dp_exist(VOID);
EFI_STATUS ventoy_hook_1st_cdrom_start(VOID); EFI_STATUS ventoy_hook_1st_cdrom_start(VOID);
EFI_STATUS ventoy_hook_1st_cdrom_stop(VOID); EFI_STATUS ventoy_hook_1st_cdrom_stop(VOID);
EFI_STATUS ventoy_disable_ex_filesystem(VOID);
EFI_STATUS ventoy_enable_ex_filesystem(VOID);
#endif #endif

View File

@@ -34,6 +34,7 @@
#include <Protocol/BlockIo.h> #include <Protocol/BlockIo.h>
#include <Protocol/RamDisk.h> #include <Protocol/RamDisk.h>
#include <Protocol/SimpleFileSystem.h> #include <Protocol/SimpleFileSystem.h>
#include <Protocol/DriverBinding.h>
#include <Ventoy.h> #include <Ventoy.h>
#define PROCOTOL_SLEEP_MSECONDS 0 #define PROCOTOL_SLEEP_MSECONDS 0

View File

@@ -34,6 +34,7 @@
#include <Protocol/BlockIo.h> #include <Protocol/BlockIo.h>
#include <Protocol/RamDisk.h> #include <Protocol/RamDisk.h>
#include <Protocol/SimpleFileSystem.h> #include <Protocol/SimpleFileSystem.h>
#include <Protocol/DriverBinding.h>
#include <Ventoy.h> #include <Ventoy.h>
UINT8 *g_iso_data_buf = NULL; UINT8 *g_iso_data_buf = NULL;
@@ -73,6 +74,9 @@ STATIC UINT8 g_sector_buf[2048];
STATIC EFI_BLOCK_READ g_sector_2048_read = NULL; STATIC EFI_BLOCK_READ g_sector_2048_read = NULL;
STATIC EFI_BLOCK_WRITE g_sector_2048_write = NULL; STATIC EFI_BLOCK_WRITE g_sector_2048_write = NULL;
STATIC UINTN g_DriverBindWrapperCnt = 0;
STATIC DRIVER_BIND_WRAPPER g_DriverBindWrapperList[MAX_DRIVER_BIND_WRAPPER];
BOOLEAN ventoy_is_cdrom_dp_exist(VOID) BOOLEAN ventoy_is_cdrom_dp_exist(VOID)
{ {
UINTN i = 0; UINTN i = 0;
@@ -483,6 +487,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) if (secNum > g_sector_flag_num)
{ {
cur_flag = AllocatePool(secNum * sizeof(ventoy_sector_flag)); cur_flag = AllocatePool(secNum * sizeof(ventoy_sector_flag));
@@ -618,26 +624,74 @@ EFI_STATUS EFIAPI ventoy_block_io_flush(IN EFI_BLOCK_IO_PROTOCOL *This)
return EFI_SUCCESS; return EFI_SUCCESS;
} }
STATIC UINTN ventoy_get_current_device_path_id(VOID)
{
UINTN i = 0;
UINTN Count = 0;
UINTN MaxId = 0;
UINTN CurId = 0;
BOOLEAN Find = FALSE;
EFI_HANDLE *Handles = NULL;
EFI_STATUS Status = EFI_SUCCESS;
EFI_DEVICE_PATH_PROTOCOL *DevicePath = NULL;
VENDOR_DEVICE_PATH *venPath = NULL;
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiDevicePathProtocolGuid,
NULL, &Count, &Handles);
if (EFI_ERROR(Status))
{
return 0;
}
for (i = 0; i < Count; i++)
{
Status = gBS->HandleProtocol(Handles[i], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePath);
if (EFI_ERROR(Status))
{
continue;
}
if (DevicePath->Type == HARDWARE_DEVICE_PATH && DevicePath->SubType == HW_VENDOR_DP)
{
venPath = (VENDOR_DEVICE_PATH *)DevicePath;
if (CompareGuid(&venPath->Guid, &gVtoyBlockDevicePathGuid))
{
CurId = StrDecimalToUintn((CHAR16 *)(venPath + 1) + StrLen(L"ventoy_"));
MaxId = MAX(MaxId, CurId);
Find = TRUE;
}
}
}
FreePool(Handles);
return Find ? (MaxId + 1) : 0;
}
EFI_STATUS EFIAPI ventoy_fill_device_path(VOID) EFI_STATUS EFIAPI ventoy_fill_device_path(VOID)
{ {
UINTN CurVtoyDpId = 0;
UINTN NameLen = 0; UINTN NameLen = 0;
UINT8 TmpBuf[128] = {0}; UINT8 TmpBuf[128] = {0};
VENDOR_DEVICE_PATH *venPath = NULL; VENDOR_DEVICE_PATH *venPath = NULL;
CHAR16 VtoyDpName[32];
CurVtoyDpId = ventoy_get_current_device_path_id();
UnicodeSPrintAsciiFormat(VtoyDpName, sizeof(VtoyDpName), "ventoy_%03lu", CurVtoyDpId);
venPath = (VENDOR_DEVICE_PATH *)TmpBuf; venPath = (VENDOR_DEVICE_PATH *)TmpBuf;
NameLen = StrSize(VTOY_BLOCK_DEVICE_PATH_NAME); NameLen = StrSize(VtoyDpName);
venPath->Header.Type = HARDWARE_DEVICE_PATH; venPath->Header.Type = HARDWARE_DEVICE_PATH;
venPath->Header.SubType = HW_VENDOR_DP; venPath->Header.SubType = HW_VENDOR_DP;
venPath->Header.Length[0] = sizeof(VENDOR_DEVICE_PATH) + NameLen; venPath->Header.Length[0] = sizeof(VENDOR_DEVICE_PATH) + NameLen;
venPath->Header.Length[1] = 0; venPath->Header.Length[1] = 0;
CopyMem(&venPath->Guid, &gVtoyBlockDevicePathGuid, sizeof(EFI_GUID)); CopyMem(&venPath->Guid, &gVtoyBlockDevicePathGuid, sizeof(EFI_GUID));
CopyMem(venPath + 1, VTOY_BLOCK_DEVICE_PATH_NAME, NameLen); CopyMem(venPath + 1, VtoyDpName, NameLen);
gBlockData.Path = AppendDevicePathNode(NULL, (EFI_DEVICE_PATH_PROTOCOL *)TmpBuf); gBlockData.Path = AppendDevicePathNode(NULL, (EFI_DEVICE_PATH_PROTOCOL *)TmpBuf);
gBlockData.DevicePathCompareLen = sizeof(VENDOR_DEVICE_PATH) + NameLen; gBlockData.DevicePathCompareLen = sizeof(VENDOR_DEVICE_PATH) + NameLen;
debug("gBlockData.Path=<%s>\n", ConvertDevicePathToText(gBlockData.Path, FALSE, FALSE)); debug("gBlockData.Path=<%lu><%s>\n", CurVtoyDpId, ConvertDevicePathToText(gBlockData.Path, FALSE, FALSE));
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@@ -670,11 +724,7 @@ EFI_STATUS EFIAPI ventoy_connect_driver(IN EFI_HANDLE ControllerHandle, IN CONST
continue; continue;
} }
Status = Name2Protocol->GetDriverName(Name2Protocol, "en", &DriverName); VENTOY_GET_COMPONENT_NAME(Name2Protocol, DriverName);
if (EFI_ERROR(Status) || NULL == DriverName)
{
continue;
}
if (StrStr(DriverName, DrvName)) if (StrStr(DriverName, DrvName))
{ {
@@ -712,11 +762,7 @@ EFI_STATUS EFIAPI ventoy_connect_driver(IN EFI_HANDLE ControllerHandle, IN CONST
continue; continue;
} }
Status = NameProtocol->GetDriverName(NameProtocol, "en", &DriverName); VENTOY_GET_COMPONENT_NAME(NameProtocol, DriverName);
if (EFI_ERROR(Status))
{
continue;
}
if (StrStr(DriverName, DrvName)) if (StrStr(DriverName, DrvName))
{ {
@@ -741,6 +787,223 @@ end:
return Status; return Status;
} }
STATIC BOOLEAN ventoy_filesystem_need_wrapper(IN CONST CHAR16 *DrvName)
{
UINTN i;
CHAR16 UpperDrvName[256];
StrCpyS(UpperDrvName, 256, DrvName);
for (i = 0; i < 256 && UpperDrvName[i]; i++)
{
if (UpperDrvName[i] >= 'a' && UpperDrvName[i] <= 'z')
{
UpperDrvName[i] = 'A' + (UpperDrvName[i] - 'a');
}
}
/*
* suppress some file system drivers
* 1. rEFInd File System Driver
*
*/
if (StrStr(UpperDrvName, L"REFIND") && StrStr(UpperDrvName, L"FILE SYSTEM"))
{
return TRUE;
}
return FALSE;
}
STATIC VOID ventoy_add_filesystem_wrapper
(
IN EFI_DRIVER_BINDING_PROTOCOL *DriverBindProtocol,
IN CONST CHAR16 *DriverName
)
{
UINTN j;
if (g_DriverBindWrapperCnt >= MAX_DRIVER_BIND_WRAPPER)
{
debug("driver binding wrapper overflow %lu", g_DriverBindWrapperCnt);
return;
}
if (!ventoy_filesystem_need_wrapper(DriverName))
{
return;
}
for (j = 0; j < g_DriverBindWrapperCnt; j++)
{
if (g_DriverBindWrapperList[j].DriverBinding == DriverBindProtocol)
{
debug("Duplicate driverbinding <%s> %p %lu %lu", DriverName, DriverBindProtocol, j, g_DriverBindWrapperCnt);
break;
}
}
if (j >= g_DriverBindWrapperCnt)
{
g_DriverBindWrapperList[g_DriverBindWrapperCnt].DriverBinding = DriverBindProtocol;
g_DriverBindWrapperList[g_DriverBindWrapperCnt].pfOldSupport = DriverBindProtocol->Supported;
g_DriverBindWrapperCnt++;
debug("Add driverbinding <%s> %p %lu", DriverName, DriverBindProtocol, g_DriverBindWrapperCnt);
}
}
STATIC EFI_STATUS ventoy_find_filesystem_driverbind(VOID)
{
UINTN i = 0;
UINTN Count = 0;
CHAR16 *DriverName = NULL;
EFI_HANDLE *Handles = NULL;
EFI_STATUS Status = EFI_SUCCESS;
EFI_COMPONENT_NAME_PROTOCOL *NameProtocol = NULL;
EFI_COMPONENT_NAME2_PROTOCOL *Name2Protocol = NULL;
EFI_DRIVER_BINDING_PROTOCOL *DriverBindProtocol = NULL;
debug("ventoy_find_filesystem_driverbind...");
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentName2ProtocolGuid,
NULL, &Count, &Handles);
if (EFI_ERROR(Status))
{
return Status;
}
for (i = 0; i < Count; i++)
{
Status = gBS->HandleProtocol(Handles[i], &gEfiComponentName2ProtocolGuid, (VOID **)&Name2Protocol);
if (EFI_ERROR(Status))
{
continue;
}
VENTOY_GET_COMPONENT_NAME(Name2Protocol, DriverName);
Status = gBS->HandleProtocol(Handles[i], &gEfiDriverBindingProtocolGuid, (VOID **)&DriverBindProtocol);
if (EFI_ERROR(Status))
{
debug("### 2 No DriverBind <%s> <%r>", DriverName, Status);
continue;
}
ventoy_add_filesystem_wrapper(DriverBindProtocol, DriverName);
}
Count = 0;
FreePool(Handles);
Handles = NULL;
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentNameProtocolGuid,
NULL, &Count, &Handles);
if (EFI_ERROR(Status))
{
return Status;
}
for (i = 0; i < Count; i++)
{
Status = gBS->HandleProtocol(Handles[i], &gEfiComponentNameProtocolGuid, (VOID **)&NameProtocol);
if (EFI_ERROR(Status))
{
continue;
}
VENTOY_GET_COMPONENT_NAME(NameProtocol, DriverName);
Status = gBS->HandleProtocol(Handles[i], &gEfiDriverBindingProtocolGuid, (VOID **)&DriverBindProtocol);
if (EFI_ERROR(Status))
{
debug("### 1 No DriverBind <%s> <%r>", DriverName, Status);
continue;
}
ventoy_add_filesystem_wrapper(DriverBindProtocol, DriverName);
}
FreePool(Handles);
return EFI_SUCCESS;
}
STATIC EFI_STATUS EFIAPI ventoy_wrapper_driver_bind_support
(
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
)
{
UINTN i;
EFI_STATUS Status = EFI_SUCCESS;
EFI_DEVICE_PATH_PROTOCOL *DevicePath = NULL;
EFI_DRIVER_BINDING_SUPPORTED pfOldSupport = NULL;
for (i = 0; i < g_DriverBindWrapperCnt; i++)
{
if (g_DriverBindWrapperList[i].DriverBinding == This)
{
pfOldSupport = g_DriverBindWrapperList[i].pfOldSupport;
break;
}
}
debug("ventoy_wrapper_driver_bind_support %lu %p", i, pfOldSupport);
if (!pfOldSupport)
{
return EFI_UNSUPPORTED;
}
Status = gBS->HandleProtocol(ControllerHandle, &gEfiDevicePathProtocolGuid, (VOID **)&DevicePath);
if (EFI_ERROR(Status))
{
goto out;
}
if (0 == CompareMem(gBlockData.Path, DevicePath, gBlockData.DevicePathCompareLen))
{
debug("return EFI_UNSUPPORTED for ventoy");
return EFI_UNSUPPORTED;
}
out:
return pfOldSupport(This, ControllerHandle, RemainingDevicePath);
}
EFI_STATUS ventoy_disable_ex_filesystem(VOID)
{
UINTN i;
ventoy_find_filesystem_driverbind();
for (i = 0; i < g_DriverBindWrapperCnt; i++)
{
g_DriverBindWrapperList[i].DriverBinding->Supported = ventoy_wrapper_driver_bind_support;
}
debug("Wrapper Ex Driver Binding %lu", g_DriverBindWrapperCnt);
ventoy_debug_pause();
return EFI_SUCCESS;
}
EFI_STATUS ventoy_enable_ex_filesystem(VOID)
{
UINTN i;
for (i = 0; i < g_DriverBindWrapperCnt; i++)
{
g_DriverBindWrapperList[i].DriverBinding->Supported = g_DriverBindWrapperList[i].pfOldSupport;
}
g_DriverBindWrapperCnt = 0;
return EFI_SUCCESS;
}
EFI_STATUS EFIAPI ventoy_block_io_read_512 EFI_STATUS EFIAPI ventoy_block_io_read_512
( (
IN EFI_BLOCK_IO_PROTOCOL *This, IN EFI_BLOCK_IO_PROTOCOL *This,
@@ -875,14 +1138,15 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im
{ {
gBlockData.Media.BlockSize = 512; gBlockData.Media.BlockSize = 512;
gBlockData.Media.LastBlock = ImgSize / 512 - 1; gBlockData.Media.LastBlock = ImgSize / 512 - 1;
gBlockData.Media.ReadOnly = FALSE;
} }
else else
{ {
gBlockData.Media.BlockSize = 2048; gBlockData.Media.BlockSize = 2048;
gBlockData.Media.LastBlock = ImgSize / 2048 - 1; gBlockData.Media.LastBlock = ImgSize / 2048 - 1;
gBlockData.Media.ReadOnly = TRUE;
} }
gBlockData.Media.ReadOnly = TRUE;
gBlockData.Media.MediaPresent = 1; gBlockData.Media.MediaPresent = 1;
gBlockData.Media.LogicalBlocksPerPhysicalBlock = 1; gBlockData.Media.LogicalBlocksPerPhysicalBlock = 1;
@@ -1137,6 +1401,16 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
debug("## ventoy_wrapper_file_open <%s> ", Name); debug("## ventoy_wrapper_file_open <%s> ", Name);
if ((Mode & EFI_FILE_MODE_WRITE) > 0 && StrCmp(Name, L"\\loader\\random-seed") == 0)
{
if (gDebugPrint)
{
debug("## ventoy_wrapper_file_open return NOT_FOUND for random-seed %lx", Mode);
sleep(3);
}
return EFI_NOT_FOUND;
}
Status = g_original_fopen(This, New, Name, Mode, Attributes); Status = g_original_fopen(This, New, Name, Mode, Attributes);
if (EFI_ERROR(Status)) if (EFI_ERROR(Status))
{ {

View File

@@ -0,0 +1,140 @@
/******************************************************************************
* VtoyDrv.c
*
* Copyright (c) 2020, longpanda <admin@ventoy.net>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*
*/
#include <Uefi.h>
#include <Library/DebugLib.h>
#include <Library/PrintLib.h>
#include <Library/UefiLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DevicePathLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/UefiApplicationEntryPoint.h>
#include <Protocol/LoadedImage.h>
#include <Guid/FileInfo.h>
#include <Guid/FileSystemInfo.h>
#include <Protocol/BlockIo.h>
#include <Protocol/RamDisk.h>
#include <Protocol/SimpleFileSystem.h>
#include <VtoyUtil.h>
STATIC UINTN g_EfiDriverNameCnt = 0;
STATIC CHAR16 *g_EfiDriverNameList[1024] = { NULL };
STATIC EFI_STATUS AddEfiDriverName(IN CHAR16 *DriverName)
{
UINTN i = 0;
if (g_EfiDriverNameCnt >= 1024)
{
return EFI_OUT_OF_RESOURCES;
}
for (i = 0; i < g_EfiDriverNameCnt; i++)
{
if (g_EfiDriverNameList[i] && StrCmp(g_EfiDriverNameList[i], DriverName) == 0)
{
break;
}
}
if (i >= g_EfiDriverNameCnt)
{
g_EfiDriverNameList[g_EfiDriverNameCnt] = DriverName;
g_EfiDriverNameCnt++;
}
return EFI_SUCCESS;
}
EFI_STATUS ShowEfiDrivers(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine)
{
UINTN i = 0;
UINTN Count = 0;
CHAR16 *DriverName = NULL;
EFI_HANDLE *Handles = NULL;
EFI_STATUS Status = EFI_SUCCESS;
EFI_COMPONENT_NAME_PROTOCOL *NameProtocol = NULL;
EFI_COMPONENT_NAME2_PROTOCOL *Name2Protocol = NULL;
(VOID)ImageHandle;
(VOID)CmdLine;
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentName2ProtocolGuid,
NULL, &Count, &Handles);
if (EFI_ERROR(Status))
{
return Status;
}
for (i = 0; i < Count; i++)
{
Status = gBS->HandleProtocol(Handles[i], &gEfiComponentName2ProtocolGuid, (VOID **)&Name2Protocol);
if (EFI_ERROR(Status))
{
continue;
}
DriverName = NULL;
Status = VtoyGetComponentName(2, Name2Protocol, &DriverName);
if ((!EFI_ERROR(Status)) && (DriverName))
{
AddEfiDriverName(DriverName);
}
}
Count = 0;
FreePool(Handles);
Handles = NULL;
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiComponentNameProtocolGuid,
NULL, &Count, &Handles);
if (EFI_ERROR(Status))
{
return Status;
}
for (i = 0; i < Count; i++)
{
Status = gBS->HandleProtocol(Handles[i], &gEfiComponentNameProtocolGuid, (VOID **)&NameProtocol);
if (EFI_ERROR(Status))
{
continue;
}
DriverName = NULL;
Status = VtoyGetComponentName(1, Name2Protocol, &DriverName);
if ((!EFI_ERROR(Status)) && (DriverName))
{
AddEfiDriverName(DriverName);
}
}
FreePool(Handles);
for (i = 0; i < g_EfiDriverNameCnt; i++)
{
Printf("%2d %s\n", i, g_EfiDriverNameList[i]);
}
return EFI_SUCCESS;
}

View File

@@ -44,8 +44,39 @@ STATIC grub_env_printf_pf g_env_printf = NULL;
STATIC VtoyUtilFeature gFeatureList[] = STATIC VtoyUtilFeature gFeatureList[] =
{ {
{ L"fix_windows_mmap", FixWindowsMemhole }, { L"fix_windows_mmap", FixWindowsMemhole },
{ L"show_efi_drivers", ShowEfiDrivers },
}; };
EFI_STATUS VtoyGetComponentName(IN UINTN Ver, IN VOID *Protocol, OUT CHAR16 **DriverName)
{
EFI_STATUS Status = EFI_SUCCESS;
CHAR16 *DrvName = NULL;
EFI_COMPONENT_NAME_PROTOCOL *NameProtocol = NULL;
EFI_COMPONENT_NAME2_PROTOCOL *Name2Protocol = NULL;
if (1 == Ver)
{
NameProtocol = (EFI_COMPONENT_NAME_PROTOCOL *)Protocol;
Status = NameProtocol->GetDriverName(Protocol, "en", &DrvName);
if (EFI_ERROR(Status) || NULL == DrvName)
{
Status = NameProtocol->GetDriverName(Protocol, "eng", &DrvName);
}
}
else
{
Name2Protocol = (EFI_COMPONENT_NAME2_PROTOCOL *)Protocol;
Status = Name2Protocol->GetDriverName(Protocol, "en", &DrvName);
if (EFI_ERROR(Status) || NULL == DrvName)
{
Status = Name2Protocol->GetDriverName(Protocol, "eng", &DrvName);
}
}
*DriverName = DrvName;
return Status;
}
VOID EFIAPI VtoyUtilDebug(IN CONST CHAR8 *Format, ...) VOID EFIAPI VtoyUtilDebug(IN CONST CHAR8 *Format, ...)
{ {
VA_LIST Marker; VA_LIST Marker;

View File

@@ -57,7 +57,9 @@ VOID EFIAPI VtoyUtilDebug(IN CONST CHAR8 *Format, ...);
#define debug(expr, ...) if (gVtoyDebugPrint) VtoyUtilDebug("[VTOY] "expr"\n", ##__VA_ARGS__) #define debug(expr, ...) if (gVtoyDebugPrint) VtoyUtilDebug("[VTOY] "expr"\n", ##__VA_ARGS__)
#define Printf VtoyUtilDebug #define Printf VtoyUtilDebug
EFI_STATUS VtoyGetComponentName(IN UINTN Ver, IN VOID *Protocol, OUT CHAR16 **DriverName);
EFI_STATUS FixWindowsMemhole(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine); EFI_STATUS FixWindowsMemhole(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine);
EFI_STATUS ShowEfiDrivers(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine);
#endif #endif

View File

@@ -28,6 +28,7 @@
[Sources] [Sources]
VtoyUtil.h VtoyUtil.h
VtoyUtil.c VtoyUtil.c
VtoyDrv.c
Memhole.c Memhole.c
[Packages] [Packages]

View File

@@ -69,7 +69,7 @@ hash_file (grub_file_t file, const gcry_md_spec_t *hash, void *result)
grub_uint64_t total = 0; grub_uint64_t total = 0;
void *context; void *context;
grub_uint8_t *readbuf; grub_uint8_t *readbuf;
#define BUF_SIZE 4096 #define BUF_SIZE 1024 * 1024
readbuf = grub_malloc (BUF_SIZE); readbuf = grub_malloc (BUF_SIZE);
if (!readbuf) if (!readbuf)
return grub_errno; return grub_errno;

View File

@@ -0,0 +1,257 @@
/* loopback.c - command to add loopback devices. */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2005,2006,2007 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <grub/dl.h>
#include <grub/misc.h>
#include <grub/file.h>
#include <grub/disk.h>
#include <grub/mm.h>
#include <grub/extcmd.h>
#include <grub/i18n.h>
GRUB_MOD_LICENSE ("GPLv3+");
struct grub_loopback
{
char *devname;
grub_file_t file;
struct grub_loopback *next;
unsigned long id;
grub_off_t skip;
};
static struct grub_loopback *loopback_list;
static unsigned long last_id = 0;
static const struct grub_arg_option options[] =
{
/* TRANSLATORS: The disk is simply removed from the list of available ones,
not wiped, avoid to scare user. */
{"delete", 'd', 0, N_("Delete the specified loopback drive."), 0, 0},
{"skip", 's', 0, "skip sectors of the file.", "SECTORS", ARG_TYPE_INT },
{0, 0, 0, 0, 0, 0}
};
/* Delete the loopback device NAME. */
static grub_err_t
delete_loopback (const char *name)
{
struct grub_loopback *dev;
struct grub_loopback **prev;
/* Search for the device. */
for (dev = loopback_list, prev = &loopback_list;
dev;
prev = &dev->next, dev = dev->next)
if (grub_strcmp (dev->devname, name) == 0)
break;
if (! dev)
return grub_error (GRUB_ERR_BAD_DEVICE, "device not found");
/* Remove the device from the list. */
*prev = dev->next;
grub_free (dev->devname);
grub_file_close (dev->file);
grub_free (dev);
return 0;
}
/* The command to add and remove loopback devices. */
static grub_err_t
grub_cmd_loopback (grub_extcmd_context_t ctxt, int argc, char **args)
{
struct grub_arg_list *state = ctxt->state;
grub_file_t file;
struct grub_loopback *newdev;
grub_err_t ret;
grub_off_t skip = 0;
if (argc < 1)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "device name required");
/* Check if `-d' was used. */
if (state[0].set)
return delete_loopback (args[0]);
if (state[1].set)
skip = (grub_off_t)grub_strtoull(state[1].arg, NULL, 10);
if (argc < 2)
return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("filename expected"));
file = grub_file_open (args[1], GRUB_FILE_TYPE_LOOPBACK
| GRUB_FILE_TYPE_NO_DECOMPRESS);
if (! file)
return grub_errno;
/* First try to replace the old device. */
for (newdev = loopback_list; newdev; newdev = newdev->next)
if (grub_strcmp (newdev->devname, args[0]) == 0)
break;
if (newdev)
{
grub_file_close (newdev->file);
newdev->file = file;
newdev->skip = skip;
return 0;
}
/* Unable to replace it, make a new entry. */
newdev = grub_malloc (sizeof (struct grub_loopback));
if (! newdev)
goto fail;
newdev->devname = grub_strdup (args[0]);
if (! newdev->devname)
{
grub_free (newdev);
goto fail;
}
newdev->file = file;
newdev->skip = skip;
newdev->id = last_id++;
/* Add the new entry to the list. */
newdev->next = loopback_list;
loopback_list = newdev;
return 0;
fail:
ret = grub_errno;
grub_file_close (file);
return ret;
}
static int
grub_loopback_iterate (grub_disk_dev_iterate_hook_t hook, void *hook_data,
grub_disk_pull_t pull)
{
struct grub_loopback *d;
if (pull != GRUB_DISK_PULL_NONE)
return 0;
for (d = loopback_list; d; d = d->next)
{
if (hook (d->devname, hook_data))
return 1;
}
return 0;
}
static grub_err_t
grub_loopback_open (const char *name, grub_disk_t disk)
{
struct grub_loopback *dev;
for (dev = loopback_list; dev; dev = dev->next)
if (grub_strcmp (dev->devname, name) == 0)
break;
if (! dev)
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't open device");
/* Use the filesize for the disk size, round up to a complete sector. */
if (dev->file->size != GRUB_FILE_SIZE_UNKNOWN)
disk->total_sectors = ((dev->file->size + GRUB_DISK_SECTOR_SIZE - 1)
/ GRUB_DISK_SECTOR_SIZE);
else
disk->total_sectors = GRUB_DISK_SIZE_UNKNOWN;
/* Avoid reading more than 512M. */
disk->max_agglomerate = 1 << (29 - GRUB_DISK_SECTOR_BITS
- GRUB_DISK_CACHE_BITS);
disk->id = dev->id;
disk->data = dev;
return 0;
}
static grub_err_t
grub_loopback_read (grub_disk_t disk, grub_disk_addr_t sector,
grub_size_t size, char *buf)
{
grub_file_t file = ((struct grub_loopback *) disk->data)->file;
grub_off_t skip = ((struct grub_loopback *) disk->data)->skip;
grub_off_t pos;
grub_file_seek (file, (sector + skip) << GRUB_DISK_SECTOR_BITS);
grub_file_read (file, buf, size << GRUB_DISK_SECTOR_BITS);
if (grub_errno)
return grub_errno;
/* In case there is more data read than there is available, in case
of files that are not a multiple of GRUB_DISK_SECTOR_SIZE, fill
the rest with zeros. */
pos = (sector + skip + size) << GRUB_DISK_SECTOR_BITS;
if (pos > file->size)
{
grub_size_t amount = pos - file->size;
grub_memset (buf + (size << GRUB_DISK_SECTOR_BITS) - amount, 0, amount);
}
return 0;
}
static grub_err_t
grub_loopback_write (grub_disk_t disk __attribute ((unused)),
grub_disk_addr_t sector __attribute ((unused)),
grub_size_t size __attribute ((unused)),
const char *buf __attribute ((unused)))
{
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"loopback write is not supported");
}
static struct grub_disk_dev grub_loopback_dev =
{
.name = "loopback",
.id = GRUB_DISK_DEVICE_LOOPBACK_ID,
.disk_iterate = grub_loopback_iterate,
.disk_open = grub_loopback_open,
.disk_read = grub_loopback_read,
.disk_write = grub_loopback_write,
.next = 0
};
static grub_extcmd_t cmd;
GRUB_MOD_INIT(loopback)
{
cmd = grub_register_extcmd ("loopback", grub_cmd_loopback, 0,
N_("[-d] DEVICENAME FILE."),
/* TRANSLATORS: The file itself is not destroyed
or transformed into drive. */
N_("Make a virtual drive from a file."), options);
grub_disk_dev_register (&grub_loopback_dev);
}
GRUB_MOD_FINI(loopback)
{
grub_unregister_extcmd (cmd);
grub_disk_dev_unregister (&grub_loopback_dev);
}

File diff suppressed because it is too large Load Diff

View File

@@ -33,6 +33,7 @@
GRUB_MOD_LICENSE ("GPLv3+"); GRUB_MOD_LICENSE ("GPLv3+");
static int g_ventoy_no_joliet = 0; static int g_ventoy_no_joliet = 0;
static int g_ventoy_cur_joliet = 0;
static grub_uint64_t g_ventoy_last_read_pos = 0; static grub_uint64_t g_ventoy_last_read_pos = 0;
static grub_uint64_t g_ventoy_last_read_offset = 0; static grub_uint64_t g_ventoy_last_read_offset = 0;
static grub_uint64_t g_ventoy_last_read_dirent_pos = 0; static grub_uint64_t g_ventoy_last_read_dirent_pos = 0;
@@ -451,6 +452,7 @@ grub_iso9660_mount (grub_disk_t disk)
data->disk = disk; data->disk = disk;
g_ventoy_cur_joliet = 0;
block = 16; block = 16;
do do
{ {
@@ -484,6 +486,7 @@ grub_iso9660_mount (grub_disk_t disk)
if (0 == g_ventoy_no_joliet) { if (0 == g_ventoy_no_joliet) {
copy_voldesc = 1; copy_voldesc = 1;
data->joliet = 1; data->joliet = 1;
g_ventoy_cur_joliet = 1;
} }
} }
@@ -1118,6 +1121,11 @@ void grub_iso9660_set_nojoliet(int nojoliet)
g_ventoy_no_joliet = nojoliet; g_ventoy_no_joliet = nojoliet;
} }
int grub_iso9660_is_joliet(void)
{
return g_ventoy_cur_joliet;
}
grub_uint64_t grub_iso9660_get_last_read_pos(grub_file_t file) grub_uint64_t grub_iso9660_get_last_read_pos(grub_file_t file)
{ {
(void)file; (void)file;

View File

@@ -59,11 +59,15 @@ struct grub_gui_label
grub_font_t font; grub_font_t font;
grub_video_rgba_color_t color; grub_video_rgba_color_t color;
int value; int value;
int vtoytip;
enum align_mode align; enum align_mode align;
}; };
typedef struct grub_gui_label *grub_gui_label_t; typedef struct grub_gui_label *grub_gui_label_t;
extern const char * g_ventoy_tip_msg1;
extern const char * g_ventoy_tip_msg2;
static void static void
label_destroy (void *vself) label_destroy (void *vself)
{ {
@@ -90,6 +94,7 @@ label_is_instance (void *vself __attribute__((unused)), const char *type)
static void static void
label_paint (void *vself, const grub_video_rect_t *region) label_paint (void *vself, const grub_video_rect_t *region)
{ {
const char *text;
grub_gui_label_t self = vself; grub_gui_label_t self = vself;
if (! self->visible) if (! self->visible)
@@ -98,16 +103,24 @@ label_paint (void *vself, const grub_video_rect_t *region)
if (!grub_video_have_common_points (region, &self->bounds)) if (!grub_video_have_common_points (region, &self->bounds))
return; return;
if (self->vtoytip == 1) {
text = g_ventoy_tip_msg1 ? g_ventoy_tip_msg1 : "";
} else if (self->vtoytip == 2) {
text = g_ventoy_tip_msg2 ? g_ventoy_tip_msg2 : "";
} else {
text = self->text;
}
/* Calculate the starting x coordinate. */ /* Calculate the starting x coordinate. */
int left_x; int left_x;
if (self->align == align_left) if (self->align == align_left)
left_x = 0; left_x = 0;
else if (self->align == align_center) else if (self->align == align_center)
left_x = (self->bounds.width left_x = (self->bounds.width
- grub_font_get_string_width (self->font, self->text)) / 2; - grub_font_get_string_width (self->font, text)) / 2;
else if (self->align == align_right) else if (self->align == align_right)
left_x = (self->bounds.width left_x = (self->bounds.width
- grub_font_get_string_width (self->font, self->text)); - grub_font_get_string_width (self->font, text));
else else
return; /* Invalid alignment. */ return; /* Invalid alignment. */
@@ -116,7 +129,7 @@ label_paint (void *vself, const grub_video_rect_t *region)
grub_video_rect_t vpsave; grub_video_rect_t vpsave;
grub_gui_set_viewport (&self->bounds, &vpsave); grub_gui_set_viewport (&self->bounds, &vpsave);
grub_font_draw_string (self->text, grub_font_draw_string (text,
self->font, self->font,
grub_video_map_rgba_color (self->color), grub_video_map_rgba_color (self->color),
left_x, left_x,
@@ -156,8 +169,8 @@ static void
label_get_minimal_size (void *vself, unsigned *width, unsigned *height) label_get_minimal_size (void *vself, unsigned *width, unsigned *height)
{ {
grub_gui_label_t self = vself; grub_gui_label_t self = vself;
*width = grub_font_get_string_width (self->font, self->text); *width = grub_font_get_string_width (self->font, self->text);
*height = (grub_font_get_ascent (self->font) *height = (grub_font_get_ascent (self->font)
+ grub_font_get_descent (self->font)); + grub_font_get_descent (self->font));
} }
@@ -255,8 +268,14 @@ label_set_property (void *vself, const char *name, const char *value)
{ {
grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self); grub_gfxmenu_timeout_unregister ((grub_gui_component_t) self);
grub_free (self->id); grub_free (self->id);
if (value) if (value) {
self->id = grub_strdup (value); self->id = grub_strdup (value);
if (grub_strcmp(value, "VTOY_MENU_TIP_1") == 0) {
self->vtoytip = 1;
} else if (grub_strcmp(value, "VTOY_MENU_TIP_2") == 0) {
self->vtoytip = 2;
}
}
else else
self->id = 0; self->id = 0;
if (self->id && grub_strcmp (self->id, GRUB_GFXMENU_TIMEOUT_COMPONENT_ID) if (self->id && grub_strcmp (self->id, GRUB_GFXMENU_TIMEOUT_COMPONENT_ID)

View File

@@ -733,6 +733,8 @@ done:
return grub_errno; return grub_errno;
} }
extern int g_menu_update_mode;
/* Set properties on the view based on settings from the specified /* Set properties on the view based on settings from the specified
theme file. */ theme file. */
grub_err_t grub_err_t
@@ -752,7 +754,7 @@ grub_gfxmenu_view_load_theme (grub_gfxmenu_view_t view, const char *theme_path)
} }
p.len = grub_file_size (file); p.len = grub_file_size (file);
p.buf = grub_malloc (p.len + 4096); p.buf = grub_malloc (p.len + 8192);
p.pos = 0; p.pos = 0;
p.line_num = 1; p.line_num = 1;
p.col_num = 1; p.col_num = 1;
@@ -781,6 +783,33 @@ grub_gfxmenu_view_load_theme (grub_gfxmenu_view_t view, const char *theme_path)
} }
} }
{
const char *tip = grub_env_get("VTOY_MENU_TIP_ENABLE");
if (tip && tip[0] == '1')
{
char tmpmsg[512];
grub_memset(tmpmsg, 'w', 500);
tmpmsg[500] = 0;
g_menu_update_mode = 1;
p.len += grub_snprintf(p.buf + p.len, 4096,
"\n+ vbox{\n left = %s\n top = %s\n"
"+ label { id=\"VTOY_MENU_TIP_1\" text = \"%s\" color = \"%s\" align = \"%s\"}\n"
"+ label { id=\"VTOY_MENU_TIP_2\" text = \"%s\" color = \"%s\" align = \"%s\"}\n"
"}\n",
grub_env_get("VTOY_TIP_LEFT"),
grub_env_get("VTOY_TIP_TOP"),
tmpmsg,
grub_env_get("VTOY_TIP_COLOR"),
grub_env_get("VTOY_TIP_ALIGN"),
tmpmsg,
grub_env_get("VTOY_TIP_COLOR"),
grub_env_get("VTOY_TIP_ALIGN")
);
}
}
if (view->canvas) if (view->canvas)
view->canvas->component.ops->destroy (view->canvas); view->canvas->component.ops->destroy (view->canvas);

View File

@@ -386,21 +386,37 @@ redraw_menu_visit (grub_gui_component_t component,
} }
} }
extern int g_menu_update_mode;
static void grub_gfxmenu_update_all(grub_gfxmenu_view_t view)
{
grub_video_set_area_status(GRUB_VIDEO_AREA_DISABLED);
grub_gfxmenu_view_redraw(view, &view->screen);
}
void void
grub_gfxmenu_redraw_menu (grub_gfxmenu_view_t view) grub_gfxmenu_redraw_menu (grub_gfxmenu_view_t view)
{ {
update_menu_components (view); update_menu_components (view);
grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas, if (g_menu_update_mode)
redraw_menu_visit, view); grub_gfxmenu_update_all(view);
else
grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas,
redraw_menu_visit, view);
grub_video_swap_buffers (); grub_video_swap_buffers ();
if (view->double_repaint) if (view->double_repaint)
{ {
grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas, if (g_menu_update_mode)
redraw_menu_visit, view); grub_gfxmenu_update_all(view);
else
grub_gui_iterate_recursively ((grub_gui_component_t) view->canvas,
redraw_menu_visit, view);
} }
} }
void void
grub_gfxmenu_set_chosen_entry (int entry, void *data) grub_gfxmenu_set_chosen_entry (int entry, void *data)
{ {
@@ -408,6 +424,8 @@ grub_gfxmenu_set_chosen_entry (int entry, void *data)
view->selected = entry; view->selected = entry;
grub_gfxmenu_redraw_menu (view); grub_gfxmenu_redraw_menu (view);
} }
static void static void

View File

@@ -279,6 +279,13 @@ static int ventoy_boot_opt_filter(char *opt)
opt[1] = 't'; opt[1] = 't';
return 0; return 0;
} }
if (grub_strncmp(opt, "dm=", 3) == 0)
{
opt[0] = 'D';
opt[1] = 'M';
return 0;
}
if (ventoy_debug) if (ventoy_debug)
{ {

View File

@@ -506,6 +506,13 @@ static int ventoy_boot_opt_filter(char *opt)
return 0; return 0;
} }
if (grub_strncmp(opt, "dm=", 3) == 0)
{
opt[0] = 'D';
opt[1] = 'M';
return 0;
}
if (ventoy_debug) if (ventoy_debug)
{ {
if (grub_strcmp(opt, "quiet") == 0) if (grub_strcmp(opt, "quiet") == 0)

View File

@@ -228,6 +228,13 @@ static int ventoy_boot_opt_filter(char *opt)
return 0; return 0;
} }
if (grub_strncmp(opt, "dm=", 3) == 0)
{
opt[0] = 'D';
opt[1] = 'M';
return 0;
}
if (ventoy_debug) if (ventoy_debug)
{ {
if (grub_strcmp(opt, "quiet") == 0) if (grub_strcmp(opt, "quiet") == 0)

View File

@@ -33,6 +33,9 @@
#include <grub/gfxterm.h> #include <grub/gfxterm.h>
#include <grub/dl.h> #include <grub/dl.h>
#include <grub/env.h> #include <grub/env.h>
#include <grub/extcmd.h>
#include <grub/ventoy.h>
#include "ventoy/ventoy_def.h"
int g_ventoy_menu_refresh = 0; int g_ventoy_menu_refresh = 0;
int g_ventoy_memdisk_mode = 0; int g_ventoy_memdisk_mode = 0;
@@ -381,10 +384,28 @@ grub_menu_execute_with_fallback (grub_menu_t menu,
static struct grub_menu_viewer *viewers; static struct grub_menu_viewer *viewers;
int g_menu_update_mode = 0;
int g_ventoy_tip_label_enable = 0;
const char * g_ventoy_tip_msg1 = NULL;
const char * g_ventoy_tip_msg2 = NULL;
static void static void
menu_set_chosen_entry (int entry) menu_set_chosen_entry (grub_menu_t menu, int entry)
{ {
struct grub_menu_viewer *cur; struct grub_menu_viewer *cur;
img_info *img;
grub_menu_entry_t e = grub_menu_get_entry (menu, entry);
g_ventoy_tip_msg1 = g_ventoy_tip_msg2 = NULL;
if (e && e->id && grub_strncmp(e->id, "VID_", 4) == 0) {
img = (img_info *)(void *)grub_strtoul(e->id + 4, NULL, 16);
if (img)
{
g_ventoy_tip_msg1 = img->tip1;
g_ventoy_tip_msg2 = img->tip2;
}
}
for (cur = viewers; cur; cur = cur->next) for (cur = viewers; cur; cur = cur->next)
cur->set_chosen_entry (entry, cur->data); cur->set_chosen_entry (entry, cur->data);
} }
@@ -732,13 +753,13 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
case GRUB_TERM_KEY_HOME: case GRUB_TERM_KEY_HOME:
case GRUB_TERM_CTRL | 'a': case GRUB_TERM_CTRL | 'a':
current_entry = 0; current_entry = 0;
menu_set_chosen_entry (current_entry); menu_set_chosen_entry (menu, current_entry);
break; break;
case GRUB_TERM_KEY_END: case GRUB_TERM_KEY_END:
case GRUB_TERM_CTRL | 'e': case GRUB_TERM_CTRL | 'e':
current_entry = menu->size - 1; current_entry = menu->size - 1;
menu_set_chosen_entry (current_entry); menu_set_chosen_entry (menu, current_entry);
break; break;
case GRUB_TERM_KEY_UP: case GRUB_TERM_KEY_UP:
@@ -746,7 +767,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
case '^': case '^':
if (current_entry > 0) if (current_entry > 0)
current_entry--; current_entry--;
menu_set_chosen_entry (current_entry); menu_set_chosen_entry (menu, current_entry);
break; break;
case GRUB_TERM_CTRL | 'n': case GRUB_TERM_CTRL | 'n':
@@ -754,7 +775,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
case 'v': case 'v':
if (current_entry < menu->size - 1) if (current_entry < menu->size - 1)
current_entry++; current_entry++;
menu_set_chosen_entry (current_entry); menu_set_chosen_entry (menu, current_entry);
break; break;
case GRUB_TERM_CTRL | 'g': case GRUB_TERM_CTRL | 'g':
@@ -763,7 +784,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
current_entry = 0; current_entry = 0;
else else
current_entry -= GRUB_MENU_PAGE_SIZE; current_entry -= GRUB_MENU_PAGE_SIZE;
menu_set_chosen_entry (current_entry); menu_set_chosen_entry (menu, current_entry);
break; break;
case GRUB_TERM_CTRL | 'c': case GRUB_TERM_CTRL | 'c':
@@ -772,7 +793,7 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
current_entry += GRUB_MENU_PAGE_SIZE; current_entry += GRUB_MENU_PAGE_SIZE;
else else
current_entry = menu->size - 1; current_entry = menu->size - 1;
menu_set_chosen_entry (current_entry); menu_set_chosen_entry (menu, current_entry);
break; break;
case '\n': case '\n':

View File

@@ -0,0 +1,232 @@
/* gpt.c - Read GUID Partition Tables (GPT). */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2002,2005,2006,2007,2008 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#include <grub/disk.h>
#include <grub/misc.h>
#include <grub/mm.h>
#include <grub/partition.h>
#include <grub/dl.h>
#include <grub/msdos_partition.h>
#include <grub/gpt_partition.h>
#include <grub/i18n.h>
GRUB_MOD_LICENSE ("GPLv3+");
static grub_uint8_t grub_gpt_magic[8] =
{
0x45, 0x46, 0x49, 0x20, 0x50, 0x41, 0x52, 0x54
};
static const grub_gpt_part_guid_t grub_gpt_partition_type_empty = GRUB_GPT_PARTITION_TYPE_EMPTY;
#ifdef GRUB_UTIL
static const grub_gpt_part_guid_t grub_gpt_partition_type_bios_boot = GRUB_GPT_PARTITION_TYPE_BIOS_BOOT;
#endif
/* 512 << 7 = 65536 byte sectors. */
#define MAX_SECTOR_LOG 7
static struct grub_partition_map grub_gpt_partition_map;
grub_err_t
grub_gpt_partition_map_iterate (grub_disk_t disk,
grub_partition_iterate_hook_t hook,
void *hook_data)
{
struct grub_partition part;
struct grub_gpt_header gpt;
struct grub_gpt_partentry entry;
struct grub_msdos_partition_mbr mbr;
grub_uint64_t entries;
unsigned int i;
int last_offset = 0;
int sector_log = 0;
/* Read the protective MBR. */
if (grub_disk_read (disk, 0, 0, sizeof (mbr), &mbr))
return grub_errno;
/* Check if it is valid. */
if (mbr.signature != grub_cpu_to_le16_compile_time (GRUB_PC_PARTITION_SIGNATURE))
return grub_error (GRUB_ERR_BAD_PART_TABLE, "no signature");
/* Make sure the MBR is a protective MBR and not a normal MBR. */
for (i = 0; i < 4; i++)
if (mbr.entries[i].type == GRUB_PC_PARTITION_TYPE_GPT_DISK)
break;
if (i == 4)
return grub_error (GRUB_ERR_BAD_PART_TABLE, "no GPT partition map found");
/* Read the GPT header. */
for (sector_log = 0; sector_log < MAX_SECTOR_LOG; sector_log++)
{
if (grub_disk_read (disk, 1 << sector_log, 0, sizeof (gpt), &gpt))
return grub_errno;
if (grub_memcmp (gpt.magic, grub_gpt_magic, sizeof (grub_gpt_magic)) == 0)
break;
}
if (sector_log == MAX_SECTOR_LOG)
return grub_error (GRUB_ERR_BAD_PART_TABLE, "no valid GPT header");
grub_dprintf ("gpt", "Read a valid GPT header\n");
entries = grub_le_to_cpu64 (gpt.partitions) << sector_log;
for (i = 0; i < grub_le_to_cpu32 (gpt.maxpart); i++)
{
if (grub_disk_read (disk, entries, last_offset,
sizeof (entry), &entry))
return grub_errno;
if (grub_memcmp (&grub_gpt_partition_type_empty, &entry.type,
sizeof (grub_gpt_partition_type_empty)))
{
/* Calculate the first block and the size of the partition. */
part.start = grub_le_to_cpu64 (entry.start) << sector_log;
part.len = (grub_le_to_cpu64 (entry.end)
- grub_le_to_cpu64 (entry.start) + 1) << sector_log;
part.offset = entries;
part.number = i;
part.index = last_offset;
part.partmap = &grub_gpt_partition_map;
part.parent = disk->partition;
part.gpt_attrib = entry.attrib;
grub_dprintf ("gpt", "GPT entry %d: start=%lld, length=%lld\n", i,
(unsigned long long) part.start,
(unsigned long long) part.len);
if (hook (disk, &part, hook_data))
return grub_errno;
}
last_offset += grub_le_to_cpu32 (gpt.partentry_size);
if (last_offset == GRUB_DISK_SECTOR_SIZE)
{
last_offset = 0;
entries++;
}
}
return GRUB_ERR_NONE;
}
#ifdef GRUB_UTIL
/* Context for gpt_partition_map_embed. */
struct gpt_partition_map_embed_ctx
{
grub_disk_addr_t start, len;
};
/* Helper for gpt_partition_map_embed. */
static int
find_usable_region (grub_disk_t disk __attribute__ ((unused)),
const grub_partition_t p, void *data)
{
struct gpt_partition_map_embed_ctx *ctx = data;
struct grub_gpt_partentry gptdata;
grub_partition_t p2;
p2 = disk->partition;
disk->partition = p->parent;
if (grub_disk_read (disk, p->offset, p->index,
sizeof (gptdata), &gptdata))
{
disk->partition = p2;
return 0;
}
disk->partition = p2;
/* If there's an embed region, it is in a dedicated partition. */
if (! grub_memcmp (&gptdata.type, &grub_gpt_partition_type_bios_boot, 16))
{
ctx->start = p->start;
ctx->len = p->len;
return 1;
}
return 0;
}
static grub_err_t
gpt_partition_map_embed (struct grub_disk *disk, unsigned int *nsectors,
unsigned int max_nsectors,
grub_embed_type_t embed_type,
grub_disk_addr_t **sectors)
{
struct gpt_partition_map_embed_ctx ctx = {
.start = 0,
.len = 0
};
unsigned i;
grub_err_t err;
if (embed_type != GRUB_EMBED_PCBIOS)
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
"GPT currently supports only PC-BIOS embedding");
err = grub_gpt_partition_map_iterate (disk, find_usable_region, &ctx);
if (err)
return err;
if (ctx.len == 0)
return grub_error (GRUB_ERR_FILE_NOT_FOUND,
N_("this GPT partition label contains no BIOS Boot Partition;"
" embedding won't be possible"));
if (ctx.len < *nsectors)
return grub_error (GRUB_ERR_OUT_OF_RANGE,
N_("your BIOS Boot Partition is too small;"
" embedding won't be possible"));
*nsectors = ctx.len;
if (*nsectors > max_nsectors)
*nsectors = max_nsectors;
*sectors = grub_malloc (*nsectors * sizeof (**sectors));
if (!*sectors)
return grub_errno;
for (i = 0; i < *nsectors; i++)
(*sectors)[i] = ctx.start + i;
return GRUB_ERR_NONE;
}
#endif
/* Partition map type. */
static struct grub_partition_map grub_gpt_partition_map =
{
.name = "gpt",
.iterate = grub_gpt_partition_map_iterate,
#ifdef GRUB_UTIL
.embed = gpt_partition_map_embed
#endif
};
GRUB_MOD_INIT(part_gpt)
{
grub_partition_map_register (&grub_gpt_partition_map);
}
GRUB_MOD_FINI(part_gpt)
{
grub_partition_map_unregister (&grub_gpt_partition_map);
}

View File

@@ -462,6 +462,8 @@ static int lzx_uncompressed ( struct lzx *lzx ) {
if ( len % 2 ) if ( len % 2 )
lzx->input.offset++; 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 */ /* Sanity check */
if ( len % 2 ) { if ( len % 2 ) {
DBG ( "LZX cannot handle odd-length input data\n" ); DBG ( "LZX cannot handle odd-length input data\n" );
return -1; //return -1;
} }
/* Initialise global state, if required */ /* Initialise global state, if required */

View File

@@ -127,6 +127,9 @@ static grub_uint64_t g_enumerate_start_time_ms;
static grub_uint64_t g_enumerate_finish_time_ms; static grub_uint64_t g_enumerate_finish_time_ms;
static int g_vtoy_file_flt[VTOY_FILE_FLT_BUTT] = {0}; static int g_vtoy_file_flt[VTOY_FILE_FLT_BUTT] = {0};
static int g_pager_flag = 0;
static char g_old_pager[32];
static const char *g_vtoy_winpeshl_ini = "[LaunchApps]\r\nvtoyjump.exe"; static const char *g_vtoy_winpeshl_ini = "[LaunchApps]\r\nvtoyjump.exe";
static const char *g_menu_class[] = static const char *g_menu_class[] =
@@ -142,6 +145,8 @@ const char *g_menu_prefix[img_type_max] =
static int g_vtoy_load_prompt = 0; static int g_vtoy_load_prompt = 0;
static char g_vtoy_prompt_msg[64]; static char g_vtoy_prompt_msg[64];
static char g_json_case_mis_path[32];
static int ventoy_get_fs_type(const char *fs) static int ventoy_get_fs_type(const char *fs)
{ {
if (NULL == fs) if (NULL == fs)
@@ -1221,6 +1226,23 @@ static grub_err_t ventoy_cmd_load_img_memdisk(grub_extcmd_context_t ctxt, int ar
return rc; return rc;
} }
static grub_err_t ventoy_cmd_iso9660_is_joliet(grub_extcmd_context_t ctxt, int argc, char **args)
{
(void)ctxt;
(void)argc;
(void)args;
if (grub_iso9660_is_joliet())
{
debug("This time has joliet process\n");
return 0;
}
else
{
return 1;
}
}
static grub_err_t ventoy_cmd_iso9660_nojoliet(grub_extcmd_context_t ctxt, int argc, char **args) static grub_err_t ventoy_cmd_iso9660_nojoliet(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
(void)ctxt; (void)ctxt;
@@ -1540,6 +1562,7 @@ static int ventoy_collect_img_files(const char *filename, const struct grub_dirh
grub_size_t len; grub_size_t len;
img_info *img; img_info *img;
img_info *tail; img_info *tail;
const menu_tip *tip;
img_iterator_node *tmp; img_iterator_node *tmp;
img_iterator_node *new_node; img_iterator_node *new_node;
img_iterator_node *node = (img_iterator_node *)data; img_iterator_node *node = (img_iterator_node *)data;
@@ -1757,6 +1780,14 @@ static int ventoy_collect_img_files(const char *filename, const struct grub_dirh
g_ventoy_img_count++; g_ventoy_img_count++;
img->alias = ventoy_plugin_get_menu_alias(vtoy_alias_image_file, img->path); img->alias = ventoy_plugin_get_menu_alias(vtoy_alias_image_file, img->path);
tip = ventoy_plugin_get_menu_tip(img->path);
if (tip)
{
img->tip1 = tip->tip1;
img->tip2 = tip->tip2;
}
img->class = ventoy_plugin_get_menu_class(vtoy_class_image_file, img->name, img->path); img->class = ventoy_plugin_get_menu_class(vtoy_class_image_file, img->name, img->path);
if (!img->class) if (!img->class)
{ {
@@ -2051,23 +2082,23 @@ static int ventoy_dynamic_tree_menu(img_iterator_node *node)
if (g_tree_view_menu_style == 0) if (g_tree_view_menu_style == 0)
{ {
vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos,
"menuentry \"%-10s %s%s\" --class=\"%s\" --id=\"VID_%d\" {\n" "menuentry \"%-10s %s%s\" --class=\"%s\" --id=\"VID_%p\" {\n"
" %s_%s \n" " %s_%s \n"
"}\n", "}\n",
grub_get_human_size(img->size, GRUB_HUMAN_SIZE_SHORT), grub_get_human_size(img->size, GRUB_HUMAN_SIZE_SHORT),
img->unsupport ? "[***********] " : "", img->unsupport ? "[***********] " : "",
img->alias ? img->alias : img->name, img->class, img->id, img->alias ? img->alias : img->name, img->class, img,
img->menu_prefix, img->menu_prefix,
img->unsupport ? "unsupport_menuentry" : "common_menuentry"); img->unsupport ? "unsupport_menuentry" : "common_menuentry");
} }
else else
{ {
vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos,
"menuentry \"%s%s\" --class=\"%s\" --id=\"VID_%d\" {\n" "menuentry \"%s%s\" --class=\"%s\" --id=\"VID_%p\" {\n"
" %s_%s \n" " %s_%s \n"
"}\n", "}\n",
img->unsupport ? "[***********] " : "", img->unsupport ? "[***********] " : "",
img->alias ? img->alias : img->name, img->class, img->id, img->alias ? img->alias : img->name, img->class, img,
img->menu_prefix, img->menu_prefix,
img->unsupport ? "unsupport_menuentry" : "common_menuentry"); img->unsupport ? "unsupport_menuentry" : "common_menuentry");
} }
@@ -2114,7 +2145,7 @@ static int ventoy_set_default_menu(void)
if (0 == g_default_menu_mode) if (0 == g_default_menu_mode)
{ {
vtoy_ssprintf(g_list_script_buf, g_list_script_pos, "set default='VID_%d'\n", default_node->id); vtoy_ssprintf(g_list_script_buf, g_list_script_pos, "set default='VID_%p'\n", default_node);
} }
else else
{ {
@@ -2147,7 +2178,7 @@ static int ventoy_set_default_menu(void)
pos = end + 1; pos = end + 1;
} }
vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, "VID_%d'\n", default_node->id); vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos, "VID_%p'\n", default_node);
grub_free(def); grub_free(def);
} }
} }
@@ -2244,7 +2275,7 @@ static grub_err_t ventoy_cmd_ext_select_img_path(grub_extcmd_context_t ctxt, int
return grub_error(GRUB_ERR_BAD_ARGUMENT, "No such image"); return grub_error(GRUB_ERR_BAD_ARGUMENT, "No such image");
} }
grub_snprintf(id, sizeof(id), "VID_%d", cur->id); grub_snprintf(id, sizeof(id), "VID_%p", cur);
grub_env_set("chosen", id); grub_env_set("chosen", id);
grub_env_export("chosen"); grub_env_export("chosen");
@@ -2253,11 +2284,10 @@ static grub_err_t ventoy_cmd_ext_select_img_path(grub_extcmd_context_t ctxt, int
static grub_err_t ventoy_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int argc, char **args) static grub_err_t ventoy_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
int img_id = 0;
char value[32]; char value[32];
char *pos = NULL; char *pos = NULL;
const char *id = NULL; const char *id = NULL;
img_info *cur = g_ventoy_img_list; img_info *cur = NULL;
(void)ctxt; (void)ctxt;
@@ -2271,20 +2301,11 @@ static grub_err_t ventoy_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int arg
pos = grub_strstr(id, "VID_"); pos = grub_strstr(id, "VID_");
if (pos) if (pos)
{ {
img_id = (int)grub_strtoul(pos + 4, NULL, 10); cur = (img_info *)(void *)grub_strtoul(pos + 4, NULL, 16);
} }
else else
{ {
img_id = (int)grub_strtoul(id, NULL, 10); cur = g_ventoy_img_list;
}
while (cur)
{
if (img_id == cur->id)
{
break;
}
cur = cur->next;
} }
if (!cur) if (!cur)
@@ -2313,12 +2334,14 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char
grub_device_t dev = NULL; grub_device_t dev = NULL;
img_info *cur = NULL; img_info *cur = NULL;
img_info *tail = NULL; img_info *tail = NULL;
img_info *min = NULL;
img_info *head = NULL;
const char *strdata = NULL; const char *strdata = NULL;
char *device_name = NULL; char *device_name = NULL;
char buf[32]; char buf[32];
img_iterator_node *node = NULL; img_iterator_node *node = NULL;
img_iterator_node *tmp = NULL; img_iterator_node *tmp = NULL;
(void)ctxt; (void)ctxt;
if (argc != 2) if (argc != 2)
@@ -2448,17 +2471,49 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char
} }
/* sort image list by image name */ /* sort image list by image name */
for (cur = g_ventoy_img_list; cur; cur = cur->next) while (g_ventoy_img_list)
{ {
for (tail = cur->next; tail; tail = tail->next) min = g_ventoy_img_list;
for (cur = g_ventoy_img_list->next; cur; cur = cur->next)
{ {
if (ventoy_cmp_img(cur, tail) > 0) if (ventoy_cmp_img(min, cur) > 0)
{ {
ventoy_swap_img(cur, tail); min = cur;
} }
} }
if (min->prev)
{
min->prev->next = min->next;
}
if (min->next)
{
min->next->prev = min->prev;
}
if (min == g_ventoy_img_list)
{
g_ventoy_img_list = min->next;
}
if (head == NULL)
{
head = tail = min;
min->prev = NULL;
min->next = NULL;
}
else
{
tail->next = min;
min->prev = tail;
min->next = NULL;
tail = min;
}
} }
g_ventoy_img_list = head;
if (g_default_menu_mode == 1) if (g_default_menu_mode == 1)
{ {
vtoy_ssprintf(g_list_script_buf, g_list_script_pos, vtoy_ssprintf(g_list_script_buf, g_list_script_pos,
@@ -2470,11 +2525,11 @@ static grub_err_t ventoy_cmd_list_img(grub_extcmd_context_t ctxt, int argc, char
for (cur = g_ventoy_img_list; cur; cur = cur->next) for (cur = g_ventoy_img_list; cur; cur = cur->next)
{ {
vtoy_ssprintf(g_list_script_buf, g_list_script_pos, vtoy_ssprintf(g_list_script_buf, g_list_script_pos,
"menuentry \"%s%s\" --class=\"%s\" --id=\"VID_%d\" {\n" "menuentry \"%s%s\" --class=\"%s\" --id=\"VID_%p\" {\n"
" %s_%s \n" " %s_%s \n"
"}\n", "}\n",
cur->unsupport ? "[***********] " : "", cur->unsupport ? "[***********] " : "",
cur->alias ? cur->alias : cur->name, cur->class, cur->id, cur->alias ? cur->alias : cur->name, cur->class, cur,
cur->menu_prefix, cur->menu_prefix,
cur->unsupport ? "unsupport_menuentry" : "common_menuentry"); cur->unsupport ? "unsupport_menuentry" : "common_menuentry");
} }
@@ -3148,6 +3203,22 @@ static grub_err_t ventoy_cmd_add_replace_file(grub_extcmd_context_t ctxt, int ar
VENTOY_CMD_RETURN(GRUB_ERR_NONE); VENTOY_CMD_RETURN(GRUB_ERR_NONE);
} }
static grub_err_t ventoy_cmd_get_replace_file_cnt(grub_extcmd_context_t ctxt, int argc, char **args)
{
char buf[32];
ventoy_grub_param_file_replace *replace = &(g_grub_param->file_replace);
(void)ctxt;
if (argc >= 1)
{
grub_snprintf(buf, sizeof(buf), "%u", replace->old_name_cnt);
grub_env_set(args[0], buf);
}
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
static grub_err_t ventoy_cmd_dump_menu(grub_extcmd_context_t ctxt, int argc, char **args) static grub_err_t ventoy_cmd_dump_menu(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
(void)ctxt; (void)ctxt;
@@ -3453,9 +3524,11 @@ end:
static int ventoy_img_partition_callback (struct grub_disk *disk, const grub_partition_t partition, void *data) static int ventoy_img_partition_callback (struct grub_disk *disk, const grub_partition_t partition, void *data)
{ {
int *pCnt = (int *)data;
(void)disk; (void)disk;
(void)data;
(*pCnt)++;
g_part_list_pos += grub_snprintf(g_part_list_buf + g_part_list_pos, VTOY_MAX_SCRIPT_BUF - g_part_list_pos, g_part_list_pos += grub_snprintf(g_part_list_buf + g_part_list_pos, VTOY_MAX_SCRIPT_BUF - g_part_list_pos,
"0 %llu linear /dev/ventoy %llu\n", "0 %llu linear /dev/ventoy %llu\n",
(ulonglong)partition->len, (ulonglong)partition->start); (ulonglong)partition->len, (ulonglong)partition->start);
@@ -3465,6 +3538,7 @@ static int ventoy_img_partition_callback (struct grub_disk *disk, const grub_par
static grub_err_t ventoy_cmd_img_part_info(grub_extcmd_context_t ctxt, int argc, char **args) static grub_err_t ventoy_cmd_img_part_info(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
int cnt = 0;
char *device_name = NULL; char *device_name = NULL;
grub_device_t dev = NULL; grub_device_t dev = NULL;
char buf[64]; char buf[64];
@@ -3493,11 +3567,14 @@ static grub_err_t ventoy_cmd_img_part_info(grub_extcmd_context_t ctxt, int argc,
goto end; goto end;
} }
grub_partition_iterate(dev->disk, ventoy_img_partition_callback, NULL); grub_partition_iterate(dev->disk, ventoy_img_partition_callback, &cnt);
grub_snprintf(buf, sizeof(buf), "newc:vtoy_dm_table:mem:0x%llx:size:%d", (ulonglong)(ulong)g_part_list_buf, g_part_list_pos); grub_snprintf(buf, sizeof(buf), "newc:vtoy_dm_table:mem:0x%llx:size:%d", (ulonglong)(ulong)g_part_list_buf, g_part_list_pos);
grub_env_set("vtoy_img_part_file", buf); grub_env_set("vtoy_img_part_file", buf);
grub_snprintf(buf, sizeof(buf), "%d", cnt);
grub_env_set("vtoy_img_part_cnt", buf);
end: end:
check_free(device_name, grub_free); check_free(device_name, grub_free);
@@ -4204,8 +4281,18 @@ static int ventoy_fs_enum_1st_file(const char *filename, const struct grub_dirho
return 0; return 0;
} }
static int ventoy_fs_enum_1st_dir(const char *filename, const struct grub_dirhook_info *info, void *data)
{
if (info->dir && filename && filename[0] != '.')
{
grub_snprintf((char *)data, 256, "%s", filename);
return 1;
}
static grub_err_t ventoy_cmd_fs_enum_1st_file(grub_extcmd_context_t ctxt, int argc, char **args) return 0;
}
static grub_err_t ventoy_fs_enum_1st_child(int argc, char **args, grub_fs_dir_hook_t hook)
{ {
int rc = 1; int rc = 1;
char *device_name = NULL; char *device_name = NULL;
@@ -4213,11 +4300,9 @@ static grub_err_t ventoy_cmd_fs_enum_1st_file(grub_extcmd_context_t ctxt, int ar
grub_fs_t fs = NULL; grub_fs_t fs = NULL;
char name[256] ={0}; char name[256] ={0};
(void)ctxt;
if (argc != 3) if (argc != 3)
{ {
debug("ventoy_cmd_fs_enum_1st_file, invalid param num %d\n", argc); debug("ventoy_fs_enum_1st_child, invalid param num %d\n", argc);
return 1; return 1;
} }
@@ -4242,7 +4327,7 @@ static grub_err_t ventoy_cmd_fs_enum_1st_file(grub_extcmd_context_t ctxt, int ar
goto end; goto end;
} }
fs->fs_dir(dev, args[1], ventoy_fs_enum_1st_file, name); fs->fs_dir(dev, args[1], hook, name);
if (name[0]) if (name[0])
{ {
ventoy_set_env(args[2], name); ventoy_set_env(args[2], name);
@@ -4258,6 +4343,18 @@ end:
return rc; return rc;
} }
static grub_err_t ventoy_cmd_fs_enum_1st_file(grub_extcmd_context_t ctxt, int argc, char **args)
{
(void)ctxt;
return ventoy_fs_enum_1st_child(argc, args, ventoy_fs_enum_1st_file);
}
static grub_err_t ventoy_cmd_fs_enum_1st_dir(grub_extcmd_context_t ctxt, int argc, char **args)
{
(void)ctxt;
return ventoy_fs_enum_1st_child(argc, args, ventoy_fs_enum_1st_dir);
}
static grub_err_t ventoy_cmd_basename(grub_extcmd_context_t ctxt, int argc, char **args) static grub_err_t ventoy_cmd_basename(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
char c; char c;
@@ -4405,6 +4502,409 @@ static grub_err_t ventoy_cmd_get_video_mode(grub_extcmd_context_t ctxt, int argc
VENTOY_CMD_RETURN(0); VENTOY_CMD_RETURN(0);
} }
static grub_err_t ventoy_cmd_get_efivdisk_offset(grub_extcmd_context_t ctxt, int argc, char **args)
{
grub_uint32_t i;
grub_uint32_t loadsector = 0;
grub_file_t file;
char value[32];
grub_uint32_t boot_catlog = 0;
grub_uint8_t buf[512];
(void)ctxt;
if (argc != 2)
{
debug("ventoy_cmd_get_efivdisk_offset, invalid param num %d\n", argc);
return 1;
}
file = grub_file_open(args[0], VENTOY_FILE_TYPE);
if (!file)
{
debug("failed to open %s\n", args[0]);
return 1;
}
boot_catlog = ventoy_get_iso_boot_catlog(file);
if (boot_catlog == 0)
{
debug("No bootcatlog found\n");
grub_file_close(file);
return 1;
}
grub_memset(buf, 0, sizeof(buf));
grub_file_seek(file, boot_catlog * 2048);
grub_file_read(file, buf, sizeof(buf));
grub_file_close(file);
for (i = 0; i < sizeof(buf); i += 32)
{
if ((buf[i] == 0 || buf[i] == 0x90 || buf[i] == 0x91) && buf[i + 1] == 0xEF)
{
if (buf[i + 32] == 0x88)
{
loadsector = *(grub_uint32_t *)(buf + i + 32 + 8);
grub_snprintf(value, sizeof(value), "%u", loadsector * 4); //change to sector size 512
break;
}
}
}
if (loadsector == 0)
{
debug("No EFI eltorito info found\n");
return 1;
}
debug("ventoy_cmd_get_efivdisk_offset <%s>\n", value);
grub_env_set(args[1], value);
VENTOY_CMD_RETURN(0);
}
static int ventoy_collect_replace_initrd(const char *filename, const struct grub_dirhook_info *info, void *data)
{
int curpos;
int printlen;
grub_size_t len;
replace_fs_dir *pfsdir = (replace_fs_dir *)data;
if (pfsdir->initrd[0])
{
return 1;
}
curpos = pfsdir->curpos;
len = grub_strlen(filename);
if (info->dir)
{
if ((len == 1 && filename[0] == '.') ||
(len == 2 && filename[0] == '.' && filename[1] == '.'))
{
return 0;
}
//debug("#### [DIR] <%s> <%s>\n", pfsdir->fullpath, filename);
pfsdir->dircnt++;
printlen = grub_snprintf(pfsdir->fullpath + curpos, 512 - curpos, "%s/", filename);
pfsdir->curpos = curpos + printlen;
pfsdir->fs->fs_dir(pfsdir->dev, pfsdir->fullpath, ventoy_collect_replace_initrd, pfsdir);
pfsdir->curpos = curpos;
pfsdir->fullpath[curpos] = 0;
}
else
{
//debug("#### [FILE] <%s> <%s>\n", pfsdir->fullpath, filename);
pfsdir->filecnt++;
/* We consider the xxx.img file bigger than 32MB is the initramfs file */
if (len > 4 && grub_strncmp(filename + len - 4, ".img", 4) == 0)
{
if (info->size > 32 * VTOY_SIZE_1MB)
{
grub_snprintf(pfsdir->initrd, sizeof(pfsdir->initrd), "%s%s", pfsdir->fullpath, filename);
return 1;
}
}
}
return 0;
}
static grub_err_t ventoy_cmd_search_replace_initrd(grub_extcmd_context_t ctxt, int argc, char **args)
{
int i;
char *pos = NULL;
char *device_name = NULL;
grub_device_t dev = NULL;
grub_fs_t fs = NULL;
replace_fs_dir *pfsdir = NULL;
(void)ctxt;
if (argc != 2)
{
debug("ventoy_cmd_search_replace_initrd, invalid param num %d\n", argc);
return 1;
}
pfsdir = grub_zalloc(sizeof(replace_fs_dir));
if (!pfsdir)
{
return 1;
}
device_name = grub_file_get_device_name(args[0]);
if (!device_name)
{
goto fail;
}
dev = grub_device_open(device_name);
if (!dev)
{
goto fail;
}
fs = grub_fs_probe(dev);
if (!fs)
{
goto fail;
}
pfsdir->dev = dev;
pfsdir->fs = fs;
pfsdir->curpos = 1;
pfsdir->fullpath[0] = '/';
fs->fs_dir(dev, "/", ventoy_collect_replace_initrd, pfsdir);
if (pfsdir->initrd[0])
{
debug("Replace initrd <%s> <%d %d>\n", pfsdir->initrd, pfsdir->dircnt, pfsdir->filecnt);
for (i = 0; i < (int)sizeof(pfsdir->initrd) && pfsdir->initrd[i]; i++)
{
if (pfsdir->initrd[i] == '/')
{
pfsdir->initrd[i] = '\\';
}
}
pos = (pfsdir->initrd[0] == '\\') ? pfsdir->initrd + 1 : pfsdir->initrd;
grub_env_set(args[1], pos);
}
else
{
debug("Replace initrd NOT found <%s> <%d %d>\n", args[0], pfsdir->dircnt, pfsdir->filecnt);
}
fail:
grub_check_free(pfsdir);
grub_check_free(device_name);
check_free(dev, grub_device_close);
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
static grub_err_t ventoy_cmd_push_pager(grub_extcmd_context_t ctxt, int argc, char **args)
{
const char *pager = NULL;
(void)ctxt;
(void)argc;
(void)args;
pager = grub_env_get("pager");
if (NULL == pager)
{
g_pager_flag = 1;
grub_env_set("pager", "1");
}
else if (pager[0] == '1')
{
g_pager_flag = 0;
}
else
{
grub_snprintf(g_old_pager, sizeof(g_old_pager), "%s", pager);
g_pager_flag = 2;
grub_env_set("pager", "1");
}
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
static grub_err_t ventoy_cmd_pop_pager(grub_extcmd_context_t ctxt, int argc, char **args)
{
(void)ctxt;
(void)argc;
(void)args;
if (g_pager_flag == 1)
{
grub_env_unset("pager");
}
else if (g_pager_flag == 2)
{
grub_env_set("pager", g_old_pager);
}
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
static int ventoy_chk_case_file(const char *filename, const struct grub_dirhook_info *info, void *data)
{
if (g_json_case_mis_path[0])
{
return 1;
}
if (0 == info->dir && grub_strncasecmp(filename, "ventoy.json", 11) == 0)
{
grub_snprintf(g_json_case_mis_path, 32, "%s/%s", (char *)data, filename);
return 1;
}
return 0;
}
static int ventoy_chk_case_dir(const char *filename, const struct grub_dirhook_info *info, void *data)
{
char path[16];
chk_case_fs_dir *fs_dir = (chk_case_fs_dir *)data;
if (g_json_case_mis_path[0])
{
return 1;
}
if (info->dir && (filename[0] == 'v' || filename[0] == 'V'))
{
if (grub_strncasecmp(filename, "ventoy", 6) == 0)
{
grub_snprintf(path, sizeof(path), "/%s", filename);
fs_dir->fs->fs_dir(fs_dir->dev, path, ventoy_chk_case_file, path);
if (g_json_case_mis_path[0])
{
return 1;
}
}
}
return 0;
}
static grub_err_t ventoy_cmd_chk_json_pathcase(grub_extcmd_context_t ctxt, int argc, char **args)
{
int fstype = 0;
char *device_name = NULL;
grub_device_t dev = NULL;
grub_fs_t fs = NULL;
chk_case_fs_dir fs_dir;
(void)ctxt;
(void)argc;
(void)args;
device_name = grub_file_get_device_name(args[0]);
if (!device_name)
{
goto out;
}
dev = grub_device_open(device_name);
if (!dev)
{
goto out;
}
fs = grub_fs_probe(dev);
if (!fs)
{
goto out;
}
fstype = ventoy_get_fs_type(fs->name);
if (fstype == ventoy_fs_fat || fstype == ventoy_fs_exfat || fstype >= ventoy_fs_max)
{
goto out;
}
g_json_case_mis_path[0] = 0;
fs_dir.dev = dev;
fs_dir.fs = fs;
fs->fs_dir(dev, "/", ventoy_chk_case_dir, &fs_dir);
if (g_json_case_mis_path[0])
{
grub_env_set("VTOY_PLUGIN_PATH_CASE_MISMATCH", g_json_case_mis_path);
}
out:
grub_check_free(device_name);
check_free(dev, grub_device_close);
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
static grub_err_t grub_cmd_gptpriority(grub_extcmd_context_t ctxt, int argc, char **args)
{
grub_disk_t disk;
grub_partition_t part;
char priority_str[3]; /* Maximum value 15 */
(void)ctxt;
if (argc < 2 || argc > 3)
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"gptpriority DISKNAME PARTITIONNUM [VARNAME]");
/* Open the disk if it exists */
disk = grub_disk_open (args[0]);
if (!disk)
{
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"Not a disk");
}
part = grub_partition_probe (disk, args[1]);
if (!part)
{
grub_disk_close (disk);
return grub_error (GRUB_ERR_BAD_ARGUMENT,
"No such partition");
}
if (grub_strcmp (part->partmap->name, "gpt"))
{
grub_disk_close (disk);
return grub_error (GRUB_ERR_BAD_PART_TABLE,
"Not a GPT partition");
}
grub_snprintf (priority_str, sizeof(priority_str), "%u",
(grub_uint32_t)((part->gpt_attrib >> 48) & 0xfULL));
if (argc == 3)
{
grub_env_set (args[2], priority_str);
grub_env_export (args[2]);
}
else
{
grub_printf ("Priority is %s\n", priority_str);
}
grub_disk_close (disk);
return GRUB_ERR_NONE;
}
/* <BEGIN>: Deleted by longpanda, 20210916 PN:XX LABEL:XX */
#if 0
void ventoy_tip_set_menu_label(const char *vid)
{
img_info *node;
g_ventoy_tip_msg1 = g_ventoy_tip_msg2 = NULL;
if (vid)
{
node = (img_info *)(void *)grub_strtoul(vid + 4, NULL, 16);
if (node)
{
g_ventoy_tip_msg1 = node->tip1;
g_ventoy_tip_msg2 = node->tip2;
}
}
}
#endif /* #if 0 */
/* <END> : Deleted by longpanda, 20210916 PN:XX LABEL:XX */
int ventoy_env_init(void) int ventoy_env_init(void)
{ {
char buf[64]; char buf[64];
@@ -4452,6 +4952,8 @@ int ventoy_env_init(void)
return 0; return 0;
} }
static cmd_para ventoy_cmds[] = static cmd_para ventoy_cmds[] =
{ {
{ "vt_incr", ventoy_cmd_incr, 0, NULL, "{Var} {INT}", "Increase integer variable", NULL }, { "vt_incr", ventoy_cmd_incr, 0, NULL, "{Var} {INT}", "Increase integer variable", NULL },
@@ -4491,6 +4993,7 @@ static cmd_para ventoy_cmds[] =
{ "vt_check_part_exist", ventoy_cmd_part_exist, 0, NULL, "", "", NULL }, { "vt_check_part_exist", ventoy_cmd_part_exist, 0, NULL, "", "", NULL },
{ "vt_get_fs_label", ventoy_cmd_get_fs_label, 0, NULL, "", "", NULL }, { "vt_get_fs_label", ventoy_cmd_get_fs_label, 0, NULL, "", "", NULL },
{ "vt_fs_enum_1st_file", ventoy_cmd_fs_enum_1st_file, 0, NULL, "", "", NULL }, { "vt_fs_enum_1st_file", ventoy_cmd_fs_enum_1st_file, 0, NULL, "", "", NULL },
{ "vt_fs_enum_1st_dir", ventoy_cmd_fs_enum_1st_dir, 0, NULL, "", "", NULL },
{ "vt_file_basename", ventoy_cmd_basename, 0, NULL, "", "", NULL }, { "vt_file_basename", ventoy_cmd_basename, 0, NULL, "", "", NULL },
{ "vt_file_basefile", ventoy_cmd_basefile, 0, NULL, "", "", NULL }, { "vt_file_basefile", ventoy_cmd_basefile, 0, NULL, "", "", NULL },
{ "vt_enum_video_mode", ventoy_cmd_enum_video_mode, 0, NULL, "", "", NULL }, { "vt_enum_video_mode", ventoy_cmd_enum_video_mode, 0, NULL, "", "", NULL },
@@ -4511,6 +5014,7 @@ static cmd_para ventoy_cmds[] =
{ "vt_select_conf_replace", ventoy_select_conf_replace, 0, NULL, "", "", NULL }, { "vt_select_conf_replace", ventoy_select_conf_replace, 0, NULL, "", "", NULL },
{ "vt_iso9660_nojoliet", ventoy_cmd_iso9660_nojoliet, 0, NULL, "", "", NULL }, { "vt_iso9660_nojoliet", ventoy_cmd_iso9660_nojoliet, 0, NULL, "", "", NULL },
{ "vt_iso9660_isjoliet", ventoy_cmd_iso9660_is_joliet, 0, NULL, "", "", NULL },
{ "vt_is_udf", ventoy_cmd_is_udf, 0, NULL, "", "", NULL }, { "vt_is_udf", ventoy_cmd_is_udf, 0, NULL, "", "", NULL },
{ "vt_file_size", ventoy_cmd_file_size, 0, NULL, "", "", NULL }, { "vt_file_size", ventoy_cmd_file_size, 0, NULL, "", "", NULL },
{ "vt_load_file_to_mem", ventoy_cmd_load_file_to_mem, 0, NULL, "", "", NULL }, { "vt_load_file_to_mem", ventoy_cmd_load_file_to_mem, 0, NULL, "", "", NULL },
@@ -4539,6 +5043,7 @@ static cmd_para ventoy_cmds[] =
{ "vt_wim_chain_data", ventoy_cmd_wim_chain_data, 0, NULL, "", "", NULL }, { "vt_wim_chain_data", ventoy_cmd_wim_chain_data, 0, NULL, "", "", NULL },
{ "vt_add_replace_file", ventoy_cmd_add_replace_file, 0, NULL, "", "", NULL }, { "vt_add_replace_file", ventoy_cmd_add_replace_file, 0, NULL, "", "", NULL },
{ "vt_get_replace_file_cnt", ventoy_cmd_get_replace_file_cnt, 0, NULL, "", "", NULL },
{ "vt_test_block_list", ventoy_cmd_test_block_list, 0, NULL, "", "", NULL }, { "vt_test_block_list", ventoy_cmd_test_block_list, 0, NULL, "", "", NULL },
{ "vt_file_exist_nocase", ventoy_cmd_file_exist_nocase, 0, NULL, "", "", NULL }, { "vt_file_exist_nocase", ventoy_cmd_file_exist_nocase, 0, NULL, "", "", NULL },
@@ -4575,6 +5080,13 @@ static cmd_para ventoy_cmds[] =
{ "vt_set_wim_load_prompt", ventoy_cmd_set_wim_prompt, 0, NULL, "", "", NULL }, { "vt_set_wim_load_prompt", ventoy_cmd_set_wim_prompt, 0, NULL, "", "", NULL },
{ "vt_set_theme", ventoy_cmd_set_theme, 0, NULL, "", "", NULL }, { "vt_set_theme", ventoy_cmd_set_theme, 0, NULL, "", "", NULL },
{ "vt_get_efi_vdisk_offset", ventoy_cmd_get_efivdisk_offset, 0, NULL, "", "", NULL },
{ "vt_search_replace_initrd", ventoy_cmd_search_replace_initrd, 0, NULL, "", "", NULL },
{ "vt_push_pager", ventoy_cmd_push_pager, 0, NULL, "", "", NULL },
{ "vt_pop_pager", ventoy_cmd_pop_pager, 0, NULL, "", "", NULL },
{ "vt_check_json_path_case", ventoy_cmd_chk_json_pathcase, 0, NULL, "", "", NULL },
{ "vt_append_extra_sector", ventoy_cmd_append_ext_sector, 0, NULL, "", "", NULL },
{ "gptpriority", grub_cmd_gptpriority, 0, NULL, "", "", NULL },
}; };
int ventoy_register_all_cmd(void) int ventoy_register_all_cmd(void)

View File

@@ -69,6 +69,9 @@
#define VTOY_ARCH_CPIO "ventoy_x86.cpio" #define VTOY_ARCH_CPIO "ventoy_x86.cpio"
#endif #endif
#define ventoy_varg_4(arg) arg[0], arg[1], arg[2], arg[3]
#define ventoy_varg_8(arg) arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7]
#define VTOY_PWD_CORRUPTED(err) \ #define VTOY_PWD_CORRUPTED(err) \
{\ {\
grub_printf("\n\n Password corrupted, will reboot after 5 seconds.\n\n"); \ grub_printf("\n\n Password corrupted, will reboot after 5 seconds.\n\n"); \
@@ -212,6 +215,8 @@ typedef struct img_info
char name[256]; char name[256];
const char *alias; const char *alias;
const char *tip1;
const char *tip2;
const char *class; const char *class;
const char *menu_prefix; const char *menu_prefix;
@@ -533,6 +538,23 @@ typedef struct plugin_entry
ventoy_plugin_check_pf checkfunc; ventoy_plugin_check_pf checkfunc;
}plugin_entry; }plugin_entry;
typedef struct replace_fs_dir
{
grub_device_t dev;
grub_fs_t fs;
char fullpath[512];
char initrd[512];
int curpos;
int dircnt;
int filecnt;
}replace_fs_dir;
typedef struct chk_case_fs_dir
{
grub_device_t dev;
grub_fs_t fs;
}chk_case_fs_dir;
int ventoy_strcmp(const char *pattern, const char *str); int ventoy_strcmp(const char *pattern, const char *str);
int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n); int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n);
void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param); void ventoy_fill_os_param(grub_file_t file, ventoy_os_param *param);
@@ -548,6 +570,7 @@ grub_err_t ventoy_cmd_linux_locate_initrd(grub_extcmd_context_t ctxt, int argc,
grub_err_t ventoy_cmd_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_valid_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_valid_initrd_count(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_append_ext_sector(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_skip_svd(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_skip_svd(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_cpio_busybox_64(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_cpio_busybox_64(grub_extcmd_context_t ctxt, int argc, char **args);
grub_err_t ventoy_cmd_trailer_cpio(grub_extcmd_context_t ctxt, int argc, char **args); grub_err_t ventoy_cmd_trailer_cpio(grub_extcmd_context_t ctxt, int argc, char **args);
@@ -844,6 +867,17 @@ typedef struct menu_alias
struct menu_alias *next; struct menu_alias *next;
}menu_alias; }menu_alias;
typedef struct menu_tip
{
int pathlen;
char isopath[256];
char tip1[1024];
char tip2[1024];
struct menu_tip *next;
}menu_tip;
#define vtoy_class_image_file 0 #define vtoy_class_image_file 0
#define vtoy_class_directory 1 #define vtoy_class_directory 1
@@ -996,6 +1030,7 @@ int ventoy_fill_windows_rtdata(void *buf, char *isopath);
int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list); int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list);
const char * ventoy_plugin_get_injection(const char *isopath); const char * ventoy_plugin_get_injection(const char *isopath);
const char * ventoy_plugin_get_menu_alias(int type, const char *isopath); const char * ventoy_plugin_get_menu_alias(int type, const char *isopath);
const menu_tip * ventoy_plugin_get_menu_tip(const char *isopath);
const char * ventoy_plugin_get_menu_class(int type, const char *name, const char *path); const char * ventoy_plugin_get_menu_class(int type, const char *name, const char *path);
int ventoy_plugin_check_memdisk(const char *isopath); int ventoy_plugin_check_memdisk(const char *isopath);
int ventoy_plugin_get_image_list_index(int type, const char *name); int ventoy_plugin_get_image_list_index(int type, const char *name);

View File

@@ -152,6 +152,23 @@ static int vtoy_json_parse_string
return JSON_FAILED; return JSON_FAILED;
} }
if (*(pcPos - 1) == '\\')
{
for (pcPos++; *pcPos; pcPos++)
{
if (*pcPos == '"' && *(pcPos - 1) != '\\')
{
break;
}
}
if (*pcPos == 0 || pcPos < pcTmp)
{
json_debug("Invalid quotes string %s.", pcData);
return JSON_FAILED;
}
}
*ppcEnd = pcPos + 1; *ppcEnd = pcPos + 1;
uiLen = (grub_uint32_t)(unsigned long)(pcPos - pcTmp); uiLen = (grub_uint32_t)(unsigned long)(pcPos - pcTmp);

View File

@@ -38,6 +38,9 @@
GRUB_MOD_LICENSE ("GPLv3+"); GRUB_MOD_LICENSE ("GPLv3+");
#define VTOY_APPEND_EXT_SIZE 4096
static int g_append_ext_sector = 0;
char * ventoy_get_line(char *start) char * ventoy_get_line(char *start)
{ {
if (start == NULL) if (start == NULL)
@@ -333,7 +336,9 @@ end:
static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName) static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
{ {
int i = 0; int i = 0;
int len = 0;
int dollar = 0; int dollar = 0;
int quotation = 0;
grub_file_t file = NULL; grub_file_t file = NULL;
char *buf = NULL; char *buf = NULL;
char *start = NULL; char *start = NULL;
@@ -382,6 +387,12 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
start++; start++;
} }
if (*start == '"')
{
quotation = 1;
start++;
}
while (*start) while (*start)
{ {
img = grub_zalloc(sizeof(initrd_info)); img = grub_zalloc(sizeof(initrd_info));
@@ -400,6 +411,16 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
} }
} }
if (quotation)
{
len = (int)grub_strlen(img->name);
if (len > 2 && img->name[len - 1] == '"')
{
img->name[len - 1] = 0;
}
debug("Remove quotation <%s>\n", img->name);
}
if (dollar == 1 || ventoy_find_initrd_by_name(g_initrd_img_list, img->name)) if (dollar == 1 || ventoy_find_initrd_by_name(g_initrd_img_list, img->name))
{ {
grub_free(img); grub_free(img);
@@ -640,6 +661,11 @@ static grub_uint32_t ventoy_linux_get_virt_chunk_count(void)
count++; count++;
} }
if (g_append_ext_sector > 0)
{
count++;
}
return count; return count;
} }
@@ -653,6 +679,11 @@ static grub_uint32_t ventoy_linux_get_virt_chunk_size(void)
{ {
size += sizeof(ventoy_virt_chunk) + g_conf_replace_new_len_align; size += sizeof(ventoy_virt_chunk) + g_conf_replace_new_len_align;
} }
if (g_append_ext_sector > 0)
{
size += sizeof(ventoy_virt_chunk) + VTOY_APPEND_EXT_SIZE;
}
return size; return size;
} }
@@ -709,6 +740,27 @@ static void ventoy_linux_fill_virt_data( grub_uint64_t isosize, ventoy_chain_
cur++; cur++;
} }
/* Lenovo EasyStartup need an addional sector for boundary check */
if (g_append_ext_sector > 0)
{
cpio_secs = VTOY_APPEND_EXT_SIZE / 2048;
cur->mem_sector_start = sector;
cur->mem_sector_end = cur->mem_sector_start + cpio_secs;
cur->mem_sector_offset = offset;
cur->remap_sector_start = 0;
cur->remap_sector_end = 0;
cur->org_sector_start = 0;
grub_memset(override + offset, 0, VTOY_APPEND_EXT_SIZE);
chain->virt_img_size_in_bytes += VTOY_APPEND_EXT_SIZE;
offset += VTOY_APPEND_EXT_SIZE;
sector += cpio_secs;
cur++;
}
if (g_conf_replace_offset > 0) if (g_conf_replace_offset > 0)
{ {
cpio_secs = g_conf_replace_new_len_align / 2048; cpio_secs = g_conf_replace_new_len_align / 2048;
@@ -1101,6 +1153,24 @@ grub_err_t ventoy_cmd_skip_svd(grub_extcmd_context_t ctxt, int argc, char **args
VENTOY_CMD_RETURN(GRUB_ERR_NONE); VENTOY_CMD_RETURN(GRUB_ERR_NONE);
} }
grub_err_t ventoy_cmd_append_ext_sector(grub_extcmd_context_t ctxt, int argc, char **args)
{
(void)ctxt;
(void)argc;
(void)args;
if (args[0][0] == '1')
{
g_append_ext_sector = 1;
}
else
{
g_append_ext_sector = 0;
}
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
}
grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **args) grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
int i; int i;
@@ -1441,9 +1511,9 @@ grub_err_t ventoy_cmd_trailer_cpio(grub_extcmd_context_t ctxt, int argc, char **
VENTOY_CMD_RETURN(GRUB_ERR_NONE); VENTOY_CMD_RETURN(GRUB_ERR_NONE);
} }
grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, char **args) grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, char **args)
{ {
int len = 0;
int ventoy_compatible = 0; int ventoy_compatible = 0;
grub_uint32_t size = 0; grub_uint32_t size = 0;
grub_uint64_t isosize = 0; grub_uint64_t isosize = 0;
@@ -1483,23 +1553,31 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
isosize = file->size; isosize = file->size;
boot_catlog = ventoy_get_iso_boot_catlog(file); len = (int)grub_strlen(args[0]);
if (boot_catlog) if (len >= 4 && 0 == grub_strcasecmp(args[0] + len - 4, ".img"))
{ {
if (ventoy_is_efi_os() && (!ventoy_has_efi_eltorito(file, boot_catlog))) debug("boot catlog %u for img file\n", boot_catlog);
{
grub_env_set("LoadIsoEfiDriver", "on");
}
} }
else else
{ {
if (ventoy_is_efi_os()) boot_catlog = ventoy_get_iso_boot_catlog(file);
if (boot_catlog)
{ {
grub_env_set("LoadIsoEfiDriver", "on"); if (ventoy_is_efi_os() && (!ventoy_has_efi_eltorito(file, boot_catlog)))
{
grub_env_set("LoadIsoEfiDriver", "on");
}
} }
else else
{ {
return grub_error(GRUB_ERR_BAD_ARGUMENT, "File %s is not bootable", args[0]); if (ventoy_is_efi_os())
{
grub_env_set("LoadIsoEfiDriver", "on");
}
else
{
return grub_error(GRUB_ERR_BAD_ARGUMENT, "File %s is not bootable", args[0]);
}
} }
} }

View File

@@ -48,6 +48,7 @@ static install_template *g_install_template_head = NULL;
static dud *g_dud_head = NULL; static dud *g_dud_head = NULL;
static menu_password *g_pwd_head = NULL; static menu_password *g_pwd_head = NULL;
static persistence_config *g_persistence_head = NULL; static persistence_config *g_persistence_head = NULL;
static menu_tip *g_menu_tip_head = NULL;
static menu_alias *g_menu_alias_head = NULL; static menu_alias *g_menu_alias_head = NULL;
static menu_class *g_menu_class_head = NULL; static menu_class *g_menu_class_head = NULL;
static custom_boot *g_custom_boot_head = NULL; static custom_boot *g_custom_boot_head = NULL;
@@ -1417,6 +1418,176 @@ static int ventoy_plugin_menualias_entry(VTOY_JSON *json, const char *isodisk)
return 0; return 0;
} }
static int ventoy_plugin_menutip_check(VTOY_JSON *json, const char *isodisk)
{
const char *path = NULL;
const char *tip = NULL;
VTOY_JSON *pNode = NULL;
(void)isodisk;
if (json->enDataType != JSON_TYPE_OBJECT)
{
grub_printf("Not object %d\n", json->enDataType);
return 1;
}
tip = vtoy_json_get_string_ex(json->pstChild, "left");
if (tip)
{
grub_printf("left: <%s>\n", tip);
}
tip = vtoy_json_get_string_ex(json->pstChild, "top");
if (tip)
{
grub_printf("top: <%s>\n", tip);
}
tip = vtoy_json_get_string_ex(json->pstChild, "color");
if (tip)
{
grub_printf("color: <%s>\n", tip);
}
pNode = vtoy_json_find_item(json->pstChild, JSON_TYPE_ARRAY, "tips");
for (pNode = pNode->pstChild; pNode; pNode = pNode->pstNext)
{
path = vtoy_json_get_string_ex(pNode->pstChild, "image");
if (path && path[0] == '/')
{
if (grub_strchr(path, '*'))
{
grub_printf("image: <%s> [ * ]\n", path);
}
else if (ventoy_check_file_exist("%s%s", isodisk, path))
{
grub_printf("image: <%s> [ OK ]\n", path);
}
else
{
grub_printf("image: <%s> [ NOT EXIST ]\n", path);
}
tip = vtoy_json_get_string_ex(pNode->pstChild, "tip");
if (tip)
{
grub_printf("tip: <%s>\n", tip);
}
else
{
tip = vtoy_json_get_string_ex(pNode->pstChild, "tip1");
if (tip)
grub_printf("tip1: <%s>\n", tip);
else
grub_printf("tip1: <NULL>\n");
tip = vtoy_json_get_string_ex(pNode->pstChild, "tip2");
if (tip)
grub_printf("tip2: <%s>\n", tip);
else
grub_printf("tip2: <NULL>\n");
}
}
else
{
grub_printf("image: <%s> [ INVALID ]\n", path);
}
}
return 0;
}
static int ventoy_plugin_menutip_entry(VTOY_JSON *json, const char *isodisk)
{
const char *path = NULL;
const char *tip = NULL;
VTOY_JSON *pNode = NULL;
menu_tip *node = NULL;
menu_tip *next = NULL;
(void)isodisk;
if (json->enDataType != JSON_TYPE_OBJECT)
{
debug("Not object %d\n", json->enDataType);
return 0;
}
pNode = vtoy_json_find_item(json->pstChild, JSON_TYPE_ARRAY, "tips");
if (pNode == NULL)
{
debug("Not tips found\n");
return 0;
}
if (g_menu_tip_head)
{
for (node = g_menu_tip_head; node; node = next)
{
next = node->next;
grub_free(node);
}
g_menu_tip_head = NULL;
}
tip = vtoy_json_get_string_ex(json->pstChild, "left");
if (tip)
{
grub_env_set("VTOY_TIP_LEFT", tip);
}
tip = vtoy_json_get_string_ex(json->pstChild, "top");
if (tip)
{
grub_env_set("VTOY_TIP_TOP", tip);
}
tip = vtoy_json_get_string_ex(json->pstChild, "color");
if (tip)
{
grub_env_set("VTOY_TIP_COLOR", tip);
}
for (pNode = pNode->pstChild; pNode; pNode = pNode->pstNext)
{
path = vtoy_json_get_string_ex(pNode->pstChild, "image");
if (path && path[0] == '/')
{
node = grub_zalloc(sizeof(menu_tip));
if (node)
{
node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", path);
tip = vtoy_json_get_string_ex(pNode->pstChild, "tip");
if (tip)
{
grub_snprintf(node->tip1, 1000, "%s", tip);
}
else
{
tip = vtoy_json_get_string_ex(pNode->pstChild, "tip1");
if (tip)
grub_snprintf(node->tip1, 1000, "%s", tip);
tip = vtoy_json_get_string_ex(pNode->pstChild, "tip2");
if (tip)
grub_snprintf(node->tip2, 1000, "%s", tip);
}
if (g_menu_tip_head)
{
node->next = g_menu_tip_head;
}
g_menu_tip_head = node;
}
}
}
return 0;
}
static int ventoy_plugin_injection_check(VTOY_JSON *json, const char *isodisk) static int ventoy_plugin_injection_check(VTOY_JSON *json, const char *isodisk)
{ {
@@ -2101,6 +2272,7 @@ static plugin_entry g_plugin_entries[] =
{ "auto_install", ventoy_plugin_auto_install_entry, ventoy_plugin_auto_install_check }, { "auto_install", ventoy_plugin_auto_install_entry, ventoy_plugin_auto_install_check },
{ "persistence", ventoy_plugin_persistence_entry, ventoy_plugin_persistence_check }, { "persistence", ventoy_plugin_persistence_entry, ventoy_plugin_persistence_check },
{ "menu_alias", ventoy_plugin_menualias_entry, ventoy_plugin_menualias_check }, { "menu_alias", ventoy_plugin_menualias_entry, ventoy_plugin_menualias_check },
{ "menu_tip", ventoy_plugin_menutip_entry, ventoy_plugin_menutip_check },
{ "menu_class", ventoy_plugin_menuclass_entry, ventoy_plugin_menuclass_check }, { "menu_class", ventoy_plugin_menuclass_entry, ventoy_plugin_menuclass_check },
{ "injection", ventoy_plugin_injection_entry, ventoy_plugin_injection_check }, { "injection", ventoy_plugin_injection_entry, ventoy_plugin_injection_check },
{ "auto_memdisk", ventoy_plugin_auto_memdisk_entry, ventoy_plugin_auto_memdisk_check }, { "auto_memdisk", ventoy_plugin_auto_memdisk_entry, ventoy_plugin_auto_memdisk_check },
@@ -2149,6 +2321,11 @@ grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **a
(void)ctxt; (void)ctxt;
(void)argc; (void)argc;
grub_env_set("VTOY_TIP_LEFT", "10%");
grub_env_set("VTOY_TIP_TOP", "80%+5");
grub_env_set("VTOY_TIP_COLOR", "blue");
grub_env_set("VTOY_TIP_ALIGN", "left");
file = ventoy_grub_file_open(GRUB_FILE_TYPE_LINUX_INITRD, "%s/ventoy/ventoy.json", args[0]); file = ventoy_grub_file_open(GRUB_FILE_TYPE_LINUX_INITRD, "%s/ventoy/ventoy.json", args[0]);
if (!file) if (!file)
{ {
@@ -2205,6 +2382,15 @@ grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **a
} }
} }
if (g_menu_tip_head)
{
grub_env_set("VTOY_MENU_TIP_ENABLE", "1");
}
else
{
grub_env_unset("VTOY_MENU_TIP_ENABLE");
}
VENTOY_CMD_RETURN(GRUB_ERR_NONE); VENTOY_CMD_RETURN(GRUB_ERR_NONE);
} }
@@ -2465,6 +2651,28 @@ const char * ventoy_plugin_get_menu_alias(int type, const char *isopath)
return NULL; return NULL;
} }
const menu_tip * ventoy_plugin_get_menu_tip(const char *isopath)
{
int len;
menu_tip *node = NULL;
if (!g_menu_tip_head)
{
return NULL;
}
len = (int)grub_strlen(isopath);
for (node = g_menu_tip_head; node; node = node->next)
{
if (node->pathlen == len && ventoy_strcmp(node->isopath, isopath) == 0)
{
return node;
}
}
return NULL;
}
const char * ventoy_plugin_get_menu_class(int type, const char *name, const char *path) const char * ventoy_plugin_get_menu_class(int type, const char *name, const char *path)
{ {
int namelen; int namelen;

View 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; chunk_num = (head->raw_size + WIM_CHUNK_LEN - 1) / WIM_CHUNK_LEN;
cur_offset = (chunk_num - 1) * 4; cur_offset = (chunk_num - 1) * 4;
chunk_offset = (grub_uint32_t *)buffer_compress; 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; cur_dst += decompress_len;
total_decompress += 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)
{ {
@@ -657,8 +661,15 @@ 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_dirent = NULL;
const char *pecmd_path[] = { "Windows", "System32", "pecmd.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, pecmd_path);
debug("search pecmd.exe %p\n", wim_dirent);
if (wim_dirent)
{
return wim_dirent;
}
wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path); wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path);
debug("search winpeshl.exe %p\n", wim_dirent); debug("search winpeshl.exe %p\n", wim_dirent);
@@ -667,15 +678,6 @@ static wim_directory_entry * search_replace_wim_dirent(void *meta_data, wim_dire
return wim_dirent; return wim_dirent;
} }
#if 0
wim_dirent = search_full_wim_dirent(meta_data, dir, native_path);
debug("search native.exe %p\n", wim_dirent);
if (wim_dirent)
{
return wim_dirent;
}
#endif
return NULL; return NULL;
} }
@@ -735,6 +737,27 @@ static grub_uint64_t ventoy_get_stream_len(wim_directory_entry *dir)
return offset; return offset;
} }
static int ventoy_update_stream_hash(wim_patch *patch, wim_directory_entry *dir)
{
grub_uint16_t i;
grub_uint64_t offset = 0;
wim_stream_entry *stream = (wim_stream_entry *)((char *)dir + dir->len);
for (i = 0; i < dir->streams; i++)
{
if (grub_memcmp(stream->hash.sha1, patch->old_hash.sha1, sizeof(wim_hash)) == 0)
{
debug("find target stream %u, name_len:%u upadte hash\n", i, stream->name_len);
grub_memcpy(stream->hash.sha1, &(patch->wim_data.bin_hash), sizeof(wim_hash));
}
offset += stream->len;
stream = (wim_stream_entry *)((char *)stream + stream->len);
}
return offset;
}
static int ventoy_update_all_hash(wim_patch *patch, void *meta_data, wim_directory_entry *dir) static int ventoy_update_all_hash(wim_patch *patch, void *meta_data, wim_directory_entry *dir)
{ {
if ((meta_data == NULL) || (dir == NULL)) if ((meta_data == NULL) || (dir == NULL))
@@ -762,6 +785,7 @@ static int ventoy_update_all_hash(wim_patch *patch, void *meta_data, wim_directo
if (dir->streams) if (dir->streams)
{ {
ventoy_update_stream_hash(patch, dir);
dir = (wim_directory_entry *)((char *)dir + dir->len + ventoy_get_stream_len(dir)); dir = (wim_directory_entry *)((char *)dir + dir->len + ventoy_get_stream_len(dir));
} }
else else
@@ -882,7 +906,14 @@ static int ventoy_update_before_chain(ventoy_os_param *param, char *isopath)
grub_crypto_hash(GRUB_MD_SHA1, wim_data->bin_hash.sha1, wim_data->jump_bin_data, wim_data->bin_raw_len); grub_crypto_hash(GRUB_MD_SHA1, wim_data->bin_hash.sha1, wim_data->jump_bin_data, wim_data->bin_raw_len);
security = (wim_security_header *)wim_data->new_meta_data; security = (wim_security_header *)wim_data->new_meta_data;
rootdir = (wim_directory_entry *)(wim_data->new_meta_data + ((security->len + 7) & 0xFFFFFFF8U)); if (security->len > 0)
{
rootdir = (wim_directory_entry *)(wim_data->new_meta_data + ((security->len + 7) & 0xFFFFFFF8U));
}
else
{
rootdir = (wim_directory_entry *)(wim_data->new_meta_data + 8);
}
/* update all winpeshl.exe dirent entry's hash */ /* update all winpeshl.exe dirent entry's hash */
ventoy_update_all_hash(node, wim_data->new_meta_data, rootdir); ventoy_update_all_hash(node, wim_data->new_meta_data, rootdir);
@@ -915,6 +946,7 @@ static int ventoy_update_before_chain(ventoy_os_param *param, char *isopath)
static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch) static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
{ {
int rc; int rc;
grub_uint16_t i;
grub_file_t file; grub_file_t file;
grub_uint32_t exe_len; grub_uint32_t exe_len;
grub_uint8_t *exe_data = NULL; grub_uint8_t *exe_data = NULL;
@@ -923,6 +955,7 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
wim_security_header *security = NULL; wim_security_header *security = NULL;
wim_directory_entry *rootdir = NULL; wim_directory_entry *rootdir = NULL;
wim_directory_entry *search = NULL; wim_directory_entry *search = NULL;
wim_stream_entry *stream = NULL;
wim_header *head = &(patch->wim_data.wim_header); wim_header *head = &(patch->wim_data.wim_header);
wim_tail *wim_data = &patch->wim_data; wim_tail *wim_data = &patch->wim_data;
@@ -985,8 +1018,28 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
} }
debug("find replace file at %p\n", search); debug("find replace file at %p\n", search);
grub_memcpy(&patch->old_hash, search->hash.sha1, sizeof(wim_hash)); grub_memset(&patch->old_hash, 0, sizeof(wim_hash));
if (grub_memcmp(&patch->old_hash, search->hash.sha1, sizeof(wim_hash)) == 0)
{
debug("search hash all 0, now do deep search\n");
stream = (wim_stream_entry *)((char *)search + search->len);
for (i = 0; i < search->streams; i++)
{
if (stream->name_len == 0)
{
grub_memcpy(&patch->old_hash, stream->hash.sha1, sizeof(wim_hash));
debug("new search hash: %02x %02x %02x %02x %02x %02x %02x %02x\n",
ventoy_varg_8(patch->old_hash.sha1));
break;
}
stream = (wim_stream_entry *)((char *)stream + stream->len);
}
}
else
{
grub_memcpy(&patch->old_hash, search->hash.sha1, sizeof(wim_hash));
}
debug("read lookup offset:%llu size:%llu\n", (ulonglong)head->lookup.offset, (ulonglong)head->lookup.raw_size); debug("read lookup offset:%llu size:%llu\n", (ulonglong)head->lookup.offset, (ulonglong)head->lookup.raw_size);
lookup = grub_malloc(head->lookup.raw_size); lookup = grub_malloc(head->lookup.raw_size);
@@ -1013,8 +1066,8 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
} }
else else
{ {
debug("failed to find lookup entry for replace file 0x%02x 0x%02x\n", debug("failed to find lookup entry for replace file %02x %02x %02x %02x\n",
patch->old_hash.sha1[0], patch->old_hash.sha1[1]); ventoy_varg_4(patch->old_hash.sha1));
} }
wim_data->wim_raw_size = (grub_uint32_t)file->size; wim_data->wim_raw_size = (grub_uint32_t)file->size;
@@ -1167,7 +1220,48 @@ static void ventoy_windows_fill_override_data_iso9660( grub_uint64_t isosize,
return; return;
} }
static void ventoy_windows_fill_override_data_udf( grub_uint64_t isosize, void *override) static int ventoy_windows_fill_udf_short_ad(grub_file_t isofile, grub_uint32_t curpos,
wim_tail *wim_data, grub_uint32_t new_wim_size)
{
int i;
grub_uint32_t total = 0;
grub_uint32_t left_size = 0;
ventoy_udf_override *udf = NULL;
ventoy_udf_override tmp[4];
grub_memset(tmp, 0, sizeof(tmp));
grub_file_seek(isofile, wim_data->override_offset);
grub_file_read(isofile, tmp, sizeof(tmp));
left_size = new_wim_size;
udf = (ventoy_udf_override *)wim_data->override_data;
for (i = 0; i < 4; i++)
{
total += tmp[i].length;
if (total >= wim_data->wim_raw_size)
{
udf->length = left_size;
udf->position = curpos;
return 0;
}
else
{
udf->length = tmp[i].length;
udf->position = curpos;
}
left_size -= tmp[i].length;
curpos += udf->length / 2048;
udf++;
wim_data->override_len += sizeof(ventoy_udf_override);
}
debug("######## Too many udf ad ######\n");
return 1;
}
static void ventoy_windows_fill_override_data_udf(grub_file_t isofile, void *override)
{ {
grub_uint32_t data32; grub_uint32_t data32;
grub_uint64_t data64; grub_uint64_t data64;
@@ -1178,9 +1272,8 @@ static void ventoy_windows_fill_override_data_udf( grub_uint64_t isosize, voi
ventoy_override_chunk *cur; ventoy_override_chunk *cur;
wim_patch *node = NULL; wim_patch *node = NULL;
wim_tail *wim_data = NULL; wim_tail *wim_data = NULL;
ventoy_udf_override *udf = NULL;
sector = (isosize + 2047) / 2048; sector = (isofile->size + 2047) / 2048;
cur = (ventoy_override_chunk *)override; cur = (ventoy_override_chunk *)override;
@@ -1190,7 +1283,7 @@ static void ventoy_windows_fill_override_data_udf( grub_uint64_t isosize, voi
cur++; cur++;
} }
debug("ventoy_windows_fill_override_data_udf %lu\n", (ulong)isosize); debug("ventoy_windows_fill_override_data_udf %lu\n", (ulong)isofile->size);
for (node = g_wim_patch_head; node; node = node->next) for (node = g_wim_patch_head; node; node = node->next)
{ {
@@ -1231,13 +1324,11 @@ static void ventoy_windows_fill_override_data_udf( grub_uint64_t isosize, voi
data64 = new_wim_size; data64 = new_wim_size;
grub_memcpy(cur->override_data, &(data64), 8); grub_memcpy(cur->override_data, &(data64), 8);
udf = (ventoy_udf_override *)wim_data->override_data; /* override 3: position and length in extend data */
udf->length = new_wim_size; ventoy_windows_fill_udf_short_ad(isofile, (grub_uint32_t)sector - udf_start_block, wim_data, new_wim_size);
udf->position = (grub_uint32_t)sector - udf_start_block;
sector += (new_wim_size / 2048); sector += (new_wim_size / 2048);
/* override 3: position and length in extend data */
cur++; cur++;
cur->img_offset = wim_data->override_offset; cur->img_offset = wim_data->override_offset;
cur->override_size = wim_data->override_len; cur->override_size = wim_data->override_len;
@@ -1631,7 +1722,7 @@ grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, c
} }
else else
{ {
ventoy_windows_fill_override_data_udf(isosize, (char *)chain + chain->override_chunk_offset); ventoy_windows_fill_override_data_udf(file, (char *)chain + chain->override_chunk_offset);
} }
/* part 5: virt chunk */ /* part 5: virt chunk */

View File

@@ -0,0 +1,141 @@
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 1999,2000,2001,2002,2004,2006,2007 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GRUB_PART_HEADER
#define GRUB_PART_HEADER 1
#include <grub/dl.h>
#include <grub/list.h>
struct grub_disk;
typedef struct grub_partition *grub_partition_t;
#ifdef GRUB_UTIL
typedef enum
{
GRUB_EMBED_PCBIOS
} grub_embed_type_t;
#endif
typedef int (*grub_partition_iterate_hook_t) (struct grub_disk *disk,
const grub_partition_t partition,
void *data);
/* Partition map type. */
struct grub_partition_map
{
/* The next partition map type. */
struct grub_partition_map *next;
struct grub_partition_map **prev;
/* The name of the partition map type. */
const char *name;
/* Call HOOK with each partition, until HOOK returns non-zero. */
grub_err_t (*iterate) (struct grub_disk *disk,
grub_partition_iterate_hook_t hook, void *hook_data);
#ifdef GRUB_UTIL
/* Determine sectors available for embedding. */
grub_err_t (*embed) (struct grub_disk *disk, unsigned int *nsectors,
unsigned int max_nsectors,
grub_embed_type_t embed_type,
grub_disk_addr_t **sectors);
#endif
};
typedef struct grub_partition_map *grub_partition_map_t;
/* Partition description. */
struct grub_partition
{
/* The partition number. */
int number;
/* The start sector (relative to parent). */
grub_disk_addr_t start;
/* The length in sector units. */
grub_uint64_t len;
/* The offset of the partition table. */
grub_disk_addr_t offset;
/* The index of this partition in the partition table. */
int index;
/* Parent partition (physically contains this partition). */
struct grub_partition *parent;
/* The type partition map. */
grub_partition_map_t partmap;
/* The type of partition whne it's on MSDOS.
Used for embedding detection. */
grub_uint8_t msdostype;
/* The attrib field for GPT. Needed for priority detection. */
grub_uint64_t gpt_attrib;
};
grub_partition_t EXPORT_FUNC(grub_partition_probe) (struct grub_disk *disk,
const char *str);
int EXPORT_FUNC(grub_partition_iterate) (struct grub_disk *disk,
grub_partition_iterate_hook_t hook,
void *hook_data);
char *EXPORT_FUNC(grub_partition_get_name) (const grub_partition_t partition);
extern grub_partition_map_t EXPORT_VAR(grub_partition_map_list);
#ifndef GRUB_LST_GENERATOR
static inline void
grub_partition_map_register (grub_partition_map_t partmap)
{
grub_list_push (GRUB_AS_LIST_P (&grub_partition_map_list),
GRUB_AS_LIST (partmap));
}
#endif
static inline void
grub_partition_map_unregister (grub_partition_map_t partmap)
{
grub_list_remove (GRUB_AS_LIST (partmap));
}
#define FOR_PARTITION_MAPS(var) FOR_LIST_ELEMENTS((var), (grub_partition_map_list))
static inline grub_disk_addr_t
grub_partition_get_start (const grub_partition_t p)
{
grub_partition_t part;
grub_uint64_t part_start = 0;
for (part = p; part; part = part->parent)
part_start += part->start;
return part_start;
}
static inline grub_uint64_t
grub_partition_get_len (const grub_partition_t p)
{
return p->len;
}
#endif /* ! GRUB_PART_HEADER */

View File

@@ -267,6 +267,7 @@ typedef struct ventoy_grub_param
int grub_ext_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list); int grub_ext_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list);
int grub_fat_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list); int grub_fat_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_img_chunk_list *chunk_list);
void grub_iso9660_set_nojoliet(int nojoliet); void grub_iso9660_set_nojoliet(int nojoliet);
int grub_iso9660_is_joliet(void);
grub_uint64_t grub_iso9660_get_last_read_pos(grub_file_t file); grub_uint64_t grub_iso9660_get_last_read_pos(grub_file_t file);
grub_uint64_t grub_iso9660_get_last_file_dirent_pos(grub_file_t file); grub_uint64_t grub_iso9660_get_last_file_dirent_pos(grub_file_t file);
grub_uint64_t grub_udf_get_file_offset(grub_file_t file); grub_uint64_t grub_udf_get_file_offset(grub_file_t file);

View File

@@ -97,6 +97,8 @@ elif [ "$1" = "arm64" ]; then
if ! echo $all_modules | grep -q " ${line%.mod} "; then if ! echo $all_modules | grep -q " ${line%.mod} "; then
echo "Copy $line ..." echo "Copy $line ..."
cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/arm64-efi/$line $VT_DIR/INSTALL/grub/arm64-efi/ cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/arm64-efi/$line $VT_DIR/INSTALL/grub/arm64-efi/
xz $VT_DIR/INSTALL/grub/arm64-efi/$line
mv $VT_DIR/INSTALL/grub/arm64-efi/${line}.xz $VT_DIR/INSTALL/grub/arm64-efi/${line}
fi fi
done done
elif [ "$1" = "mips64el" ]; then elif [ "$1" = "mips64el" ]; then

View File

@@ -121,6 +121,11 @@ elif [ "$VTOY_ARCH" = "i386" ]; then
ln -s $VTOY_PATH/tool/dmsetup32 $VTOY_PATH/tool/dmsetup ln -s $VTOY_PATH/tool/dmsetup32 $VTOY_PATH/tool/dmsetup
ln -s $VTOY_PATH/tool/lunzip32 $VTOY_PATH/tool/lunzip ln -s $VTOY_PATH/tool/lunzip32 $VTOY_PATH/tool/lunzip
if uname -a | egrep -q 'x86_64|amd64'; then
echo "zstdcat use 64bit ..." >>$VTLOG
rm -f $VTOY_PATH/tool/zstdcat
ln -s $VTOY_PATH/tool/zstdcat64 $VTOY_PATH/tool/zstdcat
fi
elif [ "$VTOY_ARCH" = "mips64el" ]; then elif [ "$VTOY_ARCH" = "mips64el" ]; then
echo "Use MIPS64 busybox toolkit ..." >>$VTLOG echo "Use MIPS64 busybox toolkit ..." >>$VTLOG
ln -s $BUSYBOX_PATH/xzminidecm64e $BUSYBOX_PATH/xzminidec ln -s $BUSYBOX_PATH/xzminidecm64e $BUSYBOX_PATH/xzminidec

View File

@@ -0,0 +1,47 @@
#!/ventoy/busybox/sh
#************************************************************************************
# Copyright (c) 2020, longpanda <admin@ventoy.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
#************************************************************************************
. /ventoy/hook/ventoy-hook-lib.sh
if is_ventoy_hook_finished; then
exit 0
fi
vtlog "####### $0 $* ########"
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
wait_for_usb_disk_ready
vtdiskname=$(get_ventoy_disk_name)
if [ "$vtdiskname" = "unknown" ]; then
vtlog "ventoy disk not found"
PATH=$VTPATH_OLD
exit 0
fi
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/')
vtDM=$(ventoy_find_dm_id ${blkdev_num})
vtlog "/dev/$vtDM"
PATH=$VTPATH_OLD
set_ventoy_hook_finish

View File

@@ -0,0 +1,20 @@
#!/ventoy/busybox/sh
#************************************************************************************
# Copyright (c) 2020, longpanda <admin@ventoy.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
#************************************************************************************
$SED "/mount_system *$/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/mocaccino-disk.sh" -i /loader

View File

@@ -27,6 +27,33 @@ vtlog "####### $0 $* ########"
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
ventoy_os_install_dmsetup_by_fuse() {
vtlog "ventoy_os_install_dmsetup_by_fuse $*"
mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso $VTOY_PATH/mnt/squashfs
vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table
vtoy_fuse_iso -f $VTOY_PATH/ventoy_dm_table -m $VTOY_PATH/mnt/fuse
mount -t iso9660 $VTOY_PATH/mnt/fuse/ventoy.iso $VTOY_PATH/mnt/iso
sfsfile=$(ls $VTOY_PATH/mnt/iso/*.sfs)
mount -t squashfs $sfsfile $VTOY_PATH/mnt/squashfs
kVer=$(uname -r)
KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$kVer/kernel/drivers/md/dm-mod.ko*)
vtlog "insmod $KoName"
insmod $KoName
umount $VTOY_PATH/mnt/squashfs
umount $VTOY_PATH/mnt/iso
umount $VTOY_PATH/mnt/fuse
}
wait_for_usb_disk_ready wait_for_usb_disk_ready
vtdiskname=$(get_ventoy_disk_name) vtdiskname=$(get_ventoy_disk_name)
@@ -36,6 +63,12 @@ if [ "$vtdiskname" = "unknown" ]; then
exit 0 exit 0
fi fi
if grep -q 'device-mapper' /proc/devices; then
vtlog "device-mapper module exist"
else
ventoy_os_install_dmsetup_by_fuse $vtdiskname
fi
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace" ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
if ! [ -e $VTOY_DM_PATH ]; then if ! [ -e $VTOY_DM_PATH ]; then

View File

@@ -18,8 +18,15 @@
#************************************************************************************ #************************************************************************************
$SED '1 apmedia=usbhd' -i /init $SED '1 apmedia=usbhd' -i /init
$SED "/^ *HAVE_PARTS=/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/puppy-disk.sh" -i /init
$SED "/^ *HAVE_PARTS=/a\ HAVE_PARTS='ventoy|iso9660'" -i /init if $GREP -q 'HAVE_PARTS=' /init; then
$SED "/^ *HAVE_PARTS=/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/puppy-disk.sh" -i /init
$SED "/^ *HAVE_PARTS=/a\ HAVE_PARTS='ventoy|iso9660'" -i /init
elif $GREP -q 'LESSPARTS=' /init; then
$SED "/^ *LESSPARTS=/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/puppy-disk.sh" -i /init
$SED "/^ *LESSPARTS=/a\ LESSPARTS='ventoy|iso9660'" -i /init
fi
if [ -f /DISTRO_SPECS ]; then if [ -f /DISTRO_SPECS ]; then
if ! [ -d /dev ]; then if ! [ -d /dev ]; then

View File

@@ -41,18 +41,18 @@ ventoy_os_install_dmsetup() {
fi fi
# install md-modules # install md-modules
LINE=$($GREP ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list) LINE=$($GREP -i ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list)
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
LINTCNT=$($GREP -c ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list) LINTCNT=$($GREP -i -c ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list)
if [ $LINTCNT -gt 1 ]; then if [ $LINTCNT -gt 1 ]; then
vtlog "more than one pkgs, need to filter..." vtlog "more than one pkgs, need to filter..."
VER=$($BUSYBOX_PATH/uname -r) VER=$($BUSYBOX_PATH/uname -r)
LINE=$($GREP ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP $VER) LINE=$($GREP -i ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -i $VER)
LINTCNT=$($GREP ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -c $VER) LINTCNT=$($GREP -i ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -i -c $VER)
if [ $LINTCNT -gt 1 ]; then if [ $LINTCNT -gt 1 ]; then
vtlog "Still more than one pkgs, use the first one..." vtlog "Still more than one pkgs, use the first one..."
LINE=$($GREP ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -m1 $VER) LINE=$($GREP -i ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -i -m1 $VER)
fi fi
fi fi
install_udeb_from_line "$LINE" ${vt_usb_disk} install_udeb_from_line "$LINE" ${vt_usb_disk}

View File

@@ -35,7 +35,7 @@ ventoy_get_debian_distro() {
fi fi
if [ -e /init ]; then if [ -e /init ]; then
if $GREP -q PUPPYSFS /init; then if $EGREP -q 'PUPPYSFS|PUPPYFILE' /init; then
if $GREP -q VEKETSFS /init; then if $GREP -q VEKETSFS /init; then
echo 'veket'; return echo 'veket'; return
else else
@@ -90,6 +90,9 @@ ventoy_get_debian_distro() {
echo 'kerio'; return echo 'kerio'; return
fi fi
if $GREP -q 'mocaccino' /proc/version; then
echo 'mocaccino'; return
fi
echo 'default' echo 'default'
} }

View File

@@ -0,0 +1,83 @@
#!/ventoy/busybox/sh
#************************************************************************************
# Copyright (c) 2021, longpanda <admin@ventoy.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
#************************************************************************************
. /ventoy/hook/ventoy-hook-lib.sh
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
get_rhel_ver() {
if uname -m | grep -q '64'; then
machine='_X64'
fi
if grep -q '6[.]1' /etc/redhat-release; then
echo "RHAS6U1$machine"; return
fi
echo "RHAS6U1$machine"
}
install_dm_mod_ko() {
# dump iso file location
vtoydm -i -f $VTOY_PATH/ventoy_image_map -d ${vtdiskname} > $VTOY_PATH/iso_file_list
sysver=$(get_rhel_ver)
vtlog "sysver=$sysver"
LINE=$(grep "$sysver" -n -m1 $VTOY_PATH/iso_file_list | awk -F: '{print $1}')
vtlog "LINE=$LINE"
LINE=$(sed -n "$LINE,\$p" $VTOY_PATH/iso_file_list | grep -m1 'initrd.img')
vtlog "LINE=$LINE"
sector=$(echo $LINE | $AWK '{print $(NF-1)}')
length=$(echo $LINE | $AWK '{print $NF}')
vtlog "sector=$sector length=$length"
mkdir xxx
vtoydm -e -f $VTOY_PATH/ventoy_image_map -d ${vtdiskname} -s $sector -l $length -o ./xxx.img
cd xxx/
zcat ../xxx.img | cpio -idmu
ko=$(find -name dm-mod.ko*)
vtlog "ko=$ko ..."
insmod $ko
cd ../
rm -f xxx.img
rm -rf xxx
}
vtdiskname=$(get_ventoy_disk_name)
vtlog "vtdiskname=$vtdiskname ..."
if [ "$vtdiskname" = "unknown" ]; then
exit 0
fi
if grep -q 'device-mapper' /proc/devices; then
vtlog "device-mapper module check ko"
else
install_dm_mod_ko
fi
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
ln -s /dev/dm-0 /dev/root
PATH=$VTPATH_OLD

View File

@@ -0,0 +1,23 @@
#!/ventoy/busybox/sh
#************************************************************************************
# Copyright (c) 2021, longpanda <admin@ventoy.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
#************************************************************************************
. $VTOY_PATH/hook/ventoy-os-lib.sh
$SED "s#^CDROM=.*#CDROM=/dev/dm-0#" -i /init
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/easystartup/ventoy-initqueue.sh /initqueue/ventoy.sh

View File

@@ -0,0 +1,20 @@
#!/ventoy/busybox/sh
#************************************************************************************
# Copyright (c) 2021, longpanda <admin@ventoy.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
#************************************************************************************
/ventoy/busybox/sh /ventoy/hook/easystartup/disk_hook.sh $*

View File

@@ -0,0 +1,42 @@
#!/ventoy/busybox/sh
#************************************************************************************
# Copyright (c) 2020, longpanda <admin@ventoy.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
#************************************************************************************
. /ventoy/hook/ventoy-hook-lib.sh
wait_for_usb_disk_ready
vtdiskname=$(get_ventoy_disk_name)
if [ "$vtdiskname" = "unknown" ]; then
vtlog "ventoy disk not found"
exit 0
fi
vtlog "wait_for_usb_disk_ready $vtdiskname ..."
if echo $vtdiskname | $EGREP -q "nvme|mmc|nbd"; then
vtpart2=${vtdiskname}p2
else
vtpart2=${vtdiskname}2
fi
/ventoy/busybox/sh /ventoy/hook/suse/udev_disk_hook.sh "${vtpart2#/dev/}"
if $GREP -q 'mediacheck=1' /proc/cmdline; then
ventoy_copy_device_mapper "${vtdiskname}"
fi

View File

@@ -63,6 +63,9 @@ if [ -e /etc/initrd.functions ] && $GREP -q 'HPIP' /etc/initrd.functions; then
$BUSYBOX_PATH/mknod -m 660 /dev/console b 5 1 $BUSYBOX_PATH/mknod -m 660 /dev/console b 5 1
$SED "/CD_DEVICES=/a $BUSYBOX_PATH/sh $VTOY_PATH/hook/suse/disk_hook.sh" -i /etc/initrd.functions $SED "/CD_DEVICES=/a $BUSYBOX_PATH/sh $VTOY_PATH/hook/suse/disk_hook.sh" -i /etc/initrd.functions
$SED "/CD_DEVICES=/a CD_DEVICES=\"/dev/ventoy \$CD_DEVICES\"" -i /etc/initrd.functions $SED "/CD_DEVICES=/a CD_DEVICES=\"/dev/ventoy \$CD_DEVICES\"" -i /etc/initrd.functions
elif [ -f /scripts/udev_setup ]; then
echo "udev_setup" >> $VTLOG
echo "/ventoy/busybox/sh /ventoy/hook/suse/udev_setup_hook.sh" >> /scripts/udev_setup
else else
echo "SUSE" >> $VTLOG echo "SUSE" >> $VTLOG
ventoy_systemd_udevd_work_around ventoy_systemd_udevd_work_around

View File

@@ -57,14 +57,14 @@ vterr() {
is_ventoy_hook_finished() { is_ventoy_hook_finished() {
[ -e $VTOY_PATH/hook_finish ] [ -e $VTOY_PATH/hook_finish ]
} }
set_ventoy_hook_finish() { set_ventoy_hook_finish() {
echo 'Y' > $VTOY_PATH/hook_finish echo 'Y' > $VTOY_PATH/hook_finish
} }
get_ventoy_disk_name() { get_ventoy_disk_name() {
line=$($VTOY_PATH/tool/vtoydump -f /ventoy/ventoy_os_param) line=$($VTOY_PATH/tool/vtoydump -f /ventoy/ventoy_os_param)
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo ${line%%#*} echo ${line%%#*}
@@ -74,7 +74,7 @@ get_ventoy_disk_name() {
} }
get_ventoy_iso_name() { get_ventoy_iso_name() {
line=$($VTOY_PATH/tool/vtoydump -f /ventoy/ventoy_os_param) line=$($VTOY_PATH/tool/vtoydump -f /ventoy/ventoy_os_param)
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo ${line##*#} echo ${line##*#}
else else
@@ -83,8 +83,9 @@ get_ventoy_iso_name() {
} }
wait_for_usb_disk_ready() { wait_for_usb_disk_ready() {
while [ -n "Y" ]; do vtloop=0
usb_disk=$(get_ventoy_disk_name) while [ -n "Y" ]; do
usb_disk=$(get_ventoy_disk_name)
vtlog "wait_for_usb_disk_ready $usb_disk ..." vtlog "wait_for_usb_disk_ready $usb_disk ..."
if echo $usb_disk | $EGREP -q "nvme|mmc|nbd"; then if echo $usb_disk | $EGREP -q "nvme|mmc|nbd"; then
@@ -95,13 +96,20 @@ wait_for_usb_disk_ready() {
if [ -e "${vtpart2}" ]; then if [ -e "${vtpart2}" ]; then
vtlog "wait_for_usb_disk_ready $usb_disk finish" vtlog "wait_for_usb_disk_ready $usb_disk finish"
break break
else else
$SLEEP 0.3 let vtloop=vtloop+1
fi if [ $vtloop -gt 2 ]; then
done if [ "$VTLOG" != "$VTOY_PATH/log" ]; then
$VTOY_PATH/tool/vtoydump -f /ventoy/ventoy_os_param -v > $VTLOG
fi
fi
$SLEEP 0.3
fi
done
} }
check_usb_disk_ready() { check_usb_disk_ready() {
if echo $1 | $EGREP -q "nvme|mmc|nbd"; then if echo $1 | $EGREP -q "nvme|mmc|nbd"; then
vtpart2=${1}p2 vtpart2=${1}p2
@@ -554,6 +562,31 @@ ventoy_create_dev_ventoy_part() {
fi fi
} }
ventoy_create_chromeos_ventoy_part() {
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | $GREP ventoy | $SED 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
$BUSYBOX_PATH/mknod -m 0666 /dev/ventoy b $blkdev_num
if [ -e /vtoy_dm_table ]; then
vtPartid=1
$CAT /vtoy_dm_table | while read vtline; do
echo $vtline > /ventoy/dm_table_part${vtPartid}
if [ $vtPartid -eq $1 ]; then
$VTOY_PATH/tool/dmsetup create ventoy${vtPartid} /ventoy/dm_table_part${vtPartid} --readonly
else
$VTOY_PATH/tool/dmsetup create ventoy${vtPartid} /ventoy/dm_table_part${vtPartid}
fi
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | $GREP ventoy${vtPartid} | $SED 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
$BUSYBOX_PATH/mknod -m 0666 /dev/ventoy${vtPartid} b $blkdev_num
vtPartid=$(expr $vtPartid + 1)
done
fi
}
is_inotify_ventoy_part() { is_inotify_ventoy_part() {
if echo $1 | $GREP -q "2$"; then if echo $1 | $GREP -q "2$"; then
if ! [ -e /sys/block/$1 ]; then if ! [ -e /sys/block/$1 ]; then

View File

@@ -185,7 +185,7 @@ ventoy_unpack_injection() {
if [ -e $VTOY_PATH/ventoy_injection ]; then if [ -e $VTOY_PATH/ventoy_injection ]; then
echo "### decompress injection ... ###" >>$VTLOG echo "### decompress injection ... ###" >>$VTLOG
ventoy_unpack_injection > $VTOY_PATH/injection.log 2>&1 ventoy_unpack_injection > $VTOY_PATH/injection.log 2>&1
fi fi

View File

@@ -0,0 +1,201 @@
#!/ventoy/busybox/sh
#************************************************************************************
# Copyright (c) 2021, longpanda <admin@ventoy.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
#************************************************************************************
. /ventoy/hook/ventoy-hook-lib.sh
vtlog "####### $0 $* ########"
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
mkdir /sys
mount -t sysfs sys /sys
mdev -s
sleep 2
while [ -n "Y" ]; do
usb_disk=$(get_ventoy_disk_name)
if echo $usb_disk | egrep -q "nvme|mmc|nbd"; then
vtpart2=${usb_disk}p2
else
vtpart2=${usb_disk}2
fi
if [ -e "${vtpart2}" ]; then
break
else
sleep 2
mdev -s
fi
done
vtdiskname=$(get_ventoy_disk_name)
if [ "$vtdiskname" = "unknown" ]; then
vtlog "ventoy disk not found"
PATH=$VTPATH_OLD
exit 0
fi
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/')
vtDM=$(ventoy_find_dm_id ${blkdev_num})
echo -n $vtDM > /ventoy/vtDM
ventoy_create_chromeos_ventoy_part 3
mdev -s
vtlog "copy out the e2fsck program ..."
copy_lib() {
cp -a /ventoy_rdroot/usr/lib64/$1 /usr/lib64/
cp -a /ventoy_rdroot/lib64/$1 /lib64/
}
mkdir /ventoy_rdroot
mkdir -p /lib /lib64 /usr/lib64 /sbin
mount -o ro /dev/ventoy3 /ventoy_rdroot >>$VTLOG 2>&1
cp -a /ventoy_rdroot/sbin/e2fsck /sbin/
cp -a /ventoy_rdroot/sbin/dmsetup /sbin/
copy_lib libext2fs*
copy_lib libcom_err*
copy_lib libe2p*
copy_lib libblk*
copy_lib libuuid*
copy_lib libdl.*
copy_lib libdl-*
copy_lib libc.*
copy_lib libc-*
copy_lib libpthread*
copy_lib ld-*
copy_lib libdevmapper*
copy_lib libudev*
copy_lib libm.*
copy_lib libm-*
copy_lib librt*
copy_lib libpopt*
copy_lib libgpg-error*
copy_lib libselinux*
copy_lib libsepol*
copy_lib libpcre*
copy_lib libcap*
copy_lib libdw*
copy_lib libgcc_s*
copy_lib libattr*
copy_lib libelf*
copy_lib libz.*
copy_lib libbz2*
copy_lib libgcrypt*
copy_lib liblvm*
ln -s /lib64/libdevmapper.so.1.02 /lib64/libdevmapper.so.1.02.1
umount /ventoy_rdroot
vtlog "========================================="
vtlog "===== e2fsck -y -v /dev/ventoy1 ====="
e2fsck -y -v /dev/ventoy1 >>$VTLOG 2>&1
#vtlog "===== e2fsck -y -v /dev/ventoy3 ====="
#e2fsck -y -v /dev/ventoy3 >>$VTLOG 2>&1
vtlog "===== e2fsck -y -v /dev/ventoy8 ====="
e2fsck -y -v /dev/ventoy8 >>$VTLOG 2>&1
vtlog "========================================="
/sbin/dmsetup --version >>$VTLOG 2>&1
veritysetup --version >>$VTLOG 2>&1
vtlog "proc devtmpfs ..."
mkdir /newdev
mount -t devtmpfs dev /newdev
cp -a /dev/mapper/ventoy* /newdev/mapper/
cp -a /dev/ventoy* /newdev/
vtshortname="${vtdiskname#/dev/}"
mv /newdev/${vtshortname} /newdev/backup_${vtshortname}
cp -a /dev/ventoy /newdev/${vtshortname}
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
if [ -e /dev/ventoy${i} ]; then
if echo $vtdiskname | egrep -q "nvme|mmc|nbd"; then
vtpart=p$i
else
vtpart=$i
fi
if [ -e /newdev/${vtshortname}${vtpart} ]; then
mv /newdev/${vtshortname}${vtpart} /newdev/backup_${vtshortname}${vtpart}
fi
cp -a /dev/ventoy${i} /newdev/${vtshortname}${vtpart}
if [ $i -eq 3 ]; then
[ -e /dev/${vtshortname}${vtpart} ] && rm -f /dev/${vtshortname}${vtpart}
cp -a /dev/ventoy${i} /dev/${vtshortname}${vtpart}
vt_root_dev="/dev/${vtshortname}${vtpart}"
vtlog "vt_root_dev=$vt_root_dev"
fi
fi
done
# if grep -q 'DM=' /proc/cmdline; then
# vtlog "Boot verified image ..."
# dmP1=$(sed "s/.*\(0 [0-9]* verity\).*/\1/" /proc/cmdline)
# alg=$(sed "s/.*alg=\([^ ]*\).*/\1/" /proc/cmdline)
# hexdigest=$(sed "s/.*root_hexdigest=\([0-9a-fA-F][0-9a-fA-F]*\).*/\1/" /proc/cmdline)
# salt=$(sed "s/.*salt=\([0-9a-fA-F][0-9a-fA-F]*\).*/\1/" /proc/cmdline)
# hashstart=$(sed "s/.*hashstart=\([0-9][0-9]*\).*/\1/" /proc/cmdline)
#512 to 4096
# blocknum=$(expr $hashstart / 8)
# hashoffset=$(expr $hashstart \* 512)
# vtlog "veritysetup create vroot $vt_root_dev $vt_root_dev $hexdigest --data-block-size=4096 --hash-block-size=4096 --data-blocks=$blocknum --hash-offset=$hashoffset --salt=$salt --hash=$alg --no-superblock --format=0"
# veritysetup create vroot $vt_root_dev $vt_root_dev $hexdigest --data-block-size=4096 --hash-block-size=4096 --data-blocks=$blocknum --hash-offset=$hashoffset --salt=$salt --hash=$alg --no-superblock --format=0
# sleep 1
# mdev -s
# blkdev_num=$(dmsetup ls | grep vroot | sed 's/.*(\([0-9][0-9]*\),[^0-9]*\([0-9][0-9]*\).*/\1:\2/')
# vtDM=$(ventoy_find_dm_id ${blkdev_num})
# vtlog "blkdev_num=$blkdev_num vtDM=$vtDM"
# if [ -b /dev/$vtDM ]; then
# veritysetup status vroot >> $VTLOG 2>&1
# mount -o ro /dev/$vtDM /ventoy_rdroot
# else
# mount -o ro $vt_root_dev /ventoy_rdroot
# fi
# else
# vtlog "Boot normal image ..."
# mount -o ro $vt_root_dev /ventoy_rdroot
# fi
vtlog "Boot normal image ..."
mount -o ro $vt_root_dev /ventoy_rdroot
cp -a $VTLOG /newdev/ventoy.log
umount /newdev
mount -t devtmpfs dev /ventoy_rdroot/dev
PATH=$VTPATH_OLD

View File

@@ -0,0 +1,201 @@
#!/ventoy/busybox/sh
#************************************************************************************
# Copyright (c) 2021, longpanda <admin@ventoy.net>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
#************************************************************************************
. /ventoy/hook/ventoy-hook-lib.sh
vtlog "####### $0 $* ########"
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
mkdir /sys
mount -t sysfs sys /sys
mdev -s
sleep 2
while [ -n "Y" ]; do
usb_disk=$(get_ventoy_disk_name)
if echo $usb_disk | egrep -q "nvme|mmc|nbd"; then
vtpart2=${usb_disk}p2
else
vtpart2=${usb_disk}2
fi
if [ -e "${vtpart2}" ]; then
break
else
sleep 2
mdev -s
fi
done
vtdiskname=$(get_ventoy_disk_name)
if [ "$vtdiskname" = "unknown" ]; then
vtlog "ventoy disk not found"
PATH=$VTPATH_OLD
exit 0
fi
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/')
vtDM=$(ventoy_find_dm_id ${blkdev_num})
echo -n $vtDM > /ventoy/vtDM
ventoy_create_chromeos_ventoy_part 3
mdev -s
vtlog "copy out the e2fsck program ..."
copy_lib() {
cp -a /ventoy_rdroot/usr/lib64/$1 /usr/lib64/
cp -a /ventoy_rdroot/lib64/$1 /lib64/
}
mkdir /ventoy_rdroot
mkdir -p /lib /lib64 /usr/lib64 /sbin
mount -o ro /dev/ventoy3 /ventoy_rdroot >>$VTLOG 2>&1
cp -a /ventoy_rdroot/sbin/e2fsck /sbin/
cp -a /ventoy_rdroot/sbin/dmsetup /sbin/
copy_lib libext2fs*
copy_lib libcom_err*
copy_lib libe2p*
copy_lib libblk*
copy_lib libuuid*
copy_lib libdl.*
copy_lib libdl-*
copy_lib libc.*
copy_lib libc-*
copy_lib libpthread*
copy_lib ld-*
copy_lib libdevmapper*
copy_lib libudev*
copy_lib libm.*
copy_lib libm-*
copy_lib librt*
copy_lib libpopt*
copy_lib libgpg-error*
copy_lib libselinux*
copy_lib libsepol*
copy_lib libpcre*
copy_lib libcap*
copy_lib libdw*
copy_lib libgcc_s*
copy_lib libattr*
copy_lib libelf*
copy_lib libz.*
copy_lib libbz2*
copy_lib libgcrypt*
copy_lib liblvm*
ln -s /lib64/libdevmapper.so.1.02 /lib64/libdevmapper.so.1.02.1
umount /ventoy_rdroot
vtlog "========================================="
vtlog "===== e2fsck -y -v /dev/ventoy1 ====="
e2fsck -y -v /dev/ventoy1 >>$VTLOG 2>&1
#vtlog "===== e2fsck -y -v /dev/ventoy3 ====="
#e2fsck -y -v /dev/ventoy3 >>$VTLOG 2>&1
vtlog "===== e2fsck -y -v /dev/ventoy8 ====="
e2fsck -y -v /dev/ventoy8 >>$VTLOG 2>&1
vtlog "========================================="
/sbin/dmsetup --version >>$VTLOG 2>&1
veritysetup --version >>$VTLOG 2>&1
vtlog "proc devtmpfs ..."
mkdir /newdev
mount -t devtmpfs dev /newdev
cp -a /dev/mapper/ventoy* /newdev/mapper/
cp -a /dev/ventoy* /newdev/
vtshortname="${vtdiskname#/dev/}"
mv /newdev/${vtshortname} /newdev/backup_${vtshortname}
cp -a /dev/ventoy /newdev/${vtshortname}
for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
if [ -e /dev/ventoy${i} ]; then
if echo $vtdiskname | egrep -q "nvme|mmc|nbd"; then
vtpart=p$i
else
vtpart=$i
fi
if [ -e /newdev/${vtshortname}${vtpart} ]; then
mv /newdev/${vtshortname}${vtpart} /newdev/backup_${vtshortname}${vtpart}
fi
cp -a /dev/ventoy${i} /newdev/${vtshortname}${vtpart}
if [ $i -eq 3 ]; then
[ -e /dev/${vtshortname}${vtpart} ] && rm -f /dev/${vtshortname}${vtpart}
cp -a /dev/ventoy${i} /dev/${vtshortname}${vtpart}
vt_root_dev="/dev/${vtshortname}${vtpart}"
vtlog "vt_root_dev=$vt_root_dev"
fi
fi
done
# if grep -q 'DM=' /proc/cmdline; then
# vtlog "Boot verified image ..."
# dmP1=$(sed "s/.*\(0 [0-9]* verity\).*/\1/" /proc/cmdline)
# alg=$(sed "s/.*alg=\([^ ]*\).*/\1/" /proc/cmdline)
# hexdigest=$(sed "s/.*root_hexdigest=\([0-9a-fA-F][0-9a-fA-F]*\).*/\1/" /proc/cmdline)
# salt=$(sed "s/.*salt=\([0-9a-fA-F][0-9a-fA-F]*\).*/\1/" /proc/cmdline)
# hashstart=$(sed "s/.*hashstart=\([0-9][0-9]*\).*/\1/" /proc/cmdline)
#512 to 4096
# blocknum=$(expr $hashstart / 8)
# hashoffset=$(expr $hashstart \* 512)
# vtlog "veritysetup create vroot $vt_root_dev $vt_root_dev $hexdigest --data-block-size=4096 --hash-block-size=4096 --data-blocks=$blocknum --hash-offset=$hashoffset --salt=$salt --hash=$alg --no-superblock --format=0"
# veritysetup create vroot $vt_root_dev $vt_root_dev $hexdigest --data-block-size=4096 --hash-block-size=4096 --data-blocks=$blocknum --hash-offset=$hashoffset --salt=$salt --hash=$alg --no-superblock --format=0
# sleep 1
# mdev -s
# blkdev_num=$(dmsetup ls | grep vroot | sed 's/.*(\([0-9][0-9]*\),[^0-9]*\([0-9][0-9]*\).*/\1:\2/')
# vtDM=$(ventoy_find_dm_id ${blkdev_num})
# vtlog "blkdev_num=$blkdev_num vtDM=$vtDM"
# if [ -b /dev/$vtDM ]; then
# veritysetup status vroot >> $VTLOG 2>&1
# mount -o ro /dev/$vtDM /ventoy_rdroot
# else
# mount -o ro $vt_root_dev /ventoy_rdroot
# fi
# else
# vtlog "Boot normal image ..."
# mount -o ro $vt_root_dev /ventoy_rdroot
# fi
vtlog "Boot normal image ..."
mount -o ro $vt_root_dev /ventoy_rdroot
cp -a $VTLOG /newdev/ventoy.log
umount /newdev
mount -t devtmpfs dev /ventoy_rdroot/dev
PATH=$VTPATH_OLD

View File

@@ -27,7 +27,83 @@ vtlog "####### $0 $* ########"
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
wait_for_usb_disk_ready check_mkdev_node() {
for i in $(ls /sys/class/block/); do
if ! [ -e /dev/$i ]; then
blkdev_num=$(sed 's/:/ /g' /sys/class/block/$i/dev)
vtlog "mknod -m 0666 /dev/$i b $blkdev_num"
mknod -m 0666 /dev/$i b $blkdev_num
fi
done
}
check_insmod() {
if [ -f "$1" ]; then
vtlog "insmod $1"
insmod "$1" >> $VTOY_PATH/log 2>&1
else
vtlog "$1 not exist"
fi
}
wrt_insmod() {
kbit=$1
kv=$(uname -r)
vtlog "insmod $kv $kbit"
check_insmod /ventoy_openwrt/$kv/$kbit/dax.ko
check_insmod /ventoy_openwrt/$kv/$kbit/dm-mod.ko
}
insmod_dm_mod() {
if grep -q "device-mapper" /proc/devices; then
vtlog "device-mapper enabled by system 0"
return
fi
check_insmod /ventoy/modules/dax.ko
check_insmod /ventoy/modules/dm-mod.ko
if grep -q "device-mapper" /proc/devices; then
vtlog "device-mapper enabled by system 1"
return
fi
if [ -f /ventoy_openwrt.xz ]; then
tar xf /ventoy_openwrt.xz -C /
rm -f /ventoy_openwrt.xz
fi
if uname -m | egrep -q "amd64|x86_64"; then
wrt_insmod 64
else
wrt_insmod generic
if lsmod | grep -q 'dm-mod'; then
vterr "insmod generic failed"
else
wrt_insmod legacy
fi
fi
}
insmod_dm_mod
check_mkdev_node
sleep 1
while [ -n "Y" ]; do
vtusb_disk=$(get_ventoy_disk_name)
if check_usb_disk_ready "$vtusb_disk"; then
vtlog "get_ventoy_disk_name $vtusb_disk ready"
break;
else
vtlog "get_ventoy_disk_name $vtusb_disk not ready"
sleep 2
check_mkdev_node
fi
done
vtdiskname=$(get_ventoy_disk_name) vtdiskname=$(get_ventoy_disk_name)
if [ "$vtdiskname" = "unknown" ]; then if [ "$vtdiskname" = "unknown" ]; then
@@ -44,6 +120,8 @@ echo -n $vtDM > /ventoy/vtDM
ventoy_create_dev_ventoy_part ventoy_create_dev_ventoy_part
mdev -s mdev -s
check_mkdev_node
mkdir /ventoy_rdroot mkdir /ventoy_rdroot
mount /dev/ventoy2 /ventoy_rdroot mount /dev/ventoy2 /ventoy_rdroot

View File

@@ -21,37 +21,8 @@
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
wrt_insmod() {
kbit=$1
kv=$(uname -r)
echo "insmod $kv $kbit" >> $VTOY_PATH/log
[ -f /ventoy_openwrt/$kv/$kbit/dax.ko ] && insmod /ventoy_openwrt/$kv/$kbit/dax.ko > /dev/null 2>&1
[ -f /ventoy_openwrt/$kv/$kbit/dm-mod.ko ] && insmod /ventoy_openwrt/$kv/$kbit/dm-mod.ko > /dev/null 2>&1
}
mkdir /sys mkdir /sys
mount -t sysfs sys /sys mount -t sysfs sys /sys
mdev -s mdev -s
if [ -f /ventoy_openwrt.xz ]; then
tar xf /ventoy_openwrt.xz -C /
rm -f /ventoy_openwrt.xz
fi
if uname -m | egrep -q "amd64|x86_64"; then
wrt_insmod 64
else
wrt_insmod generic
if lsmod | grep -q 'dm-mod'; then
echo "insmod generic failed" >> $VTOY_PATH/log
else
wrt_insmod legacy
fi
fi
sh $VTOY_PATH/loop/openwrt/ventoy-disk.sh sh $VTOY_PATH/loop/openwrt/ventoy-disk.sh

View File

@@ -58,6 +58,12 @@ ventoy_get_os_type() {
# rhel6/CentOS6 and all other distributions based on them # rhel6/CentOS6 and all other distributions based on them
elif $GREP -q 'el6' /proc/version; then elif $GREP -q 'el6' /proc/version; then
if [ -f /sbin/detectcd ]; then
if $GREP -q -i 'LENOVO-EasyStartup' /sbin/detectcd; then
echo 'easystartup'; return
fi
fi
echo 'rhel6'; return echo 'rhel6'; return
# rhel7/CentOS7/rhel8/CentOS8 and all other distributions based on them # rhel7/CentOS7/rhel8/CentOS8 and all other distributions based on them
@@ -82,8 +88,8 @@ ventoy_get_os_type() {
# Deepin : do the same process with debian # Deepin : do the same process with debian
elif $GREP -q '[Dd]eepin' /proc/version; then elif $GREP -q '[Dd]eepin' /proc/version; then
echo 'debian'; return echo 'debian'; return
# SUSE # SUSE
elif $GREP -q 'SUSE' /proc/version; then elif $GREP -q 'SUSE' /proc/version; then
echo 'suse'; return echo 'suse'; return
@@ -154,7 +160,11 @@ ventoy_get_os_type() {
elif $GREP -q 'openEuler' /etc/os-release; then elif $GREP -q 'openEuler' /etc/os-release; then
echo 'openEuler'; return echo 'openEuler'; return
elif $GREP -q 'fuyu' /etc/os-release; then elif $GREP -q 'fuyu' /etc/os-release; then
echo 'openEuler'; return echo 'openEuler'; return
elif $GREP -q 'deepin' /etc/os-release; then
echo 'debian'; return
elif $GREP -q 'chinauos' /etc/os-release; then
echo 'debian'; return
fi fi
fi fi
@@ -340,7 +350,17 @@ fi
#################################################################### ####################################################################
# # # #
# Step 3 : Check for debug break # # Step 3 : Run LiveInjection Hook #
# #
####################################################################
if [ -f "/live_injection_7ed136ec_7a61_4b54_adc3_ae494d5106ea/hook.sh" ]; then
$BUSYBOX_PATH/sh "/live_injection_7ed136ec_7a61_4b54_adc3_ae494d5106ea/hook.sh" $VTOS
fi
####################################################################
# #
# Step 4 : Check for debug break #
# # # #
#################################################################### ####################################################################
if [ "$VTOY_BREAK_LEVEL" = "03" ] || [ "$VTOY_BREAK_LEVEL" = "13" ]; then if [ "$VTOY_BREAK_LEVEL" = "03" ] || [ "$VTOY_BREAK_LEVEL" = "13" ]; then
@@ -357,7 +377,7 @@ fi
#################################################################### ####################################################################
# # # #
# Step 4 : Hand over to real init # # Step 5 : Hand over to real init #
# # # #
#################################################################### ####################################################################
$BUSYBOX_PATH/umount /proc $BUSYBOX_PATH/umount /proc

View File

@@ -127,8 +127,8 @@ ventoy_get_os_type() {
# Deepin : do the same process with debian # Deepin : do the same process with debian
elif $GREP -q '[Dd]eepin' /proc/version; then elif $GREP -q '[Dd]eepin' /proc/version; then
echo 'debian'; return echo 'debian'; return
# SUSE # SUSE
elif $GREP -q 'SUSE' /proc/version; then elif $GREP -q 'SUSE' /proc/version; then
echo 'suse'; return echo 'suse'; return
@@ -200,6 +200,10 @@ ventoy_get_os_type() {
echo 'openEuler'; return echo 'openEuler'; return
elif $GREP -q 'fuyu' /etc/os-release; then elif $GREP -q 'fuyu' /etc/os-release; then
echo 'openEuler'; return echo 'openEuler'; return
elif $GREP -q 'deepin' /etc/os-release; then
echo 'debian'; return
elif $GREP -q 'chinauos' /etc/os-release; then
echo 'debian'; return
fi fi
fi fi

View File

@@ -81,6 +81,18 @@ else
echo "use unsquashfs_32" >>$VTLOG echo "use unsquashfs_32" >>$VTLOG
$BUSYBOX_PATH/cp -a $VTOY_PATH/tool/unsquashfs_32 $VTOY_PATH/tool/vtoy_unsquashfs $BUSYBOX_PATH/cp -a $VTOY_PATH/tool/unsquashfs_32 $VTOY_PATH/tool/vtoy_unsquashfs
fi fi
if $GREP -q 64 $VTOY_PATH/ventoy_arch; then
echo "use veritysetup64" >>$VTLOG
if [ -f $VTOY_PATH/tool/veritysetup64 ]; then
$BUSYBOX_PATH/cp -a $VTOY_PATH/tool/veritysetup64 $VTOY_PATH/tool/veritysetup
fi
else
echo "use veritysetup32" >>$VTLOG
if [ -f $VTOY_PATH/tool/veritysetup32 ]; then
$BUSYBOX_PATH/cp -a $VTOY_PATH/tool/veritysetup32 $VTOY_PATH/tool/veritysetup
fi
fi
fi fi

View File

@@ -21,19 +21,19 @@ ln -s sbin/init linuxrc
cd ventoy cd ventoy
find ./loop | cpio -o -H newc>loop.cpio find ./loop | cpio -o -H newc --owner=root:root >loop.cpio
xz loop.cpio xz loop.cpio
rm -rf loop rm -rf loop
xz ventoy_chain.sh xz ventoy_chain.sh
xz ventoy_loop.sh xz ventoy_loop.sh
find ./hook | cpio -o -H newc>hook.cpio find ./hook | cpio -o -H newc --owner=root:root >hook.cpio
xz hook.cpio xz hook.cpio
rm -rf hook rm -rf hook
cd .. cd ..
find .| cpio -o -H newc>../ventoy.cpio find .| cpio -o -H newc --owner=root:root >../ventoy.cpio
cd .. cd ..
rm -rf cpio_tmp rm -rf cpio_tmp
@@ -64,12 +64,12 @@ cp -a $VENTOY_PATH/LZIP/lunzip64 tool/
chmod -R 777 ./tool chmod -R 777 ./tool
find ./tool | cpio -o -H newc>tool.cpio find ./tool | cpio -o -H newc --owner=root:root >tool.cpio
xz tool.cpio xz tool.cpio
rm -rf tool rm -rf tool
cd .. cd ..
find .| cpio -o -H newc>../ventoy_x86.cpio find .| cpio -o -H newc --owner=root:root >../ventoy_x86.cpio
cd .. cd ..
rm -rf cpio_tmp rm -rf cpio_tmp
@@ -95,12 +95,12 @@ cp -a $VENTOY_PATH/LZIP/lunzipaa64 tool/
chmod -R 777 ./tool chmod -R 777 ./tool
find ./tool | cpio -o -H newc>tool.cpio find ./tool | cpio -o -H newc --owner=root:root >tool.cpio
xz tool.cpio xz tool.cpio
rm -rf tool rm -rf tool
cd .. cd ..
find .| cpio -o -H newc>../ventoy_arm64.cpio find .| cpio -o -H newc --owner=root:root >../ventoy_arm64.cpio
cd .. cd ..
rm -rf cpio_tmp rm -rf cpio_tmp
@@ -127,12 +127,12 @@ rm -f tool/vtoytool/00/vtoytool_aa64
chmod -R 777 ./tool chmod -R 777 ./tool
find ./tool | cpio -o -H newc>tool.cpio find ./tool | cpio -o -H newc --owner=root:root >tool.cpio
xz tool.cpio xz tool.cpio
rm -rf tool rm -rf tool
cd .. cd ..
find .| cpio -o -H newc>../ventoy_mips64.cpio find .| cpio -o -H newc --owner=root:root >../ventoy_mips64.cpio
cd .. cd ..
rm -rf cpio_tmp rm -rf cpio_tmp

View File

@@ -14,7 +14,7 @@ for dir in $(ls); do
cd .. cd ..
done done
find . | cpio -o -H newc>../vtloopex.cpio find . | cpio -o -H newc --owner=root:root >../vtloopex.cpio
cd .. cd ..

View File

@@ -27,6 +27,13 @@ if [ ! -f "$file" ]; then
exit 1 exit 1
fi fi
if echo $size | grep -q "^-"; then
mode="Shrink"
size=${size:1}
else
mode="Extend"
fi
if echo $size | grep -q "[^0-9]"; then if echo $size | grep -q "[^0-9]"; then
print_usage print_usage
exit 1 exit 1
@@ -42,10 +49,25 @@ fi
fsMB=$(expr $fsize / 1024 / 1024) fsMB=$(expr $fsize / 1024 / 1024)
total=$(expr $fsMB + $size)
if [ "$mode" = "Extend" ]; then
total=$(expr $fsMB + $size)
else
if [ $fsMB -le $size ]; then
echo "File size of $file is less than ${size}MB."
exit 1
fi
total=$(expr $fsMB - $size)
fi
magic=$(hexdump -n3 -e '3/1 "%02X"' $file) magic=$(hexdump -n3 -e '3/1 "%02X"' $file)
if [ "$magic" = "584653" ]; then if [ "$magic" = "584653" ]; then
if [ "$mode" = "Shrink" ]; then
echo "Shrink is not supported for XFS filesystem."
exit 1
fi
if which xfs_growfs >/dev/null 2>&1; then if which xfs_growfs >/dev/null 2>&1; then
cmd=xfs_growfs cmd=xfs_growfs
else else
@@ -61,23 +83,26 @@ else
fi fi
fi fi
if [ "$mode" = "Extend" ]; then
echo "$mode dat file... (current is ${fsMB}MB, append ${size}MB, total ${total}MB)"
dd if=/dev/zero bs=1M count=$size status=none >> "$file"
sync
else
echo "$mode dat file... (current is ${fsMB}MB, reduce ${size}MB, finally ${total}MB)"
fi
echo "Extend dat file... (current is ${fsMB}MB, append ${size}MB, total ${total}MB)"
dd if=/dev/zero bs=1M count=$size status=none >> "$file"
sync
freeloop=$(losetup -f) freeloop=$(losetup -f)
losetup $freeloop "$file" losetup $freeloop "$file"
if [ "$cmd" = "resize2fs" ]; then if [ "$cmd" = "resize2fs" ]; then
echo "Extend ext filesystem by resize2fs ..." echo "$mode ext filesystem by resize2fs ..."
echo "resize2fs $freeloop ${total}M" echo "resize2fs $freeloop ${total}M"
e2fsck -f $freeloop e2fsck -f $freeloop
resize2fs $freeloop ${total}M resize2fs $freeloop ${total}M
ret=$? ret=$?
else else
echo "Extend xfs filesystem by xfs_growfs ..." echo "$mode xfs filesystem by xfs_growfs ..."
tmpdir=$(mktemp -d) tmpdir=$(mktemp -d)
mount $freeloop $tmpdir mount $freeloop $tmpdir
xfs_growfs $freeloop xfs_growfs $freeloop
@@ -87,6 +112,12 @@ fi
losetup -d $freeloop losetup -d $freeloop
if [ $ret -eq 0 -a "$mode" = "Shrink" ]; then
echo "truncate persistent file ..."
truncate "$file" -s ${total}M
ret=$?
fi
echo "" echo ""
if [ $ret -eq 0 ]; then if [ $ret -eq 0 ]; then
echo "======= SUCCESS =========" echo "======= SUCCESS ========="
@@ -94,4 +125,3 @@ else
echo "======= FAILED =========" echo "======= FAILED ========="
fi fi
echo "" echo ""

View File

@@ -21,8 +21,11 @@ Please refer https://www.ventoy.net/en/doc_start.html for details.
1. sudo sh VentoyWeb.sh 1. sudo sh VentoyWeb.sh
2. open your browser and visit http://127.0.0.1:24680 2. open your browser and visit http://127.0.0.1:24680
========== VentoyWebDeepin.sh ===============
1. sudo sh VentoyWebDeepin.sh ========= VentoyGUI ===================
VentoyGUI is native GUI program for Linux (GTK/QT)
1. Just double-click the file (e.g. VentoyGUI.x86_64)
2. If it can not startup after double-click, you can open the terminal and just execute the file (e.g. ./VentoyGUI.x86_64)
========== CreatePersistentImg.sh =============== ========== CreatePersistentImg.sh ===============

Binary file not shown.

View File

@@ -21,7 +21,7 @@ elif uname -m | egrep -q 'mips64'; then
else else
export TOOLDIR=i386 export TOOLDIR=i386
fi fi
export PATH=./tool/$TOOLDIR:$PATH export PATH="./tool/$TOOLDIR:$PATH"
echo '' echo ''

BIN
INSTALL/VentoyGUI.aarch64 Normal file

Binary file not shown.

BIN
INSTALL/VentoyGUI.i386 Normal file

Binary file not shown.

BIN
INSTALL/VentoyGUI.mips64el Normal file

Binary file not shown.

BIN
INSTALL/VentoyGUI.x86_64 Normal file

Binary file not shown.

View File

@@ -45,6 +45,7 @@ if [ ! -f ./boot/boot.img ]; then
if [ -d ./grub ]; then if [ -d ./grub ]; then
echo "Don't run VentoyWeb.sh here, please download the released install package, and run the script in it." echo "Don't run VentoyWeb.sh here, please download the released install package, and run the script in it."
else else
echo "Current directory is $PWD"
echo "Please run under the correct directory!" echo "Please run under the correct directory!"
fi fi
exit 1 exit 1

View File

@@ -1,109 +0,0 @@
#!/bin/sh
if echo "$*" | grep -q '[-]v'; then
set -x
fi
print_usage() {
echo 'Usage: VentoyWebDeepin.sh [ OPTION ]'
echo ' OPTION: (optional)'
echo ' -H x.x.x.x http server IP address (default is 127.0.0.1)'
echo ' -p PORT http server PORT (default is 24680)'
echo ' -h print this help'
echo ' -v print verbose info'
echo ''
}
print_err() {
echo ""
echo "$*"
echo ""
}
get_user() {
name=$(logname)
if [ -n "$name" -a "$name" != "root" ]; then
echo $name; return
fi
name=${HOME#/home/}
if [ -n "$name" -a "$name" != "root" ]; then
echo $name; return
fi
}
uid=$(id -u)
if [ $uid -ne 0 ]; then
exec sudo sh $0 $*
fi
OLDDIR=$(pwd)
if uname -m | egrep -q 'aarch64|arm64'; then
TOOLDIR=aarch64
elif uname -m | egrep -q 'x86_64|amd64'; then
TOOLDIR=x86_64
elif uname -m | egrep -q 'mips64'; then
TOOLDIR=mips64el
else
TOOLDIR=i386
fi
if [ ! -f ./tool/$TOOLDIR/V2DServer ]; then
if [ -f ${0%VentoyWebDeepin.sh}/tool/$TOOLDIR/V2DServer ]; then
cd ${0%VentoyWebDeepin.sh}
fi
fi
PATH=./tool/$TOOLDIR:$PATH
if [ ! -f ./boot/boot.img ]; then
if [ -d ./grub ]; then
echo "Don't run VentoyWebDeepin.sh here, please download the released install package, and run the script in it."
else
echo "Please run under the correct directory!"
fi
exit 1
fi
HOST="127.0.0.1"
PORT=24680
while [ -n "$1" ]; do
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
print_usage
exit 0
elif [ "$1" = "-v" ]; then
VERBOSE=1
elif [ "$1" = "-H" ]; then
shift
if echo $1 | grep -q '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*'; then
HOST="$1"
else
print_err "Invalid host $1"
exit 1
fi
elif [ "$1" = "-p" ]; then
shift
if [ $1 -gt 0 -a $1 -le 65535 ]; then
PORT="$1"
else
print_err "Invalid port $1"
exit 1
fi
fi
shift
done
if ps -ef | grep "V2DServer.*$HOST.*$PORT" | grep -q -v grep; then
print_err "Another ventoy server is running now, please close it first."
exit 1
fi
if grep -q -i uos /etc/os-release; then
. ./tool/WebUos.sh
else
. ./tool/WebDeepin.sh
fi

View File

@@ -40,6 +40,15 @@ submenu "Screen Display Mode" --class=debug_screen_mode --class=F5tool {
if [ "$grub_platform" != "pc" ]; then if [ "$grub_platform" != "pc" ]; then
submenu 'Ventoy UEFI Utilities' --class=debug_util --class=F5tool { submenu 'Ventoy UEFI Utilities' --class=debug_util --class=F5tool {
menuentry 'Show EFI Drivers' --class=debug_util_efidrv --class=debug_util --class=F5tool {
vt_push_pager
chainloader ${vtoy_path}/vtoyutil_${VTOY_EFI_ARCH}.efi env_param=${env_param} ${vtdebug_flag} feature=show_efi_drivers
boot
vt_pop_pager
echo -e "\npress ENTER to exit ..."
read vtInputKey
}
menuentry 'Fixup Windows BlinitializeLibrary Failure' --class=debug_util_blinit --class=debug_util --class=F5tool { menuentry 'Fixup Windows BlinitializeLibrary Failure' --class=debug_util_blinit --class=debug_util --class=F5tool {
chainloader ${vtoy_path}/vtoyutil_${VTOY_EFI_ARCH}.efi env_param=${env_param} ${vtdebug_flag} feature=fix_windows_mmap chainloader ${vtoy_path}/vtoyutil_${VTOY_EFI_ARCH}.efi env_param=${env_param} ${vtdebug_flag} feature=fix_windows_mmap
boot boot
@@ -103,6 +112,15 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json --cla
unset pager unset pager
} }
menuentry 'Check menu tip plugin configuration' --class=debug_menutip --class=debug_json --class=F5tool {
set pager=1
vt_check_plugin_json $vt_plugin_path menu_tip $vtoy_iso_part
echo -e "\npress ENTER to exit ..."
read vtInputKey
unset pager
}
menuentry 'Check menu class plugin configuration' --class=debug_menuclass --class=debug_json --class=F5tool { menuentry 'Check menu class plugin configuration' --class=debug_menuclass --class=debug_json --class=F5tool {
set pager=1 set pager=1
vt_check_plugin_json $vt_plugin_path menu_class $vtoy_iso_part vt_check_plugin_json $vt_plugin_path menu_class $vtoy_iso_part

View File

@@ -130,9 +130,20 @@ function get_os_type {
function vt_check_compatible_pe { function vt_check_compatible_pe {
#Check for PE without external tools #Check for PE without external tools
if [ -f "$1/HBCD_PE.ini" ]; then #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 set ventoy_compatible=YES
fi fi
return
}
function vt_check_compatible_linux {
if vt_str_begin "$vt_volume_id" "embootkit"; then
set ventoy_compatible=YES
fi
return
} }
function locate_initrd { function locate_initrd {
@@ -161,7 +172,11 @@ function distro_specify_wim_patch {
vt_windows_collect_wim_patch wim /BOOT/H3_7PE.WIM vt_windows_collect_wim_patch wim /BOOT/H3_7PE.WIM
vt_windows_collect_wim_patch wim /BOOT/H3_8PE.WIM vt_windows_collect_wim_patch wim /BOOT/H3_8PE.WIM
vt_windows_collect_wim_patch wim /BOOT/H3_81PE.WIM vt_windows_collect_wim_patch wim /BOOT/H3_81PE.WIM
fi elif [ -d (loop)/2k10/winpe ]; then
vt_windows_collect_wim_patch wim /2k10/winpe/w1086pe.wim
vt_windows_collect_wim_patch wim /2k10/winpe/w8x86pe.wim
vt_windows_collect_wim_patch wim /2k10/winpe/w7x86pe.wim
fi
} }
function distro_specify_wim_patch_phase2 { function distro_specify_wim_patch_phase2 {
@@ -550,6 +565,22 @@ function uefi_windows_menu_func {
fi fi
} }
function uefi_find_replace_initrd {
if vt_get_efi_vdisk_offset "${1}${2}" vt_efivdisk_offset; then
loopback -s $vt_efivdisk_offset vtefivdisk "${1}${2}"
unset vt_rp_initrd
vt_search_replace_initrd (vtefivdisk) vt_rp_initrd
if [ -n "$vt_rp_initrd" ]; then
vt_add_replace_file $3 "$vt_rp_initrd"
fi
loopback -d vtefivdisk
ventoy_debug_pause
fi
}
function uefi_linux_menu_func { function uefi_linux_menu_func {
if [ "$ventoy_compatible" = "NO" ]; then if [ "$ventoy_compatible" = "NO" ]; then
@@ -631,6 +662,11 @@ function uefi_linux_menu_func {
elif [ -f (loop)/loader/entries/pisi-efi-x86_64.conf ]; then elif [ -f (loop)/loader/entries/pisi-efi-x86_64.conf ]; then
vt_add_replace_file $vtindex "EFI\\pisi\\initrd.img" vt_add_replace_file $vtindex "EFI\\pisi\\initrd.img"
fi fi
vt_get_replace_file_cnt vt_replace_cnt
if [ $vt_replace_cnt -eq 0 ]; then
uefi_find_replace_initrd "$1" "$2" $vtindex
fi
elif [ -d (loop)/EFI/boot/entries ]; then elif [ -d (loop)/EFI/boot/entries ]; then
if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then
vt_add_replace_file 0 "EFI\\parabolaiso\\parabolaiso.img" vt_add_replace_file 0 "EFI\\parabolaiso\\parabolaiso.img"
@@ -638,6 +674,8 @@ function uefi_linux_menu_func {
vt_add_replace_file 0 "EFI\\hyperiso\\hyperiso.img" vt_add_replace_file 0 "EFI\\hyperiso\\hyperiso.img"
fi fi
elif [ -d (loop)/EFI/BOOT/entries ]; then elif [ -d (loop)/EFI/BOOT/entries ]; then
vt_linux_get_main_initrd_index vtindex
if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then
vt_add_replace_file 0 "EFI\\parabolaiso\\parabolaiso.img" vt_add_replace_file 0 "EFI\\parabolaiso\\parabolaiso.img"
elif [ -f (loop)/parabola/boot/x86_64/initramfs-linux-libre.img ]; then elif [ -f (loop)/parabola/boot/x86_64/initramfs-linux-libre.img ]; then
@@ -731,6 +769,8 @@ function ventoy_reset_nojoliet {
else else
vt_iso9660_nojoliet 0 vt_iso9660_nojoliet 0
fi fi
vt_append_extra_sector 0
} }
function uefi_iso_menu_func { function uefi_iso_menu_func {
@@ -757,6 +797,12 @@ function uefi_iso_menu_func {
else else
set ventoy_fs_probe=iso9660 set ventoy_fs_probe=iso9660
ventoy_reset_nojoliet ventoy_reset_nojoliet
# Lenovo EasyStartup need an addional sector for boundary check
if vt_str_begin "$vt_volume_id" "EasyStartup"; then
vt_skip_svd "${vtoy_iso_part}${vt_chosen_path}"
vt_append_extra_sector 1
fi
fi fi
loopback loop "${1}${chosen_path}" loopback loop "${1}${chosen_path}"
@@ -791,6 +837,7 @@ function uefi_iso_menu_func {
elif [ "$vtoy_os" = "Unix" ]; then elif [ "$vtoy_os" = "Unix" ]; then
uefi_unix_menu_func "$1" "${chosen_path}" uefi_unix_menu_func "$1" "${chosen_path}"
else else
vt_check_compatible_linux (loop)
uefi_linux_menu_func "$1" "${chosen_path}" uefi_linux_menu_func "$1" "${chosen_path}"
fi fi
@@ -900,7 +947,7 @@ function legacy_windows_menu_func {
loopback loop "$1$2" loopback loop "$1$2"
fi 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 vt_windows_collect_wim_patch bcd (loop)/$file
done done
@@ -940,6 +987,14 @@ function legacy_linux_menu_func {
set ventoy_fs_probe=iso9660 set ventoy_fs_probe=iso9660
loopback loop "$1$2" loopback loop "$1$2"
fi fi
if [ -f (loop)/isolinux/isolinux.cfg ]; then
if vt_iso9660_isjoliet; then
vt_iso9660_nojoliet 1
loopback -d loop
loopback loop "$1$2"
fi
fi
vt_load_cpio $vtoy_path "$2" "$1" "busybox=$ventoy_busybox_ver" vt_load_cpio $vtoy_path "$2" "$1" "busybox=$ventoy_busybox_ver"
@@ -1020,7 +1075,7 @@ function legacy_linux_menu_func {
ventoy_gui_console ventoy_gui_console
else else
ventoy_acpi_param ${vtoy_chain_mem_addr} 2048 ventoy_acpi_param ${vtoy_chain_mem_addr} 2048
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size} linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
boot boot
fi fi
else else
@@ -1087,6 +1142,7 @@ function legacy_iso_menu_func {
elif [ "$vtoy_os" = "Unix" ]; then elif [ "$vtoy_os" = "Unix" ]; then
legacy_unix_menu_func "$1" "${chosen_path}" legacy_unix_menu_func "$1" "${chosen_path}"
else else
vt_check_compatible_linux (loop)
legacy_linux_menu_func "$1" "${chosen_path}" legacy_linux_menu_func "$1" "${chosen_path}"
fi fi
} }
@@ -1169,9 +1225,8 @@ function iso_common_menuentry {
echo -e "\n $vt_volume_space $vt_chosen_size $vt_chosen_size_mod\n" echo -e "\n $vt_volume_space $vt_chosen_size $vt_chosen_size_mod\n"
echo -e "\n The size of the iso file \"$vt_chosen_size\" is invalid. File corrupted ?\n" echo -e "\n The size of the iso file \"$vt_chosen_size\" is invalid. File corrupted ?\n"
echo -e " 此ISO文件的大小 \"$vt_chosen_size\" 有问题,请确认文件是否损坏。\n" echo -e " 此ISO文件的大小 \"$vt_chosen_size\" 有问题,请确认文件是否损坏。\n"
echo -e "\n press ENTER to exit (请按 回车 键返回) ..." echo -e "\n press ENTER to continue (请按 回车 键继续) ..."
read vtInputKey read vtInputKey
return
fi fi
fi fi
@@ -1399,7 +1454,7 @@ function vtoyboot_common_func {
ventoy_pause ventoy_pause
fi fi
fi fi
vt_img_sector "${1}" vt_img_sector "${1}"
vt_raw_chain_data "${1}" vt_raw_chain_data "${1}"
@@ -1453,6 +1508,11 @@ function vtoy_unsupport_menuentry {
#============================================================# #============================================================#
# #
function only_uefi_tip {
echo -e "\n This IMG file is only supported in UEFI mode. \n"
echo -e "\n press ENTER to exit ..."
read vtInputKey
}
function ventoy_img_easyos { function ventoy_img_easyos {
vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver" vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
@@ -1626,14 +1686,25 @@ function ventoy_img_openwrt {
set ventoy_busybox_ver=64 set ventoy_busybox_ver=64
fi fi
if [ ! -f ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz ]; then vt_fs_enum_1st_dir (vtimghd,2) /lib/modules/ vt_dir_name
ventoy_gui_console
echo -e "\n ventoy_openwrt.xz not found. Please refer https://www.ventoy.net/en/doc_openwrt.html.\n" if [ -f (vtimghd,2)/lib/modules/$vt_dir_name/dm-mod.ko ]; then
echo -e " 未找到 ventoy_openwrt.xz 文件。请参考 https://www.ventoy.net/cn/doc_openwrt.html\n" set openwrt_plugin_need=0
echo -e "\n press ENTER to exit (请按 回车 键返回) ..." vt_img_extra_initrd_append (vtimghd,2)/lib/modules/$vt_dir_name/dm-mod.ko
read vtInputKey if [ -f (vtimghd,2)/lib/modules/$vt_dir_name/dax.ko ]; then
ventoy_cli_console vt_img_extra_initrd_append (vtimghd,2)/lib/modules/$vt_dir_name/dax.ko
return fi
else
set openwrt_plugin_need=1
if [ ! -f ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz ]; then
ventoy_gui_console
echo -e "\n ventoy_openwrt.xz not found. Please refer https://www.ventoy.net/en/doc_openwrt.html.\n"
echo -e " 未找到 ventoy_openwrt.xz 文件。请参考 https://www.ventoy.net/cn/doc_openwrt.html\n"
echo -e "\n press ENTER to exit (请按 回车 键返回) ..."
read vtInputKey
ventoy_cli_console
return
fi
fi fi
if vt_img_check_range "${vtoy_iso_part}${vt_chosen_path}"; then if vt_img_check_range "${vtoy_iso_part}${vt_chosen_path}"; then
@@ -1648,12 +1719,14 @@ function ventoy_img_openwrt {
return return
fi fi
vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver" vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=$ventoy_busybox_ver"
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
vt_img_extra_initrd_append ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz if [ $openwrt_plugin_need -eq 1 ]; then
if [ -f ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz ]; then
vt_img_extra_initrd_append ${vtoy_iso_part}/ventoy/ventoy_openwrt.xz
fi
fi
#boot image file #boot image file
vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=openwrt vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=openwrt
@@ -1683,6 +1756,74 @@ function ventoy_img_tails {
vt_unset_boot_opt vt_unset_boot_opt
} }
function ventoy_img_fydeos {
if [ "$grub_platform" = "pc" ]; then
only_uefi_tip
return
fi
vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=64"
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
ventoy_debug_pause
#boot image file
vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=fydeos
vt_img_hook_root
set grubdisk=vtimghd
set grubpartA=(vtimghd,3)
set grubpartB=(vtimghd,5)
set linuxpartA=(sda,3)
set linuxpartB=(sda,5)
set root=(vtimghd,12)
configfile (vtimghd,12)/efi/boot/grub.cfg
vt_img_unhook_root
vt_unset_boot_opt
unset grubdisk
unset grubpartA
unset grubpartB
unset linuxpartA
unset linuxpartB
}
function ventoy_img_cloudready {
if [ "$grub_platform" = "pc" ]; then
only_uefi_tip
return
fi
vt_load_cpio $vtoy_path "${vt_chosen_path}" ${vtoy_iso_part} "busybox=64"
vt_trailer_cpio ${vtoy_iso_part} "${vt_chosen_path}" noinit
ventoy_debug_pause
#boot image file
vt_set_boot_opt rdinit=/vtoy/vtoy ventoyos=cloudready
vt_img_hook_root
set grubdisk=vtimghd
set grubpartA=(vtimghd,3)
set grubpartB=(vtimghd,5)
set linuxpartA=(sda,3)
set linuxpartB=(sda,5)
set root=(vtimghd,12)
configfile (vtimghd,12)/efi/boot/grub.cfg
vt_img_unhook_root
vt_unset_boot_opt
unset grubdisk
unset grubpartA
unset grubpartB
unset linuxpartA
unset linuxpartB
}
function ventoy_img_memtest86 { function ventoy_img_memtest86 {
chainloader (vtimghd,1)/efi/boot/BOOTX64.efi chainloader (vtimghd,1)/efi/boot/BOOTX64.efi
boot boot
@@ -1695,9 +1836,19 @@ function img_unsupport_tip {
read vtInputKey read vtInputKey
} }
function legacy_img_memdisk {
linux16 $vtoy_path/memdisk
echo "Loading img file to memory ..."
initrd16 "${1}${2}"
ventoy_cli_console
boot
}
function img_common_menuentry { function img_common_menuentry {
set ventoy_compatible=YES set ventoy_compatible=YES
set ventoy_busybox_ver=32 set ventoy_busybox_ver=32
unset LoadIsoEfiDriver
vt_chosen_img_path vt_chosen_path vt_chosen_size vt_chosen_img_path vt_chosen_path vt_chosen_size
@@ -1709,8 +1860,11 @@ function img_common_menuentry {
return return
fi fi
if [ -d (vtimghd)/ ]; then if [ "$grub_platform" = "pc" ]; then
loopback -d vtimghd if vt_check_mode 0; then
legacy_img_memdisk $vtoy_iso_part "$vt_chosen_path"
return
fi
fi fi
loopback vtimghd "${vtoy_iso_part}${vt_chosen_path}" loopback vtimghd "${vtoy_iso_part}${vt_chosen_path}"
@@ -1728,19 +1882,26 @@ function img_common_menuentry {
vt_get_fs_label (vtimghd,1) vtImgHd1Label vt_get_fs_label (vtimghd,1) vtImgHd1Label
if [ -d (vtimghd,2)/lib ]; then
if [ "$vtImgHd1Label" = "STATE" ]; then
vt_get_fs_label (vtimghd,3) vtImgHd3Label
elif [ -d (vtimghd,2)/lib ]; then
vt_get_fs_label (vtimghd,2) vtImgHd2Label vt_get_fs_label (vtimghd,2) vtImgHd2Label
fi fi
if [ -e (vtimghd,1)/etc/hostname ]; then if [ -e (vtimghd,1)/etc/hostname ]; then
vt_1st_line (vtimghd,1)/etc/hostname vtImgHostname vt_1st_line (vtimghd,1)/etc/hostname vtImgHostname
fi fi
if vt_str_begin "$vtImgHd3Label" "ROOT-"; then
if [ -e (vtimghd,1)/easy.sfs ]; then if [ -f (vtimghd,3)/etc/os-release.d/ID ]; then
ventoy_img_easyos vt_1st_line (vtimghd,3)/etc/os-release.d/ID vt_release_line1
elif [ -e (vtimghd,1)/volumio.initrd ]; then if [ vt_str_begin "$vt_release_line1" "FydeOS" ]; then
ventoy_img_volumio ventoy_img_fydeos
fi
elif [ -f (vtimghd,3)/etc/cloudready-release ]; then
ventoy_img_cloudready
fi
elif vt_str_begin "$vtImgHd1Label" "LAKKA"; then elif vt_str_begin "$vtImgHd1Label" "LAKKA"; then
ventoy_img_openelec lakka ventoy_img_openelec lakka
elif vt_str_begin "$vtImgHd1Label" "LIBREELEC"; then elif vt_str_begin "$vtImgHd1Label" "LIBREELEC"; then
@@ -1755,6 +1916,10 @@ function img_common_menuentry {
ventoy_img_tails ventoy_img_tails
elif [ "$vtImgHd2Label" = "RECALBOX" ]; then elif [ "$vtImgHd2Label" = "RECALBOX" ]; then
ventoy_img_recalbox ventoy_img_recalbox
elif [ -e (vtimghd,1)/easy.sfs ]; then
ventoy_img_easyos
elif [ -e (vtimghd,1)/volumio.initrd ]; then
ventoy_img_volumio
elif [ -f (vtimghd,2)/loader/entries/ubos.conf ]; then elif [ -f (vtimghd,2)/loader/entries/ubos.conf ]; then
ventoy_img_ubos ventoy_img_ubos
elif [ -f (vtimghd,2)/etc/openwrt_version ]; then elif [ -f (vtimghd,2)/etc/openwrt_version ]; then
@@ -1764,7 +1929,7 @@ function img_common_menuentry {
img_unsupport_tip img_unsupport_tip
else else
ventoy_img_memtest86 ventoy_img_memtest86
fi fi
else else
vt_linux_chain_data "${vtoy_iso_part}${vt_chosen_path}" vt_linux_chain_data "${vtoy_iso_part}${vt_chosen_path}"
ventoy_acpi_param ${vtoy_chain_mem_addr} 512 ventoy_acpi_param ${vtoy_chain_mem_addr} 512
@@ -1777,6 +1942,8 @@ function img_common_menuentry {
fi fi
fi fi
loopback -d vtimghd
set root=$vtback_root set root=$vtback_root
vt_pop_last_entry vt_pop_last_entry
set theme=$vtback_theme set theme=$vtback_theme
@@ -1796,7 +1963,7 @@ function img_unsupport_menuentry {
############################################################# #############################################################
############################################################# #############################################################
set VENTOY_VERSION="1.0.46" set VENTOY_VERSION="1.0.53"
#ACPI not compatible with Window7/8, so disable by default #ACPI not compatible with Window7/8, so disable by default
set VTOY_PARAM_NO_ACPI=1 set VTOY_PARAM_NO_ACPI=1
@@ -1865,7 +2032,10 @@ else
set vtoydev=$vtoy_dev set vtoydev=$vtoy_dev
set vtoy_iso_part=($vtoy_dev,1) set vtoy_iso_part=($vtoy_dev,1)
set vtoy_efi_part=($vtoy_dev,2) set vtoy_efi_part=($vtoy_dev,2)
loadfont unicode
vt_load_file_to_mem "auto" $prefix/fonts/unicode.pf2 vtoy_font_mem
loadfont mem:${vtoy_font_mem_addr}:size:${vtoy_font_mem_size}
set vt_plugin_path=$vtoy_iso_part set vt_plugin_path=$vtoy_iso_part
fi fi
@@ -1874,9 +2044,11 @@ vt_load_part_table $vtoydev
#Load Plugin #Load Plugin
if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then
clear clear
vt_load_plugin $vtoy_iso_part vt_load_plugin $vtoy_iso_part
clear clear
else
vt_check_json_path_case $vtoy_iso_part
fi fi
if [ -n "$VTOY_MENU_TIMEOUT" ]; then if [ -n "$VTOY_MENU_TIMEOUT" ]; then
@@ -1943,6 +2115,15 @@ if [ -n "$VTOY_DEFAULT_KBD_LAYOUT" ]; then
set_keyboard_layout "$VTOY_DEFAULT_KBD_LAYOUT" set_keyboard_layout "$VTOY_DEFAULT_KBD_LAYOUT"
fi fi
if [ -n "$VTOY_PLUGIN_PATH_CASE_MISMATCH" ]; then
clear
echo "$VTOY_PLUGIN_PATH_CASE_MISMATCH"
echo -e "\n\nPath case does not match! ventoy directory and ventoy.json MUST be all lowercase!"
echo -e "\n路径大小写不匹配ventoy 目录和 ventoy.json 文件的名字必须是全部小写,请修正!"
echo -e "\n\npress ENTER to continue (请按回车键继续) ..."
read vtInputKey
fi
if [ -n "$VTOY_PLUGIN_SYNTAX_ERROR" ]; then if [ -n "$VTOY_PLUGIN_SYNTAX_ERROR" ]; then
clear clear
echo -e "\n Syntax error detected in ventoy.json, please check! \n" echo -e "\n Syntax error detected in ventoy.json, please check! \n"
@@ -1977,6 +2158,12 @@ export vtoy_efi_part
export VENTOY_VERSION export VENTOY_VERSION
export VTOY_CUR_VIDEO_MODE export VTOY_CUR_VIDEO_MODE
export VTOY_EFI_ARCH export VTOY_EFI_ARCH
export VTOY_MEM_DISK_STR
export VTOY_ISO_RAW_STR
export VTOY_GRUB2_MODE_STR
export VTOY_WIMBOOT_MODE_STR
export VTOY_ISO_UEFI_DRV_STR
#special VTOY_DEFAULT_IMAGE process #special VTOY_DEFAULT_IMAGE process
if [ -n "$VTOY_DEFAULT_IMAGE" ]; then if [ -n "$VTOY_DEFAULT_IMAGE" ]; then

Binary file not shown.

View File

@@ -105,6 +105,23 @@ else
echo "BOOTIA32.EFI NOT found ..." echo "BOOTIA32.EFI NOT found ..."
fi fi
} }
menuentry 'Search and boot xorboot' --class=boot_xorboot --class=F4boot {
set VTOY_SEARCH_NO_VTOYEFI=1
if search -n -s -f /efi/xorboot/xorboot32.xor; then
unset VTOY_SEARCH_NO_VTOYEFI
terminal_output console
if [ -f /efi/xorboot/bootia32.efi ]; then
chainloader /efi/xorboot/bootia32.efi
elif [ -f /efi/xorboot/xorboot.efi ]; then
chainloader /efi/xorboot/xorboot.efi
fi
boot
else
unset VTOY_SEARCH_NO_VTOYEFI
echo "xorboot NOT found ..."
fi
}
elif [ "$grub_cpu" = "arm64" ]; then elif [ "$grub_cpu" = "arm64" ]; then
menuentry 'Search and boot BOOTAA64.EFI' --class=boot_uefi --class=F4boot { menuentry 'Search and boot BOOTAA64.EFI' --class=boot_uefi --class=F4boot {
set VTOY_SEARCH_NO_VTOYEFI=1 set VTOY_SEARCH_NO_VTOYEFI=1
@@ -131,9 +148,25 @@ else
echo "BOOTX64.EFI NOT found ..." echo "BOOTX64.EFI NOT found ..."
fi fi
} }
menuentry 'Search and boot xorboot' --class=boot_xorboot --class=F4boot {
set VTOY_SEARCH_NO_VTOYEFI=1
if search -n -s -f /efi/xorboot/xorboot.xor; then
unset VTOY_SEARCH_NO_VTOYEFI
terminal_output console
if [ -f /efi/xorboot/bootx64.efi ]; then
chainloader /efi/xorboot/bootx64.efi
elif [ -f /efi/xorboot/xorboot.efi ]; then
chainloader /efi/xorboot/xorboot.efi
fi
boot
else
unset VTOY_SEARCH_NO_VTOYEFI
echo "xorboot NOT found ..."
fi
}
fi fi
fi fi

View File

@@ -30,13 +30,15 @@ terminal-box: "terminal_box_*.png"
scrollbar_thumb = "slider_*.png" scrollbar_thumb = "slider_*.png"
} }
+ progress_bar { + progress_bar {
id = "__timeout__" id = "__timeout__"
text = "@TIMEOUT_NOTIFICATION_SHORT@" text = "@TIMEOUT_NOTIFICATION_SHORT@"
left = 20% left = 90%
width = 60% width = 10%
top = 85% top = 90%
text_color = "red" text_color = "red"
bar_style = "*" bar_style = "*"
@@ -93,4 +95,3 @@ terminal-box: "terminal_box_*.png"
height = 25 height = 25
+ label {text = "@VTOY_ISO_UEFI_DRV@" color = "red" align = "left"} + label {text = "@VTOY_ISO_UEFI_DRV@" color = "red" align = "left"}
} }

View File

@@ -0,0 +1,583 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.2"/>
<object class="GtkImage" id="image_refresh">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<object class="GtkWindow" id="part_cfg_dlg">
<property name="can_focus">False</property>
<property name="resizable">False</property>
<property name="title" translatable="yes">Partition Configuration</property>
<property name="modal">True</property>
<property name="window_position">center</property>
<property name="default_width">460</property>
<property name="default_height">270</property>
<child>
<object class="GtkFixed" id="fixed_partcfg_1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkFrame" id="frame_space_check">
<property name="width_request">440</property>
<property name="height_request">50</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkFixed" id="fixed_space_check">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkCheckButton" id="space_check_btn">
<property name="width_request">380</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">10</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="x">10</property>
<property name="y">10</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_space_value">
<property name="width_request">220</property>
<property name="height_request">60</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkFixed" id="fixed_space_value">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkEntry" id="entry_reserve_space">
<property name="width_request">200</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">*</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
<property name="width_chars">10</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">10</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="x">10</property>
<property name="y">60</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_space_unit">
<property name="width_request">220</property>
<property name="height_request">60</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkFixed" id="fixed_space_unit">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkComboBoxText" id="comboboxtext_unit">
<property name="width_request">200</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="active">1</property>
<items>
<item translatable="yes">MB</item>
<item translatable="yes">GB</item>
</items>
</object>
<packing>
<property name="x">10</property>
<property name="y">10</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="x">230</property>
<property name="y">60</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_space_align">
<property name="width_request">440</property>
<property name="height_request">50</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkFixed" id="fixed_space_alian">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkCheckButton" id="space_align_btn">
<property name="width_request">380</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="active">True</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">10</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="x">10</property>
<property name="y">140</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_partcfg_ok">
<property name="label" translatable="yes">OK</property>
<property name="width_request">100</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="x">90</property>
<property name="y">210</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_partcfg_cancel">
<property name="label" translatable="yes">Cancel</property>
<property name="width_request">100</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="x">270</property>
<property name="y">210</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_dummy1">
<property name="width_request">460</property>
<property name="height_request">25</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">250</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkWindow" id="window">
<property name="can_focus">False</property>
<property name="resizable">False</property>
<property name="title" translatable="yes">Ventoy2Disk</property>
<property name="modal">False</property>
<property name="window_position">center</property>
<property name="default_width">480</property>
<property name="default_height">365</property>
<child>
<object class="GtkFixed" id="fixed_main">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuBar" id="menubar1">
<property name="width_request">480</property>
<property name="height_request">22</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="menu_option">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Options</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="submenu_option">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkCheckMenuItem" id="menu_item_secure">
<property name="label">Secure Boot Support</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="active">False</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_part_style">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Partition Style</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="submenu_part_style">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkRadioMenuItem" id="menu_item_mbr">
<property name="label">MBR</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="active">True</property>
</object>
</child>
<child>
<object class="GtkRadioMenuItem" id="menu_item_gpt">
<property name="label">GPT</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="active">False</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_item_part_cfg">
<property name="label">Partition Configuration</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_item_clear">
<property name="label">Clear Ventoy</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkCheckMenuItem" id="menu_item_show_all">
<property name="label">Show All Devices</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="active">False</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem" id="menu_language">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Language</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="submenu_language">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkFrame" id="frame_device">
<property name="width_request">460</property>
<property name="height_request">75</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkFixed" id="fixed5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkComboBoxText" id="combobox_devlist">
<property name="width_request">380</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">5</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_refresh">
<property name="width_request">50</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="image">image_refresh</property>
</object>
<packing>
<property name="x">398</property>
<property name="y">0</property>
</packing>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label_device">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"> Device </property>
</object>
</child>
</object>
<packing>
<property name="x">10</property>
<property name="y">40</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_pkg_ver">
<property name="width_request">228</property>
<property name="height_request">70</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0.5</property>
<child>
<object class="GtkFixed" id="fixed3">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage" id="image_secure_local">
<property name="width_request">10</property>
<property name="height_request">40</property>
<property name="visible">False</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="x">20</property>
<property name="y">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_local_ver_value">
<property name="width_request">120</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"></property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="x">45</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_local_part_style">
<property name="width_request">45</property>
<property name="height_request">20</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">MBR</property>
</object>
<packing>
<property name="x">180</property>
<property name="y">30</property>
</packing>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label_local_ver">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"> Ventoy In Package </property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="x">10</property>
<property name="y">132</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame3">
<property name="width_request">228</property>
<property name="height_request">70</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0.5</property>
<child>
<object class="GtkFixed" id="fixed4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImage" id="image_secure_dev">
<property name="width_request">10</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="x">20</property>
<property name="y">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_dev_ver_value">
<property name="width_request">120</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"></property>
<property name="use_markup">True</property>
</object>
<packing>
<property name="x">45</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label_dev_part_style">
<property name="width_request">45</property>
<property name="height_request">20</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"></property>
</object>
<packing>
<property name="x">180</property>
<property name="y">30</property>
</packing>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label_device_ver">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"> Ventoy In Device </property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="x">243</property>
<property name="y">132</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame4">
<property name="width_request">460</property>
<property name="height_request">50</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<child>
<object class="GtkFixed" id="fixed2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkProgressBar" id="progressbar1">
<property name="width_request">440</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="fraction">0.0</property>
</object>
<packing>
<property name="x">8</property>
<property name="y">10</property>
</packing>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label_status">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes"> Status - READY</property>
</object>
</child>
</object>
<packing>
<property name="x">10</property>
<property name="y">215</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_install">
<property name="label" translatable="yes">Install</property>
<property name="width_request">100</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="x">100</property>
<property name="y">300</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button_update">
<property name="label" translatable="yes">Update</property>
<property name="width_request">100</property>
<property name="height_request">40</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="x">280</property>
<property name="y">300</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame_dummy2">
<property name="width_request">460</property>
<property name="height_request">25</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
</object>
<packing>
<property name="x">10</property>
<property name="y">345</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View File

@@ -1,95 +0,0 @@
#!/bin/sh
LOGFILE=log.txt
VUSER=$(get_user)
if [ -e $LOGFILE ]; then
chown $VUSER $LOGFILE
else
su $VUSER -c "touch $LOGFILE"
fi
#delete the log.txt if it's more than 8MB
if [ -f $LOGFILE ]; then
logsize=$(stat -c '%s' $LOGFILE)
if [ $logsize -gt 8388608 ]; then
rm -f $LOGFILE
fi
fi
if [ -f ./tool/$TOOLDIR/V2DServer.xz ]; then
xz -d ./tool/$TOOLDIR/V2DServer.xz
chmod +x ./tool/$TOOLDIR/V2DServer
fi
rm -rf ./*_VTMPDIR
vtWebTmpDir=$(mktemp -d -p ./ --suffix=_VTMPDIR)
chown $VUSER $vtWebTmpDir
V2DServer "$HOST" "$PORT" &
V2DPid=$!
sleep 1
su $VUSER -c "browser --window-size=550,400 --app=\"http://${HOST}:${PORT}/index.html?chrome-app\" --user-data-dir=$vtWebTmpDir >> $LOGFILE 2>&1" &
WebPid=$!
vtoy_trap_exit() {
[ -d /proc/$V2DPid ] && kill -2 $V2DPid
[ -d /proc/$WebPid ] && kill -9 $WebPid
while [ -n "1" ]; do
curPid=$(ps -ef | grep -m1 "$vtWebTmpDir" | egrep -v '\sgrep\s' | awk '{print $2}')
if [ -z "$curPid" ]; then
break
fi
if [ -d /proc/$curPid ]; then
kill -9 $curPid
fi
done
[ -d $vtWebTmpDir ] && rm -rf $vtWebTmpDir
if [ -n "$OLDDIR" ]; then
CURDIR=$(pwd)
if [ "$CURDIR" != "$OLDDIR" ]; then
cd "$OLDDIR"
fi
fi
exit 1
}
trap vtoy_trap_exit HUP INT QUIT TSTP
sleep 1
vtVer=$(cat ventoy/version)
echo ""
echo "=================================================="
if [ "$LANG" = "zh_CN.UTF-8" ]; then
echo " Ventoy Server $vtVer 已经启动 ..."
else
echo " Ventoy Server $vtVer is running ..."
fi
echo "=================================================="
echo ""
echo "########### Press Ctrl + C to exit ###############"
echo ""
wait $WebPid
[ -d /proc/$V2DPid ] && kill -2 $V2DPid
[ -d $vtWebTmpDir ] && rm -rf $vtWebTmpDir
if [ -n "$OLDDIR" ]; then
CURDIR=$(pwd)
if [ "$CURDIR" != "$OLDDIR" ]; then
cd "$OLDDIR"
fi
fi

View File

@@ -1,68 +0,0 @@
#!/bin/sh
LOGFILE=log.txt
#delete the log.txt if it's more than 8MB
if [ -f $LOGFILE ]; then
logsize=$(stat -c '%s' $LOGFILE)
if [ $logsize -gt 8388608 ]; then
rm -f $LOGFILE
fi
fi
if [ -f ./tool/$TOOLDIR/V2DServer.xz ]; then
xz -d ./tool/$TOOLDIR/V2DServer.xz
chmod +x ./tool/$TOOLDIR/V2DServer
fi
V2DServer "$HOST" "$PORT" &
V2DPid=$!
sleep 1
vtoy_trap_exit() {
[ -d /proc/$V2DPid ] && kill -2 $V2DPid
if [ -n "$OLDDIR" ]; then
CURDIR=$(pwd)
if [ "$CURDIR" != "$OLDDIR" ]; then
cd "$OLDDIR"
fi
fi
exit 1
}
trap vtoy_trap_exit HUP INT QUIT TSTP
sleep 1
vtVer=$(cat ventoy/version)
echo ""
echo "=================================================="
if [ "$LANG" = "zh_CN.UTF-8" ]; then
echo " Ventoy Server $vtVer 已经启动 ..."
else
echo " Ventoy Server $vtVer is running ..."
fi
echo "=================================================="
echo ""
echo "########### Press Ctrl + C to exit ###############"
echo ""
if [ "$VERBOSE" = "1" ]; then
uos-browser --window-size=550,400 --app="http://${HOST}:${PORT}/index.html?chrome-app"
else
uos-browser --window-size=550,400 --app="http://${HOST}:${PORT}/index.html?chrome-app" > /dev/null 2>&1
fi
[ -d /proc/$V2DPid ] && kill -2 $V2DPid
if [ -n "$OLDDIR" ]; then
CURDIR=$(pwd)
if [ "$CURDIR" != "$OLDDIR" ]; then
cd "$OLDDIR"
fi
fi

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,23 @@
[
{
"type": "env",
"name": "DESKTOP_SESSION",
"condition": "equal",
"expression": "deepin",
"gui": "qt5"
},
{
"type": "env",
"name": "DESKTOP_SESSION",
"condition": "equal",
"expression": "uos",
"gui": "qt5"
},
{
"type": "env",
"name": "DESKTOP_SESSION",
"condition": "equal",
"expression": "ukui",
"gui": "gtk3"
}
]

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -320,7 +320,7 @@ EOF
for i in 0 1 2 3 4 5 6 7 8 9; do for i in 0 1 2 3 4 5 6 7 8 9; do
check_umount_disk "$PART2" check_umount_disk "$PART2"
if mkfs.vfat -F 16 -n VTOYEFI $PART2; then if mkfs.vfat -F 16 -n VTOYEFI -s 1 $PART2; then
echo 'success' echo 'success'
break break
else else

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -8,8 +8,8 @@ fi
dos2unix -q ./tool/ventoy_lib.sh dos2unix -q ./tool/ventoy_lib.sh
dos2unix -q ./tool/VentoyWorker.sh dos2unix -q ./tool/VentoyWorker.sh
dos2unix -q ./tool/WebDeepin.sh dos2unix -q ./tool/VentoyGTK.glade
dos2unix -q ./tool/WebUos.sh dos2unix -q ./tool/distro_gui_type.json
. ./tool/ventoy_lib.sh . ./tool/ventoy_lib.sh
@@ -78,9 +78,13 @@ cp $OPT ./tool/ENROLL_THIS_KEY_IN_MOKMANAGER.cer $tmpmnt/
mkdir -p $tmpmnt/tool mkdir -p $tmpmnt/tool
cp $OPT ./tool/i386/mount.exfat-fuse $tmpmnt/tool/mount.exfat-fuse_i386 # cp $OPT ./tool/i386/mount.exfat-fuse $tmpmnt/tool/mount.exfat-fuse_i386
cp $OPT ./tool/x86_64/mount.exfat-fuse $tmpmnt/tool/mount.exfat-fuse_x86_64 # cp $OPT ./tool/x86_64/mount.exfat-fuse $tmpmnt/tool/mount.exfat-fuse_x86_64
cp $OPT ./tool/aarch64/mount.exfat-fuse $tmpmnt/tool/mount.exfat-fuse_aarch64 # cp $OPT ./tool/aarch64/mount.exfat-fuse $tmpmnt/tool/mount.exfat-fuse_aarch64
# to save space
cp $OPT ./tool/i386/vtoygpt $tmpmnt/tool/mount.exfat-fuse_i386
cp $OPT ./tool/x86_64/vtoygpt $tmpmnt/tool/mount.exfat-fuse_x86_64
cp $OPT ./tool/aarch64/vtoygpt $tmpmnt/tool/mount.exfat-fuse_aarch64
rm -f $tmpmnt/grub/i386-pc/*.img rm -f $tmpmnt/grub/i386-pc/*.img
@@ -101,16 +105,17 @@ cp $OPT ./tool $tmpdir/
rm -f $tmpdir/ENROLL_THIS_KEY_IN_MOKMANAGER.cer rm -f $tmpdir/ENROLL_THIS_KEY_IN_MOKMANAGER.cer
cp $OPT Ventoy2Disk.sh $tmpdir/ cp $OPT Ventoy2Disk.sh $tmpdir/
cp $OPT VentoyWeb.sh $tmpdir/ cp $OPT VentoyWeb.sh $tmpdir/
cp $OPT VentoyWebDeepin.sh $tmpdir/ cp $OPT VentoyGUI* $tmpdir/
#cp $OPT Ventoy.desktop $tmpdir/
cp $OPT README $tmpdir/ cp $OPT README $tmpdir/
cp $OPT plugin $tmpdir/ cp $OPT plugin $tmpdir/
cp $OPT CreatePersistentImg.sh $tmpdir/ cp $OPT CreatePersistentImg.sh $tmpdir/
cp $OPT ExtendPersistentImg.sh $tmpdir/ cp $OPT ExtendPersistentImg.sh $tmpdir/
dos2unix -q $tmpdir/Ventoy2Disk.sh dos2unix -q $tmpdir/Ventoy2Disk.sh
dos2unix -q $tmpdir/VentoyWeb.sh dos2unix -q $tmpdir/VentoyWeb.sh
dos2unix -q $tmpdir/VentoyWebDeepin.sh
#dos2unix -q $tmpdir/Ventoy.desktop
dos2unix -q $tmpdir/CreatePersistentImg.sh dos2unix -q $tmpdir/CreatePersistentImg.sh
dos2unix -q $tmpdir/ExtendPersistentImg.sh dos2unix -q $tmpdir/ExtendPersistentImg.sh
@@ -128,11 +133,15 @@ rm -f ventoy-${curver}-linux.tar.gz
CurDir=$PWD CurDir=$PWD
for d in i386 x86_64 aarch64; do for d in i386 x86_64 aarch64 mips64el; do
cd $tmpdir/tool/$d cd $tmpdir/tool/$d
for file in $(ls); do for file in $(ls); do
if [ "$file" != "xzcat" ]; then if [ "$file" != "xzcat" ]; then
xz --check=crc32 $file if echo "$file" | grep -q '^Ventoy2Disk'; then
chmod +x $file
else
xz --check=crc32 $file
fi
fi fi
done done
cd $CurDir cd $CurDir
@@ -143,9 +152,13 @@ find $tmpdir/ -type d -exec chmod 755 "{}" +
find $tmpdir/ -type f -exec chmod 644 "{}" + find $tmpdir/ -type f -exec chmod 644 "{}" +
chmod +x $tmpdir/Ventoy2Disk.sh chmod +x $tmpdir/Ventoy2Disk.sh
chmod +x $tmpdir/VentoyWeb.sh chmod +x $tmpdir/VentoyWeb.sh
chmod +x $tmpdir/VentoyWebDeepin.sh chmod +x $tmpdir/VentoyGUI*
#chmod +x $tmpdir/Ventoy.desktop
cp $OPT $LANG_DIR/languages.json $tmpdir/tool/
chmod +x $tmpdir/CreatePersistentImg.sh 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
@@ -156,6 +169,7 @@ cp $OPT Ventoy2Disk*.exe $tmpdir/
cp $OPT $LANG_DIR/languages.json $tmpdir/ventoy/ cp $OPT $LANG_DIR/languages.json $tmpdir/ventoy/
rm -rf $tmpdir/tool rm -rf $tmpdir/tool
rm -f $tmpdir/*.sh rm -f $tmpdir/*.sh
rm -f $tmpdir/VentoyGUI.*
rm -rf $tmpdir/WebUI rm -rf $tmpdir/WebUI
rm -f $tmpdir/README rm -f $tmpdir/README

View File

@@ -44,19 +44,23 @@
"STR_WEB_SERVICE_UNAVAILABLE":"خطأ في الاتصال: الخدمة غير متوفرة", "STR_WEB_SERVICE_UNAVAILABLE":"خطأ في الاتصال: الخدمة غير متوفرة",
"STR_WEB_TOKEN_MISMATCH":"تم تحديث حالة البرنامج الخفي ، يرجى إعادة المحاولة لاحقًا.", "STR_WEB_TOKEN_MISMATCH":"تم تحديث حالة البرنامج الخفي ، يرجى إعادة المحاولة لاحقًا.",
"STR_WEB_SERVICE_BUSY":"الخدمة مشغولة ، يرجى إعادة المحاولة لاحقًا.", "STR_WEB_SERVICE_BUSY":"الخدمة مشغولة ، يرجى إعادة المحاولة لاحقًا.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
"name":"Korean (한국어)", "name":"Korean (한국어)",
"FontFamily":"Courier New", "FontFamily":"Courier New",
"FontSize":16, "FontSize":16,
"Author":"Remiz,VenusGirl", "Author":"VenusGirl",
"STR_ERROR":"오류", "STR_ERROR":"오류",
"STR_WARNING":"경고", "STR_WARNING":"경고",
"STR_INFO":"정보", "STR_INFO":"정보",
"STR_INCORRECT_DIR":"올바른 디렉토리에서 실행하십시오!", "STR_INCORRECT_DIR":"올바른 디렉토리에서 실행하십시오!",
"STR_INCORRECT_TREE_DIR":"여기서 저를 실행하지 말고, 출시된 설치 패키지를 다운로드한 다음 거기서 실행하십시오.", "STR_INCORRECT_TREE_DIR":"여기서 실행하지 말고, 출시된 설치 패키지를 다운로드한 다음 거기서 실행하십시오.",
"STR_DEVICE":"장치", "STR_DEVICE":"장치",
"STR_LOCAL_VER":"패키지의 Ventoy 버전", "STR_LOCAL_VER":"패키지의 Ventoy 버전",
"STR_DISK_VER":"장치 내부의 Ventoy 버전", "STR_DISK_VER":"장치 내부의 Ventoy 버전",
@@ -91,6 +95,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"통신 오류: 서비스를 사용할 수 없음", "STR_WEB_SERVICE_UNAVAILABLE":"통신 오류: 서비스를 사용할 수 없음",
"STR_WEB_TOKEN_MISMATCH":"데몬 상태가 업데이트되었습니다. 나중에 다시 시도하십시오.", "STR_WEB_TOKEN_MISMATCH":"데몬 상태가 업데이트되었습니다. 나중에 다시 시도하십시오.",
"STR_WEB_SERVICE_BUSY":"서비스가 사용 중입니다. 나중에 다시 시도하십시오.", "STR_WEB_SERVICE_BUSY":"서비스가 사용 중입니다. 나중에 다시 시도하십시오.",
"STR_MENU_VTSI_CREATE":"VTSI 파일 생성",
"STR_VTSI_CREATE_TIP":"이번에는 장치에 쓰지 않고 VTSI 파일#@만 생성합니다.#@계속하시겠습니까?",
"STR_VTSI_CREATE_SUCCESS":"VTSI 파일이 성공적으로 생성되었습니다!#@Rufus(3.15+)를 사용하여 장치에 기록하여 Ventoy 설치를 완료할 수 있습니다.",
"STR_VTSI_CREATE_FAILED":"VTSI 파일을 생성하지 못했습니다.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -138,6 +146,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"通信失败:服务不可用", "STR_WEB_SERVICE_UNAVAILABLE":"通信失败:服务不可用",
"STR_WEB_TOKEN_MISMATCH":"后台服务状态更新,请稍后重试", "STR_WEB_TOKEN_MISMATCH":"后台服务状态更新,请稍后重试",
"STR_WEB_SERVICE_BUSY":"后台服务正忙,请稍后重试", "STR_WEB_SERVICE_BUSY":"后台服务正忙,请稍后重试",
"STR_MENU_VTSI_CREATE":"创建 VTSI 文件",
"STR_VTSI_CREATE_TIP":"本操作不会向设备中写入数据,而只会生成一个 VTSI 文件#@是否继续?",
"STR_VTSI_CREATE_SUCCESS":"VTSI 文件创建成功你可以使用Rufus(3.15+)将其写入对应设备从而完成Ventoy的安装",
"STR_VTSI_CREATE_FAILED":"VTSI 文件创建失败",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -158,12 +170,12 @@
"STR_INSTALL":"Install", "STR_INSTALL":"Install",
"STR_UPDATE":"Update", "STR_UPDATE":"Update",
"STR_UPDATE_TIP":"Upgrade operation is safe, ISO files will be unchanged.#@Continue?", "STR_UPDATE_TIP":"Upgrade operation is safe, ISO files will be unchanged.#@Continue?",
"STR_INSTALL_TIP":"The disk will be formatted and all the data will be lost.#@Continue?", "STR_INSTALL_TIP":"The device will be formatted and all the data will be lost.#@Continue?",
"STR_INSTALL_TIP2":"The disk will be formatted and all the data will be lost.#@Continue? (Double Check)", "STR_INSTALL_TIP2":"The device will be formatted and all the data will be lost.#@Continue? (Double Check)",
"STR_INSTALL_SUCCESS":"Congratulations!#@Ventoy has been successfully installed to the device.", "STR_INSTALL_SUCCESS":"Congratulations!#@Ventoy has been successfully installed to the device.",
"STR_INSTALL_FAILED":"An error occurred during the installation. You can replug the USB and try again. Check log.txt for detail.", "STR_INSTALL_FAILED":"An error occurred during the installation. You can replug the USB device and try again. Check log.txt for detail.",
"STR_UPDATE_SUCCESS":"Congratulations!#@Ventoy has been successfully updated to the device.", "STR_UPDATE_SUCCESS":"Congratulations!#@Ventoy has been successfully updated to the device.",
"STR_UPDATE_FAILED":"An error occurred during the update. You can replug the USB and try again. Check log.txt for detail.", "STR_UPDATE_FAILED":"An error occurred during the update. You can replug the USB device and try again. Check log.txt for detail.",
"STR_WAIT_PROCESS":"A thread is running, please wait...", "STR_WAIT_PROCESS":"A thread is running, please wait...",
"STR_MENU_OPTION":"Option", "STR_MENU_OPTION":"Option",
"STR_MENU_SECURE_BOOT":"Secure Boot Support", "STR_MENU_SECURE_BOOT":"Secure Boot Support",
@@ -174,9 +186,9 @@
"STR_SPACE_VAL_INVALID":"Invalid value for reserved space", "STR_SPACE_VAL_INVALID":"Invalid value for reserved space",
"STR_MENU_CLEAR":"Clear Ventoy", "STR_MENU_CLEAR":"Clear Ventoy",
"STR_CLEAR_SUCCESS":"Ventoy has been successfully removed from the device.", "STR_CLEAR_SUCCESS":"Ventoy has been successfully removed from the device.",
"STR_CLEAR_FAILED":"An error occurred when clear Ventoy from disk. You can replug the USB and try again. Check log.txt for detail.", "STR_CLEAR_FAILED":"An error occurred when clearing Ventoy from disk. You can replug the USB device and try again. Check log.txt for details.",
"STR_MENU_PART_STYLE":"Partition Style", "STR_MENU_PART_STYLE":"Partition Style",
"STR_DISK_2TB_MBR_ERROR":"Please select GPT for disk over 2TB", "STR_DISK_2TB_MBR_ERROR":"Please select GPT for devices over 2TB",
"STR_SHOW_ALL_DEV":"Show All Devices", "STR_SHOW_ALL_DEV":"Show All Devices",
"STR_PART_ALIGN_4KB":"Align partitions with 4KB", "STR_PART_ALIGN_4KB":"Align partitions with 4KB",
"STR_WEB_COMMUNICATION_ERR":"Communication error:", "STR_WEB_COMMUNICATION_ERR":"Communication error:",
@@ -185,6 +197,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -232,6 +248,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"خطای ارتباطی: سرویس موجود نیست", "STR_WEB_SERVICE_UNAVAILABLE":"خطای ارتباطی: سرویس موجود نیست",
"STR_WEB_TOKEN_MISMATCH":"وضعیت Daemon به روز شد ، لطفاً بعداً دوباره امتحان کنید.", "STR_WEB_TOKEN_MISMATCH":"وضعیت Daemon به روز شد ، لطفاً بعداً دوباره امتحان کنید.",
"STR_WEB_SERVICE_BUSY":"سرویس شلوغ است ، لطفاً بعداً دوباره امتحان کنید.", "STR_WEB_SERVICE_BUSY":"سرویس شلوغ است ، لطفاً بعداً دوباره امتحان کنید.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -279,6 +299,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Błąd komunikacji: usługa niedostępna", "STR_WEB_SERVICE_UNAVAILABLE":"Błąd komunikacji: usługa niedostępna",
"STR_WEB_TOKEN_MISMATCH":"Stan daemona został zaktualizowany, spróbuj ponownie później.", "STR_WEB_TOKEN_MISMATCH":"Stan daemona został zaktualizowany, spróbuj ponownie później.",
"STR_WEB_SERVICE_BUSY":"Usługa jest zajęta, spróbuj ponownie później.", "STR_WEB_SERVICE_BUSY":"Usługa jest zajęta, spróbuj ponownie później.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -326,53 +350,61 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Erro de comunicação: Serviço indisponível", "STR_WEB_SERVICE_UNAVAILABLE":"Erro de comunicação: Serviço indisponível",
"STR_WEB_TOKEN_MISMATCH":"Status daemon atualizado, por favor, tente novamente mais tarde.", "STR_WEB_TOKEN_MISMATCH":"Status daemon atualizado, por favor, tente novamente mais tarde.",
"STR_WEB_SERVICE_BUSY":"O serviço está ocupado, por favor, tente novamente mais tarde.", "STR_WEB_SERVICE_BUSY":"O serviço está ocupado, por favor, tente novamente mais tarde.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
"name":"Turkish (Türkçe)", "name":"Turkish (Türkçe)",
"FontFamily":"Courier New", "FontFamily":"Courier New",
"FontSize":16, "FontSize":16,
"Author":"Erhan Kültür/crasadure", "Author":"Erhan Kültür/crasadure, Oğuz Ersen",
"STR_ERROR":"Hata", "STR_ERROR":"Hata",
"STR_WARNING":"Uyarı", "STR_WARNING":"Uyarı",
"STR_INFO":"Bilgi", "STR_INFO":"Bilgi",
"STR_INCORRECT_DIR":"Lütfen doğru dizin altında çalıştırın!", "STR_INCORRECT_DIR":"Lütfen doğru dizin altında çalıştırın!",
"STR_INCORRECT_TREE_DIR":"Dosyayı burada çalıştırma, lütfen yayınlanan en son kurulum paketini indirin ve oradan çalıştırın.", "STR_INCORRECT_TREE_DIR":"Dosyayı burada çalıştırmayın, lütfen yayınlanan en son kurulum paketini indirin ve oradan çalıştırın.",
"STR_DEVICE":"Aygıt", "STR_DEVICE":"Aygıt",
"STR_LOCAL_VER":"Ventoy GÜNCEL Sürüm", "STR_LOCAL_VER":"Ventoy GÜNCEL Sürüm",
"STR_DISK_VER":"Cihazdaki Ventoy Sürümü", "STR_DISK_VER":"Aygıttaki Ventoy Sürümü",
"STR_STATUS":"Durum - HAZIR", "STR_STATUS":"Durum - HAZIR",
"STR_INSTALL":"Kur", "STR_INSTALL":"Kur",
"STR_UPDATE":"Güncelle", "STR_UPDATE":"Güncelle",
"STR_UPDATE_TIP":"Ventoyun versiyon bilgisi güncellenecek, ISO dosyalarınız bundan etkilenmiyecek.#@Devam edilsinmi?", "STR_UPDATE_TIP":"Yükseltme işlemi güvenlidir, ISO dosyalarınız bundan etkilenmeyecek.#@Devam edilsin mi?",
"STR_INSTALL_TIP":"Disk biçimlendirilecek ve tüm veriler kaybolacak.#@Devam edilsinmi?", "STR_INSTALL_TIP":"Disk biçimlendirilecek ve tüm veriler kaybolacak.#@Devam edilsin mi?",
"STR_INSTALL_TIP2":"Disk biçimlendirilecek ve tüm veriler kaybolacak.#@Devam edilsinmi? (Son UYARI!)", "STR_INSTALL_TIP2":"Disk biçimlendirilecek ve tüm veriler kaybolacak.#@Devam edilsin mi? (Son UYARI!)",
"STR_INSTALL_SUCCESS":"Tebrikler!#@ventoy cihaza başarıyla kuruldu.", "STR_INSTALL_SUCCESS":"Tebrikler!#@Ventoy, aygıta başarıyla kuruldu.",
"STR_INSTALL_FAILED":"Yükleme sırasında bir hata oluştu. USB'yi yeniden takıp tekrar deneyebilirsiniz. Ayrıntılar için log.txt dosyasına bakın.", "STR_INSTALL_FAILED":"Kurulum sırasında bir hata oluştu. USB'yi yeniden takıp tekrar deneyebilirsiniz. Ayrıntılar için log.txt dosyasına bakın.",
"STR_UPDATE_SUCCESS":"Tebrikler!#@ventoy cihazda başarıyla güncellendi.", "STR_UPDATE_SUCCESS":"Tebrikler!#@Ventoy, aygıtta başarıyla güncellendi.",
"STR_UPDATE_FAILED":"Güncelleme sırasında bir hata oluştu. USB'yi yeniden takıp tekrar deneyebilirsiniz. Ayrıntılar için log.txt dosyasına bakın.", "STR_UPDATE_FAILED":"Güncelleme sırasında bir hata oluştu. USB'yi yeniden takıp tekrar deneyebilirsiniz. Ayrıntılar için log.txt dosyasına bakın.",
"STR_WAIT_PROCESS":"Mevcut işlem çalışıyor, lütfen bekleyiniz ...", "STR_WAIT_PROCESS":"Mevcut işlem çalışıyor, lütfen bekleyin...",
"STR_MENU_OPTION":"Seçenek", "STR_MENU_OPTION":"Seçenek",
"STR_MENU_SECURE_BOOT":"Güvenli Önyükleme", "STR_MENU_SECURE_BOOT":"Güvenli Önyükleme Desteği",
"STR_MENU_PART_CFG":"Partisyon Yapılandırması", "STR_MENU_PART_CFG":"Bölüm Yapılandırması",
"STR_BTN_OK":"Tamam", "STR_BTN_OK":"Tamam",
"STR_BTN_CANCEL":"İptal et", "STR_BTN_CANCEL":"İptal",
"STR_PRESERVE_SPACE":"Diskin sonunda ayrılmış disk partisyonu oluştur", "STR_PRESERVE_SPACE":"Diskin sonunda biraz ayrılmış alan bırak",
"STR_SPACE_VAL_INVALID":"Ayrılmış alan için geçersiz değer girdiniz", "STR_SPACE_VAL_INVALID":"Ayrılmış alan için geçersiz değer girdiniz",
"STR_MENU_CLEAR":"Ventoyu USB Diskten Sil", "STR_MENU_CLEAR":"Ventoy'u USB Diskten Sil",
"STR_CLEAR_SUCCESS":"Ventoy başarılı bir şekilde diskten silindi", "STR_CLEAR_SUCCESS":"Ventoy başarılı bir şekilde diskten silindi",
"STR_CLEAR_FAILED":"Ventoy USB diskten temizlenirken bir hata oluştu.Lütfen USB Diski tekrar takın ve tekrar deneyin.Hatanın detayları için Log.txt dosyasını okuyun", "STR_CLEAR_FAILED":"Ventoy USB diskten temizlenirken bir hata oluştu. USB'yi yeniden takıp tekrar deneyebilirsiniz. Ayrıntılar için log.txt dosyasına bakın",
"STR_MENU_PART_STYLE":"Partisyon Yapısı", "STR_MENU_PART_STYLE":"Bölüm Yapısı",
"STR_DISK_2TB_MBR_ERROR":"2TB üstündeki diskler için lütfen GPT disk yapısını seçiniz.", "STR_DISK_2TB_MBR_ERROR":"2TB üstündeki diskler için lütfen GPT disk yapısını seçin.",
"STR_SHOW_ALL_DEV":"Tüm Cihazları Göster", "STR_SHOW_ALL_DEV":"Tüm Aygıtları Göster",
"STR_PART_ALIGN_4KB":"Tüm Partisyonları 4KB düzeninde hizala", "STR_PART_ALIGN_4KB":"Tüm bölümleri 4KB düzeninde hizala",
"STR_WEB_COMMUNICATION_ERR":"Iletişim Hatası:", "STR_WEB_COMMUNICATION_ERR":"İletişim Hatası:",
"STR_WEB_REMOTE_ABNORMAL":"Iletişim Hatası:Uzaktan erişim hizmeti anormal durumda", "STR_WEB_REMOTE_ABNORMAL":"İletişim Hatası:Uzaktan erişim hizmeti anormal durumda",
"STR_WEB_REQUEST_TIMEOUT":"Iletişim hatası: Uzaktan erişim isteği zaman aşımına uğradı", "STR_WEB_REQUEST_TIMEOUT":"İletişim hatası: Uzaktan erişim isteği zaman aşımına uğradı",
"STR_WEB_SERVICE_UNAVAILABLE":"Iletişim hatası: Uzaktan web erişim hizmeti erişilemez durumda", "STR_WEB_SERVICE_UNAVAILABLE":"İletişim hatası: Uzaktan web erişim hizmeti erişilemez durumda",
"STR_WEB_TOKEN_MISMATCH":"Daemon durumu güncellendi,lütfen daha sonra tekrar deneyiniz.", "STR_WEB_TOKEN_MISMATCH":"Daemon durumu güncellendi,lütfen daha sonra tekrar deneyin.",
"STR_WEB_SERVICE_BUSY":"Hizmet meşgul, lütfen daha sonra tekrar deneyin.", "STR_WEB_SERVICE_BUSY":"Hizmet meşgul, lütfen daha sonra tekrar deneyin.",
"STR_MENU_VTSI_CREATE":"VTSI Dosyası Oluştur",
"STR_VTSI_CREATE_TIP":"Şu an aygıta yazılmayacak,sadece bir VTSI dosyası oluşturulacak#@Devam edilsin mi?",
"STR_VTSI_CREATE_SUCCESS":"VTSI dosyası başarılı bir şekilde oluşturuldu!#@Ventoy'un aygıta kurulumunu tamamlamak için Rufus(3.15+) programını kullanabilirsiniz.",
"STR_VTSI_CREATE_FAILED":"VTSI dosyası oluşturma başarısız oldu!",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -420,6 +452,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Kommunikationsfehler: Dienst nicht verfügbar", "STR_WEB_SERVICE_UNAVAILABLE":"Kommunikationsfehler: Dienst nicht verfügbar",
"STR_WEB_TOKEN_MISMATCH":"Daemon-Status aktualisiert, bitte später erneut versuchen.", "STR_WEB_TOKEN_MISMATCH":"Daemon-Status aktualisiert, bitte später erneut versuchen.",
"STR_WEB_SERVICE_BUSY":"Dienst ist ausgelastet, bitte später erneut versuchen.", "STR_WEB_SERVICE_BUSY":"Dienst ist ausgelastet, bitte später erneut versuchen.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -431,7 +467,7 @@
"STR_ERROR":"Error", "STR_ERROR":"Error",
"STR_WARNING":"Avertiment", "STR_WARNING":"Avertiment",
"STR_INFO":"Info", "STR_INFO":"Info",
"STR_INCORRECT_DIR":"Aqueste programa deu sexecutar dins lo bon repertòri!", "STR_INCORRECT_DIR":"Aqueste programa deu sexecutar dins lo bon repertòri!",
"STR_INCORRECT_TREE_DIR":"Lancetz pas aquò, mercés de telecargar lo programa dinstallacion e relançatz-lo.", "STR_INCORRECT_TREE_DIR":"Lancetz pas aquò, mercés de telecargar lo programa dinstallacion e relançatz-lo.",
"STR_DEVICE":"Periferic", "STR_DEVICE":"Periferic",
"STR_LOCAL_VER":"Ventoy en local", "STR_LOCAL_VER":"Ventoy en local",
@@ -439,10 +475,10 @@
"STR_STATUS":"Estat - prèst", "STR_STATUS":"Estat - prèst",
"STR_INSTALL":"Installacion", "STR_INSTALL":"Installacion",
"STR_UPDATE":"Mesa a jorn", "STR_UPDATE":"Mesa a jorn",
"STR_UPDATE_TIP":"La mesa a jorn es segura, los fichièrs ISO seràn pas modificats.#@Continhar ?", "STR_UPDATE_TIP":"La mesa a jorn es segura, los fichièrs ISO seràn pas modificats.#@Continhar?",
"STR_INSTALL_TIP":"Lo disc serà formatat e totas sas donadas seràn perdudas.#@Contunhar ?", "STR_INSTALL_TIP":"Lo disc serà formatat e totas sas donadas seràn perdudas.#@Contunhar?",
"STR_INSTALL_TIP2":"Lo disc serà formatat e totas sas donadas seràn perdudas.#@Contunhar ? (confirmacion)", "STR_INSTALL_TIP2":"Lo disc serà formatat e totas sas donadas seràn perdudas.#@Contunhar? (confirmacion)",
"STR_INSTALL_SUCCESS":"Felicitacions !#@Ventoy es estat corrèctament installat sul periferic.", "STR_INSTALL_SUCCESS":"Felicitacion !#@Ventoy es estat corrèctament installat sul periferic.",
"STR_INSTALL_FAILED":"Una error ses producha pendent linstallacion. Podètz tornar brancar lo periferic USB e tornar ensajar. Agachatz lo fichièr log.txt per ne saber mai.", "STR_INSTALL_FAILED":"Una error ses producha pendent linstallacion. Podètz tornar brancar lo periferic USB e tornar ensajar. Agachatz lo fichièr log.txt per ne saber mai.",
"STR_UPDATE_SUCCESS":"Felicitacions !#@Ventoy es estat corrèctament mes a jorn sul periferic.", "STR_UPDATE_SUCCESS":"Felicitacions !#@Ventoy es estat corrèctament mes a jorn sul periferic.",
"STR_UPDATE_FAILED":"Una error ses producha pendent la mesa a jorn. Podètz tornar brancar lo periferic USB e tornar ensajar. Agachatz lo fichièr log.txt per ne saber mai.", "STR_UPDATE_FAILED":"Una error ses producha pendent la mesa a jorn. Podètz tornar brancar lo periferic USB e tornar ensajar. Agachatz lo fichièr log.txt per ne saber mai.",
@@ -452,21 +488,25 @@
"STR_MENU_PART_CFG":"Configuracion de particion", "STR_MENU_PART_CFG":"Configuracion de particion",
"STR_BTN_OK":"OK", "STR_BTN_OK":"OK",
"STR_BTN_CANCEL":"Anullar", "STR_BTN_CANCEL":"Anullar",
"STR_PRESERVE_SPACE":"Preserve some space at the end of the disk", "STR_PRESERVE_SPACE":"Servar despaci a la fin del disc",
"STR_SPACE_VAL_INVALID":"Valor invalida per lespaci reservat", "STR_SPACE_VAL_INVALID":"Valor invalida per lespaci reservat",
"STR_MENU_CLEAR":"Escafar Ventoy", "STR_MENU_CLEAR":"Escafar Ventoy",
"STR_CLEAR_SUCCESS":"Ventoy es estat corrèctament tirat del periferic.", "STR_CLEAR_SUCCESS":"Ventoy es estat corrèctament tirat del periferic.",
"STR_CLEAR_FAILED":"Una error ses producha pendent lesfaçament de Ventoy del disc. Podètz tornar brancar lUSB e tornar ensajar. Vejatz log.txt pels detalhs.", "STR_CLEAR_FAILED":"Una error ses producha pendent lesfaçament de Ventoy del disc. Podètz tornar brancar lUSB e tornar ensajar. Vejatz log.txt pels detalhs.",
"STR_MENU_PART_STYLE":"Estil de particion", "STR_MENU_PART_STYLE":"Estil de particion",
"STR_DISK_2TB_MBR_ERROR":"Pels disques de mai de 2To seleccionatz GPT", "STR_DISK_2TB_MBR_ERROR":"Pels disques de mai de 2To seleccionatz GPT",
"STR_SHOW_ALL_DEV":"Mostrar totes los periferics", "STR_SHOW_ALL_DEV":"Mostrar totes los periferics",
"STR_PART_ALIGN_4KB":"Alinhar las particions sus 4Ko", "STR_PART_ALIGN_4KB":"Alinhar las particions sus 4Ko",
"STR_WEB_COMMUNICATION_ERR":"Error de comunicacion :", "STR_WEB_COMMUNICATION_ERR":"Error de comunicacion :",
"STR_WEB_REMOTE_ABNORMAL":"Error de comunicacion : remote abnormal", "STR_WEB_REMOTE_ABNORMAL":"Error de comunicacion: remote abnormal",
"STR_WEB_REQUEST_TIMEOUT":"Error de comunicacion: requèsta tardièra", "STR_WEB_REQUEST_TIMEOUT":"Error de comunicacion: requèsta tardièra",
"STR_WEB_SERVICE_UNAVAILABLE":"Error de comunicacion : servici pas disponible", "STR_WEB_SERVICE_UNAVAILABLE":"Error de comunicacion : servici pas disponible",
"STR_WEB_TOKEN_MISMATCH":"Estat del Daemon actualizat, tornatz ensajar mai tard.", "STR_WEB_TOKEN_MISMATCH":"Estat del Daemon actualizat, tornatz ensajar mai tard.",
"STR_WEB_SERVICE_BUSY":"Lo servici es ocupat, tornatz ensajar mai tard.", "STR_WEB_SERVICE_BUSY":"Lo servici es ocupat, tornatz ensajar mai tard.",
"STR_MENU_VTSI_CREATE":"Generar lo fichièr VTSI",
"STR_VTSI_CREATE_TIP":"Aqueste còp cap descritura al disc, generacion del fichiet VTSI sonque#@Contunhar?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"Fracàs de la creacion del fichièr VTSI.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -514,6 +554,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Erreur de communication : service inaccessible", "STR_WEB_SERVICE_UNAVAILABLE":"Erreur de communication : service inaccessible",
"STR_WEB_TOKEN_MISMATCH":"Statut du démon mis à jour, veuillez réessayer plus tard.", "STR_WEB_TOKEN_MISMATCH":"Statut du démon mis à jour, veuillez réessayer plus tard.",
"STR_WEB_SERVICE_BUSY":"Service surchargé, veuillez réessayer plus tard.", "STR_WEB_SERVICE_BUSY":"Service surchargé, veuillez réessayer plus tard.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -561,6 +605,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -573,7 +621,7 @@
"STR_WARNING":"Advertencia", "STR_WARNING":"Advertencia",
"STR_INFO":"Información", "STR_INFO":"Información",
"STR_INCORRECT_DIR":"¡Por favor, ejecuta bajo el directorio correcto!", "STR_INCORRECT_DIR":"¡Por favor, ejecuta bajo el directorio correcto!",
"STR_INCORRECT_TREE_DIR":"No me ejecute aquí, por favor descarga el paquete de instalación lanzado, y ejecútalo allí.", "STR_INCORRECT_TREE_DIR":"No me ejecutes aquí, por favor descarga el paquete de instalación lanzado, y ejecútalo allí.",
"STR_DEVICE":"Dispositivo", "STR_DEVICE":"Dispositivo",
"STR_LOCAL_VER":"Ventoy En Paquete", "STR_LOCAL_VER":"Ventoy En Paquete",
"STR_DISK_VER":"Ventoy En Dispositivo", "STR_DISK_VER":"Ventoy En Dispositivo",
@@ -584,20 +632,20 @@
"STR_INSTALL_TIP":"El dispositivo será formateado y todos los datos se perderán.#@¿Continuar?", "STR_INSTALL_TIP":"El dispositivo será formateado y todos los datos se perderán.#@¿Continuar?",
"STR_INSTALL_TIP2":"El dispositivo será formateado y todos los datos se perderán.#@¿Continuar? (Doble Comprobación)", "STR_INSTALL_TIP2":"El dispositivo será formateado y todos los datos se perderán.#@¿Continuar? (Doble Comprobación)",
"STR_INSTALL_SUCCESS":"¡Felicitaciones!#@Ventoy ha sido instalado exitosamente en el dispositivo.", "STR_INSTALL_SUCCESS":"¡Felicitaciones!#@Ventoy ha sido instalado exitosamente en el dispositivo.",
"STR_INSTALL_FAILED":"Ocurrió un error durante la instalación. Puedes reconectar el USB e intentar de nuevo. Comprueba log.txt para detalle.", "STR_INSTALL_FAILED":"Ocurrió un error durante la instalación. Puedes reconectar el dispositivo USB e intentar de nuevo. Comprueba log.txt para detalle.",
"STR_UPDATE_SUCCESS":"¡Felicitaciones!#@Ventoy ha sido actualizado exitosamente en el dispositivo.", "STR_UPDATE_SUCCESS":"¡Felicitaciones!#@Ventoy ha sido actualizado exitosamente en el dispositivo.",
"STR_UPDATE_FAILED":"Ocurrió un error durante la actualización. Puedes reconectar el USB e intentar de nuevo. Comprueba log.txt para detalle.", "STR_UPDATE_FAILED":"Ocurrió un error durante la actualización. Puedes reconectar el dispositivo USB e intentar de nuevo. Comprueba log.txt para detalle.",
"STR_WAIT_PROCESS":"Un hilo está ejecutándose, por favor espera...", "STR_WAIT_PROCESS":"Un hilo está ejecutándose, por favor espera...",
"STR_MENU_OPTION":"Opción", "STR_MENU_OPTION":"Opción",
"STR_MENU_SECURE_BOOT":"Soporte De Arranque Seguro", "STR_MENU_SECURE_BOOT":"Soporte De Arranque Seguro",
"STR_MENU_PART_CFG":"Configuración De Partición", "STR_MENU_PART_CFG":"Configuración De Partición",
"STR_BTN_OK":"ACEPTAR", "STR_BTN_OK":"Aceptar",
"STR_BTN_CANCEL":"Cancelar", "STR_BTN_CANCEL":"Cancelar",
"STR_PRESERVE_SPACE":"Preservar algo de espacio al final del dispositivo", "STR_PRESERVE_SPACE":"Preservar algo de espacio al final del dispositivo",
"STR_SPACE_VAL_INVALID":"Valor inválido para espacio reservado", "STR_SPACE_VAL_INVALID":"Valor inválido para espacio reservado",
"STR_MENU_CLEAR":"Limpiar Ventoy", "STR_MENU_CLEAR":"Limpiar Ventoy",
"STR_CLEAR_SUCCESS":"Ventoy ha sido removido exitosamente desde el dispositivo.", "STR_CLEAR_SUCCESS":"Ventoy ha sido removido exitosamente desde el dispositivo.",
"STR_CLEAR_FAILED":"Ocurrió un error al limpiar Ventoy desde el dispositivo. Puedes reconectar el USB e intentar de nuevo. Comprueba log.txt para detalle.", "STR_CLEAR_FAILED":"Ocurrió un error al limpiar Ventoy desde el dispositivo. Puedes reconectar el dispositivo USB e intentar de nuevo. Comprueba log.txt para detalle.",
"STR_MENU_PART_STYLE":"Estilo De Partición", "STR_MENU_PART_STYLE":"Estilo De Partición",
"STR_DISK_2TB_MBR_ERROR":"Por favor selecciona GPT para dispositivos sobre 2TB", "STR_DISK_2TB_MBR_ERROR":"Por favor selecciona GPT para dispositivos sobre 2TB",
"STR_SHOW_ALL_DEV":"Mostrar Todos Los Dispositivos", "STR_SHOW_ALL_DEV":"Mostrar Todos Los Dispositivos",
@@ -608,13 +656,17 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Error de comunicación: Servicio No Disponible", "STR_WEB_SERVICE_UNAVAILABLE":"Error de comunicación: Servicio No Disponible",
"STR_WEB_TOKEN_MISMATCH":" Estado del daemon actualizado, por favor reintenta más tarde.", "STR_WEB_TOKEN_MISMATCH":" Estado del daemon actualizado, por favor reintenta más tarde.",
"STR_WEB_SERVICE_BUSY":" El servicio está ocupado, por favor reintenta más tarde.", "STR_WEB_SERVICE_BUSY":" El servicio está ocupado, por favor reintenta más tarde.",
"STR_MENU_VTSI_CREATE":"Generar Archivo VTSI",
"STR_VTSI_CREATE_TIP":"Esta vez no se escribirá al dispositivo, pero solo generará un archivo VTSI#@¿Continuar?",
"STR_VTSI_CREATE_SUCCESS":"¡Archivo VTSI creado exitosamente!#@Puedes usar Rufus(3.15+) para escribirlo al dispositivo a fin de completar la instalación de Ventoy.",
"STR_VTSI_CREATE_FAILED":"Fallo en el archivo VTSI creado.",
"STRXXX":"" "STRXXX":""
}, },
{ {
"name":"Russian (Pусский)", "name":"Russian (Pусский)",
"FontFamily":"Courier New", "FontFamily":"Courier New",
"FontSize":16, "FontSize":16,
"Author":"BL4CKH47H4CK3R", "Author":"BL4CKH47H4CK3R, Teraskull",
"STR_ERROR":"Ошибка", "STR_ERROR":"Ошибка",
"STR_WARNING":"Предупреждение", "STR_WARNING":"Предупреждение",
@@ -655,6 +707,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Ошибка связи: Служба недоступна", "STR_WEB_SERVICE_UNAVAILABLE":"Ошибка связи: Служба недоступна",
"STR_WEB_TOKEN_MISMATCH":"Статус демона обновлен. Повторите попытку позже.", "STR_WEB_TOKEN_MISMATCH":"Статус демона обновлен. Повторите попытку позже.",
"STR_WEB_SERVICE_BUSY":"Служба занята, повторите попытку позже.", "STR_WEB_SERVICE_BUSY":"Служба занята, повторите попытку позже.",
"STR_MENU_VTSI_CREATE":"Создать файл VTSI",
"STR_VTSI_CREATE_TIP":"На этот раз Ventoy не будет установлен на устройство, а будет только создан файл VTSI#@Продолжить?",
"STR_VTSI_CREATE_SUCCESS":"Файл VTSI создан успешно!#@Вы можете использовать Rufus(3.15+), чтобы записать его на устройство, для завершения установки Ventoy.",
"STR_VTSI_CREATE_FAILED":"Ошибка создания файла VTSI.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -702,6 +758,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -749,6 +809,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -760,42 +824,46 @@
"STR_ERROR":"Fout", "STR_ERROR":"Fout",
"STR_WARNING":"Waarschuwing", "STR_WARNING":"Waarschuwing",
"STR_INFO":"Info", "STR_INFO":"Info",
"STR_INCORRECT_DIR":"Voer Ventoy uit in de juiste directory!", "STR_INCORRECT_DIR":"Voer Ventoy uit in de juiste map!",
"STR_INCORRECT_TREE_DIR":"Ventoy kan hier niet worden uitgevoerd. Download het installatiepakket en probeer Ventoy daarmee te starten.", "STR_INCORRECT_TREE_DIR":"Ventoy kan hier niet worden uitgevoerd. Download het installatiepakket en probeer Ventoy daarmee te starten.",
"STR_DEVICE":"Apparaat", "STR_DEVICE":"Apparaat",
"STR_LOCAL_VER":"Ventoy in pakket", "STR_LOCAL_VER":"Ventoy in pakket",
"STR_DISK_VER":"Ventoy op apparaat", "STR_DISK_VER":"Ventoy op apparaat",
"STR_STATUS":"Status - GEREED", "STR_STATUS":"Status - KLAAR",
"STR_INSTALL":"Installeren", "STR_INSTALL":"Installeren",
"STR_UPDATE":"Bijwerken", "STR_UPDATE":"Bijwerken",
"STR_UPDATE_TIP":"Upgraden is veilig: ISO-bestanden blijven ongewijzigd.#@Doorgaan?", "STR_UPDATE_TIP":"Upgraden is veilig: ISO-bestanden blijven ongewijzigd.#@Doorgaan?",
"STR_INSTALL_TIP":"De schijf wordt geformatteerd en alle gegevens gaan verloren.#@Doorgaan?", "STR_INSTALL_TIP":"Het apparaat wordt geformatteerd en alle gegevens gaan verloren.#@Doorgaan?",
"STR_INSTALL_TIP2":"De schijf wordt geformatteerd en alle gegevens gaan verloren.#@Doorgaan? (Dubbelcheck)", "STR_INSTALL_TIP2":"Het apparaat wordt geformatteerd en alle gegevens gaan verloren.#@Doorgaan? (Dubbelcheck)",
"STR_INSTALL_SUCCESS":"Gefeliciteerd!#@Ventoy is met succes op het apparaat geïnstalleerd.", "STR_INSTALL_SUCCESS":"Gefeliciteerd!#@Ventoy is met succes op het apparaat geïnstalleerd.",
"STR_INSTALL_FAILED":"Er is een fout opgetreden tijdens de installatie. U kunt het apparaat opnieuw aansluiten en het nogmaals proberen. Controleer log.txt voor details.", "STR_INSTALL_FAILED":"Er is een fout opgetreden tijdens de installatie. U kunt het USB-apparaat opnieuw aansluiten en het nogmaals proberen. Controleer log.txt voor details.",
"STR_UPDATE_SUCCESS":"Gefeliciteerd!#@Ventoy is succesvol bijgewerkt op het apparaat.", "STR_UPDATE_SUCCESS":"Gefeliciteerd!#@Ventoy is met succes bijgewerkt op het apparaat.",
"STR_UPDATE_FAILED":"Er is een fout opgetreden tijdens de update. U kunt het apparaat opnieuw aansluiten en het nogmaals proberen. Controleer log.txt voor details.", "STR_UPDATE_FAILED":"Er is een fout opgetreden tijdens de update. U kunt het USB-apparaat opnieuw aansluiten en het nogmaals proberen. Controleer log.txt voor details.",
"STR_WAIT_PROCESS":"Ventoy is nog bezig, even geduld...", "STR_WAIT_PROCESS":"Ventoy is nog bezig, even geduld...",
"STR_MENU_OPTION":"Opties", "STR_MENU_OPTION":"Opties",
"STR_MENU_SECURE_BOOT":"Secure Boot", "STR_MENU_SECURE_BOOT":"Ondersteuning voor Secure Boot",
"STR_MENU_PART_CFG":"Partitieconfiguratie", "STR_MENU_PART_CFG":"Partitieconfiguratie",
"STR_BTN_OK":"OK", "STR_BTN_OK":"Ok",
"STR_BTN_CANCEL":"Annuleren", "STR_BTN_CANCEL":"Annuleren",
"STR_PRESERVE_SPACE":"Ruimte aan het einde van de schijf reserveren", "STR_PRESERVE_SPACE":"Ruimte aan het einde van de schijf reserveren",
"STR_SPACE_VAL_INVALID":"Ongeldige waarde voor gereserveerde ruimte", "STR_SPACE_VAL_INVALID":"Ongeldige waarde voor gereserveerde ruimte",
"STR_MENU_CLEAR":"Ventoy verwijderen", "STR_MENU_CLEAR":"Ventoy verwijderen",
"STR_CLEAR_SUCCESS":"Ventoy is succesvol verwijderd van het apparaat.", "STR_CLEAR_SUCCESS":"Ventoy is met succes verwijderd van het apparaat.",
"STR_CLEAR_FAILED":"Er is een fout opgetreden bij het verwijderen van Ventoy. U kunt het apparaat opnieuw aansluiten en het nogmaals proberen. Controleer log.txt voor details.", "STR_CLEAR_FAILED":"Er is een fout opgetreden bij het verwijderen van Ventoy. U kunt het USB-apparaat opnieuw aansluiten en het nogmaals proberen. Controleer log.txt voor details.",
"STR_MENU_PART_STYLE":"Partitietabel", "STR_MENU_PART_STYLE":"Partitietabel",
"STR_DISK_2TB_MBR_ERROR":"Selecteer GPT als partitietabel voor schijven groter dan 2TB", "STR_DISK_2TB_MBR_ERROR":"Selecteer GPT als partitietabel voor apparaten groter dan 2 TB",
"STR_SHOW_ALL_DEV":"Toon alle apparaten", "STR_SHOW_ALL_DEV":"Alle apparaten weergeven",
"STR_PART_ALIGN_4KB":"Lijn partities uit met 4KB", "STR_PART_ALIGN_4KB":"Partities uitlijnen met 4 KB",
"STR_WEB_COMMUNICATION_ERR":"Communicatie fout:", "STR_WEB_COMMUNICATION_ERR":"Communicatiefout:",
"STR_WEB_REMOTE_ABNORMAL":"Communicatiefout: abnormaal op afstand", "STR_WEB_REMOTE_ABNORMAL":"Communicatiefout: extern abnormaal",
"STR_WEB_REQUEST_TIMEOUT":"Communicatiefout: time-out van verzoek", "STR_WEB_REQUEST_TIMEOUT":"Communicatiefout: time-out van verzoek",
"STR_WEB_SERVICE_UNAVAILABLE":"Communicatiefout: service niet beschikbaar", "STR_WEB_SERVICE_UNAVAILABLE":"Communicatiefout: service niet beschikbaar",
"STR_WEB_TOKEN_MISMATCH":"Daemon-status bijgewerkt, probeer het later opnieuw.", "STR_WEB_TOKEN_MISMATCH":"Daemon-status bijgewerkt, probeer het later opnieuw.",
"STR_WEB_SERVICE_BUSY":"Service is bezet, probeer het later opnieuw.", "STR_WEB_SERVICE_BUSY":"Service is bezet, probeer het later opnieuw.",
"STR_MENU_VTSI_CREATE":"VTSI-bestand genereren",
"STR_VTSI_CREATE_TIP":"Deze keer wordt er niet naar het apparaat geschreven, maar wordt er alleen een VTSI-bestand gegenereerd#@Doorgaan?",
"STR_VTSI_CREATE_SUCCESS":"VTSI-bestand met succes aangemaakt!#@U kunt Rufus(3.15+) gebruiken om het bestand naar het apparaat te schrijven om de installatie van Ventoy te voltooien.",
"STR_VTSI_CREATE_FAILED":"Aanmaken van VTSI-bestand mislukt.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -843,60 +911,68 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
"name":"Japanese (日本語)", "name":"Japanese (日本語)",
"FontFamily":"Courier New", "FontFamily":"Yu Gothic UI",
"FontSize":16, "FontSize":14,
"Author":"taichi eto,Bentnand", "Author":"taichi eto,Bentnand",
"STR_ERROR":"エラー", "STR_ERROR":"エラー",
"STR_WARNING":"警告", "STR_WARNING":"警告",
"STR_INFO":"情報", "STR_INFO":"情報",
"STR_INCORRECT_DIR":"正しいディレクトリーで実行してください", "STR_INCORRECT_DIR":"正しいディレクトリーで実行してください",
"STR_INCORRECT_TREE_DIR":"ここで実行するには、パッケージをインストールしてください。.", "STR_INCORRECT_TREE_DIR":"ここで実行するには、パッケージを導入してください。",
"STR_DEVICE":"デバイス", "STR_DEVICE":"機器",
"STR_LOCAL_VER":"Ventoy In Package", "STR_LOCAL_VER":"パッケージ中のVentoy",
"STR_DISK_VER":"Ventoy In Device", "STR_DISK_VER":"機器中のVentoy",
"STR_STATUS":"Status - 準備完了", "STR_STATUS":"状態 - 準備完了",
"STR_INSTALL":"インストール", "STR_INSTALL":"導入",
"STR_UPDATE":"更新", "STR_UPDATE":"更新",
"STR_UPDATE_TIP":"アップグレード可能です、ISOファイルは改変されません。.#@続行?", "STR_UPDATE_TIP":"更新可能です、ISOファイルは改変されません。#@続行しますか?",
"STR_INSTALL_TIP":"選択されたディスクは完全に初期化され、保存されたデータは二度と復元できません。#@続行?", "STR_INSTALL_TIP":"選択した機器は完全に初期化され、保存されたデータは二度と復元できません。#@続行しますか?",
"STR_INSTALL_TIP2":"選択されたディスクは完全に初期化され、保存されたデータは二度と復元できません。#@続行? (再確認)", "STR_INSTALL_TIP2":"選択した機器は完全に初期化され、保存されたデータは二度と復元できません。#@続行しますか?(再確認",
"STR_INSTALL_SUCCESS":"Congratulations!#@Ventoy は正常にインストールされました", "STR_INSTALL_SUCCESS":"おめでとうございます。#@Ventoy は正常に導入されました",
"STR_INSTALL_FAILED":"インストール中にエラーが発生しました。デバイスを再接続してもう一度やり直してください。 詳細ログ log.txt ", "STR_INSTALL_FAILED":"導入中にエラーが発生しました。機器を再接続してもう一度やり直してください。 詳細な記録は log.txt にあります。",
"STR_UPDATE_SUCCESS":"Congratulations!#@Ventoy は正常にアップデートされました.", "STR_UPDATE_SUCCESS":"おめでとうございます。#@Ventoy は正常に更新されました",
"STR_UPDATE_FAILED":"更新中にエラーが発生しました。デバイスを再接続してもう一度やり直してください。. 詳細ログ log.txt", "STR_UPDATE_FAILED":"更新中にエラーが発生しました。機器を再接続してもう一度やり直してください。詳細な記録は log.txt にあります。",
"STR_WAIT_PROCESS":"処理中...", "STR_WAIT_PROCESS":"スレッドが稼動しています。お待ちください...",
"STR_MENU_OPTION":"設定", "STR_MENU_OPTION":"設定",
"STR_MENU_SECURE_BOOT":"Secure Boot", "STR_MENU_SECURE_BOOT":"セキュアブート",
"STR_MENU_PART_CFG":"パーティション構成", "STR_MENU_PART_CFG":"区画構成",
"STR_BTN_OK":"OK", "STR_BTN_OK":"了解",
"STR_BTN_CANCEL":"キャンセル", "STR_BTN_CANCEL":"取消",
"STR_PRESERVE_SPACE":"ディスクの下部にある程度のスペースを確保する", "STR_PRESERVE_SPACE":"機器の最後に領域を確保する",
"STR_SPACE_VAL_INVALID":"予約スペースの無効な値", "STR_SPACE_VAL_INVALID":"確保する領域の値が無効です",
"STR_MENU_CLEAR":"Ventoyを削除", "STR_MENU_CLEAR":"Ventoyを削除",
"STR_CLEAR_SUCCESS":"Ventoyがディスクから削除されました。", "STR_CLEAR_SUCCESS":"Ventoyが機器から削除されました。",
"STR_CLEAR_FAILED":"Ventoyをディスクから削除できませんでした。USBを再挿入してみてください。 詳細ログ log.txt", "STR_CLEAR_FAILED":"Ventoyを機器から削除できませんでした。機器を再接続してもう一度やり直してください。詳細な記録は log.txt にあります。",
"STR_MENU_PART_STYLE":"パーティションスタイル", "STR_MENU_PART_STYLE":"区画の構成方式",
"STR_DISK_2TB_MBR_ERROR":"2TB以上のディスクにはGPTを使用してください。", "STR_DISK_2TB_MBR_ERROR":"2TB以上の機器にはGPTを使用してください。",
"STR_SHOW_ALL_DEV":"すべてのデバイスを表示", "STR_SHOW_ALL_DEV":"すべての機器を表示",
"STR_PART_ALIGN_4KB":"パーティションを4KBに揃える", "STR_PART_ALIGN_4KB":"区画単位を4KBに揃える",
"STR_WEB_COMMUNICATION_ERR":"Communication error:", "STR_WEB_COMMUNICATION_ERR":"通信エラー:",
"STR_WEB_REMOTE_ABNORMAL":"Communication error: remote abnormal", "STR_WEB_REMOTE_ABNORMAL":"通信エラー: 通信先で異常が発生しています",
"STR_WEB_REQUEST_TIMEOUT":"Communication error: Request timed out", "STR_WEB_REQUEST_TIMEOUT":"通信エラー: 要求が時間切れしました",
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"通信エラー: サービスが利用できません",
"STR_WEB_TOKEN_MISMATCH":"デーモンのステータスが更新されました。しばらくしてから再試行してください。", "STR_WEB_TOKEN_MISMATCH":"デーモンの状態が更新されました。しばらくしてから再試行してください。",
"STR_WEB_SERVICE_BUSY":"サービスがビジーです。後で再試行してください。", "STR_WEB_SERVICE_BUSY":"サービスが繁忙です。後で再試行してください。",
"STR_MENU_VTSI_CREATE":"VTSIファイルを生成する",
"STR_VTSI_CREATE_TIP":"VTSIファイルを生成し記憶装置への書き込みは行いません。#@続行しますか?",
"STR_VTSI_CREATE_SUCCESS":"VTSIファイルが生成されました。#@Rufus3.15以上の版を使って記憶装置に書き込んでVentoyの導入を完遂しましょう。",
"STR_VTSI_CREATE_FAILED":"VTSIファイルを生成できませんでした。",
"STRXXX":"" "STRXXX":""
}, },
{ {
"name":"Italian (Italiano)", "name":"Italian (Italiano)",
"FontFamily":"Courier New", "FontFamily":"Courier New",
"FontSize":16, "FontSize":16,
"Author":"AverageUser2", "Author":"AverageUser2,Albano Battistella",
"STR_ERROR":"Errore", "STR_ERROR":"Errore",
"STR_WARNING":"Attenzione", "STR_WARNING":"Attenzione",
@@ -904,14 +980,14 @@
"STR_INCORRECT_DIR":"Si prega di eseguire nella cartella corretta", "STR_INCORRECT_DIR":"Si prega di eseguire nella cartella corretta",
"STR_INCORRECT_TREE_DIR":"Non eseguire qui, scarica il pacchetto di installazione ed avvialo", "STR_INCORRECT_TREE_DIR":"Non eseguire qui, scarica il pacchetto di installazione ed avvialo",
"STR_DEVICE":"Dispositivo", "STR_DEVICE":"Dispositivo",
"STR_LOCAL_VER":"Versione Ventoy locale", "STR_LOCAL_VER":"Versione Locale di Ventoy",
"STR_DISK_VER":"Ventoy nel dispositivo", "STR_DISK_VER":"Ventoy nel dispositivo",
"STR_STATUS":"Stato - PRONTO", "STR_STATUS":"Stato - PRONTO",
"STR_INSTALL":"Installa", "STR_INSTALL":"Installa",
"STR_UPDATE":"Aggiorna", "STR_UPDATE":"Aggiorna",
"STR_UPDATE_TIP":"L'aggiornamento è sicuro, i file presenti nel dispositivo rimarranno invariati.#@Continue?", "STR_UPDATE_TIP":"L'aggiornamento è sicuro, i file presenti nel dispositivo rimarranno invariati.#@Continuare?",
"STR_INSTALL_TIP":"Il disco verrà formattato e tutti i dati saranno persi.#@Continue?", "STR_INSTALL_TIP":"Il disco verrà formattato e tutti i dati saranno persi.#@Continuare?",
"STR_INSTALL_TIP2":"Il disco verrà formattato e tutti i dati saranno persi.#@Continue?' (Seconda Verifica)", "STR_INSTALL_TIP2":"Il disco verrà formattato e tutti i dati saranno persi.#@Continuare?' (Seconda Verifica)",
"STR_INSTALL_SUCCESS":"Congratulazioni!#@Ventoy è stato installato con successo nel dispositivo", "STR_INSTALL_SUCCESS":"Congratulazioni!#@Ventoy è stato installato con successo nel dispositivo",
"STR_INSTALL_FAILED":"Si è verificato un errore durante l'installazione. Reinserisci il dispostivo e riprova. Controlla il file log.txt per i dettagli.", "STR_INSTALL_FAILED":"Si è verificato un errore durante l'installazione. Reinserisci il dispostivo e riprova. Controlla il file log.txt per i dettagli.",
"STR_UPDATE_SUCCESS":"Congratulazioni!#@Ventoy è stato aggiornato con successo nel dispositivo", "STR_UPDATE_SUCCESS":"Congratulazioni!#@Ventoy è stato aggiornato con successo nel dispositivo",
@@ -931,12 +1007,16 @@
"STR_DISK_2TB_MBR_ERROR":"Seleziona GPT per dischi con dimensioni maggiori di 2TB", "STR_DISK_2TB_MBR_ERROR":"Seleziona GPT per dischi con dimensioni maggiori di 2TB",
"STR_SHOW_ALL_DEV":"Mostra tutti i dispositivi", "STR_SHOW_ALL_DEV":"Mostra tutti i dispositivi",
"STR_PART_ALIGN_4KB":"Allinea le partizioni con 4KB", "STR_PART_ALIGN_4KB":"Allinea le partizioni con 4KB",
"STR_WEB_COMMUNICATION_ERR":"Communication error:", "STR_WEB_COMMUNICATION_ERR":"Errore di comunicazione:",
"STR_WEB_REMOTE_ABNORMAL":"Communication error: remote abnormal", "STR_WEB_REMOTE_ABNORMAL":"Errore di comunicazione: remoto anormale",
"STR_WEB_REQUEST_TIMEOUT":"Communication error: Request timed out", "STR_WEB_REQUEST_TIMEOUT":"Errore di comunicazione: richiesta scaduta",
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Errore di comunicazione: servizio non disponibile",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Stato del demone aggiornato, riprova più tardi.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Il servizio è occupato, riprova più tardi.",
"STR_MENU_VTSI_CREATE":"Genera file VTSI",
"STR_VTSI_CREATE_TIP":"Questa volta non scriverà sul dispositivo, ma genererà solo un file VTSI#@Continuare?",
"STR_VTSI_CREATE_SUCCESS":"File VTSI creato con successo!#@Puoiusare Rufus(3.15+)per scrivere sul dispositivo in modo da completare l'installazione di Ventoy.",
"STR_VTSI_CREATE_FAILED":"Creazione File VTSI non riuscito.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -984,6 +1064,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1031,6 +1115,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1078,6 +1166,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"通信錯誤: 服務不可用", "STR_WEB_SERVICE_UNAVAILABLE":"通信錯誤: 服務不可用",
"STR_WEB_TOKEN_MISMATCH":"服務狀態已更新", "STR_WEB_TOKEN_MISMATCH":"服務狀態已更新",
"STR_WEB_SERVICE_BUSY":"服務正忙,請稍後重試", "STR_WEB_SERVICE_BUSY":"服務正忙,請稍後重試",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1125,6 +1217,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Greška u komunikaciji: Servis nije dostupan", "STR_WEB_SERVICE_UNAVAILABLE":"Greška u komunikaciji: Servis nije dostupan",
"STR_WEB_TOKEN_MISMATCH":"Status demona ažuriran, pokušajte ponovo kasnije.", "STR_WEB_TOKEN_MISMATCH":"Status demona ažuriran, pokušajte ponovo kasnije.",
"STR_WEB_SERVICE_BUSY":"Servis je zauzet, pokušajte ponovo kasnije.", "STR_WEB_SERVICE_BUSY":"Servis je zauzet, pokušajte ponovo kasnije.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1172,6 +1268,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Комуникациона грешка: Сервис је недоступан", "STR_WEB_SERVICE_UNAVAILABLE":"Комуникациона грешка: Сервис је недоступан",
"STR_WEB_TOKEN_MISMATCH":"Статус демона ажуриран, покушајте поново касније.", "STR_WEB_TOKEN_MISMATCH":"Статус демона ажуриран, покушајте поново касније.",
"STR_WEB_SERVICE_BUSY":"Севис је заузет, покушајте поново касније.", "STR_WEB_SERVICE_BUSY":"Севис је заузет, покушајте поново касније.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1219,6 +1319,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1266,6 +1370,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Kommunikasjonsfeil: Tjeneste utilgjengelig", "STR_WEB_SERVICE_UNAVAILABLE":"Kommunikasjonsfeil: Tjeneste utilgjengelig",
"STR_WEB_TOKEN_MISMATCH":"Daemon status er oppdatert, vennligst prøv igjen senere.", "STR_WEB_TOKEN_MISMATCH":"Daemon status er oppdatert, vennligst prøv igjen senere.",
"STR_WEB_SERVICE_BUSY":"Tjenesten er opptatt, vennligst prøv igjen senere.", "STR_WEB_SERVICE_BUSY":"Tjenesten er opptatt, vennligst prøv igjen senere.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1285,12 +1393,12 @@
"STR_STATUS":"Trạng thái - SẴN SÀNG", "STR_STATUS":"Trạng thái - SẴN SÀNG",
"STR_INSTALL":"Cài đặt", "STR_INSTALL":"Cài đặt",
"STR_UPDATE":"Cập nhật", "STR_UPDATE":"Cập nhật",
"STR_UPDATE_TIP":"Việc cập nhật Ventoy là an toàn, các tập tin ISO của bạn sẽ được giữ nguyên trạng.#@ Bạn thật sự muốn tiếp tục ?.", "STR_UPDATE_TIP":"Việc cập nhật Ventoy là an toàn, các tập tin ISO của bạn sẽ được giữ nguyên trạng.#@Bạn thật sự muốn tiếp tục?",
"STR_INSTALL_TIP":"Thiết bị sẽ được định dạng và do đó TẤT CẢ DỮ LIỆU trên thiết bị sẽ bị mất.#@ Bạn thật sự muốn tiếp tục ?.", "STR_INSTALL_TIP":"Thiết bị sẽ được định dạng và do đó TẤT CẢ DỮ LIỆU trên thiết bị sẽ bị mất.#@Bạn thật sự muốn tiếp tục?",
"STR_INSTALL_TIP2":"Thiết bị sẽ được định dạng và do đó TẤT CẢ DỮ LIỆU trên thiết bị sẽ bị mất.#@ Bạn thật sự muốn tiếp tục ?. (Xác nhận lần hai)", "STR_INSTALL_TIP2":"Thiết bị sẽ được định dạng và do đó TẤT CẢ DỮ LIỆU trên thiết bị sẽ bị mất.#@Bạn thật sự muốn tiếp tục? (Xác nhận lần hai)",
"STR_INSTALL_SUCCESS":"Chúc mừng bạn !.#@ Thiết bị đã được cài Ventoy thành công.", "STR_INSTALL_SUCCESS":"Chúc mừng bạn !.#@Thiết bị đã được cài Ventoy thành công.",
"STR_INSTALL_FAILED":"Đã xảy ra lỗi trong quá trình cài đặt Ventoy. Bạn có thể rút thiết bị ra và thử lại. Xem chi tiết ở tệp log.txt.", "STR_INSTALL_FAILED":"Đã xảy ra lỗi trong quá trình cài đặt Ventoy. Bạn có thể rút thiết bị ra và thử lại. Xem chi tiết ở tệp log.txt.",
"STR_UPDATE_SUCCESS":"Chúc mừng bạn !.#@ Thiết bị đã được cập nhật Ventoy thành công.", "STR_UPDATE_SUCCESS":"Chúc mừng bạn !.#@Thiết bị đã được cập nhật Ventoy thành công.",
"STR_UPDATE_FAILED":"Đã xảy ra lỗi trong quá trình cập nhật Ventoy. Bạn có thể rút thiết bị ra và thử lại. Xem chi tiết ở tệp log.txt.", "STR_UPDATE_FAILED":"Đã xảy ra lỗi trong quá trình cập nhật Ventoy. Bạn có thể rút thiết bị ra và thử lại. Xem chi tiết ở tệp log.txt.",
"STR_WAIT_PROCESS":"Một luồng xử lý đang chạy, vui lòng chờ...", "STR_WAIT_PROCESS":"Một luồng xử lý đang chạy, vui lòng chờ...",
"STR_MENU_OPTION":"Tùy chọn", "STR_MENU_OPTION":"Tùy chọn",
@@ -1301,7 +1409,7 @@
"STR_PRESERVE_SPACE":"Giữ lại phần dung lượng ở cuối thiết bị", "STR_PRESERVE_SPACE":"Giữ lại phần dung lượng ở cuối thiết bị",
"STR_SPACE_VAL_INVALID":"Giá trị dung lượng giữ lại không hợp lệ.", "STR_SPACE_VAL_INVALID":"Giá trị dung lượng giữ lại không hợp lệ.",
"STR_MENU_CLEAR":"Gỡ bỏ Ventoy", "STR_MENU_CLEAR":"Gỡ bỏ Ventoy",
"STR_CLEAR_SUCCESS":"Chúc mừng bạn !.#@ Thiết bị đã được gỡ bỏ Ventoy thành công.", "STR_CLEAR_SUCCESS":"Chúc mừng bạn !.#@Thiết bị đã được gỡ bỏ Ventoy thành công.",
"STR_CLEAR_FAILED":"Đã xảy ra lỗi trong quá trình gỡ bỏ Ventoy. Bạn có thể rút thiết bị ra và thử lại. Xem chi tiết ở tệp log.txt.", "STR_CLEAR_FAILED":"Đã xảy ra lỗi trong quá trình gỡ bỏ Ventoy. Bạn có thể rút thiết bị ra và thử lại. Xem chi tiết ở tệp log.txt.",
"STR_MENU_PART_STYLE":"Kiểu phân vùng", "STR_MENU_PART_STYLE":"Kiểu phân vùng",
"STR_DISK_2TB_MBR_ERROR":"Thiết bị có dung lượng lớn hơn 2TB. Vui lòng chọn Kiểu phân vùng là GPT.", "STR_DISK_2TB_MBR_ERROR":"Thiết bị có dung lượng lớn hơn 2TB. Vui lòng chọn Kiểu phân vùng là GPT.",
@@ -1313,6 +1421,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Lỗi giao tiếp: Dịch vụ không sẵn có", "STR_WEB_SERVICE_UNAVAILABLE":"Lỗi giao tiếp: Dịch vụ không sẵn có",
"STR_WEB_TOKEN_MISMATCH":"Đã cập nhật trạng thái Daemon, vui lòng thử lại sau.", "STR_WEB_TOKEN_MISMATCH":"Đã cập nhật trạng thái Daemon, vui lòng thử lại sau.",
"STR_WEB_SERVICE_BUSY":"Dịch vụ bận, vui lòng thử lại sau.", "STR_WEB_SERVICE_BUSY":"Dịch vụ bận, vui lòng thử lại sau.",
"STR_MENU_VTSI_CREATE":"Tạo tệp VTSI",
"STR_VTSI_CREATE_TIP":"Lần này sẽ không ghi vào thiết bị, chỉ tạo một tệp VTSI#@Bạn muốn tiếp tục?",
"STR_VTSI_CREATE_SUCCESS":"Tạo tệp VTSI thành công!#@Để hoàn thành cài đặt Ventoy, bạn có thể dùng Rufus (3.15+) để ghi tệp này vào thiết bị.",
"STR_VTSI_CREATE_FAILED":"Tạo tệp VTSI đã gặp lỗi.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1360,6 +1472,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1407,6 +1523,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Комуникациска грешка: Недостапен сервис", "STR_WEB_SERVICE_UNAVAILABLE":"Комуникациска грешка: Недостапен сервис",
"STR_WEB_TOKEN_MISMATCH":"Ажуриран статус на даемонот, молиме обидете се подоцна.", "STR_WEB_TOKEN_MISMATCH":"Ажуриран статус на даемонот, молиме обидете се подоцна.",
"STR_WEB_SERVICE_BUSY":"Сервисот е зафатен, молиме обидете се подоцна.", "STR_WEB_SERVICE_BUSY":"Сервисот е зафатен, молиме обидете се подоцна.",
"STR_MENU_VTSI_CREATE":"Генерирај VTSI датотека",
"STR_VTSI_CREATE_TIP":"Овој пат ништо нема да се запише на уредот туку само ќе се генерира VTSI датотека#@Продолжи?",
"STR_VTSI_CREATE_SUCCESS":"Успешно креирана VTSI датотека!#@Можете да го користите Rufus(3.15+) за да ја запишете на уредот како и да ја комплетирате инсталацијата на Ventoy.",
"STR_VTSI_CREATE_FAILED":"Креирањето на VTSI датотека е неуспешно.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1454,6 +1574,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1501,6 +1625,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1541,13 +1669,17 @@
"STR_MENU_PART_STYLE":"Gaya Partisi", "STR_MENU_PART_STYLE":"Gaya Partisi",
"STR_DISK_2TB_MBR_ERROR":"Silakan pilih GPT untuk disk yang lebih dari 2TB", "STR_DISK_2TB_MBR_ERROR":"Silakan pilih GPT untuk disk yang lebih dari 2TB",
"STR_SHOW_ALL_DEV":"Show All Devices", "STR_SHOW_ALL_DEV":"Show All Devices",
"STR_PART_ALIGN_4KB":"Align partitions with 4KB", "STR_PART_ALIGN_4KB":"Meluruskan dengan partisi 4KB",
"STR_WEB_COMMUNICATION_ERR":"Communication error:", "STR_WEB_COMMUNICATION_ERR":"Kesalahan komunikasi:",
"STR_WEB_REMOTE_ABNORMAL":"Communication error: remote abnormal", "STR_WEB_REMOTE_ABNORMAL":"Kesalahan komunikasi: tidak normalnya kendali",
"STR_WEB_REQUEST_TIMEOUT":"Communication error: Request timed out", "STR_WEB_REQUEST_TIMEOUT":"Kesalahan komunikasi: Waktu permintaan habis",
"STR_WEB_SERVICE_UNAVAILABLE":"Communication error: Service Unavailable", "STR_WEB_SERVICE_UNAVAILABLE":"Kesalahan komunikasi: Layanan tidak tersedia",
"STR_WEB_TOKEN_MISMATCH":"Daemon status updated, please retry later.", "STR_WEB_TOKEN_MISMATCH":"Status daemon diperbarui, silakan coba lagi nanti.",
"STR_WEB_SERVICE_BUSY":"Service is busy, please retry later.", "STR_WEB_SERVICE_BUSY":"Layanan sedang sibuk, silakan coba lagi nanti.",
"STR_MENU_VTSI_CREATE":"Membuat berkas VTSI",
"STR_VTSI_CREATE_TIP":"Saat ini tidak akan menuliskan di perangkat, tetapi hanya membuat berkas VTSI #@Lanjutkan?",
"STR_VTSI_CREATE_SUCCESS":"Berkas VTSI berhasil dibuat#@Anda bisa menggunakan Rufus(3.15+) untuk menulisnya ke perangkat untuk menyelesaikan instalasi Ventoy.",
"STR_VTSI_CREATE_FAILED":"Berkas VTSI gagal dibuat.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1595,6 +1727,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Помилка зв'язку: Служба недоступна", "STR_WEB_SERVICE_UNAVAILABLE":"Помилка зв'язку: Служба недоступна",
"STR_WEB_TOKEN_MISMATCH":"Статус демона оновлено. Повторіть спробу пізніше.", "STR_WEB_TOKEN_MISMATCH":"Статус демона оновлено. Повторіть спробу пізніше.",
"STR_WEB_SERVICE_BUSY":"Служба зайнята, повторіть спробу пізніше.", "STR_WEB_SERVICE_BUSY":"Служба зайнята, повторіть спробу пізніше.",
"STR_MENU_VTSI_CREATE":"Створити файл VTSI",
"STR_VTSI_CREATE_TIP":"Цього разу Ventoy не буде встановлено на пристрій, а лише буде створено файл VTSI#@Продовжити?",
"STR_VTSI_CREATE_SUCCESS":"Файл VTSI створено успішно!#@Ви можете використати Rufus(3.15+), щоб записати його на пристрій, для завершення встановлення Ventoy",
"STR_VTSI_CREATE_FAILED":"Не вдалося створити файл VTSI.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1617,9 +1753,9 @@
"STR_UPDATE_TIP":"Η λειτουργία αναβάθμισης είναι ασφαλής, τα αρχεία ISO δεν θα αλλάξουν.#@Συνέχεια;", "STR_UPDATE_TIP":"Η λειτουργία αναβάθμισης είναι ασφαλής, τα αρχεία ISO δεν θα αλλάξουν.#@Συνέχεια;",
"STR_INSTALL_TIP":"Ο δίσκος θα μορφοποιηθεί και όλα τα δεδομένα θα χαθούν.#@Συνέχεια;", "STR_INSTALL_TIP":"Ο δίσκος θα μορφοποιηθεί και όλα τα δεδομένα θα χαθούν.#@Συνέχεια;",
"STR_INSTALL_TIP2":"Ο δίσκος θα μορφοποιηθεί και όλα τα δεδομένα θα χαθούν.#@Συνέχεια; (Επανελέγξτε)", "STR_INSTALL_TIP2":"Ο δίσκος θα μορφοποιηθεί και όλα τα δεδομένα θα χαθούν.#@Συνέχεια; (Επανελέγξτε)",
"STR_INSTALL_SUCCESS":"Συγχαρητήρια!#Το @Ventoy έχει εγκατασταθεί με επιτυχία στη συσκευή.", "STR_INSTALL_SUCCESS":"Συγχαρητήρια!#@Ventoy έχει εγκατασταθεί με επιτυχία στη συσκευή.",
"STR_INSTALL_FAILED":"Παρουσιάστηκε σφάλμα κατά την εγκατάσταση. Μπορείτε να επανασυνδέσετε το USB και να δοκιμάσετε ξανά. Ελέγξτε το αρχείο log.txt για λεπτομέρειες.", "STR_INSTALL_FAILED":"Παρουσιάστηκε σφάλμα κατά την εγκατάσταση. Μπορείτε να επανασυνδέσετε το USB και να δοκιμάσετε ξανά. Ελέγξτε το αρχείο log.txt για λεπτομέρειες.",
"STR_UPDATE_SUCCESS":"Συγχαρητήρια!#Το @Ventoy ενημερώθηκε με επιτυχία στη συσκευή.", "STR_UPDATE_SUCCESS":"Συγχαρητήρια!#@Ventoy ενημερώθηκε με επιτυχία στη συσκευή.",
"STR_UPDATE_FAILED":"Παρουσιάστηκε σφάλμα κατά την ενημέρωση. Μπορείτε να επανασυνδέσετε το USB και να δοκιμάσετε ξανά. Ελέγξτε το αρχείο log.txt για λεπτομέρειες.", "STR_UPDATE_FAILED":"Παρουσιάστηκε σφάλμα κατά την ενημέρωση. Μπορείτε να επανασυνδέσετε το USB και να δοκιμάσετε ξανά. Ελέγξτε το αρχείο log.txt για λεπτομέρειες.",
"STR_WAIT_PROCESS":"Ένα νήμα εκτελείται, παρακαλώ περιμένετε...", "STR_WAIT_PROCESS":"Ένα νήμα εκτελείται, παρακαλώ περιμένετε...",
"STR_MENU_OPTION":"Επιλογές", "STR_MENU_OPTION":"Επιλογές",
@@ -1642,6 +1778,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Σφάλμα επικοινωνίας: υπηρεσία μη διαθέσιμη", "STR_WEB_SERVICE_UNAVAILABLE":"Σφάλμα επικοινωνίας: υπηρεσία μη διαθέσιμη",
"STR_WEB_TOKEN_MISMATCH":"Η κατάσταση του δαίμονα επικαιροποιήθηκε. Παρακαλώ δοκιμάστε αργότερα.", "STR_WEB_TOKEN_MISMATCH":"Η κατάσταση του δαίμονα επικαιροποιήθηκε. Παρακαλώ δοκιμάστε αργότερα.",
"STR_WEB_SERVICE_BUSY":"Η υπηρεσία είναι απασχολημένη. Παρακαλώ δοκιμάστε αργότερα.", "STR_WEB_SERVICE_BUSY":"Η υπηρεσία είναι απασχολημένη. Παρακαλώ δοκιμάστε αργότερα.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1689,6 +1829,10 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Kommunikationsfel: Tjänsten är inte tillgänglig", "STR_WEB_SERVICE_UNAVAILABLE":"Kommunikationsfel: Tjänsten är inte tillgänglig",
"STR_WEB_TOKEN_MISMATCH":"Daemon-status uppdaterad. Försök igen senare.", "STR_WEB_TOKEN_MISMATCH":"Daemon-status uppdaterad. Försök igen senare.",
"STR_WEB_SERVICE_BUSY":"Tjänster är upptagen. Försök igen senare.", "STR_WEB_SERVICE_BUSY":"Tjänster är upptagen. Försök igen senare.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":"" "STRXXX":""
}, },
{ {
@@ -1736,6 +1880,112 @@
"STR_WEB_SERVICE_UNAVAILABLE":"Napaka v komunikaciji: storitev ni na voljo", "STR_WEB_SERVICE_UNAVAILABLE":"Napaka v komunikaciji: storitev ni na voljo",
"STR_WEB_TOKEN_MISMATCH":"Zahteva storitve je potekla, prosim poskusite kasneje.", "STR_WEB_TOKEN_MISMATCH":"Zahteva storitve je potekla, prosim poskusite kasneje.",
"STR_WEB_SERVICE_BUSY":"Storitev je zasedena, prosim poskusite kasneje.", "STR_WEB_SERVICE_BUSY":"Storitev je zasedena, prosim poskusite kasneje.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"This time will not write to the device, but only generate a VTSI file#@Continue?",
"STR_VTSI_CREATE_SUCCESS":"VTSI file created successfully!#@You can use Rufus(3.15+) to write it to the device so as to complete the installation of Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI file created failed.",
"STRXXX":""
},
{
"name":"Bulgarian (Български)",
"FontFamily":"Courier New",
"FontSize":16,
"Author":"jekovcar",
"STR_ERROR":"Грешка",
"STR_WARNING":"Предупреждение",
"STR_INFO":"Информация",
"STR_INCORRECT_DIR":"Моля, стартирайте в друга директория!",
"STR_INCORRECT_TREE_DIR":"Не ме стартирайте оттук, моля, изтеглете инсталационен пакет и го стартирайте в друго място.",
"STR_DEVICE":"Устройство",
"STR_LOCAL_VER":"Ventoy в пакета",
"STR_DISK_VER":"Ventoy на устройството",
"STR_STATUS":"Статус - ГОТОВ",
"STR_INSTALL":"Инсталирай",
"STR_UPDATE":"Обнови",
"STR_UPDATE_TIP":"Обновяването е безопасно, ISO-файловете няма да се променят.#@Продължаваме?",
"STR_INSTALL_TIP":"Диска ще се форматира и всички данни изтрият.#@Продължаваме?",
"STR_INSTALL_TIP2":"Диска ще се форматира и всички данни изтрият..#@ДЕЙСТВИТЕЛНО ще продължите?",
"STR_INSTALL_SUCCESS":"Поздрави!#@Ventoy бе успешно инсталиран на устройството.",
"STR_INSTALL_FAILED":"По време на инсталирането на Ventoy възникна грешка. Подсъединете устройството и опитайте отново. Проверете log.txt за грешки.",
"STR_UPDATE_SUCCESS":"Поздрави!#@Ventoy бе успешно обновен на устройството.",
"STR_UPDATE_FAILED":"По време на обновяването на Ventoy възникна грешка. Подсъединете устройството и опитайте отново. Проверете log.txt за грешки.",
"STR_WAIT_PROCESS":"Процеса е стартиран, моля изчакайте...",
"STR_MENU_OPTION":"Опции",
"STR_MENU_SECURE_BOOT":"Поддръжка на Secure Boot",
"STR_MENU_PART_CFG":"Допълнителен дял",
"STR_BTN_OK":"ОК",
"STR_BTN_CANCEL":"Отказ",
"STR_PRESERVE_SPACE":"Създай Допълнителен дял в края на диска",
"STR_SPACE_VAL_INVALID":"Неправилен размер на дяла",
"STR_MENU_CLEAR":"Изтрий Ventoy",
"STR_CLEAR_SUCCESS":"Ventoy бе успешно изтрит от устройството.",
"STR_CLEAR_FAILED":"По време на изтриването на Ventoy възникна грешка. Подсъединете устройството и опитайте отново. Проверете log.txt за грешки.",
"STR_MENU_PART_STYLE":"Стил на оразмеряване на дяловете",
"STR_DISK_2TB_MBR_ERROR":"Моля, изберете GPT за дискове по-големи от 2ТБ",
"STR_SHOW_ALL_DEV":"Покажи всички устройства",
"STR_PART_ALIGN_4KB":"Подравни дяловете с размер 4КБ",
"STR_WEB_COMMUNICATION_ERR":"Грешка при свързване:",
"STR_WEB_REMOTE_ABNORMAL":"Грешка при свързване: Отдалечената връзка е недействителна",
"STR_WEB_REQUEST_TIMEOUT":"Грешка при свързване: Изтекло време за изчакване на заявката",
"STR_WEB_SERVICE_UNAVAILABLE":"Грешка при свързване: Службата е недостъпна",
"STR_WEB_TOKEN_MISMATCH":"Статуса на агента е обновен. Повторете по-късно.",
"STR_WEB_SERVICE_BUSY":"Службата е заета, Повторете по-късно.",
"STR_MENU_VTSI_CREATE":"Generate VTSI File",
"STR_VTSI_CREATE_TIP":"Сега няма да се записва на диска, само ще се генерира VTSI файл#@Продължаваме?",
"STR_VTSI_CREATE_SUCCESS":"VTSI файла бе създаден успешно!#@Може да използвате Rufus(3.15+) да го запишете на устройството за инсталацията с Ventoy.",
"STR_VTSI_CREATE_FAILED":"VTSI файла създаване се провали.",
"STRXXX":""
},
{
"name":"Armenian (Հայերեն)",
"FontFamily":"Courier New",
"FontSize":16,
"Author":"Egho",
"STR_ERROR":"Սխալ",
"STR_WARNING":"Զգուշացում",
"STR_INFO":"Տեղեկություն",
"STR_INCORRECT_DIR":"Խնդրում ենք գործարկել ճիշտ թղթախանակում!",
"STR_INCORRECT_TREE_DIR":"Չգործարկել այստեղ, խնդրում եմ ներբեռնեք թողարկված տեղադրման փաթեթը և գործարկել այնտեղ:",
"STR_DEVICE":"Կրիչը",
"STR_LOCAL_VER":"Ventoy-ը փաթեթում",
"STR_DISK_VER":"Ventoy-ը կրիչում",
"STR_STATUS":"Կարգավիճակ - ՊԱՏՐԱՍՏ",
"STR_INSTALL":"Տեղադրել",
"STR_UPDATE":"Թարմացնել",
"STR_UPDATE_TIP":"Թարմացման գործողությունը անվտանգ է, ISO ֆայլերը կմնան անփոփոխ.#@Շարունակել?",
"STR_INSTALL_TIP":"Սկավառակը կձևաչափվի և բոլոր տվյալները կկորչեն.#@Շարունակել?",
"STR_INSTALL_TIP2":"Սկավառակը կձևաչափվի և բոլոր տվյալները կկորչեն:#@Դուք համոզված եք, մաքրել կրիչը? (Double Check)",
"STR_INSTALL_SUCCESS":"Շնորհավորում ենք!#@Ventoy- ը հաջողությամբ տեղադրվել է կրիչում:",
"STR_INSTALL_FAILED":"Տեղադրման ընթացքում տեղի ունեցավ սխալ: Կարող եք նորից միացնել USB- կրիչը և կրկին փորձել: Մանրամասների համար ստուգել log.txt-ը ",
"STR_UPDATE_SUCCESS":"Շնորհավորում ենք!#@Ventoy-ը հաջողությամբ թարմացվեց կրիչում:",
"STR_UPDATE_FAILED":"Թարմացման ընթացքում տեղի ունեցավ սխալ: Կարող եք նորից միացնել USB- կրիչը և կրկին փորձել: Մանրամասների համար ստուգել log.txt-ը ",
"STR_WAIT_PROCESS":"Աշխատանքն ընթանում, խնդրում ենք սպասել...",
"STR_MENU_OPTION":"Ընտրանքներ",
"STR_MENU_SECURE_BOOT":"Secure Boot աջակցություն",
"STR_MENU_PART_CFG":"Partition կազմաձևում",
"STR_BTN_OK":"Այո",
"STR_BTN_CANCEL":"Չեղարկել",
"STR_PRESERVE_SPACE":"Պահպանեք որոշակի տարածք կրիչի վերջում",
"STR_SPACE_VAL_INVALID":"Պահված տարածքի անվավեր արժեք",
"STR_MENU_CLEAR":"Մաքրել Ventoy-ը",
"STR_CLEAR_SUCCESS":"Ventoy-ը հաջողությամբ հեռացված է կրիչից:",
"STR_CLEAR_FAILED":"Ventoy-ը կրիչից մաքրելիս տեղի ունեցավ սխալ: Կարող եք նորից միացնել USB-կրիչը և կրկին փորձել: Մանրամասների համար ստուգել log.txt-ը",
"STR_MENU_PART_STYLE":"Partition-ի տեսակը",
"STR_DISK_2TB_MBR_ERROR":"Խնդրում ենք ընտրել GPT 2TB-ից մեծ կրիչի դեպքում",
"STR_SHOW_ALL_DEV":"Ցուցադրել բոլոր կրիչները",
"STR_PART_ALIGN_4KB":"partition-երը գծանշել 4KB-ով",
"STR_WEB_COMMUNICATION_ERR":"Համակցման սխալ․",
"STR_WEB_REMOTE_ABNORMAL":"Համակցման սխալ․ Հեռահար համակցումն չստացվեց",
"STR_WEB_REQUEST_TIMEOUT":"Համակցման սխալ․: Սպասման ժամանակը սպառվեց",
"STR_WEB_SERVICE_UNAVAILABLE":"Համակցման սխալ․: Ծառայությունը անհասանելի է",
"STR_WEB_TOKEN_MISMATCH":"Թարմացվել է Demon-ի կարգավիճակը, խնդրում եմ նորից փորձել ավելի ուշ:",
"STR_WEB_SERVICE_BUSY":"Ծառայությունը զբաղված է, խնդրում եմ նորից փորձել ավելի ուշ:",
"STR_MENU_VTSI_CREATE":"Ստեղծել VTSI ֆայլ",
"STR_VTSI_CREATE_TIP":"Այս անգամ չի գրվի կրիչի վրա, այլ միայն կստեղծվի VTSI ֆայլ#@Շարունակել?",
"STR_VTSI_CREATE_SUCCESS":"VTSI ֆայլը հաջողությամբ ստեղծվեց!#@Դուք կարող եք օգտագործել Rufus (3.15+) կրիչում ձայնագրելու համար, որպեսզի ավարտեք Ventoy-ի տեղադրումը:",
"STR_VTSI_CREATE_FAILED":"VTSI ֆայլի ստեղծումը ձախողվեց։",
"STRXXX":"" "STRXXX":""
} }
] ]

60
LinuxGUI/EXLIB/README.txt Normal file
View File

@@ -0,0 +1,60 @@
====== ARM64 ======
1. Download CentOS-7-aarch64-Everything-2009.iso from internet.
2. mount CentOS-7-aarch64-Everything-2009.iso /mnt
3. sh prepare_lib_aarch64.sh /mnt/Packages/
====== MIPS64EL ======
1. build dpkg for CentOS7
download dpkg_1.18.25.tar.xz from internet.
cd dpkg-1.18.25
./configure
make
cp -a ./src/dpkg /sbin/
cp -a ./dpkg-deb/dpkg-deb /sbin/
2. download debian 10.x mips64el DVD iso (e.g. debian-10.9.0-mips64el-DVD-1.iso) form internet
3. mount debian-10.9.0-mips64el-DVD-1.iso /mnt
4. sh prepare_gtk_lib_mips64el.sh /mnt/
5. download the following packages from internet and dpkg -x each of them
pool/main/g/gtk+3.0/libgtk-3-dev_3.24.5-1_mips64el.deb
pool/main/b/brotli/libbrotli1_1.0.9-2+b2_mips64el.deb
pool/main/d/double-conversion/libdouble-conversion3_3.1.5-6.1_mips64el.deb
pool/main/d/double-conversion/libdouble-conversion1_3.1.0-3_mips64el.deb
pool/main/libg/libglvnd/libgl1_1.3.2-1~bpo10+2_mips64el.deb
pool/main/libg/libglvnd/libglvnd0_1.3.2-1~bpo10+2_mips64el.deb
pool/main/libg/libglvnd/libglx0_1.3.2-1~bpo10+2_mips64el.deb
pool/main/q/qtbase-opensource-src/libqt5concurrent5_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/libqt5core5a_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/libqt5dbus5_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/libqt5gui5_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/libqt5network5_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/libqt5opengl5_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/libqt5opengl5-dev_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/libqt5widgets5_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/libqt5xml5_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/qt5-qmake_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/qtbase5-dev_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/qtbase5-dev-tools_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/qtbase5-examples_5.11.3+dfsg1-1+deb10u4_mips64el.deb
pool/main/q/qtbase-opensource-src/qtbase5-private-dev_5.11.3+dfsg1-1+deb10u4_mips64el.deb
==== I386 ===
We need a CentOS8 environment
Install CentOS 8 x86_64 system.
yum update
yum install gcc
yum install gcc-c++
yum install gcc.i686
yum install glibc.i686 glibc-devel.i686 glibc-headers.i686 glibc-static.i686 glibc-nss-devel.i686
yum install libstdc++.i686
yum install harfbuzz.i686
yum install zlib.i686
yum install mesa-libGL.i686
pack all /usr /etc directories and extract to /opt/CentOS8/

View File

@@ -0,0 +1,57 @@
gtk3-
qt5
GL
icu
glib2-
pango-
cairo-
gdk-pixbuf2-
libXcursor-
libcap-
pcre-
libffi-
libthai-
fribidi-
libXrender-
libxcb-
pixman-
libpng-
libselinux-
zlib-
libwayland-
wayland-
libglvnd-
elfutils-
libattr-
libX11-
libXi-
libXfixes-
libepoxy-
harfbuzz-
fontconfig-
freetype-
libXinerama-
libXrandr-
libXcomposite-
libXdamage-
libxkbcommon-
libuuid-
libmount-
atk-
libblkid-
graphite2-
libXau-
bzip2-
expat-
libXext-
pcre2-
pcre-
at-spi2-atk
dbus-
dbus-libs
systemd-libs
at-spi2-core
xz-libs
lz4-
libgcrypt-
libgpg-error-

Some files were not shown because too many files have changed in this diff Show More