mirror of
https://github.com/ventoy/Ventoy.git
synced 2025-09-16 17:11:13 +00:00
Compare commits
303 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
3f65f0ef03 | ||
|
4faa5e4344 | ||
|
c7693d4ecd | ||
|
4527e1db79 | ||
|
757cacf274 | ||
|
39703cabb7 | ||
|
854d17a4e9 | ||
|
a326b13fc3 | ||
|
3ff1867a2a | ||
|
7f63a1c327 | ||
|
d617985093 | ||
|
605da1ba94 | ||
|
c8dc36a5c3 | ||
|
689f7df902 | ||
|
a9d53e7448 | ||
|
46061bcd41 | ||
|
01b0de7811 | ||
|
2fee243a56 | ||
|
d0e10f8e48 | ||
|
7ff243f9bb | ||
|
f8811a4656 | ||
|
0ce90ad9b9 | ||
|
5bfddae81d | ||
|
2991f097fb | ||
|
986835338d | ||
|
f2562fecb9 | ||
|
529541f218 | ||
|
430f81ac49 | ||
|
038c0533d9 | ||
|
102b179cd9 | ||
|
6785f5d049 | ||
|
0c812ed5e9 | ||
|
9f2b9b0867 | ||
|
c79b072680 | ||
|
6b4509a550 | ||
|
feea11e2bb | ||
|
35c952d891 | ||
|
82053680bf | ||
|
6d5de12f52 | ||
|
84b2ee7ee3 | ||
|
da1b306e81 | ||
|
0961ce5624 | ||
|
07574f0379 | ||
|
142aa47944 | ||
|
11739fa9d0 | ||
|
9fc85051a7 | ||
|
b9e82bcf16 | ||
|
cff3a01289 | ||
|
0f90149c4e | ||
|
8ef9732931 | ||
|
b32eda4262 | ||
|
e743f7c15f | ||
|
652475f1ef | ||
|
abfc2a6343 | ||
|
e73ac04cb6 | ||
|
8727e63880 | ||
|
2d281d7dee | ||
|
385c806adf | ||
|
e869bc2386 | ||
|
b47aa1abc7 | ||
|
d8698b2194 | ||
|
7fa4724743 | ||
|
2717405a7a | ||
|
d494007df9 | ||
|
bc9e3f641b | ||
|
9f02d37001 | ||
|
fa1461bac7 | ||
|
3d56c3fa17 | ||
|
a7e3d78d14 | ||
|
879a7592bd | ||
|
5a433f49f7 | ||
|
0cce956c54 | ||
|
0b6372857c | ||
|
028663de9a | ||
|
5feb3f7b4b | ||
|
7035787f38 | ||
|
7dd0f509f5 | ||
|
15947caea2 | ||
|
6aeba8f8b4 | ||
|
fd46b2c3c3 | ||
|
e502f4291e | ||
|
9c59c27eff | ||
|
daeb96ce80 | ||
|
b7e878c466 | ||
|
b76ebf5b07 | ||
|
9532776f39 | ||
|
d8e81d41e4 | ||
|
fa3aa3b36f | ||
|
e717d00d53 | ||
|
6bcaf19a1a | ||
|
bcbe8835d4 | ||
|
ed746ce13e | ||
|
07a790fc6a | ||
|
fd393a02fd | ||
|
0501d03dbb | ||
|
c9939a8cfc | ||
|
5067020a61 | ||
|
4f5334026e | ||
|
3e34dd8514 | ||
|
4df793e021 | ||
|
e0132ac4b5 | ||
|
2b3192b098 | ||
|
7ee3a6d9f8 | ||
|
e1d3ca9fc4 | ||
|
8653832551 | ||
|
c308892db0 | ||
|
1300f7f4f1 | ||
|
d9182dbfa4 | ||
|
e988c0dfe2 | ||
|
0714971f8c | ||
|
3c03df31ce | ||
|
e24dacadcd | ||
|
315cabb945 | ||
|
72f25f14fc | ||
|
47e1553d23 | ||
|
9a2a7e83eb | ||
|
5f747148c6 | ||
|
686ed11037 | ||
|
7fe4762faa | ||
|
eac1c35f76 | ||
|
c7dcaa5734 | ||
|
4b17ee30c4 | ||
|
a18aa36c01 | ||
|
1de7489c6d | ||
|
afb3340ce7 | ||
|
fdce4a756a | ||
|
5a7fa0c565 | ||
|
287d77224c | ||
|
c6bd857cbe | ||
|
b4bb6efd3c | ||
|
7386f64ed8 | ||
|
044ca8811d | ||
|
8c6fd872af | ||
|
683101ae1a | ||
|
0e968e266e | ||
|
d94d59583a | ||
|
05bbef63c1 | ||
|
8923d4b8f1 | ||
|
377cd9e468 | ||
|
be78728342 | ||
|
3938fbb351 | ||
|
a2e7afd893 | ||
|
27bb4a1168 | ||
|
b8b8c7bd66 | ||
|
12b51bcf09 | ||
|
911d5dcab9 | ||
|
f597497da6 | ||
|
54bca8c942 | ||
|
6b422ad9c1 | ||
|
925d057883 | ||
|
a377dd6172 | ||
|
4707022ef9 | ||
|
e03c73978a | ||
|
f434d1f5d0 | ||
|
23f8bc8aeb | ||
|
f2016ab899 | ||
|
7acbf7e819 | ||
|
0135bf1934 | ||
|
f2c94bd963 | ||
|
676ae725ae | ||
|
54dd35d277 | ||
|
3e75b2df3b | ||
|
2d1230cba4 | ||
|
309f85fd35 | ||
|
a13d6d9c0e | ||
|
9b7d6cbc3d | ||
|
bf797ceadb | ||
|
cd0c7ca884 | ||
|
201f7cc13c | ||
|
44a3e23740 | ||
|
9c3e1a6880 | ||
|
8a664faa04 | ||
|
398ba9fb56 | ||
|
e7a0c2d359 | ||
|
22ad828df2 | ||
|
83f22173a5 | ||
|
2de7d9ffe0 | ||
|
5c174c4521 | ||
|
c76ece4b74 | ||
|
27eda4d1e7 | ||
|
acf5a84467 | ||
|
c93e406aa5 | ||
|
1b164e74e4 | ||
|
308cb86f83 | ||
|
2ec593d355 | ||
|
594e735b91 | ||
|
6203366040 | ||
|
64f4400305 | ||
|
d00e08e2e1 | ||
|
c6008be394 | ||
|
a5c6859f5f | ||
|
497d4cc991 | ||
|
7e7687afe3 | ||
|
dd3276badf | ||
|
4a06f4a694 | ||
|
c73bf256be | ||
|
21851f7e96 | ||
|
f222f8cac9 | ||
|
40c4825aac | ||
|
dd906e0b16 | ||
|
324f2b927c | ||
|
5797ca3396 | ||
|
b36b322c03 | ||
|
fd7e34b632 | ||
|
e85c02756b | ||
|
c1d68bd787 | ||
|
a35a822723 | ||
|
05137c83e2 | ||
|
8058856182 | ||
|
33b958e112 | ||
|
9eb50a85e4 | ||
|
3cc7e3772e | ||
|
9c8292867f | ||
|
a4053d2d05 | ||
|
5c14ea0a4a | ||
|
194e948cb6 | ||
|
c896c03efe | ||
|
574b4d850c | ||
|
68a98325e6 | ||
|
25b055bb0f | ||
|
bda74cd89b | ||
|
511b8091eb | ||
|
3be4aacd78 | ||
|
2d8b27b172 | ||
|
c174410d35 | ||
|
f83e84f868 | ||
|
a39078b87a | ||
|
2576235f97 | ||
|
ee04af5243 | ||
|
118bedd546 | ||
|
44ff3dd8d4 | ||
|
9da5a6ce65 | ||
|
604b25ec82 | ||
|
0918355035 | ||
|
ce76fd5649 | ||
|
42535f35bc | ||
|
68a9cebe19 | ||
|
cc77c74bf4 | ||
|
ee952e3f69 | ||
|
b11a499939 | ||
|
fdf4693433 | ||
|
ac65c0fb24 | ||
|
ea0afe7c8b | ||
|
f8ca8b13d3 | ||
|
678a2abdf1 | ||
|
e645301713 | ||
|
43b415c032 | ||
|
311d2961ca | ||
|
1d66584190 | ||
|
553c853865 | ||
|
7d90912a09 | ||
|
c2336f555a | ||
|
87391e8b32 | ||
|
f9c56c6686 | ||
|
1ab1799b72 | ||
|
4a42bdfce7 | ||
|
3f09fb9a23 | ||
|
c87ad1d734 | ||
|
5590208885 | ||
|
09a6d33d62 | ||
|
9852252aba | ||
|
0585d83a8f | ||
|
ebe0b7d282 | ||
|
261ddcef45 | ||
|
ebc5e2e993 | ||
|
d58bd8c3f7 | ||
|
17f9e2fd09 | ||
|
6b22a6200e | ||
|
860dce6683 | ||
|
7fc72d5ce6 | ||
|
b7c3cbd23b | ||
|
3de97bdf44 | ||
|
e79dc57ebe | ||
|
7bf85a1ef8 | ||
|
a5e0641226 | ||
|
2c65eec9ec | ||
|
0c310c5bd8 | ||
|
c81b49807b | ||
|
085e20f64d | ||
|
ff3ce4da66 | ||
|
81d3492a61 | ||
|
635b1a1c6c | ||
|
10b80f2690 | ||
|
36c21a21e4 | ||
|
13eb9829fa | ||
|
88f77c01e4 | ||
|
11b30dab5f | ||
|
fb729146de | ||
|
92bd6733dd | ||
|
9e28dd1394 | ||
|
4100e7a886 | ||
|
a4f5ce2c9e | ||
|
c7967ea476 | ||
|
3e7f1ca764 | ||
|
1bc18295ae | ||
|
b4f1f11742 | ||
|
20010c5e88 | ||
|
1de18e43c5 | ||
|
15299d4d87 | ||
|
5d6d6df39b | ||
|
096cc99c3c | ||
|
602e8c7fdf | ||
|
da35a99f7c |
12
.github/ISSUE_TEMPLATE/issue_template.yml
vendored
12
.github/ISSUE_TEMPLATE/issue_template.yml
vendored
@@ -21,7 +21,7 @@ body:
|
||||
attributes:
|
||||
label: Ventoy Version
|
||||
description: What version of ventoy are you running?
|
||||
placeholder: 1.0.78
|
||||
placeholder: 1.0.96
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
@@ -34,6 +34,16 @@ body:
|
||||
- No. I didn't try the latest release.
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: alternativemode
|
||||
attributes:
|
||||
label: Try alternative boot mode
|
||||
description: Have you tried alternative boot mode? (wimboot mode for Windows/WinPE, grub2 mode for linux)
|
||||
options:
|
||||
- Yes. I have tried them, but the bug still exist.
|
||||
- No. I didn't try these alternative boot modes.
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: bios
|
||||
attributes:
|
||||
|
@@ -85,7 +85,7 @@ body:
|
||||
- type: input
|
||||
id: testenv
|
||||
attributes:
|
||||
label: Test envrionment
|
||||
label: Test environment
|
||||
description: The manufacturer/model and other details about your computer (or VM).
|
||||
placeholder: Lenovo Thinkpad T420 laptop
|
||||
validations:
|
||||
|
12
.github/workflows/ci.yml
vendored
12
.github/workflows/ci.yml
vendored
@@ -12,26 +12,26 @@ jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v3
|
||||
- name: Run docker-compose up
|
||||
run: docker-compose up
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ventoy-windows
|
||||
path: INSTALL/ventoy-*windows*
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ventoy-linux
|
||||
path: INSTALL/ventoy-*linux*
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: ventoy-livecd
|
||||
path: INSTALL/ventoy-*livecd*
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: SHA256SUM
|
||||
path: INSTALL/sha256.txt
|
||||
- uses: actions/upload-artifact@v2
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: xxx-build-log
|
||||
path: DOC/build.log
|
||||
|
7
DMPATCH/Makefile_IBT
Normal file
7
DMPATCH/Makefile_IBT
Normal file
@@ -0,0 +1,7 @@
|
||||
|
||||
obj-m += dm_patch_ibt.o
|
||||
|
||||
EXTRA_CFLAGS := -Wall -DVTOY_IBT -fcf-protection=branch -mindirect-branch-register
|
||||
|
||||
dm_patch_ibt-objs := dmpatch.o
|
||||
|
@@ -51,7 +51,12 @@ typedef struct ko_param
|
||||
unsigned long sym_get_size;
|
||||
unsigned long sym_put_addr;
|
||||
unsigned long sym_put_size;
|
||||
unsigned long padding[3];
|
||||
unsigned long kv_major;
|
||||
unsigned long ibt;
|
||||
unsigned long kv_minor;
|
||||
unsigned long blkdev_get_addr;
|
||||
unsigned long blkdev_put_addr;
|
||||
unsigned long padding[1];
|
||||
}ko_param;
|
||||
|
||||
#pragma pack()
|
||||
@@ -69,38 +74,158 @@ static volatile ko_param g_ko_param =
|
||||
};
|
||||
|
||||
#if defined(CONFIG_X86_64)
|
||||
#define PATCH_OP_POS 3
|
||||
#define CODE_MATCH(code, i) \
|
||||
#define PATCH_OP_POS1 3
|
||||
#define CODE_MATCH1(code, i) \
|
||||
(code[i] == 0x40 && code[i + 1] == 0x80 && code[i + 2] == 0xce && code[i + 3] == 0x80)
|
||||
|
||||
#define PATCH_OP_POS2 1
|
||||
#define CODE_MATCH2(code, i) \
|
||||
(code[i] == 0x0C && code[i + 1] == 0x80 && code[i + 2] == 0x89 && code[i + 3] == 0xC6)
|
||||
|
||||
#define PATCH_OP_POS3 4
|
||||
#define CODE_MATCH3(code, i) \
|
||||
(code[i] == 0x44 && code[i + 1] == 0x89 && code[i + 2] == 0xe8 && code[i + 3] == 0x0c && code[i + 4] == 0x80)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#elif defined(CONFIG_X86_32)
|
||||
#define PATCH_OP_POS 2
|
||||
#define CODE_MATCH(code, i) \
|
||||
#define PATCH_OP_POS1 2
|
||||
#define CODE_MATCH1(code, i) \
|
||||
(code[i] == 0x80 && code[i + 1] == 0xca && code[i + 2] == 0x80 && code[i + 3] == 0xe8)
|
||||
|
||||
#define PATCH_OP_POS2 PATCH_OP_POS1
|
||||
#define CODE_MATCH2 CODE_MATCH1
|
||||
#define PATCH_OP_POS3 PATCH_OP_POS1
|
||||
#define CODE_MATCH3 CODE_MATCH1
|
||||
|
||||
|
||||
#else
|
||||
#error "unsupported arch"
|
||||
#endif
|
||||
|
||||
#ifdef VTOY_IBT
|
||||
#ifdef CONFIG_X86_64
|
||||
/* Using 64-bit values saves one instruction clearing the high half of low */
|
||||
#define DECLARE_ARGS(val, low, high) unsigned long low, high
|
||||
#define EAX_EDX_VAL(val, low, high) ((low) | (high) << 32)
|
||||
#define EAX_EDX_RET(val, low, high) "=a" (low), "=d" (high)
|
||||
#else
|
||||
#define DECLARE_ARGS(val, low, high) unsigned long long val
|
||||
#define EAX_EDX_VAL(val, low, high) (val)
|
||||
#define EAX_EDX_RET(val, low, high) "=A" (val)
|
||||
#endif
|
||||
|
||||
#define EX_TYPE_WRMSR 8
|
||||
#define EX_TYPE_RDMSR 9
|
||||
#define MSR_IA32_S_CET 0x000006a2 /* kernel mode cet */
|
||||
#define CET_ENDBR_EN (1ULL << 2)
|
||||
|
||||
/* Exception table entry */
|
||||
#ifdef __ASSEMBLY__
|
||||
|
||||
#define _ASM_EXTABLE_TYPE(from, to, type) \
|
||||
.pushsection "__ex_table","a" ; \
|
||||
.balign 4 ; \
|
||||
.long (from) - . ; \
|
||||
.long (to) - . ; \
|
||||
.long type ; \
|
||||
.popsection
|
||||
|
||||
#else /* ! __ASSEMBLY__ */
|
||||
|
||||
#define _ASM_EXTABLE_TYPE(from, to, type) \
|
||||
" .pushsection \"__ex_table\",\"a\"\n" \
|
||||
" .balign 4\n" \
|
||||
" .long (" #from ") - .\n" \
|
||||
" .long (" #to ") - .\n" \
|
||||
" .long " __stringify(type) " \n" \
|
||||
" .popsection\n"
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* VTOY_IBT */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define vdebug(fmt, args...) if(kprintf) kprintf(KERN_ERR fmt, ##args)
|
||||
|
||||
static int notrace dmpatch_replace_code(unsigned long addr, unsigned long size, int expect, const char *desc)
|
||||
static unsigned int g_claim_ptr = 0;
|
||||
static unsigned char *g_get_patch[MAX_PATCH] = { NULL };
|
||||
static unsigned char *g_put_patch[MAX_PATCH] = { NULL };
|
||||
|
||||
static void notrace dmpatch_restore_code(int bytes, unsigned char *opCode, unsigned int code)
|
||||
{
|
||||
unsigned long align;
|
||||
|
||||
if (opCode)
|
||||
{
|
||||
align = (unsigned long)opCode / g_ko_param.pgsize * g_ko_param.pgsize;
|
||||
set_mem_rw(align, 1);
|
||||
if (bytes == 1)
|
||||
{
|
||||
*opCode = (unsigned char)code;
|
||||
}
|
||||
else
|
||||
{
|
||||
*(unsigned int *)opCode = code;
|
||||
}
|
||||
set_mem_ro(align, 1);
|
||||
}
|
||||
}
|
||||
|
||||
static int notrace dmpatch_replace_code
|
||||
(
|
||||
int style,
|
||||
unsigned long addr,
|
||||
unsigned long size,
|
||||
int expect,
|
||||
const char *desc,
|
||||
unsigned char **patch
|
||||
)
|
||||
{
|
||||
int i = 0;
|
||||
int cnt = 0;
|
||||
unsigned long align;
|
||||
unsigned char *patch[MAX_PATCH];
|
||||
unsigned char *opCode = (unsigned char *)addr;
|
||||
|
||||
vdebug("patch for %s 0x%lx %d\n", desc, addr, (int)size);
|
||||
vdebug("patch for %s style[%d] 0x%lx %d\n", desc, style, addr, (int)size);
|
||||
|
||||
for (i = 0; i < (int)size - 4; i++)
|
||||
for (i = 0; i < (int)size - 8; i++)
|
||||
{
|
||||
if (CODE_MATCH(opCode, i) && cnt < MAX_PATCH)
|
||||
if (style == 1)
|
||||
{
|
||||
patch[cnt] = opCode + i + PATCH_OP_POS;
|
||||
cnt++;
|
||||
if (CODE_MATCH1(opCode, i) && cnt < MAX_PATCH)
|
||||
{
|
||||
patch[cnt] = opCode + i + PATCH_OP_POS1;
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
else if (style == 2)
|
||||
{
|
||||
if (CODE_MATCH2(opCode, i) && cnt < MAX_PATCH)
|
||||
{
|
||||
patch[cnt] = opCode + i + PATCH_OP_POS2;
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
else if (style == 3)
|
||||
{
|
||||
if (CODE_MATCH3(opCode, i) && cnt < MAX_PATCH)
|
||||
{
|
||||
patch[cnt] = opCode + i + PATCH_OP_POS3;
|
||||
cnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if (cnt != expect || cnt >= MAX_PATCH)
|
||||
{
|
||||
vdebug("patch error: cnt=%d expect=%d\n", cnt, expect);
|
||||
@@ -121,14 +246,185 @@ static int notrace dmpatch_replace_code(unsigned long addr, unsigned long size,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned long dmpatch_find_call_offset(unsigned long addr, unsigned long size, unsigned long func)
|
||||
{
|
||||
unsigned long i = 0;
|
||||
unsigned long dest;
|
||||
unsigned char *opCode = NULL;
|
||||
unsigned char aucOffset[8] = { 0, 0, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF };
|
||||
|
||||
opCode = (unsigned char *)addr;
|
||||
|
||||
for (i = 0; i + 4 < size; i++)
|
||||
{
|
||||
if (opCode[i] == 0xE8)
|
||||
{
|
||||
aucOffset[0] = opCode[i + 1];
|
||||
aucOffset[1] = opCode[i + 2];
|
||||
aucOffset[2] = opCode[i + 3];
|
||||
aucOffset[3] = opCode[i + 4];
|
||||
|
||||
dest = addr + i + 5 + *(unsigned long *)aucOffset;
|
||||
if (dest == func)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int dmpatch_patch_claim_ptr(void)
|
||||
{
|
||||
unsigned long i = 0;
|
||||
unsigned long t = 0;
|
||||
unsigned long offset1;
|
||||
unsigned long offset2;
|
||||
unsigned long align;
|
||||
unsigned char *opCode = NULL;
|
||||
|
||||
vdebug("Get addr: 0x%lx %lu 0x%lx\n", g_ko_param.sym_get_addr, g_ko_param.sym_get_size, g_ko_param.blkdev_get_addr);
|
||||
vdebug("Put addr: 0x%lx %lu 0x%lx\n", g_ko_param.sym_put_addr, g_ko_param.sym_put_size, g_ko_param.blkdev_put_addr);
|
||||
|
||||
opCode = (unsigned char *)g_ko_param.sym_get_addr;
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
vdebug("%02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
|
||||
opCode[i + 0], opCode[i + 1], opCode[i + 2], opCode[i + 3],
|
||||
opCode[i + 4], opCode[i + 5], opCode[i + 6], opCode[i + 7],
|
||||
opCode[i + 8], opCode[i + 9], opCode[i + 10], opCode[i + 11],
|
||||
opCode[i + 12], opCode[i + 13], opCode[i + 14], opCode[i + 15]);
|
||||
}
|
||||
|
||||
offset1 = dmpatch_find_call_offset(g_ko_param.sym_get_addr, g_ko_param.sym_get_size, g_ko_param.blkdev_get_addr);
|
||||
offset2 = dmpatch_find_call_offset(g_ko_param.sym_put_addr, g_ko_param.sym_put_size, g_ko_param.blkdev_put_addr);
|
||||
if (offset1 == 0 || offset2 == 0)
|
||||
{
|
||||
vdebug("call blkdev_get or blkdev_put Not found, %lu %lu\n", offset1, offset2);
|
||||
return 1;
|
||||
}
|
||||
vdebug("call addr1:0x%lx call addr2:0x%lx\n",
|
||||
g_ko_param.sym_get_addr + offset1,
|
||||
g_ko_param.sym_put_addr + offset2);
|
||||
|
||||
opCode = (unsigned char *)g_ko_param.sym_get_addr;
|
||||
for (i = offset1 - 1, t = 0; (i > 0) && (t < 24); i--, t++)
|
||||
{
|
||||
/* rdx */
|
||||
if (opCode[i] == 0x48 && opCode[i + 1] == 0xc7 && opCode[i + 2] == 0xc2)
|
||||
{
|
||||
g_claim_ptr = *(unsigned int *)(opCode + i + 3);
|
||||
g_get_patch[0] = opCode + i + 3;
|
||||
vdebug("claim_ptr(%08X) found at get addr 0x%lx\n", g_claim_ptr, g_ko_param.sym_get_addr + i + 3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (g_claim_ptr == 0)
|
||||
{
|
||||
vdebug("Claim_ptr not found in get\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
opCode = (unsigned char *)g_ko_param.sym_put_addr;
|
||||
for (i = offset2 - 1, t = 0; (i > 0) && (t < 24); i--, t++)
|
||||
{
|
||||
/* rsi */
|
||||
if (opCode[i] == 0x48 && opCode[i + 1] == 0xc7 && opCode[i + 2] == 0xc6)
|
||||
{
|
||||
if (*(unsigned int *)(opCode + i + 3) == g_claim_ptr)
|
||||
{
|
||||
vdebug("claim_ptr found at put addr 0x%lx\n", g_ko_param.sym_put_addr + i + 3);
|
||||
g_put_patch[0] = opCode + i + 3;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (g_put_patch[0] == 0)
|
||||
{
|
||||
vdebug("Claim_ptr not found in put\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
align = (unsigned long)g_get_patch[0] / g_ko_param.pgsize * g_ko_param.pgsize;
|
||||
set_mem_rw(align, 1);
|
||||
*(unsigned int *)(g_get_patch[0]) = 0;
|
||||
set_mem_ro(align, 1);
|
||||
|
||||
align = (unsigned long)g_put_patch[0] / g_ko_param.pgsize * g_ko_param.pgsize;
|
||||
set_mem_rw(align, 1);
|
||||
*(unsigned int *)(g_put_patch[0]) = 0;
|
||||
set_mem_ro(align, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef VTOY_IBT
|
||||
static __always_inline unsigned long long dmpatch_rdmsr(unsigned int msr)
|
||||
{
|
||||
DECLARE_ARGS(val, low, high);
|
||||
|
||||
asm volatile("1: rdmsr\n"
|
||||
"2:\n"
|
||||
_ASM_EXTABLE_TYPE(1b, 2b, EX_TYPE_RDMSR)
|
||||
: EAX_EDX_RET(val, low, high) : "c" (msr));
|
||||
|
||||
return EAX_EDX_VAL(val, low, high);
|
||||
}
|
||||
|
||||
static __always_inline void dmpatch_wrmsr(unsigned int msr, u32 low, u32 high)
|
||||
{
|
||||
asm volatile("1: wrmsr\n"
|
||||
"2:\n"
|
||||
_ASM_EXTABLE_TYPE(1b, 2b, EX_TYPE_WRMSR)
|
||||
: : "c" (msr), "a"(low), "d" (high) : "memory");
|
||||
}
|
||||
|
||||
static u64 dmpatch_ibt_save(void)
|
||||
{
|
||||
u64 msr = 0;
|
||||
u64 val = 0;
|
||||
|
||||
msr = dmpatch_rdmsr(MSR_IA32_S_CET);
|
||||
val = msr & ~CET_ENDBR_EN;
|
||||
dmpatch_wrmsr(MSR_IA32_S_CET, (u32)(val & 0xffffffffULL), (u32)(val >> 32));
|
||||
|
||||
return msr;
|
||||
}
|
||||
|
||||
static void dmpatch_ibt_restore(u64 save)
|
||||
{
|
||||
u64 msr;
|
||||
|
||||
msr = dmpatch_rdmsr(MSR_IA32_S_CET);
|
||||
|
||||
msr &= ~CET_ENDBR_EN;
|
||||
msr |= (save & CET_ENDBR_EN);
|
||||
|
||||
dmpatch_wrmsr(MSR_IA32_S_CET, (u32)(msr & 0xffffffffULL), (u32)(msr >> 32));
|
||||
}
|
||||
#else
|
||||
static u64 dmpatch_ibt_save(void) { return 0; }
|
||||
static void dmpatch_ibt_restore(u64 save) { (void)save; }
|
||||
#endif
|
||||
|
||||
static int notrace dmpatch_init(void)
|
||||
{
|
||||
int r = 0;
|
||||
int rc = 0;
|
||||
|
||||
u64 msr = 0;
|
||||
|
||||
if (g_ko_param.ibt == 0x8888)
|
||||
{
|
||||
msr = dmpatch_ibt_save();
|
||||
}
|
||||
|
||||
kprintf = (printk_pf)(g_ko_param.printk_addr);
|
||||
|
||||
vdebug("dmpatch_init start pagesize=%lu ...\n", g_ko_param.pgsize);
|
||||
vdebug("dmpatch_init start pagesize=%lu kernel=%lu.%lu ...\n",
|
||||
g_ko_param.pgsize, g_ko_param.kv_major, g_ko_param.kv_minor);
|
||||
|
||||
if (g_ko_param.struct_size != sizeof(ko_param))
|
||||
{
|
||||
@@ -147,7 +443,27 @@ static int notrace dmpatch_init(void)
|
||||
reg_kprobe = (kprobe_reg_pf)g_ko_param.reg_kprobe_addr;
|
||||
unreg_kprobe = (kprobe_unreg_pf)g_ko_param.unreg_kprobe_addr;
|
||||
|
||||
r = dmpatch_replace_code(g_ko_param.sym_get_addr, g_ko_param.sym_get_size, 2, "dm_get_table_device");
|
||||
if (g_ko_param.kv_major > 6 || (g_ko_param.kv_major == 6 && g_ko_param.kv_minor >= 5))
|
||||
{
|
||||
vdebug("new interface patch dm_get_table_device...\n");
|
||||
r = dmpatch_patch_claim_ptr();
|
||||
}
|
||||
else
|
||||
{
|
||||
r = dmpatch_replace_code(1, g_ko_param.sym_get_addr, g_ko_param.sym_get_size, 2, "dm_get_table_device", g_get_patch);
|
||||
if (r && g_ko_param.kv_major >= 5)
|
||||
{
|
||||
vdebug("new2 patch dm_get_table_device...\n");
|
||||
r = dmpatch_replace_code(2, g_ko_param.sym_get_addr, g_ko_param.sym_get_size, 1, "dm_get_table_device", g_get_patch);
|
||||
}
|
||||
|
||||
if (r && g_ko_param.kv_major >= 5)
|
||||
{
|
||||
vdebug("new3 patch dm_get_table_device...\n");
|
||||
r = dmpatch_replace_code(3, g_ko_param.sym_get_addr, g_ko_param.sym_get_size, 1, "dm_get_table_device", g_get_patch);
|
||||
}
|
||||
}
|
||||
|
||||
if (r)
|
||||
{
|
||||
rc = -EINVAL;
|
||||
@@ -155,7 +471,14 @@ static int notrace dmpatch_init(void)
|
||||
}
|
||||
vdebug("patch dm_get_table_device success\n");
|
||||
|
||||
r = dmpatch_replace_code(g_ko_param.sym_put_addr, g_ko_param.sym_put_size, 1, "dm_put_table_device");
|
||||
if (g_ko_param.kv_major >= 6 && g_ko_param.kv_minor >= 5)
|
||||
{
|
||||
r = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = dmpatch_replace_code(1, g_ko_param.sym_put_addr, g_ko_param.sym_put_size, 1, "dm_put_table_device", g_put_patch);
|
||||
}
|
||||
if (r)
|
||||
{
|
||||
rc = -EINVAL;
|
||||
@@ -167,6 +490,11 @@ static int notrace dmpatch_init(void)
|
||||
vdebug("######## dm patch success ###########\n");
|
||||
vdebug("#####################################\n");
|
||||
|
||||
if (g_ko_param.ibt == 0x8888)
|
||||
{
|
||||
dmpatch_ibt_restore(msr);
|
||||
}
|
||||
|
||||
out:
|
||||
|
||||
return rc;
|
||||
@@ -174,7 +502,34 @@ out:
|
||||
|
||||
static void notrace dmpatch_exit(void)
|
||||
{
|
||||
int i = 0;
|
||||
u64 msr;
|
||||
|
||||
if (g_ko_param.ibt == 0x8888)
|
||||
{
|
||||
msr = dmpatch_ibt_save();
|
||||
}
|
||||
|
||||
if (g_claim_ptr)
|
||||
{
|
||||
dmpatch_restore_code(4, g_get_patch[0], g_claim_ptr);
|
||||
dmpatch_restore_code(4, g_put_patch[0], g_claim_ptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < MAX_PATCH; i++)
|
||||
{
|
||||
dmpatch_restore_code(1, g_get_patch[i], 0x80);
|
||||
dmpatch_restore_code(1, g_put_patch[i], 0x80);
|
||||
}
|
||||
}
|
||||
|
||||
vdebug("dmpatch_exit success\n");
|
||||
|
||||
if (g_ko_param.ibt == 0x8888)
|
||||
{
|
||||
dmpatch_ibt_restore(msr);
|
||||
}
|
||||
}
|
||||
|
||||
module_init(dmpatch_init);
|
||||
|
@@ -1,10 +1,12 @@
|
||||
1. install ubuntu 21.10
|
||||
2. apt-get install build-essential flex libncurses-dev linux-headers-generic linux-source libssl-dev ...... and so on
|
||||
3. cp /lib/modules/5.13.0-23-generic/build/Module.symvers ./
|
||||
4. /boot/config-5.13.0-23-generic as .config make oldconfig
|
||||
1. install ubuntu 22.04 5.15.0-25
|
||||
2. apt-get install build-essential flex libncurses-dev linux-headers-generic linux-source libssl-dev bison yacc vim libelf-dev ...... and so on
|
||||
3. cp /lib/modules/5.15.0-25-generic/build/Module.symvers ./
|
||||
4. /boot/config-5.15.0-25-generic as .config make oldconfig
|
||||
5. make menuconfig
|
||||
1. close CONFIG_STACKPROTECTOR
|
||||
2. close CONFIG_RETPOLINE
|
||||
3. close CONFIG_UBSAN_BOUNDS
|
||||
4. close CONFIG_UBSAN_ENUM
|
||||
|
||||
6. modify ./scripts/mod/modpost.c
|
||||
1. skip add_srcversion (just return)
|
||||
|
65
DMPATCH/ubuntu_build.sh
Normal file
65
DMPATCH/ubuntu_build.sh
Normal file
@@ -0,0 +1,65 @@
|
||||
#!/bin/bash
|
||||
|
||||
FTPIP=192.168.44.1
|
||||
FTPUSR='a:a'
|
||||
|
||||
rm -f dmpatch.c Makefile Makefile_IBT
|
||||
|
||||
for f in dmpatch.c Makefile Makefile_IBT; do
|
||||
curl -s -u $FTPUSR ftp://$FTPIP/$f -o $f
|
||||
if [ -f $f ]; then
|
||||
echo "download $f OK ..."
|
||||
else
|
||||
echo "download $f FAILED ..."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
|
||||
rm -f *.ko
|
||||
|
||||
|
||||
echo "build dm_patch.ko ..."
|
||||
rm -rf ./aa
|
||||
mkdir ./aa
|
||||
|
||||
cp -a *.c aa/
|
||||
cp -a Makefile aa/
|
||||
|
||||
cd /home/panda/linux-source-5.15.0
|
||||
make modules M=/home/panda/build/aa/
|
||||
strip --strip-debug /home/panda/build/aa/dm_patch.ko
|
||||
cd -
|
||||
|
||||
cp -a aa/dm_patch.ko ./
|
||||
|
||||
|
||||
|
||||
echo "build dm_patch_ibt.ko ..."
|
||||
rm -rf ./aa
|
||||
mkdir ./aa
|
||||
|
||||
cp -a *.c aa/
|
||||
cp -a Makefile_IBT aa/Makefile
|
||||
|
||||
cd /home/panda/linux-source-5.15.0
|
||||
make modules M=/home/panda/build/aa/
|
||||
strip --strip-debug /home/panda/build/aa/dm_patch_ibt.ko
|
||||
cd -
|
||||
|
||||
cp -a aa/dm_patch_ibt.ko ./
|
||||
|
||||
rm -rf ./aa
|
||||
|
||||
|
||||
curl -s -T dm_patch.ko -u $FTPUSR ftp://$FTPIP/dm_patch_64.ko || exit 1
|
||||
curl -s -T dm_patch_ibt.ko -u $FTPUSR ftp://$FTPIP/dm_patch_ibt_64.ko || exit 1
|
||||
|
||||
|
||||
if [ -f ./dm_patch.ko -a -f ./dm_patch_ibt.ko ]; then
|
||||
echo -e "\n\n=============== SUCCESS =============\n\n"
|
||||
else
|
||||
echo -e "\n\n=============== FAILED ==============\n\n"
|
||||
fi
|
||||
|
@@ -5,7 +5,7 @@ use an old version of dmsetup
|
||||
http://vault.centos.org/5.3/os/SRPMS/device-mapper-1.02.28-2.el5.src.rpm
|
||||
https://www.fefe.de/dietlibc/dietlibc-0.34.tar.xz
|
||||
|
||||
======== Build Envrioment ========
|
||||
======== Build Environment ========
|
||||
build for 32bit, static linked with dietlibc
|
||||
1. install centos 6.10 i386 with CentOS-6.10-i386-bin-DVD1.iso
|
||||
2. yum install gcc kernel-devel package
|
||||
|
@@ -1,8 +1,8 @@
|
||||
|
||||
==========================================
|
||||
1. Compile Enviroment
|
||||
1. Compile Environment
|
||||
==========================================
|
||||
My build envrioment is CentOS 7.8 x86_64. So here I first explain how to create the build environment from scratch.
|
||||
My build environment is CentOS 7.8 x86_64. So here I first explain how to create the build environment from scratch.
|
||||
Because Ventoy is based on many open source projects, so the environment is important. I suggest you test it on a virtual machine firstly.
|
||||
|
||||
1.1 Install CentOS 7.8
|
||||
@@ -34,7 +34,7 @@
|
||||
https://codeload.github.com/libfuse/libfuse/zip/fuse-2.9.9 ===> /home/Ventoy-master/ExFAT/libfuse-fuse-2.9.9.zip
|
||||
https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/aarch64-linux-gnu/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz ===> /opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz
|
||||
https://toolchains.bootlin.com/downloads/releases/toolchains/aarch64/tarballs/aarch64--uclibc--stable-2020.08-1.tar.bz2 ===> /opt/aarch64--uclibc--stable-2020.08-1.tar.bz2
|
||||
http://ftp.loongnix.org/toolchain/gcc/release/mips-loongson-gcc7.3-2019.06-29-linux-gnu.tar.gz ===> /opt/mips-loongson-gcc7.3-2019.06-29-linux-gnu.tar.gz
|
||||
http://ftp.loongnix.cn/toolchain/gcc/release/mips/gcc7/mips-loongson-gcc7.3-2019.06-29-linux-gnu.tar.gz ===> /opt/mips-loongson-gcc7.3-2019.06-29-linux-gnu.tar.gz
|
||||
https://github.com/ventoy/musl-cross-make/releases/download/latest/output.tar.bz2 ===> /opt/output.tar.bz2
|
||||
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
mv /opt/output /opt/mips64el-linux-musl-gcc730
|
||||
|
||||
|
||||
2.4 Set PATH envrioment
|
||||
2.4 Set PATH environment
|
||||
export PATH=$PATH:/opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin:/opt/aarch64--uclibc--stable-2020.08-1/bin:/opt/mips64el-linux-musl-gcc730/bin
|
||||
better to add this line to /root/.bashrc and relogin as root
|
||||
|
||||
|
@@ -1491,6 +1491,34 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File, B
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
STATIC BOOLEAN EFIAPI ventoy_replace_name_match(CHAR8 *pReplace, CHAR8 *pName)
|
||||
{
|
||||
UINTN Len1, Len2;
|
||||
|
||||
Len1 = AsciiStrLen(pReplace);
|
||||
Len2 = AsciiStrLen(pName);
|
||||
|
||||
if (Len1 == 0 || Len2 == 0)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (0 == AsciiStriCmp(pReplace, pName))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (Len1 > 2 && Len2 > 2)
|
||||
{
|
||||
if ((pReplace[0] != '\\') && (pName[0] == '\\') && (0 == AsciiStriCmp(pReplace, pName + 1)))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
||||
(
|
||||
EFI_FILE_HANDLE This,
|
||||
@@ -1534,7 +1562,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
||||
AsciiSPrint(TmpName, sizeof(TmpName), "%s", Name);
|
||||
for (j = 0; j < 4; j++)
|
||||
{
|
||||
if (0 == AsciiStriCmp(g_file_replace_list[i].old_file_name[j], TmpName))
|
||||
if (ventoy_replace_name_match(g_file_replace_list[i].old_file_name[j], TmpName))
|
||||
{
|
||||
g_original_fclose(*New);
|
||||
*New = &g_efi_file_replace.WrapperHandle;
|
||||
|
@@ -1533,7 +1533,7 @@ module = {
|
||||
name = squash4;
|
||||
common = fs/squash4.c;
|
||||
cflags = '$(CFLAGS_POSIX) -Wno-undef';
|
||||
cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/xzembed -I$(srcdir)/lib/minilzo -DMINILZO_HAVE_CONFIG_H';
|
||||
cppflags = '-I$(srcdir)/lib/posix_wrap -I$(srcdir)/lib/xzembed -I$(srcdir)/lib/minilzo -I$(srcdir)/lib/zstd -DMINILZO_HAVE_CONFIG_H';
|
||||
};
|
||||
|
||||
module = {
|
||||
|
@@ -260,6 +260,7 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
|
||||
grub_file_t file;
|
||||
grub_err_t err;
|
||||
unsigned j;
|
||||
int vlnk = 0;
|
||||
file = grub_file_open (args[i], GRUB_FILE_TYPE_TO_HASH
|
||||
| (!uncompress ? GRUB_FILE_TYPE_NO_DECOMPRESS
|
||||
: GRUB_FILE_TYPE_NONE));
|
||||
@@ -272,6 +273,7 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
|
||||
unread++;
|
||||
continue;
|
||||
}
|
||||
vlnk = file->vlnk;
|
||||
err = hash_file (file, hash, result);
|
||||
grub_file_close (file);
|
||||
if (err)
|
||||
@@ -288,7 +290,7 @@ grub_cmd_hashsum (struct grub_extcmd_context *ctxt,
|
||||
grub_printf ("%02x", ((grub_uint8_t *) result)[j]);
|
||||
len += grub_snprintf(hashsum + len, sizeof(hashsum) - len, "%02x", ((grub_uint8_t *) result)[j]);
|
||||
}
|
||||
grub_printf (" %s\n", args[i]);
|
||||
grub_printf (" %s\n", vlnk ? grub_file_get_vlnk(args[i], NULL) : args[i]);
|
||||
grub_env_set("VT_LAST_CHECK_SUM", hashsum);
|
||||
}
|
||||
|
||||
|
@@ -229,6 +229,13 @@ test_parse (char **args, int *argn, int argc)
|
||||
(*argn) += 3;
|
||||
continue;
|
||||
}
|
||||
if (grub_strcmp (args[*argn + 1], "-EQ") == 0)
|
||||
{
|
||||
update_val (grub_strtoull (args[*argn], 0, 0)
|
||||
== grub_strtoull (args[*argn + 2], 0, 0), &ctx);
|
||||
(*argn) += 3;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (grub_strcmp (args[*argn + 1], "-ge") == 0)
|
||||
{
|
||||
@@ -237,6 +244,13 @@ test_parse (char **args, int *argn, int argc)
|
||||
(*argn) += 3;
|
||||
continue;
|
||||
}
|
||||
if (grub_strcmp (args[*argn + 1], "-GE") == 0)
|
||||
{
|
||||
update_val (grub_strtoull (args[*argn], 0, 0)
|
||||
>= grub_strtoull (args[*argn + 2], 0, 0), &ctx);
|
||||
(*argn) += 3;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (grub_strcmp (args[*argn + 1], "-gt") == 0)
|
||||
{
|
||||
@@ -245,6 +259,13 @@ test_parse (char **args, int *argn, int argc)
|
||||
(*argn) += 3;
|
||||
continue;
|
||||
}
|
||||
if (grub_strcmp (args[*argn + 1], "-GT") == 0)
|
||||
{
|
||||
update_val (grub_strtoull (args[*argn], 0, 0)
|
||||
> grub_strtoull (args[*argn + 2], 0, 0), &ctx);
|
||||
(*argn) += 3;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (grub_strcmp (args[*argn + 1], "-le") == 0)
|
||||
{
|
||||
@@ -253,6 +274,13 @@ test_parse (char **args, int *argn, int argc)
|
||||
(*argn) += 3;
|
||||
continue;
|
||||
}
|
||||
if (grub_strcmp (args[*argn + 1], "-LE") == 0)
|
||||
{
|
||||
update_val (grub_strtoull (args[*argn], 0, 0)
|
||||
<= grub_strtoull (args[*argn + 2], 0, 0), &ctx);
|
||||
(*argn) += 3;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (grub_strcmp (args[*argn + 1], "-lt") == 0)
|
||||
{
|
||||
@@ -261,6 +289,13 @@ test_parse (char **args, int *argn, int argc)
|
||||
(*argn) += 3;
|
||||
continue;
|
||||
}
|
||||
if (grub_strcmp (args[*argn + 1], "-LT") == 0)
|
||||
{
|
||||
update_val (grub_strtoull (args[*argn], 0, 0)
|
||||
< grub_strtoull (args[*argn + 2], 0, 0), &ctx);
|
||||
(*argn) += 3;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (grub_strcmp (args[*argn + 1], "-ne") == 0)
|
||||
{
|
||||
@@ -269,6 +304,13 @@ test_parse (char **args, int *argn, int argc)
|
||||
(*argn) += 3;
|
||||
continue;
|
||||
}
|
||||
if (grub_strcmp (args[*argn + 1], "-NE") == 0)
|
||||
{
|
||||
update_val (grub_strtoull (args[*argn], 0, 0)
|
||||
!= grub_strtoull (args[*argn + 2], 0, 0), &ctx);
|
||||
(*argn) += 3;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* GRUB extension: compare numbers skipping prefixes.
|
||||
Useful for comparing versions. E.g. vmlinuz-2 -plt vmlinuz-11. */
|
||||
|
@@ -889,6 +889,7 @@ grub_ntfs_mount (grub_disk_t disk)
|
||||
struct grub_ntfs_bpb bpb;
|
||||
struct grub_ntfs_data *data = 0;
|
||||
grub_uint32_t spc;
|
||||
grub_uint32_t sectors_per_cluster;
|
||||
|
||||
if (!disk)
|
||||
goto fail;
|
||||
@@ -903,14 +904,18 @@ grub_ntfs_mount (grub_disk_t disk)
|
||||
if (grub_disk_read (disk, 0, 0, sizeof (bpb), &bpb))
|
||||
goto fail;
|
||||
|
||||
sectors_per_cluster = bpb.sectors_per_cluster;
|
||||
if (sectors_per_cluster > 0x80)
|
||||
sectors_per_cluster = 1U << (256U - bpb.sectors_per_cluster);
|
||||
|
||||
if (grub_memcmp ((char *) &bpb.oem_name, "NTFS", 4) != 0
|
||||
|| bpb.sectors_per_cluster == 0
|
||||
|| (bpb.sectors_per_cluster & (bpb.sectors_per_cluster - 1)) != 0
|
||||
|| sectors_per_cluster == 0
|
||||
|| (sectors_per_cluster & (sectors_per_cluster - 1)) != 0
|
||||
|| bpb.bytes_per_sector == 0
|
||||
|| (bpb.bytes_per_sector & (bpb.bytes_per_sector - 1)) != 0)
|
||||
goto fail;
|
||||
|
||||
spc = (((grub_uint32_t) bpb.sectors_per_cluster
|
||||
spc = (((grub_uint32_t) sectors_per_cluster
|
||||
* (grub_uint32_t) grub_le_to_cpu16 (bpb.bytes_per_sector))
|
||||
>> GRUB_NTFS_BLK_SHR);
|
||||
if (spc == 0)
|
||||
|
@@ -27,6 +27,7 @@
|
||||
#include <grub/fshelp.h>
|
||||
#include <grub/deflate.h>
|
||||
#include <minilzo.h>
|
||||
#include <zstd.h>
|
||||
|
||||
#include "xz.h"
|
||||
#include "xz_stream.h"
|
||||
@@ -184,6 +185,7 @@ enum
|
||||
COMPRESSION_LZO = 3,
|
||||
COMPRESSION_XZ = 4,
|
||||
COMPRESSION_LZ4 = 5,
|
||||
COMPRESSION_ZSTD = 6,
|
||||
};
|
||||
|
||||
|
||||
@@ -398,6 +400,25 @@ static grub_ssize_t lz4_decompress_wrap(char *inbuf, grub_size_t insize, grub_of
|
||||
return len;
|
||||
}
|
||||
|
||||
static grub_ssize_t zstd_decompress_wrap(char *inbuf, grub_size_t insize, grub_off_t off,
|
||||
char *outbuf, grub_size_t len, struct grub_squash_data *data)
|
||||
{
|
||||
char *udata = NULL;
|
||||
int usize = data->blksz;
|
||||
if (usize < 8192)
|
||||
usize = 8192;
|
||||
|
||||
udata = grub_malloc (usize);
|
||||
if (!udata)
|
||||
return -1;
|
||||
|
||||
ZSTD_decompress(udata, usize, inbuf, insize);
|
||||
grub_memcpy(outbuf, udata + off, len);
|
||||
grub_free(udata);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static struct grub_squash_data *
|
||||
squash_mount (grub_disk_t disk)
|
||||
{
|
||||
@@ -447,6 +468,9 @@ squash_mount (grub_disk_t disk)
|
||||
case grub_cpu_to_le16_compile_time (COMPRESSION_LZ4):
|
||||
data->decompress = lz4_decompress_wrap;
|
||||
break;
|
||||
case grub_cpu_to_le16_compile_time (COMPRESSION_ZSTD):
|
||||
data->decompress = zstd_decompress_wrap;
|
||||
break;
|
||||
case grub_cpu_to_le16_compile_time (COMPRESSION_XZ):
|
||||
data->decompress = xz_decompress;
|
||||
data->xzbuf = grub_malloc (XZBUFSIZ);
|
||||
@@ -519,7 +543,7 @@ grub_squash_iterate_dir (grub_fshelp_node_t dir,
|
||||
break;
|
||||
case grub_cpu_to_le16_compile_time (SQUASH_TYPE_LONG_DIR):
|
||||
off = grub_le_to_cpu16 (dir->ino.long_dir.offset);
|
||||
endoff = grub_le_to_cpu16 (dir->ino.long_dir.size) + off - 3;
|
||||
endoff = grub_le_to_cpu32 (dir->ino.long_dir.size) + off - 3;
|
||||
chunk = grub_le_to_cpu32 (dir->ino.long_dir.chunk);
|
||||
break;
|
||||
default:
|
||||
|
@@ -31,6 +31,7 @@ extern int g_ventoy_iso_raw;
|
||||
extern int g_ventoy_grub2_mode;
|
||||
extern int g_ventoy_wimboot_mode;
|
||||
extern int g_ventoy_iso_uefi_drv;
|
||||
extern char g_ventoy_hotkey_tip[256];
|
||||
|
||||
static const char *align_options[] =
|
||||
{
|
||||
@@ -230,10 +231,11 @@ label_set_property (void *vself, const char *name, const char *value)
|
||||
value = g_ventoy_iso_uefi_drv ? grub_env_get("VTOY_ISO_UEFI_DRV_STR") : " ";
|
||||
}
|
||||
else if (grub_strcmp (value, "@VTOY_HOTKEY_TIP@") == 0) {
|
||||
value = grub_env_get("VTOY_HOTKEY_TIP");
|
||||
if (value == NULL) {
|
||||
value = _(" ");
|
||||
}
|
||||
value = g_ventoy_hotkey_tip;
|
||||
} else if (value[0] == '@' && value[1] == '@' && value[2]) {
|
||||
value = grub_env_get(value + 2);
|
||||
if (!value)
|
||||
value = " ";
|
||||
}
|
||||
|
||||
self->template = grub_strdup (value);
|
||||
|
@@ -295,6 +295,8 @@ theme_set_string (grub_gfxmenu_view_t view,
|
||||
if (! view->title_text)
|
||||
return grub_errno;
|
||||
}
|
||||
else if (! grub_strcmp ("ventoy_left_top_color", name))
|
||||
return grub_errno;
|
||||
else
|
||||
{
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT,
|
||||
@@ -732,6 +734,11 @@ read_property (struct parsebuf *p)
|
||||
"%s:%d:%d property value invalid; "
|
||||
"enclose literal values in quotes (\")",
|
||||
p->filename, p->line_num, p->col_num);
|
||||
|
||||
grub_printf("File: %s\nLine:%d Column:%d\n"
|
||||
"property value invalid; enclose literal values in quotes (\")\n\n",
|
||||
p->filename, p->line_num, p->col_num);
|
||||
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
250
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/env.c
Normal file
250
GRUB2/MOD_SRC/grub-2.04/grub-core/kern/env.c
Normal file
@@ -0,0 +1,250 @@
|
||||
/* env.c - Environment variables */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2003,2005,2006,2007,2008,2009 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/env.h>
|
||||
#include <grub/env_private.h>
|
||||
#include <grub/misc.h>
|
||||
#include <grub/mm.h>
|
||||
|
||||
/* The initial context. */
|
||||
static struct grub_env_context initial_context;
|
||||
|
||||
/* The current context. */
|
||||
struct grub_env_context *grub_current_context = &initial_context;
|
||||
|
||||
static grub_env_read_hook_t vtoy_menu_lang_read_hook;
|
||||
|
||||
/* Return the hash representation of the string S. */
|
||||
static unsigned int
|
||||
grub_env_hashval (const char *s)
|
||||
{
|
||||
unsigned int i = 0;
|
||||
|
||||
/* XXX: This can be done much more efficiently. */
|
||||
while (*s)
|
||||
i += 5 * *(s++);
|
||||
|
||||
return i % HASHSZ;
|
||||
}
|
||||
|
||||
static struct grub_env_var *
|
||||
grub_env_find (const char *name)
|
||||
{
|
||||
struct grub_env_var *var;
|
||||
int idx = grub_env_hashval (name);
|
||||
|
||||
/* Look for the variable in the current context. */
|
||||
for (var = grub_current_context->vars[idx]; var; var = var->next)
|
||||
if (grub_strcmp (var->name, name) == 0)
|
||||
return var;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
grub_env_insert (struct grub_env_context *context,
|
||||
struct grub_env_var *var)
|
||||
{
|
||||
int idx = grub_env_hashval (var->name);
|
||||
|
||||
/* Insert the variable into the hashtable. */
|
||||
var->prevp = &context->vars[idx];
|
||||
var->next = context->vars[idx];
|
||||
if (var->next)
|
||||
var->next->prevp = &(var->next);
|
||||
context->vars[idx] = var;
|
||||
}
|
||||
|
||||
static void
|
||||
grub_env_remove (struct grub_env_var *var)
|
||||
{
|
||||
/* Remove the entry from the variable table. */
|
||||
*var->prevp = var->next;
|
||||
if (var->next)
|
||||
var->next->prevp = var->prevp;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_env_set (const char *name, const char *val)
|
||||
{
|
||||
struct grub_env_var *var;
|
||||
|
||||
/* If the variable does already exist, just update the variable. */
|
||||
var = grub_env_find (name);
|
||||
if (var)
|
||||
{
|
||||
char *old = var->value;
|
||||
|
||||
if (var->write_hook)
|
||||
var->value = var->write_hook (var, val);
|
||||
else
|
||||
var->value = grub_strdup (val);
|
||||
|
||||
if (! var->value)
|
||||
{
|
||||
var->value = old;
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
grub_free (old);
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
/* The variable does not exist, so create a new one. */
|
||||
var = grub_zalloc (sizeof (*var));
|
||||
if (! var)
|
||||
return grub_errno;
|
||||
|
||||
var->name = grub_strdup (name);
|
||||
if (! var->name)
|
||||
goto fail;
|
||||
|
||||
var->value = grub_strdup (val);
|
||||
if (! var->value)
|
||||
goto fail;
|
||||
|
||||
grub_env_insert (grub_current_context, var);
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
||||
fail:
|
||||
grub_free (var->name);
|
||||
grub_free (var->value);
|
||||
grub_free (var);
|
||||
|
||||
return grub_errno;
|
||||
}
|
||||
|
||||
const char *
|
||||
grub_env_get (const char *name)
|
||||
{
|
||||
struct grub_env_var *var;
|
||||
|
||||
if (name && vtoy_menu_lang_read_hook && grub_strncmp(name, "VTLANG_", 7) == 0)
|
||||
return vtoy_menu_lang_read_hook(NULL, name);
|
||||
|
||||
var = grub_env_find (name);
|
||||
if (! var)
|
||||
return 0;
|
||||
|
||||
if (var->read_hook)
|
||||
return var->read_hook (var, var->value);
|
||||
|
||||
return var->value;
|
||||
}
|
||||
|
||||
void
|
||||
grub_env_unset (const char *name)
|
||||
{
|
||||
struct grub_env_var *var;
|
||||
|
||||
var = grub_env_find (name);
|
||||
if (! var)
|
||||
return;
|
||||
|
||||
if (var->read_hook || var->write_hook)
|
||||
{
|
||||
grub_env_set (name, "");
|
||||
return;
|
||||
}
|
||||
|
||||
grub_env_remove (var);
|
||||
|
||||
grub_free (var->name);
|
||||
grub_free (var->value);
|
||||
grub_free (var);
|
||||
}
|
||||
|
||||
struct grub_env_var *
|
||||
grub_env_update_get_sorted (void)
|
||||
{
|
||||
struct grub_env_var *sorted_list = 0;
|
||||
int i;
|
||||
|
||||
/* Add variables associated with this context into a sorted list. */
|
||||
for (i = 0; i < HASHSZ; i++)
|
||||
{
|
||||
struct grub_env_var *var;
|
||||
|
||||
for (var = grub_current_context->vars[i]; var; var = var->next)
|
||||
{
|
||||
struct grub_env_var *p, **q;
|
||||
|
||||
for (q = &sorted_list, p = *q; p; q = &((*q)->sorted_next), p = *q)
|
||||
{
|
||||
if (grub_strcmp (p->name, var->name) > 0)
|
||||
break;
|
||||
}
|
||||
|
||||
var->sorted_next = *q;
|
||||
*q = var;
|
||||
}
|
||||
}
|
||||
|
||||
return sorted_list;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_register_variable_hook (const char *name,
|
||||
grub_env_read_hook_t read_hook,
|
||||
grub_env_write_hook_t write_hook)
|
||||
{
|
||||
struct grub_env_var *var = grub_env_find (name);
|
||||
|
||||
if (! var)
|
||||
{
|
||||
if (grub_env_set (name, "") != GRUB_ERR_NONE)
|
||||
return grub_errno;
|
||||
|
||||
var = grub_env_find (name);
|
||||
/* XXX Insert an assertion? */
|
||||
}
|
||||
|
||||
var->read_hook = read_hook;
|
||||
var->write_hook = write_hook;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_register_vtoy_menu_lang_hook(grub_env_read_hook_t read_hook)
|
||||
{
|
||||
vtoy_menu_lang_read_hook = read_hook;
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
||||
|
||||
grub_err_t
|
||||
grub_env_export (const char *name)
|
||||
{
|
||||
struct grub_env_var *var;
|
||||
|
||||
var = grub_env_find (name);
|
||||
if (! var)
|
||||
{
|
||||
grub_err_t err;
|
||||
|
||||
err = grub_env_set (name, "");
|
||||
if (err)
|
||||
return err;
|
||||
var = grub_env_find (name);
|
||||
}
|
||||
var->global = 1;
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
}
|
@@ -200,7 +200,8 @@ const char *grub_file_get_vlnk(const char *name, int *vlnk)
|
||||
|
||||
if (len == g_vtoy_vlnk.srclen && grub_strcmp(name, g_vtoy_vlnk.src) == 0)
|
||||
{
|
||||
*vlnk = 1;
|
||||
if (vlnk)
|
||||
*vlnk = 1;
|
||||
return g_vtoy_vlnk.dst;
|
||||
}
|
||||
|
||||
@@ -208,7 +209,8 @@ const char *grub_file_get_vlnk(const char *name, int *vlnk)
|
||||
{
|
||||
if (node->srclen == len && grub_strcmp(name, node->src) == 0)
|
||||
{
|
||||
*vlnk = 1;
|
||||
if (vlnk)
|
||||
*vlnk = 1;
|
||||
return node->dst;
|
||||
}
|
||||
node = node->next;
|
||||
@@ -340,10 +342,12 @@ grub_file_read (grub_file_t file, void *buf, grub_size_t len)
|
||||
if (len == 0)
|
||||
return 0;
|
||||
|
||||
if (grub_strncmp(file->name, GRUB_MEMFILE_MEM, grub_strlen(GRUB_MEMFILE_MEM)) == 0) {
|
||||
if (file->name) {
|
||||
if (grub_strncmp(file->name, GRUB_MEMFILE_MEM, grub_strlen(GRUB_MEMFILE_MEM)) == 0) {
|
||||
grub_memcpy(buf, (grub_uint8_t *)(file->data) + file->offset, len);
|
||||
file->offset += len;
|
||||
return len;
|
||||
}
|
||||
}
|
||||
|
||||
read_hook = file->read_hook;
|
||||
|
@@ -362,7 +362,8 @@ static grub_err_t
|
||||
cmd_append (const char *line, struct syslinux_menu *menu)
|
||||
{
|
||||
if (!menu->entries)
|
||||
return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label");
|
||||
return GRUB_ERR_NONE;
|
||||
//return grub_error (GRUB_ERR_BAD_ARGUMENT, "kernel without label");
|
||||
|
||||
menu->entries->append = grub_strdup (line);
|
||||
if (!menu->entries->append)
|
||||
|
@@ -229,10 +229,7 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
|
||||
if (! file)
|
||||
goto fail;
|
||||
|
||||
/* Get the root device's device path. */
|
||||
dev = grub_device_open (0);
|
||||
if (! dev)
|
||||
goto fail;
|
||||
dev = file->device;
|
||||
|
||||
if (dev->disk)
|
||||
dev_handle = grub_efidisk_get_device_handle (dev->disk);
|
||||
@@ -257,16 +254,13 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
|
||||
if (dev_handle)
|
||||
dp = grub_efi_get_device_path (dev_handle);
|
||||
|
||||
if (! dp)
|
||||
if (dp != NULL)
|
||||
{
|
||||
grub_error (GRUB_ERR_BAD_DEVICE, "not a valid root device");
|
||||
goto fail;
|
||||
file_path = make_file_path (dp, filename);
|
||||
if (! file_path)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
file_path = make_file_path (dp, filename);
|
||||
if (! file_path)
|
||||
goto fail;
|
||||
|
||||
//grub_printf ("file path: ");
|
||||
//grub_efi_print_device_path (file_path);
|
||||
|
||||
@@ -390,16 +384,12 @@ grub_cmd_chainloader (grub_command_t cmd __attribute__ ((unused)),
|
||||
}
|
||||
|
||||
grub_file_close (file);
|
||||
grub_device_close (dev);
|
||||
|
||||
grub_loader_set (grub_chainloader_boot, grub_chainloader_unload, 0);
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
|
||||
if (dev)
|
||||
grub_device_close (dev);
|
||||
|
||||
if (file)
|
||||
grub_file_close (file);
|
||||
|
||||
|
@@ -88,6 +88,8 @@ static int ventoy_linux_argc = 0;
|
||||
static char **ventoy_linux_args = NULL;
|
||||
static int ventoy_extra_initrd_num = 0;
|
||||
static char *ventoy_extra_initrd_list[256];
|
||||
static grub_command_func_t ventoy_linux16_func = NULL;
|
||||
static grub_command_func_t ventoy_initrd16_func = NULL;
|
||||
static grub_err_t
|
||||
grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), int argc, char *argv[]);
|
||||
|
||||
@@ -667,54 +669,6 @@ static int ventoy_bootopt_hook(int argc, char *argv[])
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_set_boot_opt (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char *argv[])
|
||||
{
|
||||
int i;
|
||||
const char *vtdebug;
|
||||
|
||||
for (i = 0; i < argc; i++)
|
||||
{
|
||||
ventoy_linux_args[ventoy_linux_argc + (LINUX_MAX_ARGC / 2) ] = grub_strdup(argv[i]);
|
||||
ventoy_linux_argc++;
|
||||
}
|
||||
|
||||
vtdebug = grub_env_get("vtdebug_flag");
|
||||
if (vtdebug && vtdebug[0])
|
||||
{
|
||||
ventoy_debug = 1;
|
||||
}
|
||||
|
||||
if (ventoy_debug) grub_printf("ventoy set boot opt %d\n", ventoy_linux_argc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_unset_boot_opt (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char *argv[])
|
||||
{
|
||||
int i;
|
||||
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
for (i = 0; i < LINUX_MAX_ARGC; i++)
|
||||
{
|
||||
if (ventoy_linux_args[i])
|
||||
{
|
||||
grub_free(ventoy_linux_args[i]);
|
||||
}
|
||||
}
|
||||
|
||||
ventoy_debug = 0;
|
||||
ventoy_linux_argc = 0;
|
||||
ventoy_initrd_called = 0;
|
||||
grub_memset(ventoy_linux_args, 0, sizeof(char *) * LINUX_MAX_ARGC);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_extra_initrd_append (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char *argv[])
|
||||
@@ -1576,6 +1530,92 @@ ventoy_cmd_initrd (grub_command_t cmd __attribute__ ((unused)),
|
||||
return grub_cmd_initrd(cmd, ventoy_extra_initrd_num, ventoy_extra_initrd_list);
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_set_boot_opt (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char *argv[])
|
||||
{
|
||||
int i;
|
||||
const char *vtdebug;
|
||||
grub_command_t regcmd;
|
||||
|
||||
for (i = 0; i < argc; i++)
|
||||
{
|
||||
ventoy_linux_args[ventoy_linux_argc + (LINUX_MAX_ARGC / 2) ] = grub_strdup(argv[i]);
|
||||
ventoy_linux_argc++;
|
||||
}
|
||||
|
||||
vtdebug = grub_env_get("vtdebug_flag");
|
||||
if (vtdebug && vtdebug[0])
|
||||
{
|
||||
ventoy_debug = 1;
|
||||
}
|
||||
|
||||
if (ventoy_debug) grub_printf("ventoy set boot opt %d\n", ventoy_linux_argc);
|
||||
|
||||
ventoy_linux16_func = ventoy_initrd16_func = NULL;
|
||||
regcmd = grub_command_find("linux16");
|
||||
if (regcmd)
|
||||
{
|
||||
ventoy_linux16_func = regcmd->func;
|
||||
regcmd->func = grub_cmd_linux;
|
||||
}
|
||||
|
||||
regcmd = grub_command_find("initrd16");
|
||||
if (regcmd)
|
||||
{
|
||||
ventoy_initrd16_func = regcmd->func;
|
||||
regcmd->func = ventoy_cmd_initrd;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t
|
||||
grub_cmd_unset_boot_opt (grub_command_t cmd __attribute__ ((unused)),
|
||||
int argc, char *argv[])
|
||||
{
|
||||
int i;
|
||||
grub_command_t regcmd;
|
||||
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
for (i = 0; i < LINUX_MAX_ARGC; i++)
|
||||
{
|
||||
if (ventoy_linux_args[i])
|
||||
{
|
||||
grub_free(ventoy_linux_args[i]);
|
||||
}
|
||||
}
|
||||
|
||||
ventoy_debug = 0;
|
||||
ventoy_linux_argc = 0;
|
||||
ventoy_initrd_called = 0;
|
||||
grub_memset(ventoy_linux_args, 0, sizeof(char *) * LINUX_MAX_ARGC);
|
||||
|
||||
if (ventoy_linux16_func)
|
||||
{
|
||||
regcmd = grub_command_find("linux16");
|
||||
if (regcmd)
|
||||
{
|
||||
regcmd->func = ventoy_linux16_func;
|
||||
}
|
||||
ventoy_linux16_func = NULL;
|
||||
}
|
||||
|
||||
if (ventoy_initrd16_func)
|
||||
{
|
||||
regcmd = grub_command_find("initrd16");
|
||||
if (regcmd)
|
||||
{
|
||||
regcmd->func = ventoy_initrd16_func;
|
||||
}
|
||||
ventoy_initrd16_func = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static grub_command_t cmd_linux, cmd_initrd, cmd_linuxefi, cmd_initrdefi;
|
||||
static grub_command_t cmd_set_bootopt, cmd_unset_bootopt, cmd_extra_initrd_append, cmd_extra_initrd_reset;
|
||||
|
@@ -48,10 +48,35 @@ int g_ventoy_suppress_esc = 0;
|
||||
int g_ventoy_suppress_esc_default = 1;
|
||||
int g_ventoy_menu_esc = 0;
|
||||
int g_ventoy_fn_mutex = 0;
|
||||
int g_ventoy_secondary_menu_on = 0;
|
||||
int g_ventoy_terminal_output = 0;
|
||||
char g_ventoy_hotkey_tip[256];
|
||||
|
||||
static int g_vt_key_num = 0;
|
||||
static int g_vt_key_code[128];
|
||||
|
||||
static int ventoy_menu_pop_key(void)
|
||||
{
|
||||
if (g_vt_key_num > 0 && g_vt_key_num < (int)(sizeof(g_vt_key_code) / sizeof(g_vt_key_code[0])))
|
||||
{
|
||||
g_vt_key_num--;
|
||||
return g_vt_key_code[g_vt_key_num];
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int ventoy_menu_push_key(int code)
|
||||
{
|
||||
if (g_vt_key_num >= 0 && g_vt_key_num < (int)(sizeof(g_vt_key_code) / sizeof(g_vt_key_code[0])))
|
||||
{
|
||||
g_vt_key_code[g_vt_key_num++] = code;
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define VTOY_COMM_HOTKEY(cmdkey) \
|
||||
if (0 == g_ventoy_fn_mutex) { \
|
||||
if (0 == g_ventoy_fn_mutex && 0 == g_ventoy_secondary_menu_on) { \
|
||||
cmdstr = grub_env_get(cmdkey); \
|
||||
if (cmdstr) \
|
||||
{ \
|
||||
@@ -795,7 +820,11 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
||||
return default_entry;
|
||||
}
|
||||
|
||||
c = grub_getkey_noblock ();
|
||||
if (g_vt_key_num > 0) {
|
||||
c = ventoy_menu_pop_key();
|
||||
} else {
|
||||
c = grub_getkey_noblock ();
|
||||
}
|
||||
|
||||
/* Negative values are returned on error. */
|
||||
if ((c != GRUB_TERM_NO_KEY) && (c > 0))
|
||||
@@ -922,77 +951,110 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
||||
menu_fini ();
|
||||
if (g_ventoy_terminal_output == 0)
|
||||
{
|
||||
grub_script_execute_sourcecode("terminal_output console");
|
||||
grub_script_execute_sourcecode("vt_push_menu_lang en_US\nterminal_output console");
|
||||
g_ventoy_terminal_output = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_script_execute_sourcecode("terminal_output gfxterm");
|
||||
grub_script_execute_sourcecode("terminal_output gfxterm\nvt_pop_menu_lang");
|
||||
g_ventoy_terminal_output = 0;
|
||||
}
|
||||
goto refresh;
|
||||
case GRUB_TERM_KEY_F1:
|
||||
case '1':
|
||||
menu_fini ();
|
||||
g_ventoy_memdisk_mode = 1 - g_ventoy_memdisk_mode;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
|
||||
case (GRUB_TERM_CTRL | 'i'):
|
||||
menu_fini ();
|
||||
g_ventoy_iso_raw = 1 - g_ventoy_iso_raw;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
|
||||
case (GRUB_TERM_CTRL | 'r'):
|
||||
menu_fini ();
|
||||
g_ventoy_grub2_mode = 1 - g_ventoy_grub2_mode;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
|
||||
case (GRUB_TERM_CTRL | 'w'):
|
||||
menu_fini ();
|
||||
g_ventoy_wimboot_mode = 1 - g_ventoy_wimboot_mode;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
|
||||
case (GRUB_TERM_CTRL | 'u'):
|
||||
menu_fini ();
|
||||
g_ventoy_iso_uefi_drv = 1 - g_ventoy_iso_uefi_drv;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
|
||||
case (GRUB_TERM_CTRL | 'h'):
|
||||
case 'h':
|
||||
{
|
||||
cmdstr = grub_env_get("VTOY_HELP_CMD");
|
||||
if (cmdstr)
|
||||
if (0 == g_ventoy_secondary_menu_on)
|
||||
{
|
||||
cmdstr = grub_env_get("VTOY_HELP_CMD");
|
||||
if (cmdstr)
|
||||
{
|
||||
grub_script_execute_sourcecode(cmdstr);
|
||||
while (grub_getkey() != GRUB_TERM_ESC)
|
||||
;
|
||||
menu_fini ();
|
||||
goto refresh;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case (GRUB_TERM_CTRL | 'd'):
|
||||
case 'd':
|
||||
if (0 == g_ventoy_secondary_menu_on)
|
||||
{
|
||||
grub_script_execute_sourcecode(cmdstr);
|
||||
while (grub_getkey() != GRUB_TERM_ESC)
|
||||
;
|
||||
menu_fini ();
|
||||
g_ventoy_memdisk_mode = 1 - g_ventoy_memdisk_mode;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
}
|
||||
break;
|
||||
case (GRUB_TERM_CTRL | 'i'):
|
||||
case 'i':
|
||||
if (0 == g_ventoy_secondary_menu_on)
|
||||
{
|
||||
menu_fini ();
|
||||
g_ventoy_iso_raw = 1 - g_ventoy_iso_raw;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
}
|
||||
break;
|
||||
case (GRUB_TERM_CTRL | 'r'):
|
||||
case 'r':
|
||||
if (0 == g_ventoy_secondary_menu_on)
|
||||
{
|
||||
menu_fini ();
|
||||
g_ventoy_grub2_mode = 1 - g_ventoy_grub2_mode;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
}
|
||||
break;
|
||||
case (GRUB_TERM_CTRL | 'w'):
|
||||
case 'w':
|
||||
if (0 == g_ventoy_secondary_menu_on)
|
||||
{
|
||||
menu_fini ();
|
||||
g_ventoy_wimboot_mode = 1 - g_ventoy_wimboot_mode;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
}
|
||||
break;
|
||||
case (GRUB_TERM_CTRL | 'u'):
|
||||
case 'u':
|
||||
if (0 == g_ventoy_secondary_menu_on)
|
||||
{
|
||||
menu_fini ();
|
||||
g_ventoy_iso_uefi_drv = 1 - g_ventoy_iso_uefi_drv;
|
||||
g_ventoy_menu_refresh = 1;
|
||||
goto refresh;
|
||||
}
|
||||
break;
|
||||
case (GRUB_TERM_CTRL | 'l'):
|
||||
case (GRUB_TERM_CTRL | 'L'):
|
||||
case (GRUB_TERM_SHIFT | 'l'):
|
||||
case (GRUB_TERM_SHIFT | 'L'):
|
||||
case 'l':
|
||||
case 'L':
|
||||
{
|
||||
VTOY_COMM_HOTKEY("VTOY_LANG_CMD");
|
||||
break;
|
||||
}
|
||||
case (GRUB_TERM_CTRL | 'm'):
|
||||
case 'm':
|
||||
{
|
||||
if (g_ventoy_cur_img_path)
|
||||
{
|
||||
grub_env_set("VTOY_CHKSUM_FILE_PATH", g_ventoy_cur_img_path);
|
||||
cmdstr = grub_env_get("VTOY_CHKSUM_CMD");
|
||||
if (cmdstr)
|
||||
if (0 == g_ventoy_secondary_menu_on)
|
||||
{
|
||||
if (g_ventoy_cur_img_path)
|
||||
{
|
||||
menu_fini();
|
||||
grub_script_execute_sourcecode(cmdstr);
|
||||
goto refresh;
|
||||
grub_env_set("VTOY_CHKSUM_FILE_PATH", g_ventoy_cur_img_path);
|
||||
cmdstr = grub_env_get("VTOY_CHKSUM_CMD");
|
||||
if (cmdstr)
|
||||
{
|
||||
menu_fini();
|
||||
grub_script_execute_sourcecode(cmdstr);
|
||||
goto refresh;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_env_set("VTOY_CHKSUM_FILE_PATH", "X");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_env_set("VTOY_CHKSUM_FILE_PATH", "X");
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1071,6 +1133,7 @@ show_menu (grub_menu_t menu, int nested, int autobooted)
|
||||
|
||||
while (1)
|
||||
{
|
||||
int ndown;
|
||||
int boot_entry;
|
||||
grub_menu_entry_t e;
|
||||
int auto_boot;
|
||||
@@ -1113,6 +1176,16 @@ show_menu (grub_menu_t menu, int nested, int autobooted)
|
||||
|
||||
if (2 == e->argc && e->args && e->args[1] && grub_strncmp(e->args[1], "VTOY_RUN_RET", 12) == 0)
|
||||
break;
|
||||
else if (2 == e->argc && e->args && e->args[1] && grub_strncmp(e->args[1], "VTOY_RUN_SET", 12) == 0) {
|
||||
ndown = (int)grub_strtol(e->args[1] + 12, NULL, 10);
|
||||
while (ndown > 0)
|
||||
{
|
||||
ventoy_menu_push_key(GRUB_TERM_KEY_DOWN);
|
||||
ndown--;
|
||||
}
|
||||
ventoy_menu_push_key('\n');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return GRUB_ERR_NONE;
|
||||
|
@@ -31,6 +31,8 @@
|
||||
static grub_uint8_t grub_color_menu_normal;
|
||||
static grub_uint8_t grub_color_menu_highlight;
|
||||
|
||||
extern char g_ventoy_hotkey_tip[256];
|
||||
|
||||
struct menu_viewer_data
|
||||
{
|
||||
int first, offset;
|
||||
@@ -204,7 +206,7 @@ command-line or ESC to discard edits and return to the GRUB menu."),
|
||||
ret += grub_print_message_indented_real(szLine, STANDARD_MARGIN, STANDARD_MARGIN, term, dry_run);
|
||||
|
||||
ret += grub_print_message_indented_real("\n", STANDARD_MARGIN, STANDARD_MARGIN, term, dry_run);
|
||||
ret += grub_print_message_indented_real(grub_env_get("VTOY_HOTKEY_TIP"),
|
||||
ret += grub_print_message_indented_real(g_ventoy_hotkey_tip,
|
||||
3, 6, term, dry_run);
|
||||
}
|
||||
}
|
||||
|
@@ -115,6 +115,92 @@ int ventoy_str_all_digit(const char *str)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ventoy_str_all_alnum(const char *str)
|
||||
{
|
||||
if (NULL == str || 0 == *str)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (*str)
|
||||
{
|
||||
if (!grub_isalnum(*str))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ventoy_str_len_alnum(const char *str, int len)
|
||||
{
|
||||
int i;
|
||||
int slen;
|
||||
|
||||
if (NULL == str || 0 == *str)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
slen = grub_strlen(str);
|
||||
if (slen <= len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
if (!grub_isalnum(str[i]))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (str[len] == 0 || grub_isspace(str[len]))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
char * ventoy_str_basename(char *path)
|
||||
{
|
||||
char *pos = NULL;
|
||||
|
||||
pos = grub_strrchr(path, '/');
|
||||
if (pos)
|
||||
{
|
||||
pos++;
|
||||
}
|
||||
else
|
||||
{
|
||||
pos = path;
|
||||
}
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
int ventoy_str_chrcnt(const char *str, char c)
|
||||
{
|
||||
int n = 0;
|
||||
|
||||
if (str)
|
||||
{
|
||||
while (*str)
|
||||
{
|
||||
if (*str == c)
|
||||
{
|
||||
n++;
|
||||
}
|
||||
str++;
|
||||
}
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
int ventoy_strcmp(const char *pattern, const char *str)
|
||||
{
|
||||
while (*pattern && *str)
|
||||
@@ -146,6 +232,14 @@ int ventoy_strncmp (const char *pattern, const char *str, grub_size_t n)
|
||||
return (int)(grub_uint8_t)*pattern - (int)(grub_uint8_t)*str;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_env_int_set(const char *name, int value)
|
||||
{
|
||||
char buf[16];
|
||||
|
||||
grub_snprintf(buf, sizeof(buf), "%d", value);
|
||||
return grub_env_set(name, buf);
|
||||
}
|
||||
|
||||
void ventoy_debug_dump_guid(const char *prefix, grub_uint8_t *guid)
|
||||
{
|
||||
int i;
|
||||
@@ -188,6 +282,21 @@ void * ventoy_alloc_chain(grub_size_t size)
|
||||
return p;
|
||||
}
|
||||
|
||||
void ventoy_memfile_env_set(const char *prefix, const void *buf, unsigned long long len)
|
||||
{
|
||||
char name[128];
|
||||
char val[64];
|
||||
|
||||
grub_snprintf(name, sizeof(name), "%s_addr", prefix);
|
||||
grub_snprintf(val, sizeof(val), "0x%llx", (ulonglong)(ulong)buf);
|
||||
grub_env_set(name, val);
|
||||
|
||||
grub_snprintf(name, sizeof(name), "%s_size", prefix);
|
||||
grub_snprintf(val, sizeof(val), "%llu", len);
|
||||
grub_env_set(name, val);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static int ventoy_arch_mode_init(void)
|
||||
{
|
||||
@@ -254,12 +363,130 @@ static int ventoy_hwinfo_init(void)
|
||||
|
||||
grub_snprintf(str, sizeof(str), "%ld", (long)(total_mem / VTOY_SIZE_1MB));
|
||||
ventoy_env_export("grub_total_ram", str);
|
||||
|
||||
|
||||
#ifdef GRUB_MACHINE_EFI
|
||||
ventoy_get_uefi_version(str, sizeof(str));
|
||||
ventoy_env_export("grub_uefi_version", str);
|
||||
#else
|
||||
ventoy_env_export("grub_uefi_version", "NA");
|
||||
#endif
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static global_var_cfg g_global_vars[] =
|
||||
{
|
||||
{ "gfxmode", "1024x768", NULL },
|
||||
{ ventoy_left_key, "5%", NULL },
|
||||
{ ventoy_top_key, "95%", NULL },
|
||||
{ ventoy_color_key, "#0000ff", NULL },
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
static const char * ventoy_global_var_read_hook(struct grub_env_var *var, const char *val)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; g_global_vars[i].name; i++)
|
||||
{
|
||||
if (grub_strcmp(g_global_vars[i].name, var->name) == 0)
|
||||
{
|
||||
return g_global_vars[i].value;
|
||||
}
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static char * ventoy_global_var_write_hook(struct grub_env_var *var, const char *val)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; g_global_vars[i].name; i++)
|
||||
{
|
||||
if (grub_strcmp(g_global_vars[i].name, var->name) == 0)
|
||||
{
|
||||
grub_check_free(g_global_vars[i].value);
|
||||
g_global_vars[i].value = grub_strdup(val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return grub_strdup(val);
|
||||
}
|
||||
|
||||
int ventoy_global_var_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; g_global_vars[i].name; i++)
|
||||
{
|
||||
g_global_vars[i].value = grub_strdup(g_global_vars[i].defval);
|
||||
ventoy_env_export(g_global_vars[i].name, g_global_vars[i].defval);
|
||||
grub_register_variable_hook(g_global_vars[i].name, ventoy_global_var_read_hook, ventoy_global_var_write_hook);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ctrl_var_cfg g_ctrl_vars[] =
|
||||
{
|
||||
{ "VTOY_WIN11_BYPASS_CHECK", 1 },
|
||||
{ "VTOY_WIN11_BYPASS_NRO", 1 },
|
||||
{ "VTOY_LINUX_REMOUNT", 0 },
|
||||
{ "VTOY_SECONDARY_BOOT_MENU", 1 },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
static const char * ventoy_ctrl_var_read_hook(struct grub_env_var *var, const char *val)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; g_ctrl_vars[i].name; i++)
|
||||
{
|
||||
if (grub_strcmp(g_ctrl_vars[i].name, var->name) == 0)
|
||||
{
|
||||
return g_ctrl_vars[i].value ? "1" : "0";
|
||||
}
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static char * ventoy_ctrl_var_write_hook(struct grub_env_var *var, const char *val)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; g_ctrl_vars[i].name; i++)
|
||||
{
|
||||
if (grub_strcmp(g_ctrl_vars[i].name, var->name) == 0)
|
||||
{
|
||||
if (val && val[0] == '1' && val[1] == 0)
|
||||
{
|
||||
g_ctrl_vars[i].value = 1;
|
||||
return grub_strdup("1");
|
||||
}
|
||||
else
|
||||
{
|
||||
g_ctrl_vars[i].value = 0;
|
||||
return grub_strdup("0");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return grub_strdup(val);
|
||||
}
|
||||
|
||||
int ventoy_ctrl_var_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; g_ctrl_vars[i].name; i++)
|
||||
{
|
||||
ventoy_env_export(g_ctrl_vars[i].name, g_ctrl_vars[i].value ? "1" : "0");
|
||||
grub_register_variable_hook(g_ctrl_vars[i].name, ventoy_ctrl_var_read_hook, ventoy_ctrl_var_write_hook);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -392,6 +392,11 @@ static int ventoy_browser_iterate_dir(const char *filename, const struct grub_di
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (grub_file_is_vlnk_suffix(filename, len))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
node = grub_zalloc(sizeof(browser_node));
|
||||
if (!node)
|
||||
{
|
||||
@@ -616,13 +621,15 @@ grub_err_t ventoy_cmd_browser_disk(grub_extcmd_context_t ctxt, int argc, char **
|
||||
|
||||
if (g_tree_view_menu_style == 0)
|
||||
{
|
||||
browser_ssprintf(&mbuf, "menuentry \"%-10s [Return]\" --class=\"vtoyret\" VTOY_RET {\n "
|
||||
" echo 'return ...' \n}\n", "<--");
|
||||
browser_ssprintf(&mbuf, "menuentry \"%-10s [%s]\" --class=\"vtoyret\" VTOY_RET {\n "
|
||||
" echo 'return ...' \n}\n", "<--",
|
||||
ventoy_get_vmenu_title("VTLANG_BROWER_RETURN"));
|
||||
}
|
||||
else
|
||||
{
|
||||
browser_ssprintf(&mbuf, "menuentry \"[Return]\" --class=\"vtoyret\" VTOY_RET {\n "
|
||||
" echo 'return ...' \n}\n");
|
||||
browser_ssprintf(&mbuf, "menuentry \"[%s]\" --class=\"vtoyret\" VTOY_RET {\n "
|
||||
" echo 'return ...' \n}\n",
|
||||
ventoy_get_vmenu_title("VTLANG_BROWER_RETURN"));
|
||||
}
|
||||
|
||||
grub_disk_dev_iterate(ventoy_browser_iterate_disk, &mbuf);
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -29,6 +29,8 @@
|
||||
|
||||
#define VTOY_FILT_MIN_FILE_SIZE 32768
|
||||
|
||||
#define VTOY_LINUX_SYSTEMD_MENU_MAX_BUF 16384
|
||||
|
||||
#define VTOY_SIZE_1GB 1073741824
|
||||
#define VTOY_SIZE_1MB (1024 * 1024)
|
||||
#define VTOY_SIZE_2MB (2 * 1024 * 1024)
|
||||
@@ -60,6 +62,8 @@
|
||||
|
||||
#define VTOY_WARNING "!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!"
|
||||
|
||||
#define VTOY_CHKSUM_NUM 4
|
||||
|
||||
#define VTOY_PLAT_I386_UEFI 0x49413332
|
||||
#define VTOY_PLAT_ARM64_UEFI 0x41413634
|
||||
#define VTOY_PLAT_X86_64_UEFI 0x55454649
|
||||
@@ -75,6 +79,10 @@
|
||||
#define VTOY_ARCH_CPIO "ventoy_x86.cpio"
|
||||
#endif
|
||||
|
||||
#define ventoy_left_key "VTLE_LFT"
|
||||
#define ventoy_top_key "VTLE_TOP"
|
||||
#define ventoy_color_key "VTLE_CLR"
|
||||
|
||||
#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]
|
||||
|
||||
@@ -97,6 +105,28 @@
|
||||
}\
|
||||
}
|
||||
|
||||
#define VTOY_SKIP_SPACE(s) \
|
||||
while (ventoy_isspace(*s)) \
|
||||
{\
|
||||
s++;\
|
||||
}
|
||||
|
||||
#define VTOY_SKIP_SPACE_NEXT(s, initial) \
|
||||
s += initial;\
|
||||
while (ventoy_isspace(*s)) \
|
||||
{\
|
||||
s++;\
|
||||
}
|
||||
|
||||
#define VTOY_SKIP_SPACE_NEXT_EX(s, base, initial) \
|
||||
s = base + initial;\
|
||||
while (ventoy_isspace(*s)) \
|
||||
{\
|
||||
s++;\
|
||||
}
|
||||
|
||||
#define VTOY_GOTO_END(v) ret = v; goto end
|
||||
|
||||
typedef enum VTOY_FILE_FLT
|
||||
{
|
||||
VTOY_FILE_FLT_ISO = 0, /* .iso */
|
||||
@@ -329,9 +359,16 @@ void ventoy_debug(const char *fmt, ...);
|
||||
#define vtoy_ssprintf(buf, pos, fmt, args...) \
|
||||
pos += grub_snprintf(buf + pos, VTOY_MAX_SCRIPT_BUF - pos, fmt, ##args)
|
||||
|
||||
#define vtoy_len_ssprintf(buf, pos, len, fmt, args...) \
|
||||
pos += grub_snprintf(buf + pos, len - pos, fmt, ##args)
|
||||
|
||||
#define browser_ssprintf(mbuf, fmt, args...) \
|
||||
(mbuf)->pos += grub_snprintf((mbuf)->buf + (mbuf)->pos, (mbuf)->max - (mbuf)->pos, fmt, ##args)
|
||||
|
||||
#define vtoy_dummy_menuentry(buf, pos, len, title, class) \
|
||||
vtoy_len_ssprintf(buf, pos, len, "menuentry \"%s\" --class=\"%s\" {\n echo \"\"\n}\n", title, class)
|
||||
|
||||
|
||||
#define FLAG_HEADER_RESERVED 0x00000001
|
||||
#define FLAG_HEADER_COMPRESSION 0x00000002
|
||||
#define FLAG_HEADER_READONLY 0x00000004
|
||||
@@ -602,6 +639,11 @@ typedef struct chk_case_fs_dir
|
||||
}chk_case_fs_dir;
|
||||
|
||||
int ventoy_str_all_digit(const char *str);
|
||||
int ventoy_str_all_alnum(const char *str);
|
||||
int ventoy_str_len_alnum(const char *str, int len);
|
||||
char * ventoy_str_basename(char *path);
|
||||
grub_err_t ventoy_env_int_set(const char *name, int value);
|
||||
int ventoy_str_chrcnt(const char *str, char c);
|
||||
int ventoy_strcmp(const char *pattern, const char *str);
|
||||
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);
|
||||
@@ -613,6 +655,8 @@ grub_err_t ventoy_cmd_clear_initrd_list(grub_extcmd_context_t ctxt, int argc, ch
|
||||
grub_uint32_t ventoy_get_iso_boot_catlog(grub_file_t file);
|
||||
int ventoy_has_efi_eltorito(grub_file_t file, grub_uint32_t sector);
|
||||
grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_linux_systemd_menu(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_linux_limine_menu(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_linux_locate_initrd(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);
|
||||
@@ -633,6 +677,7 @@ grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, c
|
||||
grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_wim_check_bootable(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_is_standard_winiso(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_dump_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_sel_wimboot(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_set_wim_prompt(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
@@ -1028,6 +1073,7 @@ typedef struct menu_password
|
||||
}menu_password;
|
||||
|
||||
extern int g_ventoy_menu_esc;
|
||||
extern int g_ventoy_secondary_menu_on;
|
||||
extern int g_ventoy_suppress_esc;
|
||||
extern int g_ventoy_suppress_esc_default;
|
||||
extern int g_ventoy_last_entry;
|
||||
@@ -1040,6 +1086,9 @@ extern int g_ventoy_case_insensitive;
|
||||
extern int g_ventoy_fn_mutex;
|
||||
extern grub_uint8_t g_ventoy_chain_type;
|
||||
extern int g_vhdboot_enable;
|
||||
extern int g_default_menu_mode;
|
||||
extern char g_ventoy_hotkey_tip[256];
|
||||
extern int g_ventoy_menu_refresh;
|
||||
|
||||
#define VENTOY_IMG_WHITE_LIST 1
|
||||
#define VENTOY_IMG_BLACK_LIST 2
|
||||
@@ -1111,6 +1160,7 @@ grub_err_t ventoy_cmd_linux_get_main_initrd_index(grub_extcmd_context_t ctxt, in
|
||||
grub_err_t ventoy_cmd_collect_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_wim_patch_count(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_locate_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_sel_winpe_wim(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_unix_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
int ventoy_get_disk_guid(const char *filename, grub_uint8_t *guid, grub_uint8_t *signature);
|
||||
grub_err_t ventoy_cmd_unix_reset(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
@@ -1218,6 +1268,29 @@ typedef struct var_node
|
||||
struct var_node *next;
|
||||
}var_node;
|
||||
|
||||
typedef struct systemd_menu_ctx
|
||||
{
|
||||
char *dev;
|
||||
char *buf;
|
||||
int pos;
|
||||
int len;
|
||||
}systemd_menu_ctx;
|
||||
|
||||
typedef struct global_var_cfg
|
||||
{
|
||||
const char *name;
|
||||
const char *defval;
|
||||
char *value;
|
||||
}global_var_cfg;
|
||||
|
||||
typedef struct ctrl_var_cfg
|
||||
{
|
||||
const char *name;
|
||||
int value;
|
||||
}ctrl_var_cfg;
|
||||
|
||||
#define vtoy_check_goto_out(p) if (!p) goto out
|
||||
|
||||
extern char *g_tree_script_buf;
|
||||
extern int g_tree_script_pos;
|
||||
extern int g_tree_script_pre;
|
||||
@@ -1234,6 +1307,14 @@ grub_err_t ventoy_cmd_browser_disk(grub_extcmd_context_t ctxt, int argc, char **
|
||||
int ventoy_get_fs_type(const char *fs);
|
||||
int ventoy_img_name_valid(const char *filename, grub_size_t namelen);
|
||||
void * ventoy_alloc_chain(grub_size_t size);
|
||||
int ventoy_plugin_load_menu_lang(int init, const char *lang);
|
||||
const char *ventoy_get_vmenu_title(const char *vMenu);
|
||||
grub_err_t ventoy_cmd_cur_menu_lang(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
extern int ventoy_menu_push_key(int code);
|
||||
int ventoy_ctrl_var_init(void);
|
||||
int ventoy_global_var_init(void);
|
||||
grub_err_t ventoy_cmd_push_menulang(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
grub_err_t ventoy_cmd_pop_menulang(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||
|
||||
#endif /* __VENTOY_DEF_H__ */
|
||||
|
||||
|
@@ -177,10 +177,7 @@ static grub_err_t ventoy_isolinux_initrd_collect(grub_file_t file, const char *p
|
||||
{
|
||||
nextline = ventoy_get_line(start);
|
||||
|
||||
while (ventoy_isspace(*start))
|
||||
{
|
||||
start++;
|
||||
}
|
||||
VTOY_SKIP_SPACE(start);
|
||||
|
||||
offset = 7; // strlen("initrd=") or "INITRD " or "initrd "
|
||||
pos = grub_strstr(start, "initrd=");
|
||||
@@ -333,12 +330,84 @@ end:
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
static int ventoy_linux_initrd_collect_hook(const char *filename, const struct grub_dirhook_info *info, void *data)
|
||||
{
|
||||
int len;
|
||||
initrd_info *img = NULL;
|
||||
|
||||
(void)data;
|
||||
|
||||
if (0 == info->dir)
|
||||
{
|
||||
if (grub_strncmp(filename, "initrd", 6) == 0)
|
||||
{
|
||||
len = (int)grub_strlen(filename);
|
||||
if (grub_strcmp(filename + len - 4, ".img") == 0)
|
||||
{
|
||||
img = grub_zalloc(sizeof(initrd_info));
|
||||
if (img)
|
||||
{
|
||||
grub_snprintf(img->name, sizeof(img->name), "/boot/%s", filename);
|
||||
|
||||
if (ventoy_find_initrd_by_name(g_initrd_img_list, img->name))
|
||||
{
|
||||
grub_free(img);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (g_initrd_img_list)
|
||||
{
|
||||
img->prev = g_initrd_img_tail;
|
||||
g_initrd_img_tail->next = img;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_initrd_img_list = img;
|
||||
}
|
||||
|
||||
g_initrd_img_tail = img;
|
||||
g_initrd_img_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ventoy_linux_collect_boot_initrds(void)
|
||||
{
|
||||
grub_fs_t fs;
|
||||
grub_device_t dev = NULL;
|
||||
|
||||
dev = grub_device_open("loop");
|
||||
if (!dev)
|
||||
{
|
||||
debug("failed to open device loop\n");
|
||||
goto end;
|
||||
}
|
||||
|
||||
fs = grub_fs_probe(dev);
|
||||
if (!fs)
|
||||
{
|
||||
debug("failed to probe fs %d\n", grub_errno);
|
||||
goto end;
|
||||
}
|
||||
|
||||
fs->fs_dir(dev, "/boot", ventoy_linux_initrd_collect_hook, NULL);
|
||||
|
||||
end:
|
||||
return 0;
|
||||
}
|
||||
|
||||
static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
|
||||
{
|
||||
int i = 0;
|
||||
int len = 0;
|
||||
int dollar = 0;
|
||||
int quotation = 0;
|
||||
int initrd_dollar = 0;
|
||||
grub_file_t file = NULL;
|
||||
char *buf = NULL;
|
||||
char *start = NULL;
|
||||
@@ -366,10 +435,7 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
|
||||
{
|
||||
nextline = ventoy_get_line(start);
|
||||
|
||||
while (ventoy_isspace(*start))
|
||||
{
|
||||
start++;
|
||||
}
|
||||
VTOY_SKIP_SPACE(start);
|
||||
|
||||
if (grub_strncmp(start, "initrd", 6) != 0)
|
||||
{
|
||||
@@ -382,10 +448,7 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
|
||||
start++;
|
||||
}
|
||||
|
||||
while (ventoy_isspace(*start))
|
||||
{
|
||||
start++;
|
||||
}
|
||||
VTOY_SKIP_SPACE(start);
|
||||
|
||||
if (*start == '"')
|
||||
{
|
||||
@@ -421,6 +484,19 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
|
||||
debug("Remove quotation <%s>\n", img->name);
|
||||
}
|
||||
|
||||
/* special process for /boot/initrd$XXX.img */
|
||||
if (dollar == 1)
|
||||
{
|
||||
if (grub_strncmp(img->name, "/boot/initrd$", 13) == 0)
|
||||
{
|
||||
len = (int)grub_strlen(img->name);
|
||||
if (grub_strcmp(img->name + len - 4, ".img") == 0)
|
||||
{
|
||||
initrd_dollar++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (dollar == 1 || ventoy_find_initrd_by_name(g_initrd_img_list, img->name))
|
||||
{
|
||||
grub_free(img);
|
||||
@@ -443,10 +519,7 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
|
||||
|
||||
if (*start == ' ' || *start == '\t')
|
||||
{
|
||||
while (ventoy_isspace(*start))
|
||||
{
|
||||
start++;
|
||||
}
|
||||
VTOY_SKIP_SPACE(start);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -458,6 +531,12 @@ static grub_err_t ventoy_grub_cfg_initrd_collect(const char *fileName)
|
||||
grub_free(buf);
|
||||
grub_file_close(file);
|
||||
|
||||
if (initrd_dollar > 0 && grub_strncmp(fileName, "(loop)/", 7) == 0)
|
||||
{
|
||||
debug("collect initrd variable %d\n", initrd_dollar);
|
||||
ventoy_linux_collect_boot_initrds();
|
||||
}
|
||||
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
@@ -1020,6 +1099,7 @@ static grub_err_t ventoy_linux_locate_initrd(int filt, int *filtcnt)
|
||||
if (filtbysize
|
||||
&& (NULL == grub_strstr(node->name, "minirt.gz"))
|
||||
&& (NULL == grub_strstr(node->name, "initrd.xz"))
|
||||
&& (NULL == grub_strstr(node->name, "initrd.gz"))
|
||||
)
|
||||
{
|
||||
if (filt > 0 && file->size <= g_ventoy_cpio_size + 2048)
|
||||
@@ -1481,7 +1561,6 @@ grub_err_t ventoy_cmd_trailer_cpio(grub_extcmd_context_t ctxt, int argc, char **
|
||||
grub_uint8_t *bufend;
|
||||
cpio_newc_header *head;
|
||||
grub_file_t file;
|
||||
char value[64];
|
||||
const grub_uint8_t trailler[124] = {
|
||||
0x30, 0x37, 0x30, 0x37, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
|
||||
0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
|
||||
@@ -1552,11 +1631,8 @@ grub_err_t ventoy_cmd_trailer_cpio(grub_extcmd_context_t ctxt, int argc, char **
|
||||
name = (char *)(head + 1);
|
||||
}
|
||||
}
|
||||
|
||||
grub_snprintf(value, sizeof(value), "0x%llx", (ulonglong)(ulong)g_ventoy_cpio_buf);
|
||||
ventoy_set_env("ventoy_cpio_addr", value);
|
||||
grub_snprintf(value, sizeof(value), "%d", bufsize);
|
||||
ventoy_set_env("ventoy_cpio_size", value);
|
||||
|
||||
ventoy_memfile_env_set("ventoy_cpio", g_ventoy_cpio_buf, (ulonglong)bufsize);
|
||||
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
@@ -1578,7 +1654,6 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
|
||||
const char *pLastChain = NULL;
|
||||
const char *compatible;
|
||||
ventoy_chain_head *chain;
|
||||
char envbuf[64];
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
@@ -1666,10 +1741,7 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
|
||||
return 1;
|
||||
}
|
||||
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)chain);
|
||||
grub_env_set("vtoy_chain_mem_addr", envbuf);
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "%u", size);
|
||||
grub_env_set("vtoy_chain_mem_size", envbuf);
|
||||
ventoy_memfile_env_set("vtoy_chain_mem", chain, (ulonglong)size);
|
||||
|
||||
grub_memset(chain, 0, sizeof(ventoy_chain_head));
|
||||
|
||||
@@ -1720,3 +1792,300 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
static char *ventoy_systemd_conf_tag(char *buf, const char *tag, int optional)
|
||||
{
|
||||
int taglen = 0;
|
||||
char *start = NULL;
|
||||
char *nextline = NULL;
|
||||
|
||||
taglen = grub_strlen(tag);
|
||||
for (start = buf; start; start = nextline)
|
||||
{
|
||||
nextline = ventoy_get_line(start);
|
||||
VTOY_SKIP_SPACE(start);
|
||||
|
||||
if (grub_strncmp(start, tag, taglen) == 0 && (start[taglen] == ' ' || start[taglen] == '\t'))
|
||||
{
|
||||
start += taglen;
|
||||
VTOY_SKIP_SPACE(start);
|
||||
return start;
|
||||
}
|
||||
}
|
||||
|
||||
if (optional == 0)
|
||||
{
|
||||
debug("tag<%s> NOT found\n", tag);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int ventoy_systemd_conf_hook(const char *filename, const struct grub_dirhook_info *info, void *data)
|
||||
{
|
||||
int oldpos = 0;
|
||||
char *tag = NULL;
|
||||
char *bkbuf = NULL;
|
||||
char *filebuf = NULL;
|
||||
grub_file_t file = NULL;
|
||||
systemd_menu_ctx *ctx = (systemd_menu_ctx *)data;
|
||||
|
||||
debug("ventoy_systemd_conf_hook %s\n", filename);
|
||||
|
||||
if (info->dir || NULL == grub_strstr(filename, ".conf"))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s/loader/entries/%s", ctx->dev, filename);
|
||||
if (!file)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
filebuf = grub_zalloc(2 * file->size + 8);
|
||||
if (!filebuf)
|
||||
{
|
||||
goto out;
|
||||
}
|
||||
|
||||
bkbuf = filebuf + file->size + 4;
|
||||
grub_file_read(file, bkbuf, file->size);
|
||||
|
||||
oldpos = ctx->pos;
|
||||
|
||||
/* title --> menuentry */
|
||||
grub_memcpy(filebuf, bkbuf, file->size);
|
||||
tag = ventoy_systemd_conf_tag(filebuf, "title", 0);
|
||||
vtoy_check_goto_out(tag);
|
||||
vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, "menuentry \"%s\" {\n", tag);
|
||||
|
||||
/* linux xxx */
|
||||
grub_memcpy(filebuf, bkbuf, file->size);
|
||||
tag = ventoy_systemd_conf_tag(filebuf, "linux", 0);
|
||||
if (!tag)
|
||||
{
|
||||
ctx->pos = oldpos;
|
||||
goto out;
|
||||
}
|
||||
vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, " echo \"Downloading kernel ...\"\n linux %s ", tag);
|
||||
|
||||
/* kernel options */
|
||||
grub_memcpy(filebuf, bkbuf, file->size);
|
||||
tag = ventoy_systemd_conf_tag(filebuf, "options", 0);
|
||||
vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, "%s \n", tag ? tag : "");
|
||||
|
||||
|
||||
/* initrd xxx xxx xxx */
|
||||
vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, " echo \"Downloading initrd ...\"\n initrd ");
|
||||
grub_memcpy(filebuf, bkbuf, file->size);
|
||||
tag = ventoy_systemd_conf_tag(filebuf, "initrd", 1);
|
||||
while (tag)
|
||||
{
|
||||
vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, "%s ", tag);
|
||||
tag = ventoy_systemd_conf_tag(tag + grub_strlen(tag) + 1, "initrd", 1);
|
||||
}
|
||||
|
||||
vtoy_len_ssprintf(ctx->buf, ctx->pos, ctx->len, "\n boot\n}\n");
|
||||
|
||||
out:
|
||||
grub_check_free(filebuf);
|
||||
grub_file_close(file);
|
||||
return 0;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_linux_systemd_menu(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
static char *buf = NULL;
|
||||
grub_fs_t fs;
|
||||
char *device_name = NULL;
|
||||
grub_device_t dev = NULL;
|
||||
systemd_menu_ctx ctx;
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
|
||||
if (!buf)
|
||||
{
|
||||
buf = grub_malloc(VTOY_LINUX_SYSTEMD_MENU_MAX_BUF);
|
||||
if (!buf)
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
device_name = grub_file_get_device_name(args[0]);
|
||||
if (!device_name)
|
||||
{
|
||||
debug("failed to get device name %s\n", args[0]);
|
||||
goto end;
|
||||
}
|
||||
|
||||
dev = grub_device_open(device_name);
|
||||
if (!dev)
|
||||
{
|
||||
debug("failed to open device %s\n", device_name);
|
||||
goto end;
|
||||
}
|
||||
|
||||
fs = grub_fs_probe(dev);
|
||||
if (!fs)
|
||||
{
|
||||
debug("failed to probe fs %d\n", grub_errno);
|
||||
goto end;
|
||||
}
|
||||
|
||||
ctx.dev = args[0];
|
||||
ctx.buf = buf;
|
||||
ctx.pos = 0;
|
||||
ctx.len = VTOY_LINUX_SYSTEMD_MENU_MAX_BUF;
|
||||
fs->fs_dir(dev, "/loader/entries", ventoy_systemd_conf_hook, &ctx);
|
||||
|
||||
ventoy_memfile_env_set(args[1], buf, (ulonglong)(ctx.pos));
|
||||
|
||||
end:
|
||||
grub_check_free(device_name);
|
||||
check_free(dev, grub_device_close);
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
static int ventoy_limine_path_convert(char *path)
|
||||
{
|
||||
char newpath[256] = {0};
|
||||
|
||||
if (grub_strncmp(path, "boot://2/", 9) == 0)
|
||||
{
|
||||
grub_snprintf(newpath, sizeof(newpath), "(vtimghd,2)/%s", path + 9);
|
||||
}
|
||||
else if (grub_strncmp(path, "boot://1/", 9) == 0)
|
||||
{
|
||||
grub_snprintf(newpath, sizeof(newpath), "(vtimghd,1)/%s", path + 9);
|
||||
}
|
||||
|
||||
if (newpath[0])
|
||||
{
|
||||
grub_snprintf(path, 1024, "%s", newpath);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_linux_limine_menu(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int pos = 0;
|
||||
int sub = 0;
|
||||
int len = VTOY_LINUX_SYSTEMD_MENU_MAX_BUF;
|
||||
char *filebuf = NULL;
|
||||
char *start = NULL;
|
||||
char *nextline = NULL;
|
||||
grub_file_t file = NULL;
|
||||
char *title = NULL;
|
||||
char *kernel = NULL;
|
||||
char *initrd = NULL;
|
||||
char *param = NULL;
|
||||
static char *buf = NULL;
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
|
||||
if (!buf)
|
||||
{
|
||||
buf = grub_malloc(len + 4 * 1024);
|
||||
if (!buf)
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
title = buf + len;
|
||||
kernel = title + 1024;
|
||||
initrd = kernel + 1024;
|
||||
param = initrd + 1024;
|
||||
|
||||
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, args[0]);
|
||||
if (!file)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
filebuf = grub_zalloc(file->size + 8);
|
||||
if (!filebuf)
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
|
||||
grub_file_read(file, filebuf, file->size);
|
||||
grub_file_close(file);
|
||||
|
||||
|
||||
title[0] = kernel[0] = initrd[0] = param[0] = 0;
|
||||
for (start = filebuf; start; start = nextline)
|
||||
{
|
||||
nextline = ventoy_get_line(start);
|
||||
VTOY_SKIP_SPACE(start);
|
||||
|
||||
if (start[0] == ':')
|
||||
{
|
||||
if (start[1] == ':')
|
||||
{
|
||||
grub_snprintf(title, 1024, "%s", start + 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (sub)
|
||||
{
|
||||
vtoy_len_ssprintf(buf, pos, len, "}\n");
|
||||
sub = 0;
|
||||
}
|
||||
|
||||
if (nextline && nextline[0] == ':' && nextline[1] == ':')
|
||||
{
|
||||
vtoy_len_ssprintf(buf, pos, len, "submenu \"[+] %s\" {\n", start + 2);
|
||||
sub = 1;
|
||||
title[0] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_snprintf(title, 1024, "%s", start + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (grub_strncmp(start, "KERNEL_PATH=", 12) == 0)
|
||||
{
|
||||
grub_snprintf(kernel, 1024, "%s", start + 12);
|
||||
}
|
||||
else if (grub_strncmp(start, "MODULE_PATH=", 12) == 0)
|
||||
{
|
||||
grub_snprintf(initrd, 1024, "%s", start + 12);
|
||||
}
|
||||
else if (grub_strncmp(start, "KERNEL_CMDLINE=", 15) == 0)
|
||||
{
|
||||
grub_snprintf(param, 1024, "%s", start + 15);
|
||||
}
|
||||
|
||||
if (title[0] && kernel[0] && initrd[0] && param[0])
|
||||
{
|
||||
ventoy_limine_path_convert(kernel);
|
||||
ventoy_limine_path_convert(initrd);
|
||||
|
||||
vtoy_len_ssprintf(buf, pos, len, "menuentry \"%s\" {\n", title);
|
||||
vtoy_len_ssprintf(buf, pos, len, " echo \"Downloading kernel ...\"\n linux %s %s\n", kernel, param);
|
||||
vtoy_len_ssprintf(buf, pos, len, " echo \"Downloading initrd ...\"\n initrd %s\n", initrd);
|
||||
vtoy_len_ssprintf(buf, pos, len, "}\n");
|
||||
|
||||
title[0] = kernel[0] = initrd[0] = param[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (sub)
|
||||
{
|
||||
vtoy_len_ssprintf(buf, pos, len, "}\n");
|
||||
sub = 0;
|
||||
}
|
||||
|
||||
ventoy_memfile_env_set(args[1], buf, (ulonglong)pos);
|
||||
|
||||
end:
|
||||
grub_check_free(filebuf);
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
|
@@ -35,6 +35,7 @@
|
||||
#include <grub/crypto.h>
|
||||
#include <grub/time.h>
|
||||
#include <grub/font.h>
|
||||
#include <grub/video.h>
|
||||
#include <grub/ventoy.h>
|
||||
#include "ventoy_def.h"
|
||||
|
||||
@@ -56,12 +57,16 @@ static injection_config *g_injection_head = NULL;
|
||||
static auto_memdisk *g_auto_memdisk_head = NULL;
|
||||
static image_list *g_image_list_head = NULL;
|
||||
static conf_replace *g_conf_replace_head = NULL;
|
||||
static VTOY_JSON *g_menu_lang_json = NULL;
|
||||
|
||||
static int g_theme_id = 0;
|
||||
static int g_theme_res_fit = 0;
|
||||
static int g_theme_num = 0;
|
||||
static theme_list *g_theme_head = NULL;
|
||||
static int g_theme_random = vtoy_theme_random_boot_second;
|
||||
static char g_theme_single_file[256];
|
||||
static char g_cur_menu_language[32] = {0};
|
||||
static char g_push_menu_language[32] = {0};
|
||||
|
||||
static int ventoy_plugin_is_parent(const char *pat, int patlen, const char *isopath)
|
||||
{
|
||||
@@ -375,6 +380,18 @@ static int ventoy_plugin_theme_entry(VTOY_JSON *json, const char *isodisk)
|
||||
if (g_theme_num > 0)
|
||||
{
|
||||
vtoy_json_get_int(json->pstChild, "default_file", &g_theme_id);
|
||||
if (g_theme_id == 0)
|
||||
{
|
||||
vtoy_json_get_int(json->pstChild, "resolution_fit", &g_theme_res_fit);
|
||||
if (g_theme_res_fit != 1)
|
||||
{
|
||||
g_theme_res_fit = 0;
|
||||
}
|
||||
|
||||
grub_snprintf(val, sizeof(val), "%d", g_theme_res_fit);
|
||||
ventoy_env_export("vtoy_res_fit", val);
|
||||
}
|
||||
|
||||
if (g_theme_id > g_theme_num || g_theme_id < 0)
|
||||
{
|
||||
g_theme_id = 0;
|
||||
@@ -405,19 +422,19 @@ static int ventoy_plugin_theme_entry(VTOY_JSON *json, const char *isodisk)
|
||||
value = vtoy_json_get_string_ex(json->pstChild, "ventoy_left");
|
||||
if (value)
|
||||
{
|
||||
ventoy_env_export("VTLE_LFT", value);
|
||||
ventoy_env_export(ventoy_left_key, value);
|
||||
}
|
||||
|
||||
value = vtoy_json_get_string_ex(json->pstChild, "ventoy_top");
|
||||
if (value)
|
||||
{
|
||||
ventoy_env_export("VTLE_TOP", value);
|
||||
ventoy_env_export(ventoy_top_key, value);
|
||||
}
|
||||
|
||||
value = vtoy_json_get_string_ex(json->pstChild, "ventoy_color");
|
||||
if (value)
|
||||
{
|
||||
ventoy_env_export("VTLE_CLR", value);
|
||||
ventoy_env_export(ventoy_color_key, value);
|
||||
}
|
||||
|
||||
node = vtoy_json_find_item(json->pstChild, JSON_TYPE_ARRAY, "fonts");
|
||||
@@ -3369,7 +3386,7 @@ grub_err_t ventoy_cmd_select_theme_cfg(grub_extcmd_context_t ctxt, int argc, cha
|
||||
}
|
||||
|
||||
pos += grub_snprintf(buf + pos, bufsize - pos,
|
||||
"menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {\n"
|
||||
"menuentry \"$VTLANG_RETURN_PREVIOUS\" --class=vtoyret VTOY_RET {\n"
|
||||
"echo 'Return ...'\n"
|
||||
"}\n");
|
||||
|
||||
@@ -3379,13 +3396,19 @@ grub_err_t ventoy_cmd_select_theme_cfg(grub_extcmd_context_t ctxt, int argc, cha
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern char g_ventoy_theme_path[256];
|
||||
|
||||
grub_err_t ventoy_cmd_set_theme(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
grub_uint32_t i = 0;
|
||||
grub_uint32_t mod = 0;
|
||||
grub_uint32_t theme_num = 0;
|
||||
theme_list *node = g_theme_head;
|
||||
struct grub_datetime datetime;
|
||||
|
||||
struct grub_video_mode_info info;
|
||||
char buf[64];
|
||||
char **pThemePath = NULL;
|
||||
|
||||
(void)argc;
|
||||
(void)args;
|
||||
(void)ctxt;
|
||||
@@ -3415,41 +3438,82 @@ grub_err_t ventoy_cmd_set_theme(grub_extcmd_context_t ctxt, int argc, char **arg
|
||||
goto end;
|
||||
}
|
||||
|
||||
grub_memset(&datetime, 0, sizeof(datetime));
|
||||
grub_get_datetime(&datetime);
|
||||
|
||||
if (g_theme_random == vtoy_theme_random_boot_second)
|
||||
pThemePath = (char **)grub_zalloc(sizeof(char *) * g_theme_num);
|
||||
if (!pThemePath)
|
||||
{
|
||||
grub_divmod32((grub_uint32_t)datetime.second, (grub_uint32_t)g_theme_num, &mod);
|
||||
}
|
||||
else if (g_theme_random == vtoy_theme_random_boot_day)
|
||||
{
|
||||
grub_divmod32((grub_uint32_t)datetime.day, (grub_uint32_t)g_theme_num, &mod);
|
||||
}
|
||||
else if (g_theme_random == vtoy_theme_random_boot_month)
|
||||
{
|
||||
grub_divmod32((grub_uint32_t)datetime.month, (grub_uint32_t)g_theme_num, &mod);
|
||||
goto end;
|
||||
}
|
||||
|
||||
debug("%04d/%02d/%02d %02d:%02d:%02d radom:%d mod:%d\n",
|
||||
datetime.year, datetime.month, datetime.day,
|
||||
datetime.hour, datetime.minute, datetime.second,
|
||||
g_theme_random, mod);
|
||||
|
||||
for (i = 0; i < mod && node; i++)
|
||||
if (g_theme_res_fit)
|
||||
{
|
||||
node = node->next;
|
||||
if (grub_video_get_info(&info) == GRUB_ERR_NONE)
|
||||
{
|
||||
debug("get video info success %ux%u\n", info.width, info.height);
|
||||
grub_snprintf(buf, sizeof(buf), "%ux%u", info.width, info.height);
|
||||
for (node = g_theme_head; node; node = node->next)
|
||||
{
|
||||
if (grub_strstr(node->theme.path, buf))
|
||||
{
|
||||
pThemePath[theme_num++] = node->theme.path;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
debug("random theme %s\n", node->theme.path);
|
||||
grub_env_set("theme", node->theme.path);
|
||||
if (theme_num == 0)
|
||||
{
|
||||
for (node = g_theme_head; node; node = node->next)
|
||||
{
|
||||
pThemePath[theme_num++] = node->theme.path;
|
||||
}
|
||||
}
|
||||
|
||||
if (theme_num == 1)
|
||||
{
|
||||
mod = 0;
|
||||
debug("Only 1 theme match, no need to random.\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_memset(&datetime, 0, sizeof(datetime));
|
||||
grub_get_datetime(&datetime);
|
||||
|
||||
if (g_theme_random == vtoy_theme_random_boot_second)
|
||||
{
|
||||
grub_divmod32((grub_uint32_t)datetime.second, theme_num, &mod);
|
||||
}
|
||||
else if (g_theme_random == vtoy_theme_random_boot_day)
|
||||
{
|
||||
grub_divmod32((grub_uint32_t)datetime.day, theme_num, &mod);
|
||||
}
|
||||
else if (g_theme_random == vtoy_theme_random_boot_month)
|
||||
{
|
||||
grub_divmod32((grub_uint32_t)datetime.month, theme_num, &mod);
|
||||
}
|
||||
|
||||
debug("%04d/%02d/%02d %02d:%02d:%02d theme_num:%d mod:%d\n",
|
||||
datetime.year, datetime.month, datetime.day,
|
||||
datetime.hour, datetime.minute, datetime.second,
|
||||
theme_num, mod);
|
||||
}
|
||||
|
||||
if (argc > 0 && grub_strcmp(args[0], "switch") == 0)
|
||||
{
|
||||
grub_snprintf(g_ventoy_theme_path, sizeof(g_ventoy_theme_path), "%s", pThemePath[mod]);
|
||||
}
|
||||
else
|
||||
{
|
||||
debug("random theme %s\n", pThemePath[mod]);
|
||||
grub_env_set("theme", pThemePath[mod]);
|
||||
}
|
||||
g_ventoy_menu_refresh = 1;
|
||||
|
||||
end:
|
||||
|
||||
grub_check_free(pThemePath);
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
extern char g_ventoy_theme_path[256];
|
||||
grub_err_t ventoy_cmd_set_theme_path(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
(void)argc;
|
||||
@@ -3467,3 +3531,127 @@ grub_err_t ventoy_cmd_set_theme_path(grub_extcmd_context_t ctxt, int argc, char
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
const char *ventoy_get_vmenu_title(const char *vMenu)
|
||||
{
|
||||
return vtoy_json_get_string_ex(g_menu_lang_json->pstChild, vMenu);
|
||||
}
|
||||
|
||||
int ventoy_plugin_load_menu_lang(int init, const char *lang)
|
||||
{
|
||||
int ret = 1;
|
||||
grub_file_t file = NULL;
|
||||
char *buf = NULL;
|
||||
|
||||
if (grub_strcmp(lang, g_cur_menu_language) == 0)
|
||||
{
|
||||
debug("Same menu lang %s\n", lang);
|
||||
return 0;
|
||||
}
|
||||
grub_snprintf(g_cur_menu_language, sizeof(g_cur_menu_language), "%s", lang);
|
||||
|
||||
debug("Load menu lang %s\n", g_cur_menu_language);
|
||||
|
||||
if (g_menu_lang_json)
|
||||
{
|
||||
vtoy_json_destroy(g_menu_lang_json);
|
||||
g_menu_lang_json = NULL;
|
||||
}
|
||||
|
||||
g_menu_lang_json = vtoy_json_create();
|
||||
if (!g_menu_lang_json)
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
|
||||
file = ventoy_grub_file_open(GRUB_FILE_TYPE_LINUX_INITRD, "(vt_menu_tarfs)/menu/%s.json", lang);
|
||||
if (!file)
|
||||
{
|
||||
goto end;
|
||||
}
|
||||
|
||||
buf = grub_malloc(file->size + 1);
|
||||
if (!buf)
|
||||
{
|
||||
grub_printf("Failed to malloc memory %lu.\n", (ulong)(file->size + 1));
|
||||
goto end;
|
||||
}
|
||||
|
||||
buf[file->size] = 0;
|
||||
grub_file_read(file, buf, file->size);
|
||||
|
||||
vtoy_json_parse(g_menu_lang_json, buf);
|
||||
|
||||
if (g_default_menu_mode == 0)
|
||||
{
|
||||
grub_snprintf(g_ventoy_hotkey_tip, sizeof(g_ventoy_hotkey_tip), "%s", ventoy_get_vmenu_title("VTLANG_STR_HOTKEY_TREE"));
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_snprintf(g_ventoy_hotkey_tip, sizeof(g_ventoy_hotkey_tip), "%s", ventoy_get_vmenu_title("VTLANG_STR_HOTKEY_LIST"));
|
||||
}
|
||||
|
||||
if (init == 0)
|
||||
{
|
||||
ventoy_menu_push_key(GRUB_TERM_ESC);
|
||||
ventoy_menu_push_key(GRUB_TERM_ESC);
|
||||
g_ventoy_menu_refresh = 1;
|
||||
}
|
||||
ret = 0;
|
||||
|
||||
end:
|
||||
|
||||
check_free(file, grub_file_close);
|
||||
grub_check_free(buf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_cur_menu_lang(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
|
||||
if (argc > 0)
|
||||
{
|
||||
grub_env_set(args[0], g_cur_menu_language);
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_printf("%s\n", g_cur_menu_language);
|
||||
grub_printf("%s\n", g_ventoy_hotkey_tip);
|
||||
grub_refresh();
|
||||
}
|
||||
|
||||
VENTOY_CMD_RETURN(0);
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_push_menulang(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
(void)argc;
|
||||
(void)ctxt;
|
||||
|
||||
if (g_push_menu_language[0] == 0)
|
||||
{
|
||||
grub_memcpy(g_push_menu_language, g_cur_menu_language, sizeof(g_push_menu_language));
|
||||
ventoy_plugin_load_menu_lang(0, args[0]);
|
||||
}
|
||||
|
||||
VENTOY_CMD_RETURN(0);
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_pop_menulang(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
(void)argc;
|
||||
(void)ctxt;
|
||||
(void)args;
|
||||
|
||||
if (g_push_menu_language[0])
|
||||
{
|
||||
ventoy_plugin_load_menu_lang(0, g_push_menu_language);
|
||||
g_push_menu_language[0] = 0;
|
||||
}
|
||||
|
||||
VENTOY_CMD_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -1118,7 +1118,6 @@ grub_err_t ventoy_cmd_unix_chain_data(grub_extcmd_context_t ctxt, int argc, char
|
||||
const char *pLastChain = NULL;
|
||||
const char *compatible;
|
||||
ventoy_chain_head *chain;
|
||||
char envbuf[64];
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
@@ -1197,10 +1196,7 @@ grub_err_t ventoy_cmd_unix_chain_data(grub_extcmd_context_t ctxt, int argc, char
|
||||
return 1;
|
||||
}
|
||||
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)chain);
|
||||
grub_env_set("vtoy_chain_mem_addr", envbuf);
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "%u", size);
|
||||
grub_env_set("vtoy_chain_mem_size", envbuf);
|
||||
ventoy_memfile_env_set("vtoy_chain_mem", chain, (ulonglong)size);
|
||||
|
||||
grub_memset(chain, 0, sizeof(ventoy_chain_head));
|
||||
|
||||
|
@@ -148,9 +148,10 @@ static int ventoy_vhd_patch_path(char *vhdpath, ventoy_patch_vhd *patch1, ventoy
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ventoy_vhd_read_parttbl(const char *filename, ventoy_gpt_info *gpt, int *index)
|
||||
static int ventoy_vhd_read_parttbl(const char *filename, ventoy_gpt_info *gpt, int *index, grub_uint64_t *poffset)
|
||||
{
|
||||
int i;
|
||||
int find = 0;
|
||||
int ret = 1;
|
||||
grub_uint64_t start;
|
||||
grub_file_t file = NULL;
|
||||
@@ -183,6 +184,7 @@ static int ventoy_vhd_read_parttbl(const char *filename, ventoy_gpt_info *gpt, i
|
||||
if (start == gpt->PartTbl[i].StartLBA)
|
||||
{
|
||||
*index = i;
|
||||
find = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -196,11 +198,22 @@ static int ventoy_vhd_read_parttbl(const char *filename, ventoy_gpt_info *gpt, i
|
||||
if ((grub_uint32_t)start == gpt->MBR.PartTbl[i].StartSectorId)
|
||||
{
|
||||
*index = i;
|
||||
find = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (find == 0) // MBR Logical partition
|
||||
{
|
||||
if (file->device->disk->partition->number > 0)
|
||||
{
|
||||
*index = file->device->disk->partition->number;
|
||||
debug("Fall back part number: %d\n", *index);
|
||||
}
|
||||
}
|
||||
|
||||
*poffset = start;
|
||||
ret = 0;
|
||||
|
||||
end:
|
||||
@@ -226,7 +239,7 @@ static int ventoy_vhd_patch_disk(const char *vhdpath, ventoy_patch_vhd *patch1,
|
||||
else
|
||||
{
|
||||
gpt = grub_zalloc(sizeof(ventoy_gpt_info));
|
||||
ventoy_vhd_read_parttbl(vhdpath, gpt, &partIndex);
|
||||
ventoy_vhd_read_parttbl(vhdpath, gpt, &partIndex, &offset);
|
||||
debug("This is HDD partIndex %d %s\n", partIndex, vhdpath);
|
||||
}
|
||||
|
||||
@@ -249,9 +262,11 @@ static int ventoy_vhd_patch_disk(const char *vhdpath, ventoy_patch_vhd *patch1,
|
||||
}
|
||||
else
|
||||
{
|
||||
offset = gpt->MBR.PartTbl[partIndex].StartSectorId;
|
||||
if (offset == 0)
|
||||
{
|
||||
offset = gpt->MBR.PartTbl[partIndex].StartSectorId;
|
||||
}
|
||||
offset *= 512;
|
||||
|
||||
debug("MBR disk signature: %02x%02x%02x%02x Part(%d) offset:%llu\n",
|
||||
gpt->MBR.BootCode[0x1b8 + 0], gpt->MBR.BootCode[0x1b8 + 1],
|
||||
gpt->MBR.BootCode[0x1b8 + 2], gpt->MBR.BootCode[0x1b8 + 3],
|
||||
@@ -305,7 +320,6 @@ grub_err_t ventoy_cmd_patch_vhdboot(grub_extcmd_context_t ctxt, int argc, char *
|
||||
int patchoffset[2];
|
||||
ventoy_patch_vhd *patch1;
|
||||
ventoy_patch_vhd *patch2;
|
||||
char envbuf[64];
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
@@ -356,15 +370,9 @@ grub_err_t ventoy_cmd_patch_vhdboot(grub_extcmd_context_t ctxt, int argc, char *
|
||||
|
||||
/* set buffer and size */
|
||||
#ifdef GRUB_MACHINE_EFI
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (ulong)g_vhdboot_totbuf);
|
||||
grub_env_set("vtoy_vhd_buf_addr", envbuf);
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "%d", (int)(g_vhdboot_isolen + sizeof(ventoy_chain_head)));
|
||||
grub_env_set("vtoy_vhd_buf_size", envbuf);
|
||||
ventoy_memfile_env_set("vtoy_vhd_buf", g_vhdboot_totbuf, (ulonglong)(g_vhdboot_isolen + sizeof(ventoy_chain_head)));
|
||||
#else
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (ulong)g_vhdboot_isobuf);
|
||||
grub_env_set("vtoy_vhd_buf_addr", envbuf);
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "%d", g_vhdboot_isolen);
|
||||
grub_env_set("vtoy_vhd_buf_size", envbuf);
|
||||
ventoy_memfile_env_set("vtoy_vhd_buf", g_vhdboot_isobuf, (ulonglong)g_vhdboot_isolen);
|
||||
#endif
|
||||
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
@@ -645,7 +653,6 @@ grub_err_t ventoy_cmd_raw_chain_data(grub_extcmd_context_t ctxt, int argc, char
|
||||
grub_disk_t disk;
|
||||
const char *pLastChain = NULL;
|
||||
ventoy_chain_head *chain;
|
||||
char envbuf[64];
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
@@ -695,10 +702,7 @@ grub_err_t ventoy_cmd_raw_chain_data(grub_extcmd_context_t ctxt, int argc, char
|
||||
return 1;
|
||||
}
|
||||
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)chain);
|
||||
grub_env_set("vtoy_chain_mem_addr", envbuf);
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "%u", size);
|
||||
grub_env_set("vtoy_chain_mem_size", envbuf);
|
||||
ventoy_memfile_env_set("vtoy_chain_mem", chain, (ulonglong)size);
|
||||
|
||||
grub_env_export("vtoy_chain_mem_addr");
|
||||
grub_env_export("vtoy_chain_mem_size");
|
||||
|
@@ -1090,6 +1090,12 @@ static int ventoy_fill_windows_rtdata(void *buf, char *isopath, int dataflag)
|
||||
{
|
||||
data->windows11_bypass_check = 1;
|
||||
}
|
||||
|
||||
env = grub_env_get("VTOY_WIN11_BYPASS_NRO");
|
||||
if (env && env[0] == '1' && env[1] == 0)
|
||||
{
|
||||
data->windows11_bypass_nro = 1;
|
||||
}
|
||||
|
||||
pos = grub_strstr(isopath, "/");
|
||||
if (!pos)
|
||||
@@ -1364,6 +1370,112 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch, int win
|
||||
return 0;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_sel_winpe_wim(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int i = 0;
|
||||
int pos = 0;
|
||||
int len = 0;
|
||||
int find = 0;
|
||||
char *cmd = NULL;
|
||||
wim_patch *node = NULL;
|
||||
wim_patch *tmp = NULL;
|
||||
grub_file_t file = NULL;
|
||||
wim_header *head = NULL;
|
||||
char cfgfile[128];
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
|
||||
len = 8 * VTOY_SIZE_1KB;
|
||||
cmd = (char *)grub_malloc(len + sizeof(wim_header));
|
||||
if (!cmd)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
head = (wim_header *)(cmd + len);
|
||||
grub_env_unset("vtoy_pe_wim_path");
|
||||
|
||||
for (node = g_wim_patch_head; node; node = node->next)
|
||||
{
|
||||
find = 0;
|
||||
for (tmp = g_wim_patch_head; tmp != node; tmp = tmp->next)
|
||||
{
|
||||
if (tmp->valid && grub_strcasecmp(tmp->path, node->path) == 0)
|
||||
{
|
||||
find = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (find)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
g_ventoy_case_insensitive = 1;
|
||||
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[0], node->path);
|
||||
g_ventoy_case_insensitive = 0;
|
||||
if (!file)
|
||||
{
|
||||
debug("File %s%s NOT exist\n", args[0], node->path);
|
||||
continue;
|
||||
}
|
||||
|
||||
grub_file_read(file, head, sizeof(wim_header));
|
||||
if (grub_memcmp(head->signature, WIM_HEAD_SIGNATURE, sizeof(head->signature)))
|
||||
{
|
||||
debug("Not a valid wim file %s\n", (char *)head->signature);
|
||||
grub_file_close(file);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (head->flags & FLAG_HEADER_COMPRESS_LZMS)
|
||||
{
|
||||
debug("LZMS compress is not supported 0x%x\n", head->flags);
|
||||
grub_file_close(file);
|
||||
continue;
|
||||
}
|
||||
|
||||
grub_file_close(file);
|
||||
node->valid = 1;
|
||||
|
||||
vtoy_len_ssprintf(cmd, pos, len, "menuentry \"%s\" --class=\"sel_wim\" {\n echo \"\"\n}\n", node->path);
|
||||
}
|
||||
|
||||
if (pos > 0)
|
||||
{
|
||||
g_ventoy_menu_esc = 1;
|
||||
g_ventoy_suppress_esc = 1;
|
||||
g_ventoy_suppress_esc_default = 0;
|
||||
g_ventoy_secondary_menu_on = 1;
|
||||
|
||||
grub_snprintf(cfgfile, sizeof(cfgfile), "configfile mem:0x%llx:size:%d", (ulonglong)(ulong)cmd, pos);
|
||||
grub_script_execute_sourcecode(cfgfile);
|
||||
|
||||
g_ventoy_menu_esc = 0;
|
||||
g_ventoy_suppress_esc = 0;
|
||||
g_ventoy_suppress_esc_default = 1;
|
||||
g_ventoy_secondary_menu_on = 0;
|
||||
|
||||
for (node = g_wim_patch_head; node; node = node->next)
|
||||
{
|
||||
if (node->valid)
|
||||
{
|
||||
if (i == g_ventoy_last_entry)
|
||||
{
|
||||
grub_env_set("vtoy_pe_wim_path", node->path);
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
grub_free(cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_locate_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int datalen = 0;
|
||||
@@ -1790,19 +1902,150 @@ end:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ventoy_extract_init_exe(char *wimfile, grub_uint8_t **pexe_data, grub_uint32_t *pexe_len, char *exe_name)
|
||||
{
|
||||
int rc;
|
||||
int ret = 1;
|
||||
grub_uint16_t i;
|
||||
grub_file_t file = NULL;
|
||||
grub_uint32_t exe_len = 0;
|
||||
wim_header *head = NULL;
|
||||
grub_uint16_t *uname = NULL;
|
||||
grub_uint8_t *exe_data = NULL;
|
||||
grub_uint8_t *decompress_data = NULL;
|
||||
wim_lookup_entry *lookup = NULL;
|
||||
wim_security_header *security = NULL;
|
||||
wim_directory_entry *rootdir = NULL;
|
||||
wim_directory_entry *search = NULL;
|
||||
wim_stream_entry *stream = NULL;
|
||||
wim_lookup_entry *replace_look = NULL;
|
||||
wim_header wimhdr;
|
||||
wim_hash hashdata;
|
||||
|
||||
head = &wimhdr;
|
||||
|
||||
file = grub_file_open(wimfile, VENTOY_FILE_TYPE);
|
||||
if (!file)
|
||||
{
|
||||
goto out;
|
||||
}
|
||||
|
||||
grub_file_read(file, head, sizeof(wim_header));
|
||||
rc = ventoy_read_resource(file, head, &head->metadata, (void **)&decompress_data);
|
||||
if (rc)
|
||||
{
|
||||
grub_printf("failed to read meta data %d\n", rc);
|
||||
goto out;
|
||||
}
|
||||
|
||||
security = (wim_security_header *)decompress_data;
|
||||
if (security->len > 0)
|
||||
{
|
||||
rootdir = (wim_directory_entry *)(decompress_data + ((security->len + 7) & 0xFFFFFFF8U));
|
||||
}
|
||||
else
|
||||
{
|
||||
rootdir = (wim_directory_entry *)(decompress_data + 8);
|
||||
}
|
||||
|
||||
debug("read lookup offset:%llu size:%llu\n", (ulonglong)head->lookup.offset, (ulonglong)head->lookup.raw_size);
|
||||
lookup = grub_malloc(head->lookup.raw_size);
|
||||
grub_file_seek(file, head->lookup.offset);
|
||||
grub_file_read(file, lookup, head->lookup.raw_size);
|
||||
|
||||
/* search winpeshl.exe dirent entry */
|
||||
search = search_replace_wim_dirent(file, head, lookup, decompress_data, rootdir);
|
||||
if (!search)
|
||||
{
|
||||
debug("Failed to find replace file %p\n", search);
|
||||
goto out;
|
||||
}
|
||||
|
||||
uname = (grub_uint16_t *)(search + 1);
|
||||
for (i = 0; i < search->name_len / 2 && i < 200; i++)
|
||||
{
|
||||
exe_name[i] = (char)uname[i];
|
||||
}
|
||||
exe_name[i] = 0;
|
||||
debug("find replace file at %p <%s>\n", search, exe_name);
|
||||
|
||||
grub_memset(&hashdata, 0, sizeof(wim_hash));
|
||||
if (grub_memcmp(&hashdata, 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(&hashdata, stream->hash.sha1, sizeof(wim_hash));
|
||||
debug("new search hash: %02x %02x %02x %02x %02x %02x %02x %02x\n",
|
||||
ventoy_varg_8(hashdata.sha1));
|
||||
break;
|
||||
}
|
||||
stream = (wim_stream_entry *)((char *)stream + stream->len);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
grub_memcpy(&hashdata, search->hash.sha1, sizeof(wim_hash));
|
||||
}
|
||||
|
||||
/* find and extact winpeshl.exe */
|
||||
replace_look = ventoy_find_look_entry(head, lookup, &hashdata);
|
||||
if (replace_look)
|
||||
{
|
||||
exe_len = (grub_uint32_t)replace_look->resource.raw_size;
|
||||
debug("find replace lookup entry_id:%ld raw_size:%u\n",
|
||||
((long)replace_look - (long)lookup) / sizeof(wim_lookup_entry), exe_len);
|
||||
|
||||
if (0 != ventoy_read_resource(file, head, &(replace_look->resource), (void **)&(exe_data)))
|
||||
{
|
||||
exe_len = 0;
|
||||
exe_data = NULL;
|
||||
debug("failed to read replace file meta data %u\n", exe_len);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
debug("failed to find lookup entry for replace file %02x %02x %02x %02x\n",
|
||||
ventoy_varg_4(hashdata.sha1));
|
||||
}
|
||||
|
||||
if (exe_data)
|
||||
{
|
||||
ret = 0;
|
||||
*pexe_data = exe_data;
|
||||
*pexe_len = exe_len;
|
||||
}
|
||||
|
||||
out:
|
||||
|
||||
grub_check_free(lookup);
|
||||
grub_check_free(decompress_data);
|
||||
check_free(file, grub_file_close);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int rc = 0;
|
||||
int wim64 = 0;
|
||||
int datalen = 0;
|
||||
int dataflag = 0;
|
||||
grub_uint32_t size = 0;
|
||||
grub_uint32_t exe_len = 0;
|
||||
grub_uint32_t jump_align = 0;
|
||||
const char *addr = NULL;
|
||||
ventoy_chain_head *chain = NULL;
|
||||
ventoy_os_param *param = NULL;
|
||||
char envbuf[64];
|
||||
grub_uint8_t *param = NULL;
|
||||
grub_uint8_t *exe_data = NULL;
|
||||
ventoy_windows_data *rtdata = NULL;
|
||||
char exename[128] = {0};
|
||||
wim_tail wim_data;
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
(void)args;
|
||||
|
||||
addr = grub_env_get("vtoy_chain_mem_addr");
|
||||
if (!addr)
|
||||
@@ -1821,24 +2064,30 @@ grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc,
|
||||
|
||||
datalen = ventoy_get_windows_rtdata_len(chain->os_param.vtoy_img_path, &dataflag);
|
||||
|
||||
size = sizeof(ventoy_os_param) + datalen;
|
||||
param = (ventoy_os_param *)grub_zalloc(size);
|
||||
if (!param)
|
||||
rc = ventoy_extract_init_exe(args[0], &exe_data, &exe_len, exename);
|
||||
if (rc)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
wim64 = ventoy_is_pe64(exe_data);
|
||||
|
||||
grub_memcpy(param, &chain->os_param, sizeof(ventoy_os_param));
|
||||
ventoy_fill_windows_rtdata(param + 1, param->vtoy_img_path, dataflag);
|
||||
grub_memset(&wim_data, 0, sizeof(wim_data));
|
||||
ventoy_cat_exe_file_data(&wim_data, exe_len, exe_data, datalen);
|
||||
grub_check_free(exe_data);
|
||||
|
||||
jump_align = ventoy_align(wim_data.jump_exe_len, 16);
|
||||
param = wim_data.jump_bin_data;
|
||||
|
||||
grub_memcpy(param + jump_align, &chain->os_param, sizeof(ventoy_os_param));
|
||||
|
||||
rtdata = (ventoy_windows_data *)(param + jump_align + sizeof(ventoy_os_param));
|
||||
ventoy_fill_windows_rtdata(rtdata, chain->os_param.vtoy_img_path, dataflag);
|
||||
|
||||
ventoy_memfile_env_set("vtoy_wimboot_mem", param, (ulonglong)(wim_data.bin_align_len));
|
||||
|
||||
grub_env_set(args[1], exename);
|
||||
grub_env_set(args[2], wim64 ? "64" : "32");
|
||||
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)param);
|
||||
grub_env_set("vtoy_wimboot_mem_addr", envbuf);
|
||||
debug("vtoy_wimboot_mem_addr: %s\n", envbuf);
|
||||
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "%u", size);
|
||||
grub_env_set("vtoy_wimboot_mem_size", envbuf);
|
||||
debug("vtoy_wimboot_mem_size: %s\n", envbuf);
|
||||
|
||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||
}
|
||||
|
||||
@@ -1857,7 +2106,6 @@ grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, c
|
||||
const char *pLastChain = NULL;
|
||||
const char *compatible;
|
||||
ventoy_chain_head *chain;
|
||||
char envbuf[64];
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
@@ -1879,7 +2127,10 @@ grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, c
|
||||
if (0 == ventoy_compatible && g_wim_valid_patch_count == 0)
|
||||
{
|
||||
unknown_image = 1;
|
||||
debug("Warning: %s was not recognized by Ventoy\n", args[0]);
|
||||
if (!g_ventoy_wimboot_mode)
|
||||
{
|
||||
debug("Warning: %s was not recognized by Ventoy\n", args[0]);
|
||||
}
|
||||
}
|
||||
|
||||
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", args[0]);
|
||||
@@ -1949,10 +2200,7 @@ grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, c
|
||||
return 1;
|
||||
}
|
||||
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)chain);
|
||||
grub_env_set("vtoy_chain_mem_addr", envbuf);
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "%u", size);
|
||||
grub_env_set("vtoy_chain_mem_size", envbuf);
|
||||
ventoy_memfile_env_set("vtoy_chain_mem", chain, (ulonglong)size);
|
||||
|
||||
grub_memset(chain, 0, sizeof(ventoy_chain_head));
|
||||
|
||||
@@ -2071,6 +2319,67 @@ static int ventoy_get_wim_chunklist(grub_file_t wimfile, ventoy_img_chunk_list *
|
||||
return 0;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_is_standard_winiso(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
int i;
|
||||
int ret = 1;
|
||||
char prefix[32] = {0};
|
||||
const char *chkfile[] =
|
||||
{
|
||||
"boot/bcd", "boot/boot.sdi", NULL
|
||||
};
|
||||
|
||||
(void)ctxt;
|
||||
(void)argc;
|
||||
|
||||
if (ventoy_check_file_exist("%s/sources/boot.wim", args[0]))
|
||||
{
|
||||
prefix[0] = 0;
|
||||
}
|
||||
else if (ventoy_check_file_exist("%s/x86/sources/boot.wim", args[0]))
|
||||
{
|
||||
grub_snprintf(prefix, sizeof(prefix), "/x86");
|
||||
}
|
||||
else if (ventoy_check_file_exist("%s/x64/sources/boot.wim", args[0]))
|
||||
{
|
||||
grub_snprintf(prefix, sizeof(prefix), "/x64");
|
||||
}
|
||||
else
|
||||
{
|
||||
debug("No boot.wim found.\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (i = 0; chkfile[i]; i++)
|
||||
{
|
||||
if (!ventoy_check_file_exist("%s%s/%s", args[0], prefix, chkfile[i]))
|
||||
{
|
||||
debug("%s not found.\n", chkfile[i]);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
if ((!ventoy_check_file_exist("%s%s/sources/install.wim", args[0], prefix)) &&
|
||||
(!ventoy_check_file_exist("%s%s/sources/install.esd", args[0], prefix)))
|
||||
{
|
||||
debug("No install.wim(esd) found.\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!ventoy_check_file_exist("%s/setup.exe", args[0]))
|
||||
{
|
||||
debug("No setup.exe found.\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
debug("This is standard Windows ISO.\n");
|
||||
|
||||
out:
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
grub_err_t ventoy_cmd_wim_check_bootable(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||
{
|
||||
grub_uint32_t boot_index;
|
||||
@@ -2125,7 +2434,6 @@ static grub_err_t ventoy_vlnk_wim_chain_data(grub_file_t wimfile)
|
||||
ventoy_img_chunk *chunknode;
|
||||
ventoy_override_chunk *override;
|
||||
ventoy_img_chunk_list wimchunk;
|
||||
char envbuf[128];
|
||||
|
||||
debug("vlnk wim chain data begin <%s> ...\n", wimfile->name);
|
||||
|
||||
@@ -2182,10 +2490,7 @@ static grub_err_t ventoy_vlnk_wim_chain_data(grub_file_t wimfile)
|
||||
return 1;
|
||||
}
|
||||
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)chain);
|
||||
grub_env_set("vtoy_chain_mem_addr", envbuf);
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "%u", size);
|
||||
grub_env_set("vtoy_chain_mem_size", envbuf);
|
||||
ventoy_memfile_env_set("vtoy_chain_mem", chain, (ulonglong)size);
|
||||
|
||||
grub_memset(chain, 0, sizeof(ventoy_chain_head));
|
||||
|
||||
@@ -2290,7 +2595,6 @@ static grub_err_t ventoy_normal_wim_chain_data(grub_file_t wimfile)
|
||||
ventoy_img_chunk *chunknode;
|
||||
ventoy_override_chunk *override;
|
||||
ventoy_img_chunk_list wimchunk;
|
||||
char envbuf[128];
|
||||
|
||||
debug("normal wim chain data begin <%s> ...\n", wimfile->name);
|
||||
|
||||
@@ -2347,10 +2651,7 @@ static grub_err_t ventoy_normal_wim_chain_data(grub_file_t wimfile)
|
||||
return 1;
|
||||
}
|
||||
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "0x%lx", (unsigned long)chain);
|
||||
grub_env_set("vtoy_chain_mem_addr", envbuf);
|
||||
grub_snprintf(envbuf, sizeof(envbuf), "%u", size);
|
||||
grub_env_set("vtoy_chain_mem_size", envbuf);
|
||||
ventoy_memfile_env_set("vtoy_chain_mem", chain, (ulonglong)size);
|
||||
|
||||
grub_memset(chain, 0, sizeof(ventoy_chain_head));
|
||||
|
||||
|
73
GRUB2/MOD_SRC/grub-2.04/include/grub/env.h
Normal file
73
GRUB2/MOD_SRC/grub-2.04/include/grub/env.h
Normal file
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 2003,2005,2006,2007,2009 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_ENV_HEADER
|
||||
#define GRUB_ENV_HEADER 1
|
||||
|
||||
#include <grub/symbol.h>
|
||||
#include <grub/err.h>
|
||||
#include <grub/types.h>
|
||||
#include <grub/menu.h>
|
||||
|
||||
struct grub_env_var;
|
||||
|
||||
typedef const char *(*grub_env_read_hook_t) (struct grub_env_var *var,
|
||||
const char *val);
|
||||
typedef char *(*grub_env_write_hook_t) (struct grub_env_var *var,
|
||||
const char *val);
|
||||
|
||||
struct grub_env_var
|
||||
{
|
||||
char *name;
|
||||
char *value;
|
||||
grub_env_read_hook_t read_hook;
|
||||
grub_env_write_hook_t write_hook;
|
||||
struct grub_env_var *next;
|
||||
struct grub_env_var **prevp;
|
||||
struct grub_env_var *sorted_next;
|
||||
int global;
|
||||
};
|
||||
|
||||
grub_err_t EXPORT_FUNC(grub_env_set) (const char *name, const char *val);
|
||||
const char *EXPORT_FUNC(grub_env_get) (const char *name);
|
||||
void EXPORT_FUNC(grub_env_unset) (const char *name);
|
||||
struct grub_env_var *EXPORT_FUNC(grub_env_update_get_sorted) (void);
|
||||
|
||||
#define FOR_SORTED_ENV(var) for (var = grub_env_update_get_sorted (); var; var = var->sorted_next)
|
||||
|
||||
grub_err_t EXPORT_FUNC(grub_register_variable_hook) (const char *name,
|
||||
grub_env_read_hook_t read_hook,
|
||||
grub_env_write_hook_t write_hook);
|
||||
grub_err_t EXPORT_FUNC(grub_register_vtoy_menu_lang_hook) (grub_env_read_hook_t read_hook);
|
||||
|
||||
grub_err_t grub_env_context_open (void);
|
||||
grub_err_t grub_env_context_close (void);
|
||||
grub_err_t EXPORT_FUNC(grub_env_export) (const char *name);
|
||||
|
||||
void grub_env_unset_menu (void);
|
||||
grub_menu_t grub_env_get_menu (void);
|
||||
void grub_env_set_menu (grub_menu_t nmenu);
|
||||
|
||||
grub_err_t
|
||||
grub_env_extractor_open (int source);
|
||||
|
||||
grub_err_t
|
||||
grub_env_extractor_close (int source);
|
||||
|
||||
|
||||
#endif /* ! GRUB_ENV_HEADER */
|
@@ -141,8 +141,10 @@ typedef struct ventoy_windows_data
|
||||
grub_uint8_t windows11_bypass_check;
|
||||
|
||||
grub_uint32_t auto_install_len;
|
||||
|
||||
grub_uint8_t reserved[255 - 4];
|
||||
|
||||
grub_uint8_t windows11_bypass_nro;
|
||||
|
||||
grub_uint8_t reserved[255 - 5];
|
||||
|
||||
/* auto_intall file buf */
|
||||
/* ...... + auto_install_len */
|
||||
@@ -304,6 +306,7 @@ grub_uint64_t grub_udf_get_last_file_attr_offset
|
||||
grub_uint64_t *fe_entry_size_offset
|
||||
);
|
||||
int ventoy_is_efi_os(void);
|
||||
void ventoy_memfile_env_set(const char *prefix, const void *buf, unsigned long long len);
|
||||
|
||||
#endif /* __VENTOY_H__ */
|
||||
|
||||
|
@@ -12,7 +12,7 @@ make install
|
||||
PATH=$VT_DIR/GRUB2/INSTALL/bin/:$VT_DIR/GRUB2/INSTALL/sbin/:$PATH
|
||||
|
||||
net_modules_legacy="net tftp http"
|
||||
all_modules_legacy="file setkey date drivemap blocklist regexp newc vga_text ntldr search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio lspci pci ext2 xfs ventoy chain read halt iso9660 linux16 test true sleep reboot echo videotest videoinfo videotest_checksum video_colors video_cirrus video_bochs vga vbe video_fb font video gettext extcmd terminal linux minicmd help configfile tr trig boot biosdisk disk ls tar squash4 password_pbkdf2 all_video png jpeg part_gpt part_msdos fat exfat ntfs loopback gzio normal udf gfxmenu gfxterm gfxterm_background gfxterm_menu smbios zfs"
|
||||
all_modules_legacy="file date drivemap blocklist newc vga_text ntldr search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio lspci pci ext2 xfs ventoy chain read halt iso9660 linux16 test true sleep reboot echo videotest videoinfo videotest_checksum video_colors video_cirrus video_bochs vga vbe font video gettext extcmd terminal linux minicmd help configfile tr trig boot biosdisk disk ls tar squash4 password_pbkdf2 all_video png jpeg part_gpt part_msdos fat exfat ntfs loopback gzio normal video_fb udf gfxmenu gfxterm gfxterm_background gfxterm_menu smbios"
|
||||
|
||||
net_modules_uefi="efinet net tftp http"
|
||||
all_modules_uefi="file setkey blocklist ventoy test true regexp newc search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio ext2 xfs read halt sleep serial terminfo png password_pbkdf2 gcry_sha512 pbkdf2 part_gpt part_msdos ls tar squash4 loopback part_apple minicmd diskfilter linux relocator jpeg iso9660 udf hfsplus halt acpi mmap gfxmenu video_colors trig bitmap_scale gfxterm bitmap font fat exfat ntfs fshelp efifwsetup reboot echo configfile normal terminal gettext chain priority_queue bufio datetime cat extcmd crypto gzio boot all_video efi_gop efi_uga video_bochs video_cirrus video video_fb gfxterm_background gfxterm_menu mouse fwload smbios zfs"
|
||||
|
BIN
ICON/filechecksum.gif
Normal file
BIN
ICON/filechecksum.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 437 KiB |
32
IMG/cpio/ventoy/hook/chimera/disk_hook.sh
Normal file
32
IMG/cpio/ventoy/hook/chimera/disk_hook.sh
Normal file
@@ -0,0 +1,32 @@
|
||||
#!/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
|
||||
|
||||
for i in 0 1 2 3 4 5 6 7 8 9; do
|
||||
vtdiskname=$(get_ventoy_disk_name)
|
||||
if [ "$vtdiskname" = "unknown" ]; then
|
||||
vtlog "wait for disk ..."
|
||||
$SLEEP 3
|
||||
else
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
|
22
IMG/cpio/ventoy/hook/chimera/ventoy-hook.sh
Normal file
22
IMG/cpio/ventoy/hook/chimera/ventoy-hook.sh
Normal file
@@ -0,0 +1,22 @@
|
||||
#!/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/>.
|
||||
#
|
||||
#************************************************************************************
|
||||
|
||||
. $VTOY_PATH/hook/ventoy-os-lib.sh
|
||||
|
||||
$SED "/maybe_break *premount/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/chimera/disk_hook.sh" -i /init
|
@@ -40,13 +40,13 @@ ventoy_os_install_dmsetup_by_unsquashfs() {
|
||||
|
||||
dmModPath="/usr/lib/modules/$vtKerVer/kernel/drivers/md/dm-mod.$vtKoPo"
|
||||
echo $dmModPath > $VTOY_PATH/fsextract
|
||||
vtoy_unsquashfs -d $VTOY_PATH/sqfs -n -q -e $VTOY_PATH/fsextract $VTOY_PATH/fsdisk
|
||||
vtoy_unsquashfs -d $VTOY_PATH/sqfs -n -q -e $VTOY_PATH/fsextract $VTOY_PATH/fsdisk 2>>$VTLOG
|
||||
|
||||
if ! [ -e $VTOY_PATH/sqfs${dmModPath} ]; then
|
||||
rm -rf $VTOY_PATH/sqfs
|
||||
dmModPath="/lib/modules/$vtKerVer/kernel/drivers/md/dm-mod.$vtKoPo"
|
||||
echo $dmModPath > $VTOY_PATH/fsextract
|
||||
vtoy_unsquashfs -d $VTOY_PATH/sqfs -n -q -e $VTOY_PATH/fsextract $VTOY_PATH/fsdisk
|
||||
vtoy_unsquashfs -d $VTOY_PATH/sqfs -n -q -e $VTOY_PATH/fsextract $VTOY_PATH/fsdisk 2>>$VTLOG
|
||||
fi
|
||||
|
||||
if [ -e $VTOY_PATH/sqfs${dmModPath} ]; then
|
||||
|
@@ -33,7 +33,7 @@ ventoy_os_install_dmsetup_by_fuse() {
|
||||
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
|
||||
mount -t squashfs $VTOY_PATH/mnt/iso/minios/01-core*.sb $VTOY_PATH/mnt/squashfs
|
||||
mount -t squashfs $VTOY_PATH/mnt/iso/minios/0*-core*.sb $VTOY_PATH/mnt/squashfs
|
||||
|
||||
KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/md/dm-mod.ko*)
|
||||
vtlog "insmod $KoName"
|
||||
|
@@ -20,5 +20,5 @@
|
||||
if [ -f /lib/livekitlib ] && $GREP -q 'debug_log.*find_data_try' /lib/livekitlib; then
|
||||
$SED "/debug_log.*find_data_try/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/minios-disk.sh" -i /lib/livekitlib
|
||||
else
|
||||
$SED "/find_data/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/minios-disk.sh" -i /init
|
||||
$SED "/find_data/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/minios-disk.sh" -i /init
|
||||
fi
|
||||
|
@@ -37,12 +37,20 @@ ventoy_os_install_dmsetup_by_fuse() {
|
||||
|
||||
mount -t iso9660 $VTOY_PATH/mnt/fuse/ventoy.iso $VTOY_PATH/mnt/iso
|
||||
|
||||
sfsfile=$(ls $VTOY_PATH/mnt/iso/*.sfs)
|
||||
if ls $VTOY_PATH/mnt/iso/zdrv_*.sfs 2>/dev/null; then
|
||||
sfsfile=$(ls $VTOY_PATH/mnt/iso/zdrv_*.sfs)
|
||||
else
|
||||
sfsfile=$(ls $VTOY_PATH/mnt/iso/*.sfs)
|
||||
fi
|
||||
|
||||
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*)
|
||||
if [ -z "$KoName" ]; then
|
||||
KoName=$(ls $VTOY_PATH/mnt/squashfs/usr/lib/modules/$kVer/kernel/drivers/md/dm-mod.ko*)
|
||||
fi
|
||||
|
||||
vtlog "insmod $KoName"
|
||||
insmod $KoName
|
||||
|
||||
|
@@ -28,6 +28,7 @@ vtlog "####### $0 $* ########"
|
||||
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||
|
||||
ventoy_os_install_dmsetup_by_fuse() {
|
||||
local drvdir=""
|
||||
vtlog "ventoy_os_install_dmsetup_by_fuse $*"
|
||||
|
||||
mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso $VTOY_PATH/mnt/squashfs
|
||||
@@ -37,11 +38,13 @@ ventoy_os_install_dmsetup_by_fuse() {
|
||||
|
||||
mount -t iso9660 $VTOY_PATH/mnt/fuse/ventoy.iso $VTOY_PATH/mnt/iso
|
||||
|
||||
|
||||
for sfsfile in $(ls $VTOY_PATH/mnt/iso/*drv_veket*.sfs); do
|
||||
mount -t squashfs $sfsfile $VTOY_PATH/mnt/squashfs
|
||||
if [ -d $VTOY_PATH/mnt/squashfs/lib/modules ]; then
|
||||
KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/md/dm-mod.ko*)
|
||||
if [ -n "$KoName" -a -f $KoName ]; then
|
||||
drvdir=$VTOY_PATH/mnt/squashfs/lib/modules/$2
|
||||
break
|
||||
fi
|
||||
fi
|
||||
@@ -49,11 +52,29 @@ ventoy_os_install_dmsetup_by_fuse() {
|
||||
umount $VTOY_PATH/mnt/squashfs
|
||||
done
|
||||
|
||||
KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/dax/dax.ko*)
|
||||
|
||||
if [ -z "$drvdir" ]; then
|
||||
vtlog "retry for usr/lib dir"
|
||||
for sfsfile in $(ls $VTOY_PATH/mnt/iso/*drv_veket*.sfs); do
|
||||
mount -t squashfs $sfsfile $VTOY_PATH/mnt/squashfs
|
||||
if [ -d $VTOY_PATH/mnt/squashfs/usr/lib/modules ]; then
|
||||
KoName=$(ls $VTOY_PATH/mnt/squashfs/usr/lib/modules/$2/kernel/drivers/md/dm-mod.ko*)
|
||||
if [ -n "$KoName" -a -f $KoName ]; then
|
||||
drvdir=$VTOY_PATH/mnt/squashfs/usr/lib/modules/$2
|
||||
break
|
||||
fi
|
||||
fi
|
||||
|
||||
umount $VTOY_PATH/mnt/squashfs
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
KoName=$(ls $drvdir/kernel/drivers/dax/dax.ko*)
|
||||
vtlog "insmod $KoName"
|
||||
insmod $KoName
|
||||
|
||||
KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/md/dm-mod.ko*)
|
||||
KoName=$(ls $drvdir/kernel/drivers/md/dm-mod.ko*)
|
||||
vtlog "insmod $KoName"
|
||||
insmod $KoName
|
||||
|
||||
|
@@ -26,6 +26,10 @@ ventoy_get_debian_distro() {
|
||||
if $EGREP -q "ID=.*antix|ID=.*mx" /etc/initrd-release; then
|
||||
echo 'antix'; return
|
||||
fi
|
||||
elif [ -e /etc/initrd_release ]; then
|
||||
if $EGREP -q "ID=.*antix|ID=.*mx" /etc/initrd_release; then
|
||||
echo 'antix'; return
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -e /DISTRO_SPECS ]; then
|
||||
@@ -45,6 +49,8 @@ ventoy_get_debian_distro() {
|
||||
echo 'mll'; return
|
||||
elif $GREP -m1 -q 'stratodesk.com' /init; then
|
||||
echo 'stratodesk'; return
|
||||
elif $GREP -q "\bPVE\b" /init; then
|
||||
echo 'pve'; return
|
||||
fi
|
||||
fi
|
||||
|
||||
|
40
IMG/cpio/ventoy/hook/deepin/disk_mount_hook.sh
Normal file
40
IMG/cpio/ventoy/hook/deepin/disk_mount_hook.sh
Normal file
@@ -0,0 +1,40 @@
|
||||
#!/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
|
||||
|
||||
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
|
||||
|
||||
vtlog "${vtdiskname#/dev/}2 found..."
|
||||
$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/udev_disk_hook.sh "${vtdiskname#/dev/}2"
|
||||
|
||||
if [ -f /ventoy/autoinstall ]; then
|
||||
sh /ventoy/hook/default/auto_install_varexp.sh /ventoy/autoinstall
|
||||
fi
|
151
IMG/cpio/ventoy/hook/deepin/udev_disk_hook.sh
Normal file
151
IMG/cpio/ventoy/hook/deepin/udev_disk_hook.sh
Normal file
@@ -0,0 +1,151 @@
|
||||
#!/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
|
||||
|
||||
ventoy_os_install_dmsetup() {
|
||||
|
||||
vtlog "ventoy_os_install_dmsetup $1 ..."
|
||||
|
||||
vt_usb_disk=$1
|
||||
|
||||
# dump iso file location
|
||||
$VTOY_PATH/tool/vtoydm -i -f $VTOY_PATH/ventoy_image_map -d ${vt_usb_disk} > $VTOY_PATH/iso_file_list
|
||||
|
||||
# install dmsetup
|
||||
LINE=$($GREP ' dmsetup.*\.udeb' $VTOY_PATH/iso_file_list)
|
||||
if [ $? -eq 0 ]; then
|
||||
install_udeb_from_line "$LINE" ${vt_usb_disk}
|
||||
fi
|
||||
|
||||
# install libdevmapper
|
||||
LINE=$($GREP ' libdevmapper.*\.udeb' $VTOY_PATH/iso_file_list)
|
||||
if [ $? -eq 0 ]; then
|
||||
install_udeb_from_line "$LINE" ${vt_usb_disk}
|
||||
fi
|
||||
|
||||
# install md-modules
|
||||
LINE=$($GREP -i ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list)
|
||||
if [ $? -eq 0 ]; then
|
||||
LINTCNT=$($GREP -i -c ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list)
|
||||
if [ $LINTCNT -gt 1 ]; then
|
||||
vtlog "more than one pkgs, need to filter..."
|
||||
VER=$($BUSYBOX_PATH/uname -r)
|
||||
|
||||
LINE=$($GREP -i ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -i $VER)
|
||||
LINTCNT=$($GREP -i ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -i -c $VER)
|
||||
if [ $LINTCNT -gt 1 ]; then
|
||||
vtlog "Still more than one pkgs, use the first one..."
|
||||
LINE=$($GREP -i ' md-modules.*\.udeb' $VTOY_PATH/iso_file_list | $GREP -i -m1 $VER)
|
||||
fi
|
||||
fi
|
||||
install_udeb_from_line "$LINE" ${vt_usb_disk}
|
||||
fi
|
||||
|
||||
# insmod md-mod if needed
|
||||
if $GREP -q 'device-mapper' /proc/devices; then
|
||||
vtlog "device mapper module is loaded"
|
||||
else
|
||||
vtlog "device mapper module is NOT loaded, now load it..."
|
||||
|
||||
VER=$($BUSYBOX_PATH/uname -r)
|
||||
KO=$($FIND /lib/modules/$VER/kernel/drivers/md -name "dm-mod*")
|
||||
vtlog "KO=$KO"
|
||||
|
||||
insmod $KO
|
||||
fi
|
||||
|
||||
vtlog "dmsetup install finish, now check it..."
|
||||
if dmsetup info >> $VTLOG 2>&1; then
|
||||
vtlog "dmsetup work ok"
|
||||
else
|
||||
vtlog "dmsetup not work, now try to load eglibc ..."
|
||||
|
||||
# install eglibc (some ubuntu 32 bit version need it)
|
||||
LINE=$($GREP 'libc6-.*\.udeb' $VTOY_PATH/iso_file_list)
|
||||
if [ $? -eq 0 ]; then
|
||||
install_udeb_from_line "$LINE" ${vt_usb_disk}
|
||||
fi
|
||||
|
||||
if dmsetup info >> $VTLOG 2>&1; then
|
||||
vtlog "dmsetup work ok after retry"
|
||||
else
|
||||
vtlog "dmsetup still not work after retry"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
if is_ventoy_hook_finished || not_ventoy_disk "${1:0:-1}"; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
vtlog "==== $0 $* ===="
|
||||
|
||||
dmsetup_path=$(ventoy_find_bin_path dmsetup)
|
||||
if [ -z "$dmsetup_path" ]; then
|
||||
ventoy_os_install_dmsetup "/dev/${1:0:-1}"
|
||||
fi
|
||||
|
||||
if ! $GREP -q 'device-mapper' /proc/devices; then
|
||||
ventoy_os_install_dmsetup "/dev/${1:0:-1}"
|
||||
fi
|
||||
|
||||
ventoy_udev_disk_common_hook $*
|
||||
|
||||
#
|
||||
# Some distro default only accept usb partitions as install medium.
|
||||
# So if ventoy is installed on a non-USB device, we just mount /cdrom here except
|
||||
# for these has boot=live or boot=casper parameter in cmdline
|
||||
#
|
||||
VT_BUS_USB=""
|
||||
if [ -n "$ID_BUS" ]; then
|
||||
if echo $ID_BUS | $GREP -q -i usb; then
|
||||
VT_BUS_USB="YES"
|
||||
fi
|
||||
else
|
||||
if $BUSYBOX_PATH/ls -l /sys/class/block/${1:0:-1} | $GREP -q -i usb; then
|
||||
VT_BUS_USB="YES"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$VT_BUS_USB" ]; then
|
||||
vtlog "$1 is USB device"
|
||||
echo /dev/$1 > /ventoy/list-devices-usb-part
|
||||
else
|
||||
vtlog "$1 is NOT USB device (bus $ID_BUS)"
|
||||
|
||||
if $EGREP -q 'boot=|casper' /proc/cmdline; then
|
||||
vtlog "boot=, or casper, don't mount"
|
||||
else
|
||||
vtlog "No boot param, need to mount"
|
||||
echo /dev/$1 > /ventoy/list-devices-usb-part
|
||||
fi
|
||||
fi
|
||||
|
||||
#special process for Linx
|
||||
if $BUSYBOX_PATH/uname -r | $GREP -q "^2\.6"; then
|
||||
if $GREP -q "linx" /proc/version; then
|
||||
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 "/dev/$vtDM" > /ventoy/list-devices-usb-part
|
||||
fi
|
||||
fi
|
||||
|
||||
# OK finish
|
||||
set_ventoy_hook_finish
|
42
IMG/cpio/ventoy/hook/deepin/ventoy-hook.sh
Normal file
42
IMG/cpio/ventoy/hook/deepin/ventoy-hook.sh
Normal 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/>.
|
||||
#
|
||||
#************************************************************************************
|
||||
|
||||
|
||||
if [ -e /init ] && $GREP -q '^mountroot$' /init; then
|
||||
echo "Here before mountroot ..." >> $VTLOG
|
||||
|
||||
$SED "/^mountroot$/i\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/deepin/disk_mount_hook.sh" -i /init
|
||||
$SED "/^mountroot$/i\\export LIVEMEDIA=/dev/mapper/ventoy" -i /init
|
||||
$SED "/^mountroot$/i\\export LIVE_MEDIA=/dev/mapper/ventoy" -i /init
|
||||
|
||||
if $GREP -q 'live-media=' /proc/cmdline; then
|
||||
if [ -f /scripts/casper ] && $GREP -q '^ *LIVEMEDIA=' /scripts/casper; then
|
||||
$SED "s#^ *LIVEMEDIA=.*#LIVEMEDIA=/dev/mapper/ventoy#" -i /scripts/casper
|
||||
fi
|
||||
fi
|
||||
else
|
||||
echo "Here use udev hook ..." >> $VTLOG
|
||||
ventoy_systemd_udevd_work_around
|
||||
ventoy_add_udev_rule "$VTOY_PATH/hook/deepin/udev_disk_hook.sh %k"
|
||||
fi
|
||||
|
||||
if [ -f $VTOY_PATH/autoinstall ]; then
|
||||
echo "Do auto install ..." >> $VTLOG
|
||||
$SED '/maybe_break[[:space:]]*init/i\/ventoy/busybox/sh /ventoy/hook/deepin/ventoy_autoinstall.sh >>/ventoy/autoinstall.log 2>&1' -i /init
|
||||
fi
|
122
IMG/cpio/ventoy/hook/deepin/ventoy_autoinstall.sh
Normal file
122
IMG/cpio/ventoy/hook/deepin/ventoy_autoinstall.sh
Normal file
@@ -0,0 +1,122 @@
|
||||
#!/ventoy/busybox/sh
|
||||
|
||||
. /ventoy/hook/ventoy_hook_lib.sh
|
||||
|
||||
change_var_value() {
|
||||
local vfile=$1
|
||||
local vkey=$2
|
||||
local vVal=$3
|
||||
local quote=$4
|
||||
local vline
|
||||
|
||||
if [ $quote -eq 0 ]; then
|
||||
vline="$vkey = $vVal"
|
||||
else
|
||||
vline="$vkey = \"$vVal\""
|
||||
fi
|
||||
|
||||
if grep -q -m1 "^$vkey[[:space:]]*=" $vfile; then
|
||||
sed "s#^$vkey[[:space:]]*=.*#$vline#g" -i $vfile
|
||||
else
|
||||
echo "$vline" >> $vfile
|
||||
fi
|
||||
}
|
||||
|
||||
setting_script_process() {
|
||||
local sfile=$1
|
||||
local vItem
|
||||
local vB64Item
|
||||
|
||||
vItem=$(grep '^language[[:space:]]*=' /ventoy/autoinstall | awk '{print $3}')
|
||||
if [ -n "$vItem" ]; then
|
||||
change_var_value $sfile 'select_language_default_locale' "$vItem" 0
|
||||
fi
|
||||
|
||||
vItem=$(grep '^timezone[[:space:]]*=' /ventoy/autoinstall | awk '{print $3}')
|
||||
if [ -n "$vItem" ]; then
|
||||
change_var_value $sfile 'timezone_default' "$vItem" 0
|
||||
fi
|
||||
|
||||
vItem=$(grep '^hostname[[:space:]]*=' /ventoy/autoinstall | awk '{print $3}')
|
||||
if [ -n "$vItem" ]; then
|
||||
change_var_value $sfile 'system_info_default_hostname' "$vItem" 1
|
||||
change_var_value $sfile 'DI_HOSTNAME' "$vItem" 1
|
||||
fi
|
||||
|
||||
vItem=$(grep '^root_password[[:space:]]*=' /ventoy/autoinstall | awk '{print $3}')
|
||||
if [ -n "$vItem" ]; then
|
||||
vB64Item=$(echo -n "$vItem" | base64)
|
||||
change_var_value $sfile 'system_info_default_root_password' "$vB64Item" 1
|
||||
change_var_value $sfile 'DI_ROOTPASSWORD' "$vB64Item" 1
|
||||
fi
|
||||
|
||||
vItem=$(grep '^default_username[[:space:]]*=' /ventoy/autoinstall | awk '{print $3}')
|
||||
if [ -n "$vItem" ]; then
|
||||
change_var_value $sfile 'system_info_default_username' "$vItem" 1
|
||||
change_var_value $sfile 'DI_USERNAME' "$vItem" 1
|
||||
fi
|
||||
|
||||
vItem=$(grep '^default_password[[:space:]]*=' /ventoy/autoinstall | awk '{print $3}')
|
||||
if [ -n "$vItem" ]; then
|
||||
change_var_value $sfile 'system_info_default_password' "$vItem" 1
|
||||
change_var_value $sfile 'DI_PASSWORD' "$vItem" 1
|
||||
fi
|
||||
|
||||
vItem=$(grep '^install_disk[[:space:]]*=' /ventoy/autoinstall | awk '{print $3}')
|
||||
if [ -n "$vItem" ]; then
|
||||
echo "DI_FULLDISK_MULTIDISK_DEVICE = $vItem" >> $sfile
|
||||
echo "DI_ROOTDISK = $vItem" >> $sfile
|
||||
echo "DI_BOOTLOADER = $vItem" >> $sfile
|
||||
fi
|
||||
|
||||
change_var_value $sfile 'skip_virtual_machine_page' 'true' 0
|
||||
change_var_value $sfile 'skip_select_language_page' 'true' 0
|
||||
change_var_value $sfile 'skip_select_language_page_on_first_boot' 'true' 0
|
||||
change_var_value $sfile 'skip_system_keyboard_page' 'true' 0
|
||||
change_var_value $sfile 'skip_system_info_page' 'true' 0
|
||||
change_var_value $sfile 'skip_qr_code_system_info_page' 'true' 0
|
||||
change_var_value $sfile 'skip_timezone_page' 'true' 0
|
||||
change_var_value $sfile 'skip_partition_page' 'true' 0
|
||||
change_var_value $sfile 'system_info_password_validate_required' '0' 0
|
||||
change_var_value $sfile 'system_info_password_strong_check' 'false' 0
|
||||
change_var_value $sfile 'partition_do_auto_part' 'true' 0
|
||||
change_var_value $sfile 'system_info_disable_license' 'true' 0
|
||||
change_var_value $sfile 'system_info_disable_experience' 'true' 0
|
||||
change_var_value $sfile 'system_info_disable_privacy_license' 'true' 0
|
||||
|
||||
#filesystem.squashfs search ini
|
||||
#first_page_state=0,表示不跳过首页,展示首页让用户自己选择
|
||||
#first_page_state=1,表示跳过首页,并且自动点击一键安装
|
||||
#first_page_state=2,表示跳过首页,并且自动点击自定义安装
|
||||
#first_page_state=3,表示跳过首页,并且直接以全盘安装方式自动安装
|
||||
change_var_value $sfile 'first_page_state' '3' 0
|
||||
}
|
||||
|
||||
update_settings() {
|
||||
local script=$1
|
||||
local newscript
|
||||
|
||||
echo "update_settings for $script ..."
|
||||
|
||||
newscript=$(basename $script)
|
||||
cp -a $script /ventoy/vini_${newscript}
|
||||
setting_script_process /ventoy/vini_${newscript}
|
||||
|
||||
rm -f $script
|
||||
cp -a /ventoy/vini_${newscript} $script
|
||||
}
|
||||
|
||||
sh /ventoy/hook/common/auto_install_varexp.sh /ventoy/autoinstall
|
||||
|
||||
update_settings /root/usr/share/deepin-installer/resources/default_settings.ini
|
||||
|
||||
ls -1 /root/usr/share/deepin-installer/resources/override/ | while read line; do
|
||||
update_settings /root/usr/share/deepin-installer/resources/override/$line
|
||||
done
|
||||
|
||||
ls -1 /root/usr/share/deepin-installer/resources/oem/ | while read line; do
|
||||
update_settings /root/usr/share/deepin-installer/resources/oem/$line
|
||||
done
|
||||
|
||||
|
||||
|
@@ -24,6 +24,9 @@ if $GREP -q kaspersky /proc/version; then
|
||||
if [ -f /ventoy/ventoy_persistent_map ]; then
|
||||
$SED "/sysresccd_parsecmdline[^(]*$/a\ BACKSTORE_CMD='LABEL=casper-rw,noloop'" -i /init
|
||||
fi
|
||||
elif $GREP -q 'setting up the root filesystem' /init; then
|
||||
$SED "/setting up the root filesystem/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/gentoo/disk_hook.sh" -i /init
|
||||
$SED "/setting up the root filesystem/a\ export CDROOT_DEV=/dev/mapper/ventoy" -i /init
|
||||
elif [ -d /etc/udev/rules.d ] || [ -d /lib/udev/rules.d ]; then
|
||||
ventoy_systemd_udevd_work_around
|
||||
ventoy_add_udev_rule "$VTOY_PATH/hook/default/udev_disk_hook.sh %k noreplace"
|
||||
|
24
IMG/cpio/ventoy/hook/openEuler/ventoy-autoexp.sh
Normal file
24
IMG/cpio/ventoy/hook/openEuler/ventoy-autoexp.sh
Normal file
@@ -0,0 +1,24 @@
|
||||
#!/bin/sh
|
||||
#************************************************************************************
|
||||
# Copyright (c) 2022, 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/>.
|
||||
#
|
||||
#************************************************************************************
|
||||
|
||||
if [ -f /run/install/ks.cfg ]; then
|
||||
sh /ventoy/hook/default/auto_install_varexp.sh /run/install/ks.cfg
|
||||
fi
|
||||
|
||||
exit 0
|
@@ -24,18 +24,21 @@ if [ -f $VTOY_PATH/autoinstall ]; then
|
||||
else
|
||||
for vtParam in $($CAT /proc/cmdline); do
|
||||
if echo $vtParam | $GREP -q 'inst.ks=hd:LABEL='; then
|
||||
vtRawKsFull="$vtParam"
|
||||
vtRawKs=$(echo $vtParam | $AWK -F: '{print $NF}')
|
||||
VTKS="inst.ks=hd:/dev/ventoy:$vtRawKs"
|
||||
break
|
||||
fi
|
||||
|
||||
if echo $vtParam | $GREP -q '^ks=.*:/'; then
|
||||
vtRawKsFull="$vtParam"
|
||||
vtRawKs=$(echo $vtParam | $AWK -F: '{print $NF}')
|
||||
VTKS="ks=hd:/dev/ventoy:$vtRawKs"
|
||||
break
|
||||
fi
|
||||
|
||||
if echo $vtParam | $GREP -q '^inst.ks=.*:/'; then
|
||||
vtRawKsFull="$vtParam"
|
||||
vtRawKs=$(echo $vtParam | $AWK -F: '{print $NF}')
|
||||
VTKS="inst.ks=hd:/dev/ventoy:$vtRawKs"
|
||||
break
|
||||
@@ -63,7 +66,13 @@ fi
|
||||
echo "VTKS=$VTKS VTOVERLAY=$VTOVERLAY" >> $VTLOG
|
||||
|
||||
if [ -n "$vtRawKs" ]; then
|
||||
echo "$vtRawKs" > $VTOY_PATH/ventoy_ks_rootpath
|
||||
if echo $vtRawKsFull | $EGREP -q "=http|=https|=ftp|=nfs|=hmc"; then
|
||||
echo "vtRawKsFull=$vtRawKsFull no patch needed." >> $VTLOG
|
||||
vtRawKs=""
|
||||
VTKS=""
|
||||
else
|
||||
echo "$vtRawKs" > $VTOY_PATH/ventoy_ks_rootpath
|
||||
fi
|
||||
fi
|
||||
|
||||
if ls $VTOY_PATH | $GREP -q 'ventoy_dud[0-9]'; then
|
||||
@@ -98,3 +107,7 @@ if [ -f /usr/sbin/anaconda-diskroot ]; then
|
||||
$SED 's/^mount $dev $repodir/mount -oro $dev $repodir/' -i /usr/sbin/anaconda-diskroot
|
||||
fi
|
||||
|
||||
|
||||
if [ -f $VTOY_PATH/autoinstall ]; then
|
||||
cp -a $VTOY_PATH/hook/openEuler/ventoy-autoexp.sh /lib/dracut/hooks/pre-mount/99-ventoy-autoexp.sh
|
||||
fi
|
||||
|
@@ -51,6 +51,9 @@ if is_inotify_ventoy_part $3; then
|
||||
|
||||
if [ -e /sbin/anaconda-diskroot ]; then
|
||||
vtlog "set anaconda-diskroot ..."
|
||||
|
||||
#busybox cp doesn't support -t option (issue 1900)
|
||||
/bin/cp -a /bin/cp $BUSYBOX_PATH/cp
|
||||
/sbin/anaconda-diskroot /dev/ventoy
|
||||
fi
|
||||
|
||||
|
@@ -39,6 +39,9 @@ fi
|
||||
|
||||
if [ -e /sbin/anaconda-diskroot ]; then
|
||||
vtlog "set anaconda-diskroot /dev/ventoy ..."
|
||||
|
||||
#busybox cp doesn't support -t option (issue 1900)
|
||||
/bin/cp -a /bin/cp $BUSYBOX_PATH/cp
|
||||
/sbin/anaconda-diskroot /dev/ventoy
|
||||
fi
|
||||
|
||||
|
@@ -24,21 +24,29 @@
|
||||
|
||||
if [ -f $VTOY_PATH/autoinstall ]; then
|
||||
VTKS="inst.ks=file:$VTOY_PATH/autoinstall"
|
||||
cp -a $VTOY_PATH/hook/rhel7/ventoy-autoexp.sh /lib/dracut/hooks/pre-mount/99-ventoy-autoexp.sh
|
||||
else
|
||||
for vtParam in $($CAT /proc/cmdline); do
|
||||
if echo $vtParam | $GREP -q 'ks=file:/'; then
|
||||
continue
|
||||
fi
|
||||
|
||||
if echo $vtParam | $GREP -q 'inst.ks=hd:LABEL='; then
|
||||
vtRawKsFull="$vtParam"
|
||||
vtRawKs=$(echo $vtParam | $AWK -F: '{print $NF}')
|
||||
VTKS="inst.ks=hd:/dev/ventoy:$vtRawKs"
|
||||
break
|
||||
fi
|
||||
|
||||
if echo $vtParam | $GREP -q '^ks=.*:/'; then
|
||||
vtRawKsFull="$vtParam"
|
||||
vtRawKs=$(echo $vtParam | $AWK -F: '{print $NF}')
|
||||
VTKS="ks=hd:/dev/ventoy:$vtRawKs"
|
||||
break
|
||||
fi
|
||||
|
||||
if echo $vtParam | $GREP -q '^inst.ks=.*:/'; then
|
||||
vtRawKsFull="$vtParam"
|
||||
vtRawKs=$(echo $vtParam | $AWK -F: '{print $NF}')
|
||||
VTKS="inst.ks=hd:/dev/ventoy:$vtRawKs"
|
||||
break
|
||||
@@ -67,7 +75,13 @@ fi
|
||||
echo "VTKS=$VTKS VTOVERLAY=$VTOVERLAY" >> $VTLOG
|
||||
|
||||
if [ -n "$vtRawKs" ]; then
|
||||
echo "$vtRawKs" > $VTOY_PATH/ventoy_ks_rootpath
|
||||
if echo $vtRawKsFull | $EGREP -q "=http|=https|=ftp|=nfs|=hmc"; then
|
||||
echo "vtRawKsFull=$vtRawKsFull no patch needed." >> $VTLOG
|
||||
vtRawKs=""
|
||||
VTKS=""
|
||||
else
|
||||
echo "$vtRawKs" > $VTOY_PATH/ventoy_ks_rootpath
|
||||
fi
|
||||
fi
|
||||
|
||||
if ls $VTOY_PATH | $GREP -q 'ventoy_dud[0-9]'; then
|
||||
@@ -77,23 +91,7 @@ if ls $VTOY_PATH | $GREP -q 'ventoy_dud[0-9]'; then
|
||||
fi
|
||||
echo "vtInstDD=$vtInstDD" >> $VTLOG
|
||||
|
||||
if $GREP -q 'root=live' /proc/cmdline; then
|
||||
$SED "s#printf\(.*\)\$CMDLINE#printf\1\$CMDLINE root=live:/dev/ventoy $VTKS $VTOVERLAY $vtInstDD#" -i /lib/dracut-lib.sh
|
||||
else
|
||||
$SED "s#printf\(.*\)\$CMDLINE#printf\1\$CMDLINE inst.stage2=hd:/dev/ventoy $VTKS $VTOVERLAY $vtInstDD#" -i /lib/dracut-lib.sh
|
||||
fi
|
||||
|
||||
ventoy_set_inotify_script rhel7/ventoy-inotifyd-hook.sh
|
||||
|
||||
#Fedora
|
||||
if $BUSYBOX_PATH/which dmsquash-live-root > /dev/null; then
|
||||
vtPriority=99
|
||||
else
|
||||
vtPriority=01
|
||||
fi
|
||||
|
||||
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-inotifyd-start.sh /lib/dracut/hooks/pre-udev/${vtPriority}-ventoy-inotifyd-start.sh
|
||||
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-timeout.sh /lib/dracut/hooks/initqueue/timeout/${vtPriority}-ventoy-timeout.sh
|
||||
|
||||
vtNeedRepo=
|
||||
if [ -f /etc/system-release ]; then
|
||||
@@ -112,12 +110,61 @@ if $GREP -i -q Fedora /proc/version; then
|
||||
fi
|
||||
fi
|
||||
|
||||
if $GREP -i -q Fedora /etc/os-release; then
|
||||
if $GREP -q 'Server Edition' /etc/os-release; then
|
||||
vtNeedRepo="yes"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "vtNeedRepo=$vtNeedRepo" >> $VTLOG
|
||||
|
||||
if [ "$vtNeedRepo" = "yes" ]; then
|
||||
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-repo.sh /lib/dracut/hooks/pre-pivot/99-ventoy-repo.sh
|
||||
fi
|
||||
|
||||
|
||||
#iso-scan (currently only for Fedora)
|
||||
if $GREP -q Fedora /etc/os-release; then
|
||||
if /ventoy/tool/vtoydump -a /ventoy/ventoy_os_param; then
|
||||
if ventoy_iso_scan_check; then
|
||||
echo "iso_scan process ..." >> $VTLOG
|
||||
|
||||
vtIsoPath=$(/ventoy/tool/vtoydump -p /ventoy/ventoy_os_param)
|
||||
VTISO_SCAN="iso-scan/filename=$vtIsoPath"
|
||||
echo -n $vtIsoPath > /ventoy/vtoy_iso_scan
|
||||
|
||||
$SED "s#printf\(.*\)\$CMDLINE#printf\1\$CMDLINE $VTISO_SCAN $VTKS $VTOVERLAY $vtInstDD#" -i /lib/dracut-lib.sh
|
||||
if [ "$VTOY_LINUX_REMOUNT" = "01" -a "$vtNeedRepo" != "yes" ]; then
|
||||
ventoy_rw_iso_scan
|
||||
fi
|
||||
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
echo "common process ..." >> $VTLOG
|
||||
if $GREP -q 'root=live' /proc/cmdline; then
|
||||
$SED "s#printf\(.*\)\$CMDLINE#printf\1\$CMDLINE root=live:/dev/ventoy $VTKS $VTOVERLAY $VTISO_SCAN $vtInstDD#" -i /lib/dracut-lib.sh
|
||||
else
|
||||
$SED "s#printf\(.*\)\$CMDLINE#printf\1\$CMDLINE inst.stage2=hd:/dev/ventoy $VTKS $VTOVERLAY $VTISO_SCAN $vtInstDD#" -i /lib/dracut-lib.sh
|
||||
fi
|
||||
|
||||
|
||||
ventoy_set_inotify_script rhel7/ventoy-inotifyd-hook.sh
|
||||
|
||||
#Fedora
|
||||
if $BUSYBOX_PATH/which dmsquash-live-root > /dev/null; then
|
||||
vtPriority=99
|
||||
else
|
||||
vtPriority=01
|
||||
fi
|
||||
|
||||
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-inotifyd-start.sh /lib/dracut/hooks/pre-udev/${vtPriority}-ventoy-inotifyd-start.sh
|
||||
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-timeout.sh /lib/dracut/hooks/initqueue/timeout/${vtPriority}-ventoy-timeout.sh
|
||||
|
||||
|
||||
if [ -e /sbin/dmsquash-live-root ]; then
|
||||
echo "patch /sbin/dmsquash-live-root ..." >> $VTLOG
|
||||
$SED "1 a $BUSYBOX_PATH/sh $VTOY_PATH/hook/rhel7/ventoy-make-link.sh" -i /sbin/dmsquash-live-root
|
||||
@@ -128,6 +175,24 @@ if [ -e /usr/sbin/anaconda-diskroot ]; then
|
||||
$SED 's/^mount $dev $repodir/mount -oro $dev $repodir/' -i /usr/sbin/anaconda-diskroot
|
||||
fi
|
||||
|
||||
if [ -f $VTOY_PATH/autoinstall ]; then
|
||||
cp -a $VTOY_PATH/hook/rhel7/ventoy-autoexp.sh /lib/dracut/hooks/pre-mount/99-ventoy-autoexp.sh
|
||||
#For Fedora CoreOS
|
||||
if $GREP -i -q 'fedora.*coreos' /etc/os-release; then
|
||||
$SED "s#isosrc=.*#isosrc=/dev/mapper/ventoy#" -i /lib/systemd/system-generators/live-generator
|
||||
cp -a $VTOY_PATH/hook/rhel7/ventoy-make-link.sh /lib/dracut/hooks/pre-mount/99-ventoy-premount-mklink.sh
|
||||
fi
|
||||
|
||||
|
||||
#special distro magic
|
||||
$BUSYBOX_PATH/mkdir -p $VTOY_PATH/distmagic
|
||||
if $GREP -q SCRE /proc/cmdline; then
|
||||
echo 1 > $VTOY_PATH/distmagic/SCRE
|
||||
fi
|
||||
|
||||
if $GREP -qw 'SA[.]1' /proc/cmdline; then
|
||||
if $GREP -qw 'writable.fsimg' /proc/cmdline; then
|
||||
if $GREP -qw 'rw' /proc/cmdline; then
|
||||
echo 1 > $VTOY_PATH/distmagic/DELL_PER
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
|
26
IMG/cpio/ventoy/hook/rhel7/ventoy-inotifyd-call.sh
Normal file
26
IMG/cpio/ventoy/hook/rhel7/ventoy-inotifyd-call.sh
Normal file
@@ -0,0 +1,26 @@
|
||||
#!/ventoy/busybox/sh
|
||||
#************************************************************************************
|
||||
# Copyright (c) 2023, 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
|
||||
|
||||
vtHook=$($CAT $VTOY_PATH/inotifyd-hook-script.txt)
|
||||
|
||||
vtdisk=$(get_ventoy_disk_name)
|
||||
vtlog "... $vtdisk already exist ..."
|
||||
$BUSYBOX_PATH/sh $vtHook n /dev "${vtdisk#/dev/}2"
|
@@ -50,7 +50,11 @@ if is_inotify_ventoy_part $3; then
|
||||
vtScript=$($GREP -m1 'RUN.=' $vtGenRulFile | $AWK -F'RUN.=' '{print $2}' | $SED 's/"\(.*\)".*/\1/')
|
||||
vtlog "vtScript=$vtScript"
|
||||
|
||||
if $GREP -q SCRE /proc/cmdline; then
|
||||
if [ -f $VTOY_PATH/distmagic/SCRE ]; then
|
||||
/sbin/dmsquash-live-root /dev/ventoy
|
||||
elif [ -f $VTOY_PATH/distmagic/DELL_PER ]; then
|
||||
sed 's/liverw=[^ ]*/liverw=ro/g' -i /sbin/dmsquash-live-root
|
||||
sed 's/writable_fsimg=[^ ]*/writable_fsimg=""/g' -i /sbin/dmsquash-live-root
|
||||
/sbin/dmsquash-live-root /dev/ventoy
|
||||
else
|
||||
$vtScript
|
||||
@@ -70,6 +74,9 @@ if is_inotify_ventoy_part $3; then
|
||||
|
||||
if [ -e /sbin/anaconda-diskroot ]; then
|
||||
vtlog "set anaconda-diskroot ..."
|
||||
|
||||
#busybox cp doesn't support -t option (issue 1900)
|
||||
/bin/cp -a /bin/cp $BUSYBOX_PATH/cp
|
||||
/sbin/anaconda-diskroot /dev/ventoy
|
||||
fi
|
||||
|
||||
|
@@ -27,5 +27,8 @@ if [ "$vtdisk" = "unknown" ]; then
|
||||
$BUSYBOX_PATH/nohup $VTOY_PATH/tool/inotifyd $vtHook /dev:n 2>&- &
|
||||
else
|
||||
vtlog "... $vtdisk already exist ..."
|
||||
$BUSYBOX_PATH/sh $vtHook n /dev "${vtdisk#/dev/}2"
|
||||
|
||||
#don't call it too early issue 2225
|
||||
#$BUSYBOX_PATH/sh $vtHook n /dev "${vtdisk#/dev/}2"
|
||||
cp -a $VTOY_PATH/hook/rhel7/ventoy-inotifyd-call.sh /lib/dracut/hooks/initqueue/settled/90-ventoy-inotifyd-call.sh
|
||||
fi
|
||||
|
@@ -26,7 +26,9 @@ fi
|
||||
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})
|
||||
|
||||
if ! [ -e /dev/mapper/ventoy ]; then
|
||||
if [ -e /dev/mapper/ventoy ]; then
|
||||
vtlog "/dev/mapper/ventoy already exist"
|
||||
else
|
||||
vtlog "link /dev/$vtDM to /dev/mapper/ventoy"
|
||||
ln -s /dev/$vtDM /dev/mapper/ventoy
|
||||
fi
|
||||
@@ -35,7 +37,13 @@ VTLABEL=$($BUSYBOX_PATH/blkid /dev/$vtDM | $SED 's/.*LABEL="\([^"]*\)".*/\1/')
|
||||
vtlog "VTLABEL=$VTLABEL"
|
||||
|
||||
if [ -n "$VTLABEL" ]; then
|
||||
if ! [ -e "/dev/disk/by-label/$VTLABEL" ]; then
|
||||
if ! [ -d /dev/disk/by-label ]; then
|
||||
mkdir -p /dev/disk/by-label
|
||||
fi
|
||||
|
||||
if [ -e "/dev/disk/by-label/$VTLABEL" ]; then
|
||||
vtlog "/dev/disk/by-label/$VTLABEL already exist"
|
||||
else
|
||||
vtlog "link /dev/$vtDM to /dev/disk/by-label/$VTLABEL"
|
||||
ln -s /dev/$vtDM "/dev/disk/by-label/$VTLABEL"
|
||||
fi
|
||||
|
@@ -23,7 +23,18 @@ vtlog "##### $0 $* ..."
|
||||
|
||||
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||
|
||||
repodev=$(ls $VTOY_PATH/dev_backup*)
|
||||
echo "inst.repo=hd:/dev/${repodev#*dev_backup_}" >> /sysroot/etc/cmdline
|
||||
if [ -f /ventoy/vtoy_iso_scan ]; then
|
||||
repopath=$(cat /ventoy/vtoy_iso_scan)
|
||||
repodev=$(vtoydump -f /ventoy/ventoy_os_param | awk -F'#' '{print $1}')
|
||||
if echo $repodev | egrep -q "nvme|mmc|nbd"; then
|
||||
vtpart1=${repodev}p1
|
||||
else
|
||||
vtpart1=${repodev}1
|
||||
fi
|
||||
echo "inst.repo=hd:${vtpart1}:${repopath}" >> /sysroot/etc/cmdline
|
||||
else
|
||||
repodev=$(ls $VTOY_PATH/dev_backup*)
|
||||
echo "inst.repo=hd:/dev/${repodev#*dev_backup_}" >> /sysroot/etc/cmdline
|
||||
fi
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
@@ -39,6 +39,9 @@ fi
|
||||
|
||||
if [ -e /sbin/anaconda-diskroot ]; then
|
||||
vtlog "set anaconda-diskroot /dev/ventoy ..."
|
||||
|
||||
#busybox cp doesn't support -t option (issue 1900)
|
||||
/bin/cp -a /bin/cp $BUSYBOX_PATH/cp
|
||||
/sbin/anaconda-diskroot /dev/ventoy
|
||||
fi
|
||||
|
||||
|
@@ -54,6 +54,21 @@ if [ -z "$dmsetup_path" ]; then
|
||||
ventoy_os_install_dmsetup "/dev/${1:0:-1}"
|
||||
fi
|
||||
|
||||
if [ -f /proc/devices ]; then
|
||||
vtlog "/proc/devices exist OK"
|
||||
else
|
||||
for i in 1 2 3 4 5 6 7 8 9; do
|
||||
if [ -f /proc/devices ]; then
|
||||
vtlog "/proc/devices exist OK now"
|
||||
break
|
||||
else
|
||||
vtlog "/proc/devices NOT exist, wait $i"
|
||||
$BUSYBOX_PATH/sleep 1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
ventoy_udev_disk_common_hook $*
|
||||
|
||||
# OK finish
|
||||
|
@@ -209,11 +209,20 @@ ventoy_check_dm_module() {
|
||||
vtlog "modprobe failed, now try to insmod ko..."
|
||||
|
||||
$FIND /lib/modules/ -name "dm-mod.ko*" | while read vtline; do
|
||||
vtlog "insmode $vtline "
|
||||
vtlog "insmod $vtline "
|
||||
$BUSYBOX_PATH/insmod $vtline >>$VTLOG 2>&1
|
||||
if [ $? -eq 0 ]; then
|
||||
vtlog "insmod success"
|
||||
else
|
||||
vtlog "insmod failed, try decompress"
|
||||
if echo $vtline | $GREP -q "\.zst"; then
|
||||
$VTOY_PATH/tool/zstdcat $vtline > $VTOY_PATH/extract_dm_mod.ko
|
||||
$BUSYBOX_PATH/insmod $VTOY_PATH/extract_dm_mod.ko >>$VTLOG 2>&1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
if $GREP -q 'device-mapper' /proc/devices; then
|
||||
vtlog "device-mapper found in /proc/devices after retry"
|
||||
$BUSYBOX_PATH/true; return
|
||||
@@ -223,6 +232,42 @@ ventoy_check_dm_module() {
|
||||
fi
|
||||
}
|
||||
|
||||
ventoy_need_proc_ibt() {
|
||||
vtKv=$($BUSYBOX_PATH/uname -r)
|
||||
vtMajor=$(echo $vtKv | $AWK -F. '{print $1}')
|
||||
vtMinor=$(echo $vtKv | $AWK -F. '{print $2}')
|
||||
|
||||
#ibt was supported since linux kernel 5.18
|
||||
if [ $vtMajor -lt 5 ]; then
|
||||
$BUSYBOX_PATH/false; return
|
||||
elif [ $vtMajor -eq 5 ]; then
|
||||
if [ $vtMajor -lt 18 ]; then
|
||||
$BUSYBOX_PATH/false; return
|
||||
fi
|
||||
fi
|
||||
|
||||
if $GREP -q ' ibt=off' /proc/cmdline; then
|
||||
$BUSYBOX_PATH/false; return
|
||||
fi
|
||||
|
||||
#hardware CPU doesn't support IBT
|
||||
if $VTOY_PATH/tool/vtoykmod -I; then
|
||||
:
|
||||
else
|
||||
$BUSYBOX_PATH/false; return
|
||||
fi
|
||||
|
||||
#dot.CONFIG not enabled
|
||||
if $GREP -q ' ibt_restore$' /proc/kallsyms; then
|
||||
:
|
||||
else
|
||||
$BUSYBOX_PATH/false; return
|
||||
fi
|
||||
|
||||
$BUSYBOX_PATH/true
|
||||
}
|
||||
|
||||
|
||||
ventoy_need_dm_patch() {
|
||||
if [ "$VTOY_LINUX_REMOUNT" != "01" ]; then
|
||||
if $GREP -q 'VTOY_LINUX_REMOUNT=1' /proc/cmdline; then
|
||||
@@ -256,6 +301,7 @@ ventoy_need_dm_patch() {
|
||||
}
|
||||
|
||||
ventoy_dm_patch() {
|
||||
vtDmPatchDebug=0
|
||||
vtMType=$($BUSYBOX_PATH/uname -m)
|
||||
|
||||
vtlog "######### ventoy_dm_patch ############"
|
||||
@@ -269,6 +315,16 @@ ventoy_dm_patch() {
|
||||
return
|
||||
fi
|
||||
|
||||
if ventoy_need_proc_ibt; then
|
||||
vtlog "need to proc IBT"
|
||||
vtKoName=dm_patch_ibt_64.ko
|
||||
vtIBT='0x8888'
|
||||
else
|
||||
vtlog "NO need to proc IBT"
|
||||
vtIBT='0'
|
||||
fi
|
||||
|
||||
|
||||
if [ -f $VTOY_PATH/tool/$vtKoName ]; then
|
||||
vtlog "/ventoy/tool/$vtKoName exist OK"
|
||||
else
|
||||
@@ -278,11 +334,32 @@ ventoy_dm_patch() {
|
||||
|
||||
$CAT /proc/kallsyms | $BUSYBOX_PATH/sort > $VTOY_PATH/kallsyms
|
||||
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym dm_get_table_device $VTOY_PATH/kallsyms)
|
||||
if $GREP -m1 -q 'open_table_device.isra' $VTOY_PATH/kallsyms; then
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym open_table_device.isra $VTOY_PATH/kallsyms)
|
||||
vtlog "get open_table_device.isra address $vtLine"
|
||||
else
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym dm_get_table_device $VTOY_PATH/kallsyms)
|
||||
vtlog "get dm_get_table_device address $vtLine"
|
||||
fi
|
||||
get_addr=$(echo $vtLine | $AWK '{print $1}')
|
||||
get_size=$(echo $vtLine | $AWK '{print $2}')
|
||||
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym dm_put_table_device $VTOY_PATH/kallsyms)
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym blkdev_get_by_dev $VTOY_PATH/kallsyms)
|
||||
vtlog "get blkdev_get_by_dev address $vtLine"
|
||||
blkdev_get_addr=$(echo $vtLine | $AWK '{print $1}')
|
||||
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym blkdev_put $VTOY_PATH/kallsyms)
|
||||
vtlog "get blkdev_put address $vtLine"
|
||||
blkdev_put_addr=$(echo $vtLine | $AWK '{print $1}')
|
||||
|
||||
|
||||
if $GREP -m1 -q 'close_table_device.isra' $VTOY_PATH/kallsyms; then
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym close_table_device.isra $VTOY_PATH/kallsyms)
|
||||
vtlog "get close_table_device.isra address $vtLine"
|
||||
else
|
||||
vtLine=$($VTOY_PATH/tool/vtoyksym dm_put_table_device $VTOY_PATH/kallsyms)
|
||||
vtlog "get dm_put_table_device address $vtLine"
|
||||
fi
|
||||
put_addr=$(echo $vtLine | $AWK '{print $1}')
|
||||
put_size=$(echo $vtLine | $AWK '{print $2}')
|
||||
|
||||
@@ -292,7 +369,19 @@ ventoy_dm_patch() {
|
||||
kprobe_unreg_addr=$($GREP ' unregister_kprobe$' /proc/kallsyms | $AWK '{print $1}')
|
||||
|
||||
if [ "$VTOY_DEBUG_LEVEL" = "01" ]; then
|
||||
vtDmPatchDebug=1
|
||||
fi
|
||||
|
||||
if $GREP -q 'dmpatch_debug' /proc/cmdline; then
|
||||
vtDmPatchDebug=1
|
||||
fi
|
||||
|
||||
|
||||
if [ $vtDmPatchDebug -eq 1 ]; then
|
||||
printk_addr=$($GREP ' printk$' /proc/kallsyms | $AWK '{print $1}')
|
||||
if [ -z "$printk_addr" ]; then
|
||||
printk_addr=$($GREP ' _printk$' /proc/kallsyms | $AWK '{print $1}')
|
||||
fi
|
||||
vtDebug="-v"
|
||||
else
|
||||
printk_addr=0
|
||||
@@ -303,6 +392,7 @@ ventoy_dm_patch() {
|
||||
|
||||
vtlog get_addr=$get_addr get_size=$get_size
|
||||
vtlog put_addr=$put_addr put_size=$put_size
|
||||
vtlog blkdev_get_addr=$blkdev_get_addr blkdev_put_addr=$blkdev_put_addr
|
||||
vtlog kprobe_reg_addr=$kprobe_reg_addr kprobe_unreg_addr=$kprobe_unreg_addr
|
||||
vtlog ro_addr=$ro_addr rw_addr=$rw_addr printk_addr=$printk_addr
|
||||
|
||||
@@ -317,20 +407,25 @@ ventoy_dm_patch() {
|
||||
|
||||
|
||||
vtKv=$($BUSYBOX_PATH/uname -r)
|
||||
vtKVMajor=$(echo $vtKv | $AWK -F. '{print $1}')
|
||||
vtKVMinor=$(echo $vtKv | $AWK -F. '{print $2}')
|
||||
|
||||
if [ ! -d /lib/modules/$vtKv ]; then
|
||||
vtlog "No modules directory found"
|
||||
return
|
||||
elif [ -d /lib/modules/$vtKv/kernel/fs ]; then
|
||||
vtModPath=$($FIND /lib/modules/$vtKv/kernel/fs/ -name "*.ko*" | $HEAD -n1)
|
||||
else
|
||||
elif [ -d /lib/modules/$vtKv/kernel ]; then
|
||||
vtModPath=$($FIND /lib/modules/$vtKv/kernel/ -name "xfs.ko*" | $HEAD -n1)
|
||||
elif [ -d /lib/modules/$vtKv/initrd ]; then
|
||||
vtModPath=$($FIND /lib/modules/$vtKv/initrd/ -name "xfs.ko*" | $HEAD -n1)
|
||||
fi
|
||||
|
||||
|
||||
|
||||
if [ -z "$vtModPath" ]; then
|
||||
vtModPath=$($FIND /lib/modules/$vtKv/kernel/ -name "*.ko*" | $HEAD -n1)
|
||||
vtModPath=$($FIND /lib/modules/$vtKv/ -name "*.ko*" | $HEAD -n1)
|
||||
fi
|
||||
|
||||
|
||||
vtModName=$($BUSYBOX_PATH/basename $vtModPath)
|
||||
|
||||
vtlog "template module is $vtModPath $vtModName"
|
||||
@@ -344,24 +439,37 @@ ventoy_dm_patch() {
|
||||
$BUSYBOX_PATH/xzcat $vtModPath > $VTOY_PATH/$vtModName
|
||||
elif echo $vtModPath | $GREP -q "[.]ko[.]gz$"; then
|
||||
$BUSYBOX_PATH/zcat $vtModPath > $VTOY_PATH/$vtModName
|
||||
elif echo $vtModPath | $GREP -q "[.]ko[.]zst$"; then
|
||||
$VTOY_PATH/tool/zstdcat $vtModPath > $VTOY_PATH/$vtModName
|
||||
else
|
||||
vtlog "unsupport module type"
|
||||
return
|
||||
fi
|
||||
|
||||
|
||||
|
||||
#step1: modify vermagic/mod crc/relocation
|
||||
vtlog "$VTOY_PATH/tool/vtoykmod -u $VTOY_PATH/tool/$vtKoName $VTOY_PATH/$vtModName $vtDebug"
|
||||
$VTOY_PATH/tool/vtoykmod -u $VTOY_PATH/tool/$vtKoName $VTOY_PATH/$vtModName $vtDebug
|
||||
vtlog "$VTOY_PATH/tool/vtoykmod -u $vtKVMajor $vtKVMinor $VTOY_PATH/tool/$vtKoName $VTOY_PATH/$vtModName $vtDebug"
|
||||
$VTOY_PATH/tool/vtoykmod -u $vtKVMajor $vtKVMinor $VTOY_PATH/tool/$vtKoName $VTOY_PATH/$vtModName $vtDebug >>$VTLOG 2>&1
|
||||
|
||||
#step2: fill parameters
|
||||
vtPgsize=$($VTOY_PATH/tool/vtoyksym -p)
|
||||
vtlog "$VTOY_PATH/tool/vtoykmod -f $VTOY_PATH/tool/$vtKoName $vtPgsize 0x$printk_addr 0x$ro_addr 0x$rw_addr $get_addr $get_size $put_addr $put_size 0x$kprobe_reg_addr 0x$kprobe_unreg_addr $vtDebug"
|
||||
$VTOY_PATH/tool/vtoykmod -f $VTOY_PATH/tool/$vtKoName $vtPgsize 0x$printk_addr 0x$ro_addr 0x$rw_addr $get_addr $get_size $put_addr $put_size 0x$kprobe_reg_addr 0x$kprobe_unreg_addr $vtDebug
|
||||
|
||||
vtPrams="$VTOY_PATH/tool/$vtKoName $vtPgsize 0x$printk_addr 0x$ro_addr 0x$rw_addr $get_addr $get_size $put_addr $put_size 0x$kprobe_reg_addr 0x$kprobe_unreg_addr $vtKVMajor $vtIBT $vtKVMinor $blkdev_get_addr $blkdev_put_addr $vtDebug"
|
||||
|
||||
|
||||
vtlog "$VTOY_PATH/tool/vtoykmod -f $vtPrams"
|
||||
$VTOY_PATH/tool/vtoykmod -f $vtPrams >>$VTLOG 2>&1
|
||||
|
||||
$BUSYBOX_PATH/insmod $VTOY_PATH/tool/$vtKoName
|
||||
|
||||
vtlog "insmod $VTOY_PATH/tool/$vtKoName"
|
||||
$BUSYBOX_PATH/insmod $VTOY_PATH/tool/$vtKoName >>$VTLOG 2>&1
|
||||
|
||||
if $GREP -q 'dm_patch' /proc/modules; then
|
||||
vtlog "dm_patch module OK"
|
||||
echo "done" > $VTOY_PATH/dm_patch_done
|
||||
else
|
||||
vtlog "dm_patch module FAILED"
|
||||
fi
|
||||
|
||||
}
|
||||
@@ -738,6 +846,7 @@ ventoy_udev_disk_common_hook() {
|
||||
fi
|
||||
|
||||
if $GREP -q 'dm_patch' /proc/modules; then
|
||||
vtlog "remove dm_patch module."
|
||||
$BUSYBOX_PATH/rmmod dm_patch
|
||||
fi
|
||||
}
|
||||
@@ -879,3 +988,17 @@ ventoy_check_umount() {
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
ventoy_wait_dir() {
|
||||
vtdir=$1
|
||||
vtsec=0
|
||||
|
||||
while [ $vtsec -lt $2 ]; do
|
||||
if [ -d "$vtdir" ]; then
|
||||
break
|
||||
else
|
||||
$SLEEP 1
|
||||
vtsec=$(expr $vtsec + 1)
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
@@ -121,3 +121,53 @@ ventoy_check_mount() {
|
||||
$BUSYBOX_PATH/mount $1 $2
|
||||
fi
|
||||
}
|
||||
|
||||
ventoy_has_exfat_ko() {
|
||||
vtExfat=''
|
||||
vtKerVer=$($BUSYBOX_PATH/uname -r)
|
||||
if [ -d /lib/modules/$vtKerVer/kernel/fs/exfat ]; then
|
||||
vtExfat=$(ls /lib/modules/$vtKerVer/kernel/fs/exfat/)
|
||||
fi
|
||||
[ -n "$vtExfat" ]
|
||||
}
|
||||
|
||||
ventoy_is_exfat_part() {
|
||||
$VTOY_PATH/tool/vtoydump -s /ventoy/ventoy_os_param | $GREP -q exfat
|
||||
}
|
||||
|
||||
ventoy_iso_scan_path() {
|
||||
if [ -f /sbin/iso-scan ]; then
|
||||
echo -n '/sbin/iso-scan'
|
||||
elif [ -f /bin/iso-scan ]; then
|
||||
echo -n '/bin/iso-scan'
|
||||
else
|
||||
echo -n ''
|
||||
fi
|
||||
}
|
||||
|
||||
ventoy_has_iso_scan() {
|
||||
vtScanPath=$(ventoy_iso_scan_path)
|
||||
[ -n "$vtScanPath" ]
|
||||
}
|
||||
|
||||
ventoy_rw_iso_scan() {
|
||||
vtScanPath=$(ventoy_iso_scan_path)
|
||||
if [ -n "$vtScanPath" ]; then
|
||||
if $GREP -q 'mount.* ro .*isoscan' $vtScanPath; then
|
||||
$SED -i 's/\(mount.*-o.*\) ro /\1 rw /' $vtScanPath
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
ventoy_iso_scan_check() {
|
||||
vtCheckOk=0
|
||||
if ventoy_is_exfat_part; then
|
||||
if ventoy_has_exfat_ko; then
|
||||
if ventoy_has_iso_scan; then
|
||||
vtCheckOk=1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
[ $vtCheckOk -eq 1 ]
|
||||
}
|
||||
|
@@ -34,9 +34,12 @@ else
|
||||
vtBit=32
|
||||
fi
|
||||
|
||||
xz -d $VTOY_PATH/vtloopex/dm-mod/$vtKerVer/$vtBit/dm-mod.ko.xz
|
||||
insmod $VTOY_PATH/vtloopex/dm-mod/$vtKerVer/$vtBit/dm-mod.ko
|
||||
|
||||
if [ -f $VTOY_PATH/vtloopex/dm-mod/$vtKerVer/$vtBit/dm-mod.ko.xz ]; then
|
||||
xz -d $VTOY_PATH/vtloopex/dm-mod/$vtKerVer/$vtBit/dm-mod.ko.xz
|
||||
insmod $VTOY_PATH/vtloopex/dm-mod/$vtKerVer/$vtBit/dm-mod.ko
|
||||
elif [ -f $VTOY_PATH/modules/dm-mod.ko ]; then
|
||||
insmod $VTOY_PATH/modules/dm-mod.ko
|
||||
fi
|
||||
|
||||
wait_for_usb_disk_ready
|
||||
|
||||
|
@@ -37,9 +37,38 @@ if [ "$vtdiskname" = "unknown" ]; then
|
||||
fi
|
||||
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
|
||||
ventoy_create_dev_ventoy_part
|
||||
|
||||
if ventoy_need_dm_patch; then
|
||||
vtlog "extract a ko file"
|
||||
|
||||
mkdir -p /ventoy/tmpmnt1 /ventoy/tmpmnt2
|
||||
mount /dev/ventoy1 /ventoy/tmpmnt1
|
||||
mount /ventoy/tmpmnt1/boot/batocera /ventoy/tmpmnt2
|
||||
vtKV=$(uname -r)
|
||||
|
||||
mkdir -p /lib/modules/$vtKV/kernel/
|
||||
vtKO=$(find "/ventoy/tmpmnt2/lib/modules/$vtKV/kernel/fs/" -name "*.ko*" | head -n1)
|
||||
cp -a $vtKO /lib/modules/$vtKV/kernel/
|
||||
|
||||
vtlog "vtKV=$vtKV vtKO=$vtKO"
|
||||
|
||||
umount /ventoy/tmpmnt2
|
||||
umount /ventoy/tmpmnt1
|
||||
|
||||
vtPartid=1
|
||||
cat /vtoy_dm_table | while read vtline; do
|
||||
dmsetup remove ventoy$vtPartid
|
||||
vtPartid=$(expr $vtPartid + 1)
|
||||
done
|
||||
dmsetup remove ventoy
|
||||
|
||||
vtlog "Recreate device-mapper"
|
||||
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||
ventoy_create_dev_ventoy_part
|
||||
fi
|
||||
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
||||
|
@@ -23,6 +23,9 @@ $SED "/find drives/i $BUSYBOX_PATH/sh $VTOY_PATH/loop/easyos/ventoy-disk.sh; vtD
|
||||
|
||||
$SED "1a boot_dev=ventoy1;wkg_dev=ventoy2" -i /init
|
||||
|
||||
$SED 's#\(dd *if=/dev/.*WKG_DRV.* *of=/dev/null.*skip\)=[0-9]*#\1=1048576#' -i /init
|
||||
$SED "s#WKG_DEV=\"\"#WKG_DEV=ventoy2#g" -i /init
|
||||
|
||||
#check for ssd will read /sys/block/ventoy, will no exist, need a workaround
|
||||
$SED "s#/sys/block/\${WKG_DRV}/#/sys/block/\$vtDM/#g" -i /init
|
||||
|
||||
|
46
IMG/cpio/ventoy/loop/fwts/ventoy-disk.sh
Normal file
46
IMG/cpio/ventoy/loop/fwts/ventoy-disk.sh
Normal file
@@ -0,0 +1,46 @@
|
||||
#!/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"
|
||||
|
||||
ventoy_create_dev_ventoy_part
|
||||
mdev -s
|
||||
|
||||
PATH=$VTPATH_OLD
|
||||
|
||||
set_ventoy_hook_finish
|
23
IMG/cpio/ventoy/loop/fwts/ventoy-hook.sh
Normal file
23
IMG/cpio/ventoy/loop/fwts/ventoy-hook.sh
Normal file
@@ -0,0 +1,23 @@
|
||||
#!/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/>.
|
||||
#
|
||||
#************************************************************************************
|
||||
|
||||
. $VTOY_PATH/hook/ventoy-os-lib.sh
|
||||
|
||||
$SED "/^mountroot$/i\\$BUSYBOX_PATH/sh $VTOY_PATH/loop/fwts/ventoy-disk.sh" -i /init
|
||||
#$SED "/^mountroot$/i\\export ROOT=/dev/mapper/ventoy" -i /init
|
@@ -64,9 +64,9 @@ ventoy_get_os_type() {
|
||||
elif $GREP -q '[Uu]buntu' /proc/version; then
|
||||
echo 'debian'; return
|
||||
|
||||
# Deepin : do the same process with debian
|
||||
# Deepin :
|
||||
elif $GREP -q '[Dd]eepin' /proc/version; then
|
||||
echo 'debian'; return
|
||||
echo 'deepin'; return
|
||||
|
||||
# rhel5/CentOS5 and all other distributions based on them
|
||||
elif $GREP -q 'el5' /proc/version; then
|
||||
@@ -169,9 +169,9 @@ ventoy_get_os_type() {
|
||||
elif $GREP -q 'fuyu' /etc/os-release; then
|
||||
echo 'openEuler'; return
|
||||
elif $GREP -q 'deepin' /etc/os-release; then
|
||||
echo 'debian'; return
|
||||
echo 'deepin'; return
|
||||
elif $GREP -q 'chinauos' /etc/os-release; then
|
||||
echo 'debian'; return
|
||||
echo 'deepin'; return
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -229,6 +229,10 @@ ventoy_get_os_type() {
|
||||
echo 'android'; return
|
||||
fi
|
||||
|
||||
if $GREP -q 'android.google' /proc/version; then
|
||||
echo 'android'; return
|
||||
fi
|
||||
|
||||
if $GREP -q 'adelielinux' /proc/version; then
|
||||
echo 'adelie'; return
|
||||
fi
|
||||
@@ -362,6 +366,24 @@ ventoy_get_os_type() {
|
||||
fi
|
||||
|
||||
|
||||
#Kylin V10 Server
|
||||
if [ -f /usr/sbin/dhclient ]; then
|
||||
if $BUSYBOX_PATH/strings /usr/sbin/dhclient | $GREP -i -q -m1 openeuler; then
|
||||
echo 'openEuler'; return
|
||||
fi
|
||||
fi
|
||||
|
||||
if $GREP -q 'chimera' /proc/version; then
|
||||
echo 'chimera'; return
|
||||
fi
|
||||
|
||||
|
||||
if $GREP -q '4.19.' /proc/version; then
|
||||
if [ -d /lib/dracut/hooks ]; then
|
||||
echo 'openEuler'; return
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
echo "default"
|
||||
}
|
||||
|
@@ -75,6 +75,10 @@ ventoy_get_os_type() {
|
||||
echo 'openwrt'; return
|
||||
fi
|
||||
|
||||
if $GREP -q 'easyos' /proc/cmdline; then
|
||||
echo 'easyos'; return
|
||||
fi
|
||||
|
||||
if [ -e /BOOT_SPECS ]; then
|
||||
if $GREP -q 'easyos' /BOOT_SPECS; then
|
||||
echo 'easyos'; return
|
||||
|
Binary file not shown.
Binary file not shown.
BIN
IMG/cpio_x86/ventoy/tool/dm_patch_ibt_64.ko
Normal file
BIN
IMG/cpio_x86/ventoy/tool/dm_patch_ibt_64.ko
Normal file
Binary file not shown.
@@ -18,6 +18,18 @@ print_usage() {
|
||||
echo ''
|
||||
}
|
||||
|
||||
print_err() {
|
||||
echo ""
|
||||
echo "$*"
|
||||
echo ""
|
||||
}
|
||||
|
||||
uid=$(id -u)
|
||||
if [ $uid -ne 0 ]; then
|
||||
print_err "Please use sudo or run the script as root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while [ -n "$1" ]; do
|
||||
if [ "$1" = "-s" ]; then
|
||||
shift
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
INSTALL/EFI/BOOT/MokManager.efi
Normal file
BIN
INSTALL/EFI/BOOT/MokManager.efi
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
print_usage() {
|
||||
echo 'Usage: ExtendPersistentImg.sh file size'
|
||||
@@ -19,6 +19,18 @@ if [ -z "$2" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
if [ "$1" = "__vbash__" ]; then
|
||||
shift
|
||||
else
|
||||
if readlink /bin/sh | grep -q bash; then
|
||||
:
|
||||
else
|
||||
exec /bin/bash $0 "__vbash__" "$@"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
file=$1
|
||||
size=$2
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
|
||||
========== Ventoy2Disk.sh ===============
|
||||
|
||||
sudo sh Ventoy2Disk.sh { -i | -I | -u } /dev/sdX sdX is the USB device, for example /dev/sdb.
|
||||
sudo bash Ventoy2Disk.sh { -i | -I | -u } /dev/sdX sdX is the USB device, for example /dev/sdb.
|
||||
|
||||
Ventoy2Disk.sh CMD [ OPTION ] /dev/sdX
|
||||
CMD:
|
||||
@@ -18,16 +18,16 @@ Please refer https://www.ventoy.net/en/doc_start.html for details.
|
||||
|
||||
|
||||
========== VentoyWeb.sh ===============
|
||||
1. sudo sh VentoyWeb.sh
|
||||
1. sudo bash VentoyWeb.sh
|
||||
2. open your browser and visit http://127.0.0.1:24680
|
||||
|
||||
|
||||
========== VentoyPlugson.sh ===============
|
||||
1. sudo sh VentoyPlugson.sh
|
||||
1. sudo bash VentoyPlugson.sh /dev/sdX
|
||||
2. open your browser and visit http://127.0.0.1:24681
|
||||
|
||||
========== VentoyVlnk.sh ===============
|
||||
Usage: sudo sh VentoyVlnk.sh CMD FILE
|
||||
Usage: sudo bash VentoyVlnk.sh CMD FILE
|
||||
CMD:
|
||||
-c FILE create vlnk for FILE
|
||||
-l VLNK parse vlnk file
|
||||
@@ -43,21 +43,21 @@ VentoyGUI is native GUI program for Linux (GTK/QT)
|
||||
|
||||
========== CreatePersistentImg.sh ===============
|
||||
|
||||
sudo sh CreatePersistentImg.sh [ -s SIZE_IN_MB ] [ -t FSTYPE ] [ -l LABEL ] for example:
|
||||
sudo bash CreatePersistentImg.sh [ -s SIZE_IN_MB ] [ -t FSTYPE ] [ -l LABEL ] for example:
|
||||
|
||||
sh CreatePersistentImg.sh ----> persistence.dat in 1GB size and ext4 filesystem and casper-rw label
|
||||
sh CreatePersistentImg.sh -l MX-Persist ----> persistence.dat in 1GB size and ext4 filesystem and MX-Persist label
|
||||
sh CreatePersistentImg.sh -s 2048 ----> persistence.dat in 2GB size and ext4 filesystem and casper-rw label
|
||||
sh CreatePersistentImg.sh -s 4096 -t xfs ----> persistence.dat in 4GB size and xfs filesystem (ext2/3/4 xfs are supported) and casper-rw label
|
||||
bash CreatePersistentImg.sh ----> persistence.dat in 1GB size and ext4 filesystem and casper-rw label
|
||||
bash CreatePersistentImg.sh -l MX-Persist ----> persistence.dat in 1GB size and ext4 filesystem and MX-Persist label
|
||||
bash CreatePersistentImg.sh -s 2048 ----> persistence.dat in 2GB size and ext4 filesystem and casper-rw label
|
||||
bash CreatePersistentImg.sh -s 4096 -t xfs ----> persistence.dat in 4GB size and xfs filesystem (ext2/3/4 xfs are supported) and casper-rw label
|
||||
|
||||
Please refer https://www.ventoy.net/en/plugin_persistence.html for details.
|
||||
|
||||
|
||||
|
||||
========== ExtendPersistentImg.sh ===============
|
||||
sudo sh ExtendPersistentImg.sh file size
|
||||
sudo bash ExtendPersistentImg.sh file size
|
||||
For example:
|
||||
sh ExtendPersistentImg.sh persistence.dat 2048 ----> Extend persistence.dat by 2048MB
|
||||
bash ExtendPersistentImg.sh persistence.dat 2048 ----> Extend persistence.dat by 2048MB
|
||||
That is to say, persistence.dat file will grow to 3GB size (assume that it is 1GB size before extend)
|
||||
|
||||
Please refer https://www.ventoy.net/en/plugin_persistence.html for details.
|
||||
|
Binary file not shown.
@@ -12,11 +12,11 @@ if [ -f ./ventoy/version ]; then
|
||||
curver=$(cat ./ventoy/version)
|
||||
fi
|
||||
|
||||
if uname -m | egrep -q 'aarch64|arm64'; then
|
||||
if uname -m | grep -E -q 'aarch64|arm64'; then
|
||||
export TOOLDIR=aarch64
|
||||
elif uname -m | egrep -q 'x86_64|amd64'; then
|
||||
elif uname -m | grep -E -q 'x86_64|amd64'; then
|
||||
export TOOLDIR=x86_64
|
||||
elif uname -m | egrep -q 'mips64'; then
|
||||
elif uname -m | grep -E -q 'mips64'; then
|
||||
export TOOLDIR=mips64el
|
||||
else
|
||||
export TOOLDIR=i386
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,9 +1,9 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
. ./tool/ventoy_lib.sh
|
||||
|
||||
print_usage() {
|
||||
echo 'Usage: sudo sh VentoyPlugson.sh [OPTION] /dev/sdX'
|
||||
echo 'Usage: sudo bash VentoyPlugson.sh [OPTION] /dev/sdX'
|
||||
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 24681)'
|
||||
@@ -17,17 +17,26 @@ if [ $uid -ne 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ "$1" = "__vbash__" ]; then
|
||||
shift
|
||||
else
|
||||
if readlink /bin/sh | grep -q bash; then
|
||||
:
|
||||
else
|
||||
exec /bin/bash $0 "__vbash__" "$@"
|
||||
fi
|
||||
fi
|
||||
|
||||
OLDDIR=$(pwd)
|
||||
|
||||
machine=$(uname -m)
|
||||
if echo $machine | egrep -q 'aarch64|arm64'; then
|
||||
if echo $machine | grep -E -q 'aarch64|arm64'; then
|
||||
TOOLDIR=aarch64
|
||||
elif echo $machine | egrep -q 'x86_64|amd64'; then
|
||||
elif echo $machine | grep -E -q 'x86_64|amd64'; then
|
||||
TOOLDIR=x86_64
|
||||
elif echo $machine | egrep -q 'mips64'; then
|
||||
elif echo $machine | grep -E -q 'mips64'; then
|
||||
TOOLDIR=mips64el
|
||||
elif echo $machine | egrep -q 'i[3-6]86'; then
|
||||
elif echo $machine | grep -E -q 'i[3-6]86'; then
|
||||
TOOLDIR=i386
|
||||
else
|
||||
echo "Unsupported machine type $machine"
|
||||
@@ -113,7 +122,7 @@ if echo $DISK | grep -q "[a-z]d[a-z][1-9]"; then
|
||||
DISK=${DISK:0:-1}
|
||||
fi
|
||||
|
||||
if echo $DISK | egrep -q "/dev/nvme|/dev/mmcblk/dev/nbd"; then
|
||||
if echo $DISK | grep -E -q "/dev/nvme|/dev/mmcblk/dev/nbd"; then
|
||||
if echo $DISK | grep -q "p[1-9]$"; then
|
||||
DISK=${DISK:0:-2}
|
||||
fi
|
||||
@@ -154,7 +163,7 @@ fi
|
||||
PART1=$(get_disk_part_name $DISK 1)
|
||||
|
||||
if grep -q "^$PART1 " /proc/mounts; then
|
||||
mtpnt=$(grep "^$PART1 " /proc/mounts | awk '{print $2}')
|
||||
mtpnt=$(grep "^$PART1 " /proc/mounts | awk '{print $2}' | sed 's/\\040/ /g')
|
||||
fstype=$(grep "^$PART1 " /proc/mounts | awk '{print $3}')
|
||||
|
||||
if echo $fstype | grep -q -i 'fuse'; then
|
||||
@@ -187,7 +196,7 @@ fi
|
||||
|
||||
#change current directory to Ventoy disk
|
||||
cd "$mtpnt"
|
||||
$OLDDIR/tool/$TOOLDIR/Plugson "$HOST" "$PORT" "$OLDDIR" "$DISK" $version "$fstype" $partstyle $secureboot &
|
||||
"$OLDDIR/tool/$TOOLDIR/Plugson" "$HOST" "$PORT" "$OLDDIR" "$DISK" $version "$fstype" $partstyle $secureboot &
|
||||
wID=$!
|
||||
sleep 1
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
print_usage() {
|
||||
echo 'Usage: VentoyWeb.sh [ OPTION ]'
|
||||
@@ -23,11 +23,11 @@ fi
|
||||
|
||||
OLDDIR=$(pwd)
|
||||
|
||||
if uname -m | egrep -q 'aarch64|arm64'; then
|
||||
if uname -m | grep -E -q 'aarch64|arm64'; then
|
||||
TOOLDIR=aarch64
|
||||
elif uname -m | egrep -q 'x86_64|amd64'; then
|
||||
elif uname -m | grep -E -q 'x86_64|amd64'; then
|
||||
TOOLDIR=x86_64
|
||||
elif uname -m | egrep -q 'mips64'; then
|
||||
elif uname -m | grep -E -q 'mips64'; then
|
||||
TOOLDIR=mips64el
|
||||
else
|
||||
TOOLDIR=i386
|
||||
|
@@ -3,7 +3,7 @@
|
||||
VTOY_PATH=$PWD/..
|
||||
|
||||
date +"%Y/%m/%d %H:%M:%S"
|
||||
echo downloading envrionment ...
|
||||
echo downloading environment ...
|
||||
|
||||
wget -q -P $VTOY_PATH/DOC/ https://github.com/ventoy/vtoytoolchain/releases/download/1.0/dietlibc-0.34.tar.xz
|
||||
wget -q -P $VTOY_PATH/DOC/ https://github.com/ventoy/vtoytoolchain/releases/download/1.0/musl-1.2.1.tar.gz
|
||||
@@ -14,6 +14,6 @@ wget -q -P /opt/ https://github.com/ventoy/vtoytoolchain/releases/download/1.0/a
|
||||
wget -q -P /opt/ https://github.com/ventoy/vtoytoolchain/releases/download/1.0/mips-loongson-gcc7.3-2019.06-29-linux-gnu.tar.gz
|
||||
|
||||
date +"%Y/%m/%d %H:%M:%S"
|
||||
echo downloading envrionment finish...
|
||||
echo downloading environment finish...
|
||||
|
||||
sh all_in_one.sh CI
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user