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
e2656c28
Commit
e2656c28
authored
Aug 02, 2021
by
longpanda
Browse files
Compatibility improvement for some WinPE
parent
d8433985
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
103 additions
and
175 deletions
+103
-175
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
+3
-0
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c
+57
-21
INSTALL/VentoyWeb.sh
INSTALL/VentoyWeb.sh
+1
-0
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
+42
-154
No files found.
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h
View file @
e2656c28
...
...
@@ -69,6 +69,9 @@
#define VTOY_ARCH_CPIO "ventoy_x86.cpio"
#endif
#define ventoy_varg_4(arg) arg[0], arg[1], arg[2], arg[3]
#define ventoy_varg_8(arg) arg[0], arg[1], arg[2], arg[3], arg[4], arg[5], arg[6], arg[7]
#define VTOY_PWD_CORRUPTED(err) \
{\
grub_printf("\n\n Password corrupted, will reboot after 5 seconds.\n\n"); \
...
...
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c
View file @
e2656c28
...
...
@@ -660,30 +660,22 @@ static wim_directory_entry * search_full_wim_dirent
static
wim_directory_entry
*
search_replace_wim_dirent
(
void
*
meta_data
,
wim_directory_entry
*
dir
)
{
wim_directory_entry
*
wim_dirent1
=
NULL
;
wim_directory_entry
*
wim_dirent2
=
NULL
;
wim_directory_entry
*
wim_dirent
=
NULL
;
const
char
*
pecmd_path
[]
=
{
"Windows"
,
"System32"
,
"pecmd.exe"
,
NULL
};
const
char
*
wpeinit_path
[]
=
{
"Windows"
,
"System32"
,
"wpeinit.exe"
,
NULL
};
const
char
*
winpeshl_path
[]
=
{
"Windows"
,
"System32"
,
"winpeshl.exe"
,
NULL
};
wim_dirent
1
=
search_full_wim_dirent
(
meta_data
,
dir
,
pecmd_path
);
debug
(
"search pecmd.exe %p
\n
"
,
wim_dirent
1
);
if
(
wim_dirent
1
)
wim_dirent
=
search_full_wim_dirent
(
meta_data
,
dir
,
pecmd_path
);
debug
(
"search pecmd.exe %p
\n
"
,
wim_dirent
);
if
(
wim_dirent
)
{
wim_dirent2
=
search_full_wim_dirent
(
meta_data
,
dir
,
wpeinit_path
);
debug
(
"search wpeinit.exe %p
\n
"
,
wim_dirent1
);
if
(
wim_dirent2
)
{
return
wim_dirent2
;
}
return
wim_dirent1
;
return
wim_dirent
;
}
wim_dirent
1
=
search_full_wim_dirent
(
meta_data
,
dir
,
winpeshl_path
);
debug
(
"search winpeshl.exe %p
\n
"
,
wim_dirent
1
);
if
(
wim_dirent
1
)
wim_dirent
=
search_full_wim_dirent
(
meta_data
,
dir
,
winpeshl_path
);
debug
(
"search winpeshl.exe %p
\n
"
,
wim_dirent
);
if
(
wim_dirent
)
{
return
wim_dirent
1
;
return
wim_dirent
;
}
return
NULL
;
...
...
@@ -745,6 +737,27 @@ static grub_uint64_t ventoy_get_stream_len(wim_directory_entry *dir)
return
offset
;
}
static
int
ventoy_update_stream_hash
(
wim_patch
*
patch
,
wim_directory_entry
*
dir
)
{
grub_uint16_t
i
;
grub_uint64_t
offset
=
0
;
wim_stream_entry
*
stream
=
(
wim_stream_entry
*
)((
char
*
)
dir
+
dir
->
len
);
for
(
i
=
0
;
i
<
dir
->
streams
;
i
++
)
{
if
(
grub_memcmp
(
stream
->
hash
.
sha1
,
patch
->
old_hash
.
sha1
,
sizeof
(
wim_hash
))
==
0
)
{
debug
(
"find target stream %u, name_len:%u upadte hash
\n
"
,
i
,
stream
->
name_len
);
grub_memcpy
(
stream
->
hash
.
sha1
,
&
(
patch
->
wim_data
.
bin_hash
),
sizeof
(
wim_hash
));
}
offset
+=
stream
->
len
;
stream
=
(
wim_stream_entry
*
)((
char
*
)
stream
+
stream
->
len
);
}
return
offset
;
}
static
int
ventoy_update_all_hash
(
wim_patch
*
patch
,
void
*
meta_data
,
wim_directory_entry
*
dir
)
{
if
((
meta_data
==
NULL
)
||
(
dir
==
NULL
))
...
...
@@ -772,6 +785,7 @@ static int ventoy_update_all_hash(wim_patch *patch, void *meta_data, wim_directo
if
(
dir
->
streams
)
{
ventoy_update_stream_hash
(
patch
,
dir
);
dir
=
(
wim_directory_entry
*
)((
char
*
)
dir
+
dir
->
len
+
ventoy_get_stream_len
(
dir
));
}
else
...
...
@@ -932,6 +946,7 @@ static int ventoy_update_before_chain(ventoy_os_param *param, char *isopath)
static
int
ventoy_wimdows_locate_wim
(
const
char
*
disk
,
wim_patch
*
patch
)
{
int
rc
;
grub_uint16_t
i
;
grub_file_t
file
;
grub_uint32_t
exe_len
;
grub_uint8_t
*
exe_data
=
NULL
;
...
...
@@ -940,6 +955,7 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
wim_security_header
*
security
=
NULL
;
wim_directory_entry
*
rootdir
=
NULL
;
wim_directory_entry
*
search
=
NULL
;
wim_stream_entry
*
stream
=
NULL
;
wim_header
*
head
=
&
(
patch
->
wim_data
.
wim_header
);
wim_tail
*
wim_data
=
&
patch
->
wim_data
;
...
...
@@ -1002,8 +1018,28 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
}
debug
(
"find replace file at %p
\n
"
,
search
);
grub_memcpy
(
&
patch
->
old_hash
,
search
->
hash
.
sha1
,
sizeof
(
wim_hash
));
grub_memset
(
&
patch
->
old_hash
,
0
,
sizeof
(
wim_hash
));
if
(
grub_memcmp
(
&
patch
->
old_hash
,
search
->
hash
.
sha1
,
sizeof
(
wim_hash
))
==
0
)
{
debug
(
"search hash all 0, now do deep search
\n
"
);
stream
=
(
wim_stream_entry
*
)((
char
*
)
search
+
search
->
len
);
for
(
i
=
0
;
i
<
search
->
streams
;
i
++
)
{
if
(
stream
->
name_len
==
0
)
{
grub_memcpy
(
&
patch
->
old_hash
,
stream
->
hash
.
sha1
,
sizeof
(
wim_hash
));
debug
(
"new search hash: %02x %02x %02x %02x %02x %02x %02x %02x
\n
"
,
ventoy_varg_8
(
patch
->
old_hash
.
sha1
));
break
;
}
stream
=
(
wim_stream_entry
*
)((
char
*
)
stream
+
stream
->
len
);
}
}
else
{
grub_memcpy
(
&
patch
->
old_hash
,
search
->
hash
.
sha1
,
sizeof
(
wim_hash
));
}
debug
(
"read lookup offset:%llu size:%llu
\n
"
,
(
ulonglong
)
head
->
lookup
.
offset
,
(
ulonglong
)
head
->
lookup
.
raw_size
);
lookup
=
grub_malloc
(
head
->
lookup
.
raw_size
);
...
...
@@ -1030,8 +1066,8 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
}
else
{
debug
(
"failed to find lookup entry for replace file
0x%02x 0x
%02x
\n
"
,
patch
->
old_hash
.
sha1
[
0
],
patch
->
old_hash
.
sha1
[
1
]
);
debug
(
"failed to find lookup entry for replace file
%02x %02x %02x
%02x
\n
"
,
ventoy_varg_4
(
patch
->
old_hash
.
sha1
)
);
}
wim_data
->
wim_raw_size
=
(
grub_uint32_t
)
file
->
size
;
...
...
INSTALL/VentoyWeb.sh
View file @
e2656c28
...
...
@@ -45,6 +45,7 @@ if [ ! -f ./boot/boot.img ]; then
if
[
-d
./grub
]
;
then
echo
"Don't run VentoyWeb.sh here, please download the released install package, and run the script in it."
else
echo
"Current directory is
$PWD
"
echo
"Please run under the correct directory!"
fi
exit
1
...
...
INSTALL/ventoy/vtoyjump32.exe
View file @
e2656c28
No preview for this file type
INSTALL/ventoy/vtoyjump64.exe
View file @
e2656c28
No preview for this file type
vtoyjump/vtoyjump/vtoyjump.c
View file @
e2656c28
...
...
@@ -41,25 +41,26 @@ void Log(const char *Fmt, ...)
FILE
*
File
=
NULL
;
SYSTEMTIME
Sys
;
char
szBuf
[
1024
];
DWORD
PID
=
GetCurrentProcessId
();
GetLocalTime
(
&
Sys
);
Len
+=
sprintf_s
(
szBuf
,
sizeof
(
szBuf
),
"[%4d/%02d/%02d %02d:%02d:%02d.%03d] "
,
"[%4d/%02d/%02d %02d:%02d:%02d.%03d]
[%u]
"
,
Sys
.
wYear
,
Sys
.
wMonth
,
Sys
.
wDay
,
Sys
.
wHour
,
Sys
.
wMinute
,
Sys
.
wSecond
,
Sys
.
wMilliseconds
);
Sys
.
wMilliseconds
,
PID
);
va_start
(
Arg
,
Fmt
);
Len
+=
vsnprintf_s
(
szBuf
+
Len
,
sizeof
(
szBuf
)
-
Len
,
sizeof
(
szBuf
)
-
Len
,
Fmt
,
Arg
);
va_end
(
Arg
);
fopen_s
(
&
File
,
"ventoy.log"
,
"a+"
);
if
(
File
)
{
fwrite
(
szBuf
,
1
,
Len
,
File
);
fwrite
(
"
\n
"
,
1
,
1
,
File
);
fclose
(
File
);
}
fopen_s
(
&
File
,
"ventoy.log"
,
"a+"
);
if
(
File
)
{
fwrite
(
szBuf
,
1
,
Len
,
File
);
fwrite
(
"
\n
"
,
1
,
1
,
File
);
fclose
(
File
);
}
}
...
...
@@ -1410,159 +1411,43 @@ End:
return
rc
;
}
static
int
GetPecmdParam
(
const
char
*
arg
v
,
char
*
CallParamBuf
,
DWORD
BufLen
)
int
main
(
int
arg
c
,
char
*
*
argv
)
{
HKEY
hKey
;
LSTATUS
Ret
;
DWORD
dw
;
DWORD
Type
;
int
i
=
0
;
int
rc
=
0
;
CHAR
*
Pos
=
NULL
;
CHAR
CallParam
[
256
]
=
{
0
};
CHAR
FileName
[
MAX_PATH
];
Log
(
"GetPecmdParam <%s>"
,
argv
);
*
CallParamBuf
=
0
;
strcpy_s
(
FileName
,
sizeof
(
FileName
),
argv
);
for
(
dw
=
0
,
Pos
=
FileName
;
*
Pos
;
Pos
++
)
{
dw
++
;
*
Pos
=
toupper
(
*
Pos
);
}
Log
(
"dw=%lu argv=<%s>"
,
dw
,
FileName
);
if
(
dw
>=
9
&&
strcmp
(
FileName
+
dw
-
9
,
"PECMD.EXE"
)
==
0
)
{
Log
(
"Get parameters for pecmd.exe"
);
Ret
=
RegCreateKeyEx
(
HKEY_LOCAL_MACHINE
,
"System
\\
Setup"
,
0
,
NULL
,
REG_OPTION_NON_VOLATILE
,
KEY_ALL_ACCESS
,
NULL
,
&
hKey
,
&
dw
);
if
(
ERROR_SUCCESS
==
Ret
)
{
memset
(
FileName
,
0
,
sizeof
(
FileName
));
dw
=
sizeof
(
FileName
);
Ret
=
RegQueryValueEx
(
hKey
,
"CmdLine"
,
NULL
,
&
Type
,
FileName
,
&
dw
);
if
(
ERROR_SUCCESS
==
Ret
&&
Type
==
REG_SZ
)
{
strcpy_s
(
CallParam
,
sizeof
(
CallParam
),
FileName
);
Log
(
"CmdLine:<%s>"
,
CallParam
);
if
(
_strnicmp
(
CallParam
,
"PECMD.EXE"
,
9
)
==
0
)
{
Pos
=
CallParam
+
9
;
if
(
*
Pos
==
' '
||
*
Pos
==
'\t'
)
{
Pos
++
;
}
}
else
{
Pos
=
CallParam
;
}
Log
(
"CmdLine2:<%s>"
,
Pos
);
sprintf_s
(
CallParamBuf
,
BufLen
,
" %s"
,
Pos
);
}
else
{
Log
(
"Failed to RegQueryValueEx %lu %lu"
,
Ret
,
Type
);
}
CHAR
CurDir
[
MAX_PATH
];
CHAR
LunchFile
[
MAX_PATH
];
CHAR
CallParam
[
1024
]
=
{
0
};
STARTUPINFOA
Si
;
PROCESS_INFORMATION
Pi
;
RegCloseKey
(
hKey
);
return
1
;
}
else
{
Log
(
"Failed to create reg key %lu"
,
Ret
);
}
}
else
if
(
argv
[
0
]
&&
argv
[
0
][
0
]
&&
argv
[
0
][
1
]
==
':'
)
{
Log
(
"This is NOT pecmd.exe"
);
}
return
0
;
}
static
int
GetWpeInitParam
(
char
**
argv
,
int
argc
,
char
*
CallParamBuf
,
DWORD
BufLen
)
{
int
i
;
DWORD
dw
;
CHAR
*
Pos
=
NULL
;
CHAR
FileName
[
MAX_PATH
];
Log
(
"GetWpeInitParam argc=%d"
,
argc
);
*
CallParamBuf
=
0
;
GetCurrentDirectoryA
(
sizeof
(
CurDir
),
CurDir
);
strcpy_s
(
FileName
,
sizeof
(
FileName
),
argv
[
0
]);
for
(
dw
=
0
,
Pos
=
FileName
;
*
Pos
;
Pos
++
)
{
dw
++
;
*
Pos
=
toupper
(
*
Pos
);
}
strcpy_s
(
LunchFile
,
sizeof
(
LunchFile
),
argv
[
0
]);
Pos
=
(
char
*
)
GetFileNameInPath
(
LunchFile
);
Log
(
"dw=%lu argv=<%s>"
,
dw
,
FileName
);
strcat_s
(
CurDir
,
sizeof
(
CurDir
),
"
\\
"
);
strcat_s
(
CurDir
,
sizeof
(
CurDir
),
Pos
);
if
(
dw
>=
11
&&
strcmp
(
FileName
+
dw
-
11
,
"WPEINIT.EXE"
)
==
0
)
{
Log
(
"Get parameters for WPEINIT.EXE"
);
for
(
i
=
1
;
i
<
argc
;
i
++
)
if
(
_stricmp
(
argv
[
0
],
CurDir
)
!=
0
)
{
strcat_s
(
CallParamBuf
,
BufLen
,
" "
)
;
strcat_s
(
CallParamBuf
,
BufLen
,
argv
[
i
]
);
*
Pos
=
0
;
SetCurrentDirectoryA
(
LunchFile
);
}
return
1
;
}
else
{
Log
(
"This is NOT wpeinit.exe"
);
}
return
0
;
}
int
main
(
int
argc
,
char
**
argv
)
{
int
i
=
0
;
int
rc
=
0
;
CHAR
*
Pos
=
NULL
;
CHAR
CurDir
[
MAX_PATH
];
CHAR
LunchFile
[
MAX_PATH
];
CHAR
CallParam
[
1024
]
=
{
0
};
STARTUPINFOA
Si
;
PROCESS_INFORMATION
Pi
;
if
(
argv
[
0
]
&&
argv
[
0
][
0
]
&&
argv
[
0
][
1
]
==
':'
)
{
GetCurrentDirectoryA
(
sizeof
(
CurDir
),
CurDir
);
strcpy_s
(
LunchFile
,
sizeof
(
LunchFile
),
argv
[
0
]);
Pos
=
(
char
*
)
GetFileNameInPath
(
LunchFile
);
strcat_s
(
CurDir
,
sizeof
(
CurDir
),
"
\\
"
);
strcat_s
(
CurDir
,
sizeof
(
CurDir
),
Pos
);
if
(
_stricmp
(
argv
[
0
],
CurDir
)
!=
0
)
{
*
Pos
=
0
;
SetCurrentDirectoryA
(
LunchFile
);
}
}
Log
(
"######## VentoyJump ##########"
);
Log
(
"argc = %d argv[0] = <%s>"
,
argc
,
argv
[
0
]);
//special process for some WinPE
if
(
_stricmp
(
argv
[
0
],
"WPEINIT.EXE"
)
==
0
)
Log
(
"######## VentoyJump ##########"
);
Log
(
"argc = %d"
,
argc
);
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
GetCurrentDirectoryA
(
sizeof
(
CurDir
),
CurDir
);
if
(
_stricmp
(
CurDir
,
"X:
\\
"
)
==
0
)
Log
(
"argv[%d]=<%s>"
,
i
,
argv
[
i
]
);
if
(
i
>
0
)
{
Log
(
"Set current directory to system32
"
);
SetCurrentDirectoryA
(
"X:
\\
Windows
\\
System32"
);
strcat_s
(
CallParam
,
sizeof
(
CallParam
),
"
"
);
strcat_s
(
CallParam
,
sizeof
(
CallParam
),
argv
[
i
]
);
}
}
...
...
@@ -1577,11 +1462,6 @@ int main(int argc, char **argv)
Log
(
"Current directory = <%s>"
,
CurDir
);
}
if
(
0
==
GetWpeInitParam
(
argv
,
argc
,
CallParam
,
sizeof
(
CallParam
)))
{
GetPecmdParam
(
argv
[
0
],
CallParam
,
sizeof
(
CallParam
));
}
GetStartupInfoA
(
&
Si
);
memset
(
LunchFile
,
0
,
sizeof
(
LunchFile
));
...
...
@@ -1597,6 +1477,14 @@ int main(int argc, char **argv)
Log
(
"LunchFile=<%s> CallParam=<%s>"
,
LunchFile
,
CallParam
);
if
(
_stricmp
(
argv
[
0
],
"PECMD.EXE"
)
==
0
&&
_stricmp
(
LunchFile
,
"ventoy
\\
PECMD.EXE"
)
==
0
)
{
MoveFileA
(
"PECMD.EXE"
,
"PECMD_BACK.EXE"
);
MoveFileA
(
"ventoy
\\
PECMD.EXE"
,
"PECMD.EXE"
);
sprintf_s
(
LunchFile
,
sizeof
(
LunchFile
),
"%s"
,
"PECMD.EXE"
);
Log
(
"Move original PECMD.EXE <%s>"
,
LunchFile
);
}
if
(
g_os_param_reserved
[
0
]
==
3
)
{
Log
(
"Open log for debug ..."
);
...
...
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