Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
dadigang
Ventoy
Commits
7d37cab2
Commit
7d37cab2
authored
Feb 15, 2022
by
longpanda
Browse files
1. F2 browser and vlnk support partitions in Ventoy reserved space (#1434)
2. Speedup browser
parent
a1c6fe2d
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
53 additions
and
47 deletions
+53
-47
GRUB2/MOD_SRC/grub-2.04/grub-core/fs/ntfs.c
GRUB2/MOD_SRC/grub-2.04/grub-core/fs/ntfs.c
+12
-1
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_browser.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_browser.c
+31
-38
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
+10
-8
No files found.
GRUB2/MOD_SRC/grub-2.04/grub-core/fs/ntfs.c
View file @
7d37cab2
...
@@ -995,8 +995,19 @@ grub_ntfs_dir_iter (const char *filename, enum grub_fshelp_filetype filetype,
...
@@ -995,8 +995,19 @@ grub_ntfs_dir_iter (const char *filename, enum grub_fshelp_filetype filetype,
info
.
mtime
=
grub_divmod64
(
node
->
mtime
,
10000000
,
0
)
info
.
mtime
=
grub_divmod64
(
node
->
mtime
,
10000000
,
0
)
-
86400ULL
*
365
*
(
1970
-
1601
)
-
86400ULL
*
365
*
(
1970
-
1601
)
-
86400ULL
*
((
1970
-
1601
)
/
4
)
+
86400ULL
*
((
1970
-
1601
)
/
100
);
-
86400ULL
*
((
1970
-
1601
)
/
4
)
+
86400ULL
*
((
1970
-
1601
)
/
100
);
if
(
!
info
.
dir
)
if
(
!
info
.
dir
)
info
.
size
=
node
->
size
;
{
struct
grub_ntfs_file
*
mft
=
(
struct
grub_ntfs_file
*
)
node
;
info
.
size
=
mft
->
size
;
if
(
!
mft
->
inode_read
)
{
init_file
(
mft
,
mft
->
ino
);
info
.
size
=
mft
->
size
;
free_file
(
mft
);
}
}
grub_free
(
node
);
grub_free
(
node
);
return
ctx
->
hook
(
filename
,
&
info
,
ctx
->
hook_data
);
return
ctx
->
hook
(
filename
,
&
info
,
ctx
->
hook_data
);
}
}
...
...
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_browser.c
View file @
7d37cab2
...
@@ -40,8 +40,10 @@ GRUB_MOD_LICENSE ("GPLv3+");
...
@@ -40,8 +40,10 @@ GRUB_MOD_LICENSE ("GPLv3+");
#define BROWSER_MENU_BUF 65536
#define BROWSER_MENU_BUF 65536
static
const
char
*
g_vtoy_dev
=
NULL
;
static
grub_fs_t
g_menu_fs
=
NULL
;
static
grub_fs_t
g_menu_fs
=
NULL
;
static
char
*
g_menu_device
=
NULL
;
static
char
*
g_menu_device
=
NULL
;
static
grub_device_t
g_menu_dev
=
NULL
;
static
char
g_menu_path_buf
[
1024
];
static
char
g_menu_path_buf
[
1024
];
static
int
g_menu_path_len
=
0
;
static
int
g_menu_path_len
=
0
;
static
browser_node
*
g_browser_list
=
NULL
;
static
browser_node
*
g_browser_list
=
NULL
;
...
@@ -93,13 +95,13 @@ static int ventoy_browser_mbuf_alloc(browser_mbuf *mbuf)
...
@@ -93,13 +95,13 @@ static int ventoy_browser_mbuf_alloc(browser_mbuf *mbuf)
return
1
;
return
1
;
}
}
static
void
ventoy_browser_mbuf_free
(
browser_mbuf
*
mbuf
)
static
inline
void
ventoy_browser_mbuf_free
(
browser_mbuf
*
mbuf
)
{
{
if
(
mbuf
)
if
(
mbuf
)
grub_check_free
(
mbuf
->
buf
)
grub_check_free
(
mbuf
->
buf
)
}
}
static
int
ventoy_browser_mbuf_extend
(
browser_mbuf
*
mbuf
)
static
inline
int
ventoy_browser_mbuf_extend
(
browser_mbuf
*
mbuf
)
{
{
if
(
mbuf
->
max
-
mbuf
->
pos
<=
VTOY_SIZE_1KB
)
if
(
mbuf
->
max
-
mbuf
->
pos
<=
VTOY_SIZE_1KB
)
{
{
...
@@ -202,7 +204,12 @@ static int ventoy_browser_iterate_partition(struct grub_disk *disk, const grub_p
...
@@ -202,7 +204,12 @@ static int ventoy_browser_iterate_partition(struct grub_disk *disk, const grub_p
browser_mbuf
*
mbuf
=
(
browser_mbuf
*
)
data
;
browser_mbuf
*
mbuf
=
(
browser_mbuf
*
)
data
;
(
void
)
data
;
(
void
)
data
;
if
(
partition
->
number
<
2
&&
g_vtoy_dev
&&
grub_strcmp
(
disk
->
name
,
g_vtoy_dev
)
==
0
)
{
return
0
;
}
grub_snprintf
(
partname
,
sizeof
(
partname
)
-
1
,
"%s,%d"
,
disk
->
name
,
partition
->
number
+
1
);
grub_snprintf
(
partname
,
sizeof
(
partname
)
-
1
,
"%s,%d"
,
disk
->
name
,
partition
->
number
+
1
);
dev
=
grub_device_open
(
partname
);
dev
=
grub_device_open
(
partname
);
...
@@ -246,14 +253,9 @@ static int ventoy_browser_iterate_partition(struct grub_disk *disk, const grub_p
...
@@ -246,14 +253,9 @@ static int ventoy_browser_iterate_partition(struct grub_disk *disk, const grub_p
return
0
;
return
0
;
}
}
static
int
ventoy_browser_iterate_disk
(
const
char
*
name
,
void
*
data
)
static
int
ventoy_browser_iterate_disk
(
const
char
*
name
,
void
*
data
)
{
{
grub_disk_t
disk
;
grub_disk_t
disk
;
grub_uint32_t
sig
;
grub_uint32_t
selfsig
;
grub_memcpy
(
&
selfsig
,
g_ventoy_part_info
->
MBR
.
BootCode
+
0x1b8
,
4
);
if
(
name
[
0
]
!=
'h'
)
if
(
name
[
0
]
!=
'h'
)
{
{
...
@@ -263,14 +265,7 @@ static int ventoy_browser_iterate_disk(const char *name, void *data)
...
@@ -263,14 +265,7 @@ static int ventoy_browser_iterate_disk(const char *name, void *data)
disk
=
grub_disk_open
(
name
);
disk
=
grub_disk_open
(
name
);
if
(
disk
)
if
(
disk
)
{
{
grub_disk_read
(
disk
,
0
,
0x1b8
,
4
,
&
sig
);
grub_partition_iterate
(
disk
,
ventoy_browser_iterate_partition
,
data
);
/* skip ventoy device self */
if
(
sig
!=
selfsig
)
{
grub_partition_iterate
(
disk
,
ventoy_browser_iterate_partition
,
data
);
}
grub_disk_close
(
disk
);
grub_disk_close
(
disk
);
}
}
...
@@ -325,38 +320,33 @@ static int ventoy_browser_iterate_dir(const char *filename, const struct grub_di
...
@@ -325,38 +320,33 @@ static int ventoy_browser_iterate_dir(const char *filename, const struct grub_di
}
}
else
else
{
{
grub_uint64_t
fsize
;
grub_uint64_t
fsize
=
info
->
size
;
grub_file_t
file
=
NULL
;
if
(
ventoy_browser_check_filename
(
filename
,
len
,
&
type
)
==
0
)
if
(
ventoy_browser_check_filename
(
filename
,
len
,
&
type
)
==
0
)
{
{
return
0
;
return
0
;
}
}
fsize
=
info
->
size
;
if
(
fsize
==
0
)
{
file
=
ventoy_grub_file_open
(
VENTOY_FILE_TYPE
,
"(%s)%s/%s"
,
g_menu_device
,
g_menu_path_buf
,
filename
);
if
(
!
file
)
{
return
0
;
}
fsize
=
file
->
size
;
grub_file_close
(
file
);
}
if
(
fsize
<
VTOY_FILT_MIN_FILE_SIZE
)
{
return
0
;
}
node
=
grub_zalloc
(
sizeof
(
browser_node
));
node
=
grub_zalloc
(
sizeof
(
browser_node
));
if
(
!
node
)
if
(
!
node
)
{
{
return
0
;
return
0
;
}
}
if
(
fsize
==
0
)
{
struct
grub_file
file
;
grub_memset
(
&
file
,
0
,
sizeof
(
file
));
file
.
device
=
g_menu_dev
;
grub_snprintf
(
node
->
menuentry
,
sizeof
(
node
->
menuentry
),
"%s/%s"
,
g_menu_path_buf
,
filename
);
if
(
g_menu_fs
->
fs_open
(
&
file
,
node
->
menuentry
)
==
GRUB_ERR_NONE
)
{
fsize
=
file
.
size
;
g_menu_fs
->
fs_close
(
&
file
);
}
}
node
->
dir
=
0
;
node
->
dir
=
0
;
grub_strncpy
(
node
->
filename
,
filename
,
sizeof
(
node
->
filename
));
grub_strncpy
(
node
->
filename
,
filename
,
sizeof
(
node
->
filename
));
grub_snprintf
(
node
->
menuentry
,
sizeof
(
node
->
menuentry
),
grub_snprintf
(
node
->
menuentry
,
sizeof
(
node
->
menuentry
),
...
@@ -368,7 +358,6 @@ static int ventoy_browser_iterate_dir(const char *filename, const struct grub_di
...
@@ -368,7 +358,6 @@ static int ventoy_browser_iterate_dir(const char *filename, const struct grub_di
grub_get_human_size
(
fsize
,
GRUB_HUMAN_SIZE_SHORT
),
filename
,
g_menu_class
[
type
],
grub_get_human_size
(
fsize
,
GRUB_HUMAN_SIZE_SHORT
),
filename
,
g_menu_class
[
type
],
g_menu_device
,
g_menu_path_buf
,
filename
,
g_menu_prefix
[
type
],
(
ulonglong
)
fsize
,
g_menu_device
,
g_menu_path_buf
,
filename
,
g_menu_prefix
[
type
],
(
ulonglong
)
fsize
,
g_menu_prefix
[
type
]);
g_menu_prefix
[
type
]);
}
}
node
->
prev
=
NULL
;
node
->
prev
=
NULL
;
...
@@ -415,6 +404,7 @@ grub_err_t ventoy_cmd_browser_dir(grub_extcmd_context_t ctxt, int argc, char **a
...
@@ -415,6 +404,7 @@ grub_err_t ventoy_cmd_browser_dir(grub_extcmd_context_t ctxt, int argc, char **a
g_menu_fs
=
fs
;
g_menu_fs
=
fs
;
g_menu_device
=
args
[
0
];
g_menu_device
=
args
[
0
];
g_menu_dev
=
dev
;
g_browser_list
=
NULL
;
g_browser_list
=
NULL
;
if
(
args
[
2
][
0
]
==
'/'
&&
args
[
2
][
1
]
==
0
)
if
(
args
[
2
][
0
]
==
'/'
&&
args
[
2
][
1
]
==
0
)
...
@@ -440,8 +430,9 @@ grub_err_t ventoy_cmd_browser_dir(grub_extcmd_context_t ctxt, int argc, char **a
...
@@ -440,8 +430,9 @@ grub_err_t ventoy_cmd_browser_dir(grub_extcmd_context_t ctxt, int argc, char **a
node
=
ventoy_browser_find_top_node
(
i
);
node
=
ventoy_browser_find_top_node
(
i
);
if
(
node
)
if
(
node
)
{
{
grub_printf
(
"Find Node <%s>
\n
"
,
node
->
filename
);
browser_ssprintf
(
&
mbuf
,
"%s"
,
node
->
menuentry
);
browser_ssprintf
(
&
mbuf
,
"%s"
,
node
->
menuentry
);
ventoy_browser_mbuf_extend
(
&
mbuf
);
if
(
node
->
prev
)
if
(
node
->
prev
)
{
{
node
->
prev
->
next
=
node
->
next
;
node
->
prev
->
next
=
node
->
next
;
...
@@ -486,6 +477,8 @@ grub_err_t ventoy_cmd_browser_disk(grub_extcmd_context_t ctxt, int argc, char **
...
@@ -486,6 +477,8 @@ grub_err_t ventoy_cmd_browser_disk(grub_extcmd_context_t ctxt, int argc, char **
return
1
;
return
1
;
}
}
g_vtoy_dev
=
grub_env_get
(
"vtoydev"
);
browser_ssprintf
(
&
mbuf
,
"menuentry
\"
%-10s [Return]
\"
--class=
\"
vtoyret
\"
VTOY_RET {
\n
"
browser_ssprintf
(
&
mbuf
,
"menuentry
\"
%-10s [Return]
\"
--class=
\"
vtoyret
\"
VTOY_RET {
\n
"
" echo 'return ...'
\n
}
\n
"
,
"<--"
);
" echo 'return ...'
\n
}
\n
"
,
"<--"
);
...
...
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
View file @
7d37cab2
...
@@ -1597,8 +1597,16 @@ int ventoy_img_name_valid(const char *filename, grub_size_t namelen)
...
@@ -1597,8 +1597,16 @@ int ventoy_img_name_valid(const char *filename, grub_size_t namelen)
static
int
ventoy_vlnk_iterate_partition
(
struct
grub_disk
*
disk
,
const
grub_partition_t
partition
,
void
*
data
)
static
int
ventoy_vlnk_iterate_partition
(
struct
grub_disk
*
disk
,
const
grub_partition_t
partition
,
void
*
data
)
{
{
ventoy_vlnk_part
*
node
=
NULL
;
ventoy_vlnk_part
*
node
=
NULL
;
grub_uint32_t
SelfSig
;
grub_uint32_t
*
pSig
=
(
grub_uint32_t
*
)
data
;
grub_uint32_t
*
pSig
=
(
grub_uint32_t
*
)
data
;
/* skip Ventoy partition 1/2 */
grub_memcpy
(
&
SelfSig
,
g_ventoy_part_info
->
MBR
.
BootCode
+
0x1b8
,
4
);
if
(
partition
->
number
<
2
&&
SelfSig
==
*
pSig
)
{
return
0
;
}
node
=
grub_zalloc
(
sizeof
(
ventoy_vlnk_part
));
node
=
grub_zalloc
(
sizeof
(
ventoy_vlnk_part
));
if
(
node
)
if
(
node
)
{
{
...
@@ -1625,13 +1633,7 @@ static int ventoy_vlnk_iterate_disk(const char *name, void *data)
...
@@ -1625,13 +1633,7 @@ static int ventoy_vlnk_iterate_disk(const char *name, void *data)
if
(
disk
)
if
(
disk
)
{
{
grub_disk_read
(
disk
,
0
,
0x1b8
,
4
,
&
sig
);
grub_disk_read
(
disk
,
0
,
0x1b8
,
4
,
&
sig
);
grub_partition_iterate
(
disk
,
ventoy_vlnk_iterate_partition
,
&
sig
);
/* skip ventoy device self */
if
(
sig
!=
*
(
grub_uint32_t
*
)
data
)
{
grub_partition_iterate
(
disk
,
ventoy_vlnk_iterate_partition
,
&
sig
);
}
grub_disk_close
(
disk
);
grub_disk_close
(
disk
);
}
}
...
@@ -1693,7 +1695,7 @@ static int ventoy_check_vlnk_data(ventoy_vlnk *vlnk, int print, char *dst, int s
...
@@ -1693,7 +1695,7 @@ static int ventoy_check_vlnk_data(ventoy_vlnk *vlnk, int print, char *dst, int s
if
(
!
g_vlnk_part_list
)
if
(
!
g_vlnk_part_list
)
{
{
grub_disk_dev_iterate
(
ventoy_vlnk_iterate_disk
,
g_ventoy_part_info
->
MBR
.
BootCode
+
0x1b8
);
grub_disk_dev_iterate
(
ventoy_vlnk_iterate_disk
,
NULL
);
}
}
for
(
cur
=
g_vlnk_part_list
;
cur
&&
filefind
==
0
;
cur
=
cur
->
next
)
for
(
cur
=
g_vlnk_part_list
;
cur
&&
filefind
==
0
;
cur
=
cur
->
next
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment