mirror of https://github.com/ventoy/Ventoy.git
Compatibility improvement for some WinPE
This commit is contained in:
parent
d8433985e7
commit
e2656c287b
|
@ -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"); \
|
||||
|
|
|
@ -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_dirent1 = search_full_wim_dirent(meta_data, dir, pecmd_path);
|
||||
debug("search pecmd.exe %p\n", wim_dirent1);
|
||||
if (wim_dirent1)
|
||||
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_dirent1 = search_full_wim_dirent(meta_data, dir, winpeshl_path);
|
||||
debug("search winpeshl.exe %p\n", wim_dirent1);
|
||||
if (wim_dirent1)
|
||||
wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path);
|
||||
debug("search winpeshl.exe %p\n", wim_dirent);
|
||||
if (wim_dirent)
|
||||
{
|
||||
return wim_dirent1;
|
||||
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;
|
||||
|
||||
|
@ -1003,7 +1019,27 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
|
|||
|
||||
debug("find replace file at %p\n", search);
|
||||
|
||||
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;
|
||||
|
|
|
@ -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
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -41,13 +41,14 @@ 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);
|
||||
|
@ -1410,120 +1411,6 @@ End:
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int GetPecmdParam(const char *argv, char *CallParamBuf, DWORD BufLen)
|
||||
{
|
||||
HKEY hKey;
|
||||
LSTATUS Ret;
|
||||
DWORD dw;
|
||||
DWORD Type;
|
||||
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);
|
||||
}
|
||||
|
||||
RegCloseKey(hKey);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log("Failed to create reg key %lu", Ret);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
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;
|
||||
|
||||
strcpy_s(FileName, sizeof(FileName), argv[0]);
|
||||
for (dw = 0, Pos = FileName; *Pos; Pos++)
|
||||
{
|
||||
dw++;
|
||||
*Pos = toupper(*Pos);
|
||||
}
|
||||
|
||||
Log("dw=%lu argv=<%s>", dw, FileName);
|
||||
|
||||
if (dw >= 11 && strcmp(FileName + dw - 11, "WPEINIT.EXE") == 0)
|
||||
{
|
||||
Log("Get parameters for WPEINIT.EXE");
|
||||
for (i = 1; i < argc; i++)
|
||||
{
|
||||
strcat_s(CallParamBuf, BufLen, " ");
|
||||
strcat_s(CallParamBuf, BufLen, argv[i]);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log("This is NOT wpeinit.exe");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int i = 0;
|
||||
|
@ -1553,16 +1440,14 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
Log("######## VentoyJump ##########");
|
||||
Log("argc = %d argv[0] = <%s>", argc, argv[0]);
|
||||
|
||||
//special process for some WinPE
|
||||
if (_stricmp(argv[0], "WPEINIT.EXE") == 0)
|
||||
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 ...");
|
||||
|
|
Loading…
Reference in New Issue