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
e79dc57e
Commit
e79dc57e
authored
Sep 16, 2022
by
longpanda
Browse files
wimboot mode support Bob.Ombs.Modified.Win10PEx64 (#1842)
parent
7bf85a1e
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
1206 additions
and
924 deletions
+1206
-924
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
+4
-8
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c
+153
-12
GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h
GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h
+1
-1
INSTALL/grub/grub.cfg
INSTALL/grub/grub.cfg
+136
-65
INSTALL/ventoy/vtoyjump32.exe
INSTALL/ventoy/vtoyjump32.exe
+0
-0
INSTALL/ventoy/vtoyjump64.exe
INSTALL/ventoy/vtoyjump64.exe
+0
-0
vtoyjump/vtoyjump/vtoyjump.c
vtoyjump/vtoyjump/vtoyjump.c
+905
-838
vtoyjump/vtoyjump/vtoyjump.h
vtoyjump/vtoyjump/vtoyjump.h
+7
-0
No files found.
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_cmd.c
View file @
e79dc57e
...
@@ -148,8 +148,6 @@ static char g_iso_vd_id_application[130];
...
@@ -148,8 +148,6 @@ static char g_iso_vd_id_application[130];
static
int
g_pager_flag
=
0
;
static
int
g_pager_flag
=
0
;
static
char
g_old_pager
[
32
];
static
char
g_old_pager
[
32
];
static
const
char
*
g_vtoy_winpeshl_ini
=
"[LaunchApps]
\r\n
vtoyjump.exe"
;
const
char
*
g_menu_class
[
img_type_max
]
=
const
char
*
g_menu_class
[
img_type_max
]
=
{
{
"vtoyiso"
,
"vtoywim"
,
"vtoyefi"
,
"vtoyimg"
,
"vtoyvhd"
,
"vtoyvtoy"
"vtoyiso"
,
"vtoywim"
,
"vtoyefi"
,
"vtoyimg"
,
"vtoyvhd"
,
"vtoyvtoy"
...
@@ -1148,6 +1146,10 @@ grub_ssize_t ventoy_load_file_with_prompt(grub_file_t file, void *buf, grub_ssiz
...
@@ -1148,6 +1146,10 @@ grub_ssize_t ventoy_load_file_with_prompt(grub_file_t file, void *buf, grub_ssiz
left
-=
VTOY_SIZE_2MB
;
left
-=
VTOY_SIZE_2MB
;
div
=
grub_divmod64
((
grub_uint64_t
)((
size
-
left
)
*
100
),
(
grub_uint64_t
)
size
,
&
ro
);
div
=
grub_divmod64
((
grub_uint64_t
)((
size
-
left
)
*
100
),
(
grub_uint64_t
)
size
,
&
ro
);
if
(
div
<
1
)
{
div
=
1
;
}
grub_printf
(
"
\r
%s %d%% "
,
g_vtoy_prompt_msg
,
(
int
)
div
);
grub_printf
(
"
\r
%s %d%% "
,
g_vtoy_prompt_msg
,
(
int
)
div
);
grub_refresh
();
grub_refresh
();
}
}
...
@@ -5987,12 +5989,6 @@ int ventoy_env_init(void)
...
@@ -5987,12 +5989,6 @@ int ventoy_env_init(void)
grub_env_export
(
"ventoy_env_param"
);
grub_env_export
(
"ventoy_env_param"
);
}
}
grub_snprintf
(
buf
,
sizeof
(
buf
),
"0x%lx"
,
(
ulong
)
g_vtoy_winpeshl_ini
);
grub_env_set
(
"vtoy_winpeshl_ini_addr"
,
buf
);
grub_snprintf
(
buf
,
sizeof
(
buf
),
"%d"
,
(
int
)
grub_strlen
(
g_vtoy_winpeshl_ini
));
grub_env_set
(
"vtoy_winpeshl_ini_size"
,
buf
);
grub_env_export
(
"vtoy_winpeshl_ini_addr"
);
grub_env_export
(
"vtoy_winpeshl_ini_addr"
);
grub_env_export
(
"vtoy_winpeshl_ini_size"
);
grub_env_export
(
"vtoy_winpeshl_ini_size"
);
...
...
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c
View file @
e79dc57e
...
@@ -1790,19 +1790,150 @@ end:
...
@@ -1790,19 +1790,150 @@ end:
return
rc
;
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
)
grub_err_t
ventoy_cmd_windows_wimboot_data
(
grub_extcmd_context_t
ctxt
,
int
argc
,
char
**
args
)
{
{
int
rc
=
0
;
int
datalen
=
0
;
int
datalen
=
0
;
int
dataflag
=
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
;
const
char
*
addr
=
NULL
;
ventoy_chain_head
*
chain
=
NULL
;
ventoy_chain_head
*
chain
=
NULL
;
ventoy_os_param
*
param
=
NULL
;
grub_uint8_t
*
param
=
NULL
;
char
envbuf
[
64
];
grub_uint8_t
*
exe_data
=
NULL
;
ventoy_windows_data
*
rtdata
=
NULL
;
char
envbuf
[
64
]
=
{
0
};
char
exename
[
128
]
=
{
0
};
wim_tail
wim_data
;
(
void
)
ctxt
;
(
void
)
ctxt
;
(
void
)
argc
;
(
void
)
argc
;
(
void
)
args
;
addr
=
grub_env_get
(
"vtoy_chain_mem_addr"
);
addr
=
grub_env_get
(
"vtoy_chain_mem_addr"
);
if
(
!
addr
)
if
(
!
addr
)
...
@@ -1821,24 +1952,34 @@ grub_err_t ventoy_cmd_windows_wimboot_data(grub_extcmd_context_t ctxt, int argc,
...
@@ -1821,24 +1952,34 @@ 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
);
datalen
=
ventoy_get_windows_rtdata_len
(
chain
->
os_param
.
vtoy_img_path
,
&
dataflag
);
size
=
sizeof
(
ventoy_os_param
)
+
datalen
;
rc
=
ventoy_extract_init_exe
(
args
[
0
],
&
exe_data
,
&
exe_len
,
exename
);
param
=
(
ventoy_os_param
*
)
grub_zalloc
(
size
);
if
(
rc
)
if
(
!
param
)
{
{
return
1
;
return
1
;
}
}
grub_memcpy
(
param
,
&
chain
->
os_param
,
sizeof
(
ventoy_os_param
));
grub_memset
(
&
wim_data
,
0
,
sizeof
(
wim_data
));
ventoy_fill_windows_rtdata
(
param
+
1
,
param
->
vtoy_img_path
,
dataflag
);
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
));
grub_snprintf
(
envbuf
,
sizeof
(
envbuf
),
"0x%lx"
,
(
unsigned
long
)
param
);
rtdata
=
(
ventoy_windows_data
*
)(
param
+
jump_align
+
sizeof
(
ventoy_os_param
));
ventoy_fill_windows_rtdata
(
rtdata
,
chain
->
os_param
.
vtoy_img_path
,
dataflag
);
grub_snprintf
(
envbuf
,
sizeof
(
envbuf
),
"0x%lx"
,
(
ulong
)
param
);
grub_env_set
(
"vtoy_wimboot_mem_addr"
,
envbuf
);
grub_env_set
(
"vtoy_wimboot_mem_addr"
,
envbuf
);
debug
(
"vtoy_wimboot_mem_addr: %s
\n
"
,
envbuf
);
debug
(
"vtoy_wimboot_mem_addr: %s
\n
"
,
envbuf
);
grub_snprintf
(
envbuf
,
sizeof
(
envbuf
),
"%u"
,
size
);
grub_snprintf
(
envbuf
,
sizeof
(
envbuf
),
"%u"
,
wim_data
.
bin_align_len
);
grub_env_set
(
"vtoy_wimboot_mem_size"
,
envbuf
);
grub_env_set
(
"vtoy_wimboot_mem_size"
,
envbuf
);
debug
(
"vtoy_wimboot_mem_size: %s
\n
"
,
envbuf
);
debug
(
"vtoy_wimboot_mem_size: %s
\n
"
,
envbuf
);
grub_env_set
(
args
[
1
],
exename
);
VENTOY_CMD_RETURN
(
GRUB_ERR_NONE
);
VENTOY_CMD_RETURN
(
GRUB_ERR_NONE
);
}
}
...
...
GRUB2/MOD_SRC/grub-2.04/include/grub/ventoy.h
View file @
e79dc57e
INSTALL/grub/grub.cfg
View file @
e79dc57e
...
@@ -599,6 +599,11 @@ function ventoy_unix_comm_proc {
...
@@ -599,6 +599,11 @@ function ventoy_unix_comm_proc {
function uefi_windows_menu_func {
function uefi_windows_menu_func {
vt_windows_reset
vt_windows_reset
if vt_check_mode 4 "$vt_chosen_name"; then
vt_windows_chain_data "${1}${chosen_path}"
ventoy_debug_pause
vtoy_wimboot_func
else
if [ "$ventoy_compatible" = "NO" ]; then
if [ "$ventoy_compatible" = "NO" ]; then
if [ "$ventoy_fs_probe" = "iso9660" ]; then
if [ "$ventoy_fs_probe" = "iso9660" ]; then
...
@@ -619,12 +624,8 @@ function uefi_windows_menu_func {
...
@@ -619,12 +624,8 @@ function uefi_windows_menu_func {
ventoy_debug_pause
ventoy_debug_pause
locate_wim "${chosen_path}"
locate_wim "${chosen_path}"
fi
fi
vt_windows_chain_data "${1}${chosen_path}"
vt_windows_chain_data "${1}${chosen_path}"
ventoy_debug_pause
ventoy_debug_pause
if vt_check_mode 4 "$vt_chosen_name"; then
vtoy_windows_wimboot_func
fi
fi
if [ -n "$vtoy_chain_mem_addr" ]; then
if [ -n "$vtoy_chain_mem_addr" ]; then
...
@@ -942,8 +943,7 @@ function uefi_iso_memdisk {
...
@@ -942,8 +943,7 @@ function uefi_iso_memdisk {
ventoy_gui_console
ventoy_gui_console
}
}
function vtoy_windows_wimboot {
function vtoy_windows_wimboot_func {
if [ -f (loop)/x86/sources/boot.wim -a -f (loop)/x64/sources/boot.wim ]; then
if [ -f (loop)/x86/sources/boot.wim -a -f (loop)/x64/sources/boot.wim ]; then
vt_sel_wimboot vtoy_wimboot_bit
vt_sel_wimboot vtoy_wimboot_bit
if [ "$vtoy_wimboot_bit" = "32" ]; then
if [ "$vtoy_wimboot_bit" = "32" ]; then
...
@@ -961,7 +961,7 @@ function vtoy_windows_wimboot_func {
...
@@ -961,7 +961,7 @@ function vtoy_windows_wimboot_func {
fi
fi
if [ -n "${vtdebug_flag}" ]; then
if [ -n "${vtdebug_flag}" ]; then
echo vtoy_wimboot_prefix=$vtoy_wimboot_prefix vtoy_wimboot_bit=$vtoy_wimboot_bit
echo vtoy_wimboot_prefix=$vtoy_wimboot_prefix vtoy_wimboot_bit=$vtoy_wimboot_bit
vt_wimkernel=$vt_wimkernel
fi
fi
for wmfile in sources/boot.wim boot/bcd boot/boot.sdi; do
for wmfile in sources/boot.wim boot/bcd boot/boot.sdi; do
...
@@ -971,33 +971,24 @@ function vtoy_windows_wimboot_func {
...
@@ -971,33 +971,24 @@ function vtoy_windows_wimboot_func {
done
done
if [ -f $vtoy_wimboot_prefix/sources/install.wim -o -f $vtoy_wimboot_prefix/sources/install.esd ]; then
if [ -f $vtoy_wimboot_prefix/sources/install.wim -o -f $vtoy_wimboot_prefix/sources/install.esd ]; then
vt_windows_wimboot_data
vt_windows_wimboot_data
"$vtoy_wimboot_prefix/sources/boot.wim" vtoy_init_exe
else
else
return
return
fi
fi
if [ "$grub_platform" = "pc" ]; then
if [ "$grub_platform" = "pc" ]; then
set vt_wimkernel=wimboot.x86_64.xz
linux16 "$vtoy_path/$vt_wimkernel" quiet
linux16 "$vtoy_path/$vt_wimkernel" quiet
ventoy_debug_pause
ventoy_debug_pause
vt_set_wim_load_prompt 1 "Loading files......"
vt_set_wim_load_prompt 1 "Loading files......"
initrd16 newc:vtoyjump.exe:$vtoy_path/vtoyjump${vtoy_wimboot_bit}.exe \
initrd16 newc:winpeshl.exe:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size} \
newc:wimboot.data:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size} \
newc:vtoy_wimboot:$vtoy_wimboot_prefix/boot/bcd \
newc:winpeshl.ini:mem:${vtoy_winpeshl_ini_addr}:size:${vtoy_winpeshl_ini_size} \
newc:bcd:$vtoy_wimboot_prefix/boot/bcd \
newc:bcd:$vtoy_wimboot_prefix/boot/bcd \
newc:boot.sdi:$vtoy_wimboot_prefix/boot/boot.sdi \
newc:boot.sdi:$vtoy_wimboot_prefix/boot/boot.sdi \
newc:boot.wim:$vtoy_wimboot_prefix/sources/boot.wim
newc:boot.wim:$vtoy_wimboot_prefix/sources/boot.wim
vt_set_wim_load_prompt 0
vt_set_wim_load_prompt 0
boot
boot
else
else
if [ "$grub_cpu" = "i386" ]; then
set vt_wimkernel=wimboot.i386.efi.xz
else
set vt_wimkernel=wimboot.x86_64.xz
fi
vt_set_wim_load_prompt 1 "Loading files......"
vt_set_wim_load_prompt 1 "Loading files......"
vt_load_file_to_mem "nodecompress" $vtoy_wimboot_prefix/sources/boot.wim vtoy_wimfile_mem
vt_load_file_to_mem "nodecompress" $vtoy_wimboot_prefix/sources/boot.wim vtoy_wimfile_mem
vt_set_wim_load_prompt 0
vt_set_wim_load_prompt 0
...
@@ -1010,9 +1001,8 @@ function vtoy_windows_wimboot_func {
...
@@ -1010,9 +1001,8 @@ function vtoy_windows_wimboot_func {
ventoy_cli_console
ventoy_cli_console
chainloader "$vtoy_path/$vt_wimkernel" quiet \
chainloader "$vtoy_path/$vt_wimkernel" quiet \
"vf=wimboot.data:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size}" \
"vf=winpeshl.exe:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size}" \
"vf=winpeshl.ini:mem:${vtoy_winpeshl_ini_addr}:size:${vtoy_winpeshl_ini_size}" \
"vf=vtoy_wimboot:$vtoy_wimboot_prefix/boot/bcd" \
"vf=vtoyjump.exe:$vtoy_path/vtoyjump${vtoy_wimboot_bit}.exe" \
"vf=bcd:$vtoy_wimboot_prefix/boot/bcd" \
"vf=bcd:$vtoy_wimboot_prefix/boot/bcd" \
"vf=boot.sdi:$vtoy_wimboot_prefix/boot/boot.sdi" \
"vf=boot.sdi:$vtoy_wimboot_prefix/boot/boot.sdi" \
"vf=boot.wim:$vtoy_wimfile_path" \
"vf=boot.wim:$vtoy_wimfile_path" \
...
@@ -1023,9 +1013,93 @@ function vtoy_windows_wimboot_func {
...
@@ -1023,9 +1013,93 @@ function vtoy_windows_wimboot_func {
fi
fi
}
}
function vtoy_winpe_wimboot {
unset vtoy_boot_mgr_exe
unset vtoy_boot_mgr_efi
set vtoy_wimboot_prefix=(loop)
set vtoy_bcd_path="$1"
set vtoy_sdi_path="$2"
set vtoy_wim_path="$3"
set vtoy_mgr_flag="$4"
if [ $vtoy_mgr_flag -eq 1 ]; then
set vtoy_boot_mgr_exe="newc:bootmgr.exe:$vtoy_wimboot_prefix/$5"
elif [ $vtoy_mgr_flag -eq 2 ]; then
set vtoy_boot_mgr_efi="vf=bootmgr.efi:$vtoy_wimboot_prefix/$5"
elif [ $vtoy_mgr_flag -eq 3 ]; then
set vtoy_boot_mgr_exe="newc:bootmgr.exe:$vtoy_wimboot_prefix/$5"
set vtoy_boot_mgr_efi="vf=bootmgr.efi:$vtoy_wimboot_prefix/$6"
fi
vt_windows_wimboot_data $vtoy_wimboot_prefix/$vtoy_wim_path vtoy_init_exe
if [ "$grub_platform" = "pc" ]; then
linux16 "$vtoy_path/$vt_wimkernel" quiet
ventoy_debug_pause
vt_set_wim_load_prompt 1 "Loading files......"
initrd16 newc:$vtoy_init_exe:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size} \
$vtoy_boot_mgr_exe \
newc:vtoy_wimboot:$vtoy_wimboot_prefix/$vtoy_bcd_path \
newc:bcd:$vtoy_wimboot_prefix/$vtoy_bcd_path \
newc:boot.sdi:$vtoy_wimboot_prefix/$vtoy_sdi_path \
newc:boot.wim:$vtoy_wimboot_prefix/$vtoy_wim_path
vt_set_wim_load_prompt 0
boot
else
vt_set_wim_load_prompt 1 "Loading files......"
vt_load_file_to_mem "nodecompress" $vtoy_wimboot_prefix/$vtoy_wim_path vtoy_wimfile_mem
vt_set_wim_load_prompt 0
if [ $? -eq 0 ]; then
set vtoy_wimfile_path=mem:${vtoy_wimfile_mem_addr}:size:${vtoy_wimfile_mem_size}
else
set vtoy_wimfile_path=$vtoy_wimboot_prefix/$vtoy_wim_path
fi
ventoy_cli_console
chainloader "$vtoy_path/$vt_wimkernel" quiet \
"vf=$vtoy_init_exe:mem:${vtoy_wimboot_mem_addr}:size:${vtoy_wimboot_mem_size}" \
"vf=vtoy_wimboot:$vtoy_wimboot_prefix/$vtoy_bcd_path" \
"$vtoy_boot_mgr_efi" \
"vf=bcd:$vtoy_wimboot_prefix/$vtoy_bcd_path" \
"vf=boot.sdi:$vtoy_wimboot_prefix/$vtoy_sdi_path" \
"vf=boot.wim:$vtoy_wimfile_path" \
pfsize=$vtoy_chain_file_size \
pfread=$vtoy_chain_file_read
boot
ventoy_gui_console
fi
}
function vtoy_wimboot_func {
echo -e "\n===================== VENTOY WIMBOOT ===================\n"
if [ "$grub_platform" = "pc" ]; then
set vt_wimkernel=wimboot.x86_64.xz
else
if [ "$grub_cpu" = "i386" ]; then
set vt_wimkernel=wimboot.i386.efi.xz
else
set vt_wimkernel=wimboot.x86_64.xz
fi
fi
if vt_str_begin "$vt_volume_id" "Modified-Win10PEx64"; then
vtoy_winpe_wimboot 'Boot/bcd' 'Boot/boot.sdi' 'sources/boot.wim' 1 'bootmgr.exe'
else
vtoy_windows_wimboot
fi
}
function legacy_windows_menu_func {
function legacy_windows_menu_func {
vt_windows_reset
vt_windows_reset
if vt_check_mode 4 "$vt_chosen_name"; then
vt_windows_chain_data "${1}${chosen_path}"
ventoy_debug_pause
vtoy_wimboot_func
else
if [ "$ventoy_compatible" = "NO" ]; then
if [ "$ventoy_compatible" = "NO" ]; then
if [ "$ventoy_fs_probe" = "iso9660" ]; then
if [ "$ventoy_fs_probe" = "iso9660" ]; then
...
@@ -1051,9 +1125,6 @@ function legacy_windows_menu_func {
...
@@ -1051,9 +1125,6 @@ function legacy_windows_menu_func {
vt_windows_chain_data "${1}${chosen_path}"
vt_windows_chain_data "${1}${chosen_path}"
ventoy_debug_pause
ventoy_debug_pause
if vt_check_mode 4 "$vt_chosen_name"; then
vtoy_windows_wimboot_func
fi
fi
if [ -n "$vtoy_chain_mem_addr" ]; then
if [ -n "$vtoy_chain_mem_addr" ]; then
...
...
INSTALL/ventoy/vtoyjump32.exe
View file @
e79dc57e
No preview for this file type
INSTALL/ventoy/vtoyjump64.exe
View file @
e79dc57e
No preview for this file type
vtoyjump/vtoyjump/vtoyjump.c
View file @
e79dc57e
...
@@ -36,6 +36,8 @@ static ventoy_guid g_ventoy_guid = VENTOY_GUID;
...
@@ -36,6 +36,8 @@ static ventoy_guid g_ventoy_guid = VENTOY_GUID;
static
HANDLE
g_vtoylog_mutex
=
NULL
;
static
HANDLE
g_vtoylog_mutex
=
NULL
;
static
HANDLE
g_vtoyins_mutex
=
NULL
;
static
HANDLE
g_vtoyins_mutex
=
NULL
;
static
BOOL
g_wimboot_mode
=
FALSE
;
static
DWORD
g_vtoy_disk_drive
;
static
DWORD
g_vtoy_disk_drive
;
static
CHAR
g_prog_full_path
[
MAX_PATH
];
static
CHAR
g_prog_full_path
[
MAX_PATH
];
...
@@ -46,13 +48,14 @@ static CHAR g_prog_name[MAX_PATH];
...
@@ -46,13 +48,14 @@ static CHAR g_prog_name[MAX_PATH];
#define ORG_PECMD_PATH "X:\\Windows\\system32\\PECMD.EXE"
#define ORG_PECMD_PATH "X:\\Windows\\system32\\PECMD.EXE"
#define ORG_PECMD_BK_PATH "X:\\Windows\\system32\\PECMD.EXE_BACK.EXE"
#define ORG_PECMD_BK_PATH "X:\\Windows\\system32\\PECMD.EXE_BACK.EXE"
#define WIMBOOT_FILE "X:\\Windows\\system32\\vtoy_wimboot"
#define WIMBOOT_DONE "X:\\Windows\\system32\\vtoy_wimboot_done"
#define AUTO_RUN_BAT "X:\\VentoyAutoRun.bat"
#define AUTO_RUN_BAT "X:\\VentoyAutoRun.bat"
#define AUTO_RUN_LOG "X:\\VentoyAutoRun.log"
#define AUTO_RUN_LOG "X:\\VentoyAutoRun.log"
#define VTOY_AUTO_FILE "X:\\_vtoy_auto_install"
#define VTOY_AUTO_FILE "X:\\_vtoy_auto_install"
#define WINPESHL_INI "X:\\Windows\\system32\\winpeshl.ini"
#define LOG_FILE "X:\\Windows\\system32\\ventoy.log"
#define LOG_FILE "X:\\Windows\\system32\\ventoy.log"
#define MUTEX_LOCK(hmutex) if (hmutex != NULL) LockStatus = WaitForSingleObject(hmutex, INFINITE)
#define MUTEX_LOCK(hmutex) if (hmutex != NULL) LockStatus = WaitForSingleObject(hmutex, INFINITE)
#define MUTEX_UNLOCK(hmutex) if (hmutex != NULL && WAIT_OBJECT_0 == LockStatus) ReleaseMutex(hmutex)
#define MUTEX_UNLOCK(hmutex) if (hmutex != NULL && WAIT_OBJECT_0 == LockStatus) ReleaseMutex(hmutex)
...
@@ -92,6 +95,38 @@ static int split_path_name(char *fullpath, char *dir, char *name)
...
@@ -92,6 +95,38 @@ static int split_path_name(char *fullpath, char *dir, char *name)
return
0
;
return
0
;
}
}
static
void
TrimString
(
CHAR
*
String
,
BOOL
TrimLeft
)
{
CHAR
*
Pos1
=
String
;
CHAR
*
Pos2
=
String
;
size_t
Len
=
strlen
(
String
);
while
(
Len
>
0
)
{
if
(
String
[
Len
-
1
]
!=
' '
&&
String
[
Len
-
1
]
!=
'\t'
)
{
break
;
}
String
[
Len
-
1
]
=
0
;
Len
--
;
}
if
(
TrimLeft
)
{
while
(
*
Pos1
==
' '
||
*
Pos1
==
'\t'
)
{
Pos1
++
;
}
while
(
*
Pos1
)
{
*
Pos2
++
=
*
Pos1
++
;
}
*
Pos2
++
=
0
;
}
return
;
}
void
Log
(
const
char
*
Fmt
,
...)
void
Log
(
const
char
*
Fmt
,
...)
{
{
...
@@ -992,8 +1027,99 @@ End:
...
@@ -992,8 +1027,99 @@ End:
return
rc
;
return
rc
;
}
}
static
int
GetIsoId
(
CONST
CHAR
*
IsoPath
,
IsoId
*
ids
)
{
int
i
;
int
n
=
0
;
HANDLE
hFile
;
DWORD
dwSize
=
0
;
BOOL
bRet
[
8
];
hFile
=
CreateFileA
(
IsoPath
,
GENERIC_READ
,
FILE_SHARE_READ
,
NULL
,
OPEN_EXISTING
,
0
,
NULL
);
if
(
hFile
==
INVALID_HANDLE_VALUE
)
{
return
1
;
}
SetFilePointer
(
hFile
,
2048
*
16
+
8
,
NULL
,
FILE_BEGIN
);
bRet
[
n
++
]
=
ReadFile
(
hFile
,
ids
->
SystemId
,
32
,
&
dwSize
,
NULL
);
SetFilePointer
(
hFile
,
2048
*
16
+
40
,
NULL
,
FILE_BEGIN
);
bRet
[
n
++
]
=
ReadFile
(
hFile
,
ids
->
VolumeId
,
32
,
&
dwSize
,
NULL
);
SetFilePointer
(
hFile
,
2048
*
16
+
318
,
NULL
,
FILE_BEGIN
);
bRet
[
n
++
]
=
ReadFile
(
hFile
,
ids
->
PulisherId
,
128
,
&
dwSize
,
NULL
);
SetFilePointer
(
hFile
,
2048
*
16
+
446
,
NULL
,
FILE_BEGIN
);
bRet
[
n
++
]
=
ReadFile
(
hFile
,
ids
->
PreparerId
,
128
,
&
dwSize
,
NULL
);
CloseHandle
(
hFile
);
for
(
i
=
0
;
i
<
n
;
i
++
)
{
if
(
bRet
[
i
]
==
FALSE
)
{
return
1
;
}
}
TrimString
(
ids
->
SystemId
,
FALSE
);
TrimString
(
ids
->
VolumeId
,
FALSE
);
TrimString
(
ids
->
PulisherId
,
FALSE
);
TrimString
(
ids
->
PreparerId
,
FALSE
);
Log
(
"ISO ID: System<%s> Volume<%s> Pulisher<%s> Preparer<%s>"
,
ids
->
SystemId
,
ids
->
VolumeId
,
ids
->
PulisherId
,
ids
->
PreparerId
);
return
0
;
}
static
int
CheckSkipMountIso
(
CONST
CHAR
*
IsoPath
)
{
BOOL
InRoot
=
FALSE
;
int
slashcnt
=
0
;
CONST
CHAR
*
p
=
NULL
;
IsoId
ID
;
// C:\\xxx
for
(
p
=
IsoPath
;
*
p
;
p
++
)
{
if
(
*
p
==
'\\'
||
*
p
==
'/'
)
{
slashcnt
++
;
}
}
if
(
slashcnt
==
2
)
{
InRoot
=
TRUE
;
}
memset
(
&
ID
,
0
,
sizeof
(
ID
));
if
(
GetIsoId
(
IsoPath
,
&
ID
))
{
return
0
;
}
//Bob.Ombs.Modified.Win10PEx64.iso will auto find ISO file in root, so we can skip the mount
if
(
InRoot
&&
strcmp
(
ID
.
VolumeId
,
"Modified-Win10PEx64"
)
==
0
)
{
return
1
;
}
return
0
;
}
static
int
MountIsoFile
(
CONST
CHAR
*
IsoPath
,
DWORD
PhyDrive
)
static
int
MountIsoFile
(
CONST
CHAR
*
IsoPath
,
DWORD
PhyDrive
)
{
{
if
(
CheckSkipMountIso
(
IsoPath
))
{
Log
(
"Skip mount ISO file for <%s>"
,
IsoPath
);
return
0
;
}
if
(
IsWindows8OrGreater
())
if
(
IsWindows8OrGreater
())
{
{
Log
(
"This is Windows 8 or latter..."
);
Log
(
"This is Windows 8 or latter..."
);
...
@@ -1417,36 +1543,6 @@ static int ExpandSingleVar(VarDiskInfo *pDiskInfo, int DiskNum, const char *var,
...
@@ -1417,36 +1543,6 @@ static int ExpandSingleVar(VarDiskInfo *pDiskInfo, int DiskNum, const char *var,
return
0
;
return
0
;
}
}
static
void
TrimString
(
CHAR
*
String
)
{
CHAR
*
Pos1
=
String
;
CHAR
*
Pos2
=
String
;
size_t
Len
=
strlen
(
String
);
while
(
Len
>
0
)
{
if
(
String
[
Len
-
1
]
!=
' '
&&
String
[
Len
-
1
]
!=
'\t'
)
{
break
;
}
String
[
Len
-
1
]
=
0
;
Len
--
;
}
while
(
*
Pos1
==
' '
||
*
Pos1
==
'\t'
)
{
Pos1
++
;
}
while
(
*
Pos1
)
{
*
Pos2
++
=
*
Pos1
++
;
}
*
Pos2
++
=
0
;
return
;
}
static
int
GetRegDwordValue
(
HKEY
Key
,
LPCSTR
SubKey
,
LPCSTR
ValueName
,
DWORD
*
pValue
)
static
int
GetRegDwordValue
(
HKEY
Key
,
LPCSTR
SubKey
,
LPCSTR
ValueName
,
DWORD
*
pValue
)
{
{
HKEY
hKey
;
HKEY
hKey
;
...
@@ -1655,25 +1751,25 @@ static int EnumerateAllDisk(VarDiskInfo **ppDiskInfo, int *pDiskNum)
...
@@ -1655,25 +1751,25 @@ static int EnumerateAllDisk(VarDiskInfo **ppDiskInfo, int *pDiskNum)
if
(
pDevDesc
->
VendorIdOffset
)
if
(
pDevDesc
->
VendorIdOffset
)
{
{
safe_strcpy
(
pDiskInfo
[
i
].
VendorId
,
(
char
*
)
pDevDesc
+
pDevDesc
->
VendorIdOffset
);
safe_strcpy
(
pDiskInfo
[
i
].
VendorId
,
(
char
*
)
pDevDesc
+
pDevDesc
->
VendorIdOffset
);
TrimString
(
pDiskInfo
[
i
].
VendorId
);
TrimString
(
pDiskInfo
[
i
].
VendorId
,
TRUE
);
}
}
if
(
pDevDesc
->
ProductIdOffset
)
if
(
pDevDesc
->
ProductIdOffset
)
{
{
safe_strcpy
(
pDiskInfo
[
i
].
ProductId
,
(
char
*
)
pDevDesc
+
pDevDesc
->
ProductIdOffset
);
safe_strcpy
(
pDiskInfo
[
i
].
ProductId
,
(
char
*
)
pDevDesc
+
pDevDesc
->
ProductIdOffset
);
TrimString
(
pDiskInfo
[
i
].
ProductId
);
TrimString
(
pDiskInfo
[
i
].
ProductId
,
TRUE
);
}
}
if
(
pDevDesc
->
ProductRevisionOffset
)
if
(
pDevDesc
->
ProductRevisionOffset
)
{
{
safe_strcpy
(
pDiskInfo
[
i
].
ProductRev
,
(
char
*
)
pDevDesc
+
pDevDesc
->
ProductRevisionOffset
);
safe_strcpy
(
pDiskInfo
[
i
].
ProductRev
,
(
char
*
)
pDevDesc
+
pDevDesc
->
ProductRevisionOffset
);
TrimString
(
pDiskInfo
[
i
].
ProductRev
);
TrimString
(
pDiskInfo
[
i
].
ProductRev
,
TRUE
);
}
}
if
(
pDevDesc
->
SerialNumberOffset
)
if
(
pDevDesc
->
SerialNumberOffset
)
{
{
safe_strcpy
(
pDiskInfo
[
i
].
SerialNumber
,
(
char
*
)
pDevDesc
+
pDevDesc
->
SerialNumberOffset
);
safe_strcpy
(
pDiskInfo
[
i
].
SerialNumber
,
(
char
*
)
pDevDesc
+
pDevDesc
->
SerialNumberOffset
);
TrimString
(
pDiskInfo
[
i
].
SerialNumber
);
TrimString
(
pDiskInfo
[
i
].
SerialNumber
,
TRUE
);
}
}
free
(
pDevDesc
);
free
(
pDevDesc
);
...
@@ -2258,59 +2354,6 @@ static int ExtractWindowsDataFile(char *databuf)
...
@@ -2258,59 +2354,6 @@ static int ExtractWindowsDataFile(char *databuf)
return
len
;
return
len
;
}
}
int
VentoyJumpWimboot
(
INT
argc
,
CHAR
**
argv
,
CHAR
*
LunchFile
)
{
int
rc
=
1
;
char
*
buf
=
NULL
;
DWORD
size
=
0
;
DWORD
Pos
;
Log
(
"VentoyJumpWimboot %dbit"
,
g_system_bit
);
sprintf_s
(
LunchFile
,
MAX_PATH
,
"X:
\\
setup.exe"
);
ReadWholeFile2Buf
(
"wimboot.data"
,
&
buf
,
&
size
);
Log
(
"wimboot.data size:%d"
,
size
);
memcpy
(
&
g_os_param
,
buf
,
sizeof
(
ventoy_os_param
));
memcpy
(
&
g_windows_data
,
buf
+
sizeof
(
ventoy_os_param
),
sizeof
(
ventoy_windows_data
));
ExtractWindowsDataFile
(
buf
+
sizeof
(
ventoy_os_param
));
memcpy
(
g_os_param_reserved
,
g_os_param
.
vtoy_reserved
,
sizeof
(
g_os_param_reserved
));
if
(
g_os_param_reserved
[
0
]
==
1
)
{
Log
(
"break here for debug ....."
);
goto
End
;
}
// convert / to \\
for
(
Pos
=
0
;
Pos
<
sizeof
(
g_os_param
.
vtoy_img_path
)
&&
g_os_param
.
vtoy_img_path
[
Pos
];
Pos
++
)
{
if
(
g_os_param
.
vtoy_img_path
[
Pos
]
==
'/'
)
{
g_os_param
.
vtoy_img_path
[
Pos
]
=
'\\'
;
}
}
if
(
g_os_param_reserved
[
0
]
==
2
)
{
Log
(
"skip hook for debug ....."
);
rc
=
0
;
goto
End
;
}
rc
=
VentoyHook
(
&
g_os_param
);
End:
if
(
buf
)
{
free
(
buf
);
}
return
rc
;
}
static
int
ventoy_check_create_directory
(
void
)
static
int
ventoy_check_create_directory
(
void
)
{
{
if
(
IsDirExist
(
"ventoy"
))
if
(
IsDirExist
(
"ventoy"
))
...
@@ -2443,7 +2486,6 @@ int real_main(int argc, char **argv)
...
@@ -2443,7 +2486,6 @@ int real_main(int argc, char **argv)
{
{
int
i
=
0
;
int
i
=
0
;
int
rc
=
0
;
int
rc
=
0
;
int
wimboot
=
0
;
CHAR
NewFile
[
MAX_PATH
];
CHAR
NewFile
[
MAX_PATH
];
CHAR
LunchFile
[
MAX_PATH
];
CHAR
LunchFile
[
MAX_PATH
];
CHAR
CallParam
[
1024
]
=
{
0
};
CHAR
CallParam
[
1024
]
=
{
0
};
...
@@ -2453,7 +2495,7 @@ int real_main(int argc, char **argv)
...
@@ -2453,7 +2495,7 @@ int real_main(int argc, char **argv)
Log
(
"#### real_main #### argc = %d"
,
argc
);
Log
(
"#### real_main #### argc = %d"
,
argc
);
Log
(
"program full path: <%s>"
,
g_prog_full_path
);
Log
(
"program full path: <%s>"
,
g_prog_full_path
);
Log
(
"program dir: <%s>"
,
g_prog_dir
);
Log
(
"program dir: <%s>"
,
g_prog_dir
);
Log
(
"program name:
:
<%s>"
,
g_prog_name
);
Log
(
"program name: <%s>"
,
g_prog_name
);
Log
(
"argc = %d"
,
argc
);
Log
(
"argc = %d"
,
argc
);
for
(
i
=
0
;
i
<
argc
;
i
++
)
for
(
i
=
0
;
i
<
argc
;
i
++
)
...
@@ -2469,17 +2511,7 @@ int real_main(int argc, char **argv)
...
@@ -2469,17 +2511,7 @@ int real_main(int argc, char **argv)
GetStartupInfoA
(
&
Si
);
GetStartupInfoA
(
&
Si
);
memset
(
LunchFile
,
0
,
sizeof
(
LunchFile
));
memset
(
LunchFile
,
0
,
sizeof
(
LunchFile
));
if
(
strstr
(
argv
[
0
],
"vtoyjump.exe"
))
{
wimboot
=
1
;
DeleteFileA
(
WINPESHL_INI
);
IsFileExist
(
WINPESHL_INI
);
rc
=
VentoyJumpWimboot
(
argc
,
argv
,
LunchFile
);
}
else
{
rc
=
VentoyJump
(
argc
,
argv
,
LunchFile
);
rc
=
VentoyJump
(
argc
,
argv
,
LunchFile
);
}
Log
(
"LunchFile=<%s> CallParam=<%s>"
,
LunchFile
,
CallParam
);
Log
(
"LunchFile=<%s> CallParam=<%s>"
,
LunchFile
,
CallParam
);
...
@@ -2496,11 +2528,6 @@ int real_main(int argc, char **argv)
...
@@ -2496,11 +2528,6 @@ int real_main(int argc, char **argv)
sprintf_s
(
LunchFile
,
sizeof
(
LunchFile
),
"%s"
,
g_prog_full_path
);
sprintf_s
(
LunchFile
,
sizeof
(
LunchFile
),
"%s"
,
g_prog_full_path
);
Log
(
"Final lunchFile is <%s>"
,
LunchFile
);
Log
(
"Final lunchFile is <%s>"
,
LunchFile
);
}
}
else
if
(
wimboot
&&
IsFileExist
(
WINPESHL_INI
))
{
sprintf_s
(
LunchFile
,
MAX_PATH
,
"X:
\\
Windows
\\
system32
\\
winpeshl.exe"
);
Log
(
"winpeshl.ini updated, now recall winpeshl.exe"
);
}
else
else
{
{
Log
(
"We don't need to recover original <%s>"
,
g_prog_name
);
Log
(
"We don't need to recover original <%s>"
,
g_prog_name
);
...
@@ -2563,6 +2590,31 @@ static void VentoyToUpper(CHAR *str)
...
@@ -2563,6 +2590,31 @@ static void VentoyToUpper(CHAR *str)
}
}
}
}
static
int
vtoy_remove_duplicate_file
(
char
*
File
)
{
CHAR
szCmd
[
MAX_PATH
];
CHAR
NewFile
[
MAX_PATH
];
STARTUPINFOA
Si
;
PROCESS_INFORMATION
Pi
;
Log
(
"<1> Copy New file"
,
File
);
sprintf_s
(
NewFile
,
sizeof
(
NewFile
),
"%s_NEW"
,
File
);
CopyFileA
(
File
,
NewFile
,
FALSE
);
Log
(
"<2> Remove file <%s>"
,
File
);
GetStartupInfoA
(
&
Si
);
Si
.
dwFlags
|=
STARTF_USESHOWWINDOW
;
Si
.
wShowWindow
=
SW_HIDE
;
sprintf_s
(
szCmd
,
sizeof
(
szCmd
),
"cmd.exe /c del /F /Q %s"
,
File
);
CreateProcessA
(
NULL
,
szCmd
,
NULL
,
NULL
,
FALSE
,
0
,
NULL
,
NULL
,
&
Si
,
&
Pi
);
WaitForSingleObject
(
Pi
.
hProcess
,
INFINITE
);
Log
(
"<3> Copy back file <%s>"
,
File
);
MoveFileA
(
NewFile
,
File
);
return
0
;
}
int
main
(
int
argc
,
char
**
argv
)
int
main
(
int
argc
,
char
**
argv
)
{
{
int
i
;
int
i
;
...
@@ -2585,6 +2637,22 @@ int main(int argc, char **argv)
...
@@ -2585,6 +2637,22 @@ int main(int argc, char **argv)
Log
(
"EXE path: <%s> dir:<%s> name:<%s>"
,
g_prog_full_path
,
g_prog_dir
,
g_prog_name
);
Log
(
"EXE path: <%s> dir:<%s> name:<%s>"
,
g_prog_full_path
,
g_prog_dir
,
g_prog_name
);
if
(
IsFileExist
(
WIMBOOT_FILE
))
{
Log
(
"This is wimboot mode ..."
);
g_wimboot_mode
=
TRUE
;
if
(
!
IsFileExist
(
WIMBOOT_DONE
))
{
vtoy_remove_duplicate_file
(
g_prog_full_path
);
SaveBuffer2File
(
WIMBOOT_DONE
,
g_prog_full_path
,
1
);
}
}
else
{
Log
(
"This is normal mode ..."
);
}
if
(
_stricmp
(
g_prog_name
,
"WinLogon.exe"
)
==
0
)
if
(
_stricmp
(
g_prog_name
,
"WinLogon.exe"
)
==
0
)
{
{
Log
(
"This time is rejump back ..."
);
Log
(
"This time is rejump back ..."
);
...
@@ -2641,4 +2709,3 @@ int main(int argc, char **argv)
...
@@ -2641,4 +2709,3 @@ int main(int argc, char **argv)
}
}
}
}
vtoyjump/vtoyjump/vtoyjump.h
View file @
e79dc57e
...
@@ -164,6 +164,13 @@ typedef struct VarDiskInfo
...
@@ -164,6 +164,13 @@ typedef struct VarDiskInfo
CHAR
SerialNumber
[
128
];
CHAR
SerialNumber
[
128
];
}
VarDiskInfo
;
}
VarDiskInfo
;
typedef
struct
IsoId
{
CHAR
SystemId
[
64
];
CHAR
VolumeId
[
64
];
CHAR
PulisherId
[
256
];
CHAR
PreparerId
[
256
];
}
IsoId
;
#define SAFE_CLOSE_HANDLE(handle) \
#define SAFE_CLOSE_HANDLE(handle) \
{
\
{
\
...
...
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