From a9be2fd4d98aa206813dbc89428f736f595a65c2 Mon Sep 17 00:00:00 2001 From: longpanda Date: Thu, 14 Oct 2021 11:27:22 +0800 Subject: [PATCH] Improvement for some special WinPE --- .../grub-2.04/grub-core/ventoy/ventoy_def.h | 2 + .../grub-core/ventoy/ventoy_windows.c | 77 ++- INSTALL/ventoy/vtoyjump32.exe | Bin 114688 -> 114176 bytes INSTALL/ventoy/vtoyjump64.exe | Bin 135680 -> 135168 bytes vtoyjump/vtoyjump/vtoyjump.c | 503 +++++++----------- vtoyjump/vtoyjump/vtoyjump.vcxproj | 4 +- 6 files changed, 277 insertions(+), 309 deletions(-) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h index d7171bc0..1099cefb 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h @@ -21,6 +21,8 @@ #ifndef __VENTOY_DEF_H__ #define __VENTOY_DEF_H__ +#define VTOY_MAX_DIR_DEPTH 32 + #define VTOY_MAX_SCRIPT_BUF (4 * 1024 * 1024) #define VTOY_PART_BUF_LEN (128 * 1024) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c index a35680aa..e4c9aa6a 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_windows.c @@ -776,6 +776,67 @@ end: return ret; } +static int parse_custom_setup_path(char *cmdline, const char **path, char *exefile) +{ + int i = 0; + int len = 0; + char *pos1 = NULL; + char *pos2 = NULL; + + if ((cmdline[0] == 'x' || cmdline[0] == 'X') && cmdline[1] == ':') + { + pos1 = pos2 = cmdline + 3; + + while (i < VTOY_MAX_DIR_DEPTH && *pos2) + { + while (*pos2 && *pos2 != '\\' && *pos2 != '/') + { + pos2++; + } + + path[i++] = pos1; + + if (*pos2 == 0) + { + break; + } + + *pos2 = 0; + pos1 = pos2 + 1; + pos2 = pos1; + } + + if (i == 0 || i >= VTOY_MAX_DIR_DEPTH) + { + return 1; + } + } + else + { + path[i++] = "Windows"; + path[i++] = "System32"; + path[i++] = cmdline; + } + + pos1 = (char *)path[i - 1]; + while (*pos1 != ' ' && *pos1 != '\t' && *pos1) + { + pos1++; + } + *pos1 = 0; + + len = (int)grub_strlen(path[i - 1]); + if (len < 4 || grub_strcasecmp(path[i - 1] + len - 4, ".exe") != 0) + { + grub_snprintf(exefile, 256, "%s.exe", path[i - 1]); + path[i - 1] = exefile; + } + + + debug("custom setup: %d <%s>\n", i, path[i - 1]); + return 0; +} + static wim_directory_entry * search_replace_wim_dirent ( grub_file_t file, @@ -786,38 +847,44 @@ static wim_directory_entry * search_replace_wim_dirent ) { int ret; + char exefile[256] = {0}; char cmdline[256] = {0}; wim_directory_entry *wim_dirent = NULL; wim_directory_entry *pecmd_dirent = NULL; const char *peset_path[] = { "Windows", "System32", "peset.exe", NULL }; const char *pecmd_path[] = { "Windows", "System32", "pecmd.exe", NULL }; const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL }; + const char *custom_path[VTOY_MAX_DIR_DEPTH + 1] = { NULL }; pecmd_dirent = search_full_wim_dirent(meta_data, dir, pecmd_path); debug("search pecmd.exe %p\n", pecmd_dirent); if (pecmd_dirent) { - ret = parse_registry_setup_cmdline(file, head, lookup, meta_data, dir, cmdline, sizeof(cmdline)); + ret = parse_registry_setup_cmdline(file, head, lookup, meta_data, dir, cmdline, sizeof(cmdline) - 1); if (0 == ret) { debug("registry setup cmdline:<%s>\n", cmdline); - ventoy_str_toupper(cmdline); - if (grub_strncmp(cmdline, "PECMD", 5) == 0) + if (grub_strncasecmp(cmdline, "PECMD", 5) == 0) { wim_dirent = pecmd_dirent; } - else if (grub_strncmp(cmdline, "PESET", 5) == 0) + else if (grub_strncasecmp(cmdline, "PESET", 5) == 0) { wim_dirent = search_full_wim_dirent(meta_data, dir, peset_path); debug("search peset.exe %p\n", wim_dirent); } - else if (grub_strncmp(cmdline, "WINPESHL", 8) == 0) + else if (grub_strncasecmp(cmdline, "WINPESHL", 8) == 0) { wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path); debug("search winpeshl.exe %p\n", wim_dirent); } + else if (0 == parse_custom_setup_path(cmdline, custom_path, exefile)) + { + wim_dirent = search_full_wim_dirent(meta_data, dir, custom_path); + debug("search custom path %p\n", wim_dirent); + } if (wim_dirent) { diff --git a/INSTALL/ventoy/vtoyjump32.exe b/INSTALL/ventoy/vtoyjump32.exe index 9541db5bd96c29f75e03ce1a68c3264eb055b9f1..7259ef24b347b74b6fbd94541efa6e5c35cc3452 100644 GIT binary patch delta 24716 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 ZrC6yatF5pZ_7{gGI}h>01Z=s&{udI`^veJM diff --git a/INSTALL/ventoy/vtoyjump64.exe b/INSTALL/ventoy/vtoyjump64.exe index 7e28387d9855be1afd9cb3956c381dd5910f81a0..4693f2e63091a4299c5d6f4e16320b498a2d546b 100644 GIT binary patch delta 46920 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 +* Copyright (c) 2021, longpanda * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -31,22 +31,55 @@ static ventoy_os_param g_os_param; static ventoy_windows_data g_windows_data; static UINT8 g_os_param_reserved[32]; -static BOOL g_64bit_system = FALSE; +static INT g_system_bit = VTOY_BIT; static ventoy_guid g_ventoy_guid = VENTOY_GUID; static HANDLE g_vtoylog_mutex = NULL; static HANDLE g_vtoyins_mutex = NULL; -//Unicode "CmdLine" -static BOOL g_PecmdHasCmdLine = FALSE; -static UCHAR g_aucCmdLineHex[] = -{ - 0x43, 0x00, 0x6D, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00 -}; +static CHAR g_prog_full_path[MAX_PATH]; +static CHAR g_prog_dir[MAX_PATH]; +static CHAR g_prog_name[MAX_PATH]; -#define VTOY_PID_FILE "X:\\Windows\\System32\\pidventoy" +#define LOG_FILE "X:\\Windows\\system32\\ventoy.log" #define MUTEX_LOCK(hmutex) if (hmutex != NULL) LockStatus = WaitForSingleObject(hmutex, INFINITE) #define MUTEX_UNLOCK(hmutex) if (hmutex != NULL && WAIT_OBJECT_0 == LockStatus) ReleaseMutex(hmutex) +static const char * GetFileNameInPath(const char *fullpath) +{ + int i; + + if (strstr(fullpath, ":")) + { + for (i = (int)strlen(fullpath); i > 0; i--) + { + if (fullpath[i - 1] == '/' || fullpath[i - 1] == '\\') + { + return fullpath + i; + } + } + } + + return fullpath; +} + +static int split_path_name(char *fullpath, char *dir, char *name) +{ + CHAR ch; + CHAR *Pos = NULL; + + Pos = (CHAR *)GetFileNameInPath(fullpath); + + strcpy_s(name, MAX_PATH, Pos); + + ch = *(Pos - 1); + *(Pos - 1) = 0; + strcpy_s(dir, MAX_PATH, fullpath); + *(Pos - 1) = ch; + + return 0; +} + + void Log(const char *Fmt, ...) { va_list Arg; @@ -70,7 +103,7 @@ void Log(const char *Fmt, ...) MUTEX_LOCK(g_vtoylog_mutex); - fopen_s(&File, "ventoy.log", "a+"); + fopen_s(&File, LOG_FILE, "a+"); if (File) { fwrite(szBuf, 1, Len, File); @@ -233,24 +266,6 @@ static BOOL CheckPeHead(BYTE *Head) return TRUE; } -static BOOL IsPe64(BYTE *buffer) -{ - DWORD pe_off; - - if (!CheckPeHead(buffer)) - { - return FALSE; - } - - pe_off = *(UINT32 *)(buffer + 60); - if (*(UINT16 *)(buffer + pe_off + 24) == 0x020b) - { - return TRUE; - } - - return FALSE; -} - static BOOL CheckOsParam(ventoy_os_param *param) { @@ -528,7 +543,7 @@ int VentoyMountY(HANDLE Handle) for (i = 0; physicalDriveName[i]; i++) { - physicalDriveNameA[i] = toupper((CHAR)(physicalDriveName[i])); + physicalDriveNameA[i] = (CHAR)toupper((CHAR)(physicalDriveName[i])); } Log("physicalDriveNameA=<%s>", physicalDriveNameA); @@ -553,8 +568,10 @@ int VentoyMountY(HANDLE Handle) return bRet ? 0 : 1; } -static BOOL VentoyNeedMountY(const char *IsoPath) +static BOOL VentoyAPINeedMountY(const char *IsoPath) { + (void)IsoPath; + /* TBD */ return FALSE; } @@ -576,7 +593,7 @@ static int VentoyAttachVirtualDisk(HANDLE Handle, const char *IsoPath) DriveYFree = 1; } - if (DriveYFree && VentoyNeedMountY(IsoPath)) + if (DriveYFree && VentoyAPINeedMountY(IsoPath)) { return VentoyMountY(Handle); } @@ -744,7 +761,7 @@ static BOOL Is2K10PE(void) return bRet; } -static CHAR GetMountLogicalDrive(void) +static CHAR GetIMDiskMountLogicalDrive(void) { CHAR Letter = 'Y'; DWORD Drives; @@ -832,7 +849,7 @@ static int VentoyRunImdisk(const char *IsoPath, const char *imdiskexe) Log("VentoyRunImdisk <%s> <%s>", IsoPath, imdiskexe); - Letter = GetMountLogicalDrive(); + Letter = GetIMDiskMountLogicalDrive(); sprintf_s(Cmdline, sizeof(Cmdline), "%s -a -o ro -f \"%s\" -m %C:", imdiskexe, IsoPath, Letter); Log("mount iso to %C: use imdisk cmd <%s>", Letter, Cmdline); @@ -909,7 +926,7 @@ int VentoyMountISOByImdisk(const char *IsoPath, DWORD PhyDrive) if (0 == fl_attach_media(VentoyFatDiskRead, NULL)) { - if (g_64bit_system) + if (g_system_bit == 64) { CopyFileFromFatDisk("/ventoy/imdisk/64/imdisk.sys", "ventoy\\imdisk.sys"); CopyFileFromFatDisk("/ventoy/imdisk/64/imdisk.exe", "ventoy\\imdisk.exe"); @@ -1132,7 +1149,7 @@ static int DecompressInjectionArchive(const char *archive, DWORD PhyDrive) if (0 == fl_attach_media(VentoyFatDiskRead, NULL)) { - if (g_64bit_system) + if (g_system_bit == 64) { CopyFileFromFatDisk("/ventoy/7z/64/7za.exe", "ventoy\\7za.exe"); } @@ -1345,24 +1362,6 @@ static int VentoyHook(ventoy_os_param *param) return 0; } -const char * GetFileNameInPath(const char *fullpath) -{ - int i; - const char *pos = NULL; - - if (strstr(fullpath, ":")) - { - for (i = (int)strlen(fullpath); i > 0; i--) - { - if (fullpath[i - 1] == '/' || fullpath[i - 1] == '\\') - { - return fullpath + i; - } - } - } - - return fullpath; -} int VentoyJumpWimboot(INT argc, CHAR **argv, CHAR *LunchFile) { @@ -1371,13 +1370,7 @@ int VentoyJumpWimboot(INT argc, CHAR **argv, CHAR *LunchFile) DWORD size = 0; DWORD Pos; -#ifdef VTOY_32 - g_64bit_system = FALSE; -#else - g_64bit_system = TRUE; -#endif - - Log("VentoyJumpWimboot %dbit", g_64bit_system ? 64 : 32); + Log("VentoyJumpWimboot %dbit", g_system_bit); sprintf_s(LunchFile, MAX_PATH, "X:\\setup.exe"); @@ -1441,24 +1434,6 @@ static int ventoy_check_create_directory(void) return 0; } -static BOOL VentoyFindCmdLineStr(BYTE *buf, DWORD size) -{ - DWORD i = 0; - UINT32 uiDataChk; - UINT32 uiDataHex = *(UINT32 *)(g_aucCmdLineHex); - - for (i = 0; i < size - sizeof(g_aucCmdLineHex); i += 16) - { - uiDataChk = *(UINT32 *)(buf + i); - if (uiDataChk == uiDataHex && memcmp(buf + i, g_aucCmdLineHex, sizeof(g_aucCmdLineHex)) == 0) - { - return TRUE; - } - } - - return FALSE; -} - int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) { int rc = 1; @@ -1484,8 +1459,7 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) goto End; } - g_64bit_system = IsPe64(Buffer); - Log("VentoyJump %dbit", g_64bit_system ? 64 : 32); + Log("VentoyJump %dbit", g_system_bit); MUTEX_LOCK(g_vtoyins_mutex); stat = ventoy_check_create_directory(); @@ -1537,13 +1511,6 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile) SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart); MUTEX_UNLOCK(g_vtoyins_mutex); - #ifdef VTOY_REJUMP_SUPPORTED - if (_stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0) - { - g_PecmdHasCmdLine = VentoyFindCmdLineStr(Buffer + PeStart, FileSize - PeStart); - } - #endif - break; } } @@ -1574,244 +1541,176 @@ End: } - -static int ventoy_append_process_id(const char *pidfile) +int real_main(int argc, char **argv) { - DWORD PID = 0; - FILE *fp = NULL; + int i = 0; + int rc = 0; + CHAR NewFile[MAX_PATH]; + CHAR LunchFile[MAX_PATH]; + CHAR CallParam[1024] = { 0 }; + STARTUPINFOA Si; + PROCESS_INFORMATION Pi; - PID = GetCurrentProcessId(); - - fopen_s(&fp, pidfile, "a+"); - if (!fp) - { - return 1; - } - - fprintf_s(fp, "%u\n", PID); - - fclose(fp); - return 0; -} - -static int ventoy_get_instance_id(const char *pidfile) -{ - int instance = 0; - FILE *fp = NULL; - char line[256]; - - fopen_s(&fp, pidfile, "r"); - if (!fp) - { - return 1; - } - - while (fgets(line, sizeof(line), fp)) - { - instance++; - } - - fclose(fp); - return instance + 1; -} - -int main(int argc, char **argv) -{ - int i = 0; - int rc = 0; - int id = 0; - BOOL ReJump = FALSE; - CHAR *Pos = NULL; - CHAR CurDir[MAX_PATH]; - CHAR LunchFile[MAX_PATH]; - CHAR CallParam[1024] = { 0 }; - DWORD LockStatus = 0; - STARTUPINFOA Si; - PROCESS_INFORMATION Pi; - -#ifdef VTOY_REJUMP_SUPPORTED - if (argv[0] && strcmp(argv[0], "ventoy\\WinLogon.exe") == 0) - { - GetStartupInfoA(&Si); - Si.dwFlags |= STARTF_USESHOWWINDOW; - Si.wShowWindow = SW_HIDE; - - sprintf_s(LunchFile, sizeof(LunchFile), "PECMD.EXE"); - for (i = 1; i < argc; i++) - { - strcat_s(LunchFile, sizeof(LunchFile), " "); - strcat_s(LunchFile, sizeof(LunchFile), argv[i]); - } - - CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi); - WaitForSingleObject(Pi.hProcess, INFINITE); - return 0; - } -#endif - - g_PecmdHasCmdLine = 0; - g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK"); - g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK"); - - MUTEX_LOCK(g_vtoyins_mutex); - if (IsFileExist(VTOY_PID_FILE)) - { - id = ventoy_get_instance_id(VTOY_PID_FILE); - } - else - { - id = 1; - } - ventoy_append_process_id(VTOY_PID_FILE); - MUTEX_UNLOCK(g_vtoyins_mutex); - - 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); - } - } - -#ifdef VTOY_32 - Log("######## VentoyJump 32bit [%d] ##########", id); -#else - Log("######## VentoyJump 64bit [%d] ##########", id); -#endif + Log("#### real_main #### argc = %d", argc); + Log("program full path: <%s>", g_prog_full_path); + Log("program dir: <%s>", g_prog_dir); + Log("program name:: <%s>", g_prog_name); Log("argc = %d", argc); - for (i = 0; i < argc; i++) - { - Log("argv[%d]=<%s>", i, argv[i]); - if (i > 0) - { - strcat_s(CallParam, sizeof(CallParam), " "); - strcat_s(CallParam, sizeof(CallParam), argv[i]); - } - } - - if (Pos && *Pos == 0) + for (i = 0; i < argc; i++) { - Log("Old current directory = <%s>", CurDir); - Log("New current directory = <%s>", LunchFile); + Log("argv[%d]=<%s>", i, argv[i]); + if (i > 0) + { + strcat_s(CallParam, sizeof(CallParam), " "); + strcat_s(CallParam, sizeof(CallParam), argv[i]); + } + } + + GetStartupInfoA(&Si); + memset(LunchFile, 0, sizeof(LunchFile)); + + if (strstr(argv[0], "vtoyjump.exe")) + { + rc = VentoyJumpWimboot(argc, argv, LunchFile); } else { - GetCurrentDirectoryA(sizeof(CurDir), CurDir); - Log("Current directory = <%s>", CurDir); + rc = VentoyJump(argc, argv, LunchFile); } - GetStartupInfoA(&Si); + Log("LunchFile=<%s> CallParam=<%s>", LunchFile, CallParam); - memset(LunchFile, 0, sizeof(LunchFile)); + if (_stricmp(g_prog_name, "winpeshl.exe") != 0 && IsFileExist("ventoy\\%s", g_prog_name)) + { + sprintf_s(NewFile, sizeof(NewFile), "%s_BACK.EXE", g_prog_full_path); + MoveFileA(g_prog_full_path, NewFile); + Log("Move <%s> to <%s>", g_prog_full_path, NewFile); - if (strstr(argv[0], "vtoyjump.exe")) - { - rc = VentoyJumpWimboot(argc, argv, LunchFile); - } + sprintf_s(NewFile, sizeof(NewFile), "ventoy\\%s", g_prog_name); + CopyFileA(NewFile, g_prog_full_path, TRUE); + Log("Copy <%s> to <%s>", NewFile, g_prog_full_path); + + sprintf_s(LunchFile, sizeof(LunchFile), "%s", g_prog_full_path); + Log("Final lunchFile is <%s>", LunchFile); + } else { - rc = VentoyJump(argc, argv, LunchFile); + Log("We don't need to recover original <%s>", g_prog_name); } - Log("id=%d LunchFile=<%s> CallParam=<%s>", id, LunchFile, CallParam); + if (g_os_param_reserved[0] == 3) + { + Log("Open log for debug ..."); + sprintf_s(LunchFile, sizeof(LunchFile), "%s", "notepad.exe ventoy.log"); + } + else + { + if (CallParam[0]) + { + strcat_s(LunchFile, sizeof(LunchFile), CallParam); + } + else if (NULL == strstr(LunchFile, "setup.exe")) + { + Log("Not setup.exe, hide windows."); + Si.dwFlags |= STARTF_USESHOWWINDOW; + Si.wShowWindow = SW_HIDE; + } - if (id == 1 && _stricmp(argv[0], "PECMD.EXE") == 0 && _stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0) - { - MUTEX_LOCK(g_vtoyins_mutex); - id = ventoy_get_instance_id(VTOY_PID_FILE); - MUTEX_UNLOCK(g_vtoyins_mutex); + Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed"); + } - Log("Current instance id is: %d", id); + Log("Now launch <%s> ...", LunchFile); - if (id == 2) - { - #ifdef VTOY_REJUMP_SUPPORTED - if (g_PecmdHasCmdLine) - { - ReJump = TRUE; - CopyFileA("PECMD.EXE", "ventoy\\WinLogon.exe", TRUE); - } - #endif + if (g_os_param_reserved[0] == 4) + { + Log("Open cmd for debug ..."); + sprintf_s(LunchFile, sizeof(LunchFile), "%s", "cmd.exe"); + } - MoveFileA("PECMD.EXE", "PECMD_BACK.EXE"); - CopyFileA("ventoy\\PECMD.EXE", "PECMD.EXE", TRUE); - sprintf_s(LunchFile, sizeof(LunchFile), "%s", "PECMD.EXE"); - Log("Move original PECMD.EXE <%s>", LunchFile); - } - else - { - Log("%d instance started, don't move PECMD.EXE", id); - } - } + Log("Backup log at this point"); + CopyFileA(LOG_FILE, "X:\\Windows\\ventoy.backup", TRUE); - if (g_os_param_reserved[0] == 3) - { - Log("Open log for debug ..."); - sprintf_s(LunchFile, sizeof(LunchFile), "%s", "notepad.exe ventoy.log"); - } - else - { - if (CallParam[0]) - { - strcat_s(LunchFile, sizeof(LunchFile), CallParam); - } - else if (NULL == strstr(LunchFile, "setup.exe")) - { - Log("Not setup.exe, hide windows."); - Si.dwFlags |= STARTF_USESHOWWINDOW; - Si.wShowWindow = SW_HIDE; - } + CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi); - Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed"); - } - - Log("Now launch <%s> ...", LunchFile); + for (i = 0; rc && i < 1800; i++) + { + Log("Ventoy hook failed, now wait and retry ..."); + Sleep(1000); + rc = VentoyHook(&g_os_param); + } - if (g_os_param_reserved[0] == 4) - { - Log("Open cmd for debug ..."); - sprintf_s(LunchFile, sizeof(LunchFile), "%s", "cmd.exe"); - } + Log("Wait process..."); + WaitForSingleObject(Pi.hProcess, INFINITE); -#ifdef VTOY_REJUMP_SUPPORTED - if (ReJump) - { - sprintf_s(CallParam, sizeof(CallParam), "ventoy\\WinLogon.exe%s", LunchFile + strlen("PECMD.EXE")); - Log("Now rejump to pecmd.exe <%s> ...", CallParam); - - CreateProcessA(NULL, CallParam, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi); - - Log("Wait rejump process..."); - WaitForSingleObject(Pi.hProcess, INFINITE); - Log("rejump finished"); - return 0; - } -#else - (void)ReJump; -#endif - - CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi); - - for (i = 0; rc && i < 1800; i++) - { - Log("Ventoy hook failed, now wait and retry ..."); - Sleep(1000); - rc = VentoyHook(&g_os_param); - } - - Log("Wait process..."); - WaitForSingleObject(Pi.hProcess, INFINITE); - - Log("vtoyjump finished"); + Log("vtoyjump finished"); return 0; } + + +int main(int argc, char **argv) +{ + int i; + STARTUPINFOA Si; + PROCESS_INFORMATION Pi; + CHAR CurDir[MAX_PATH]; + CHAR NewArgv0[MAX_PATH]; + CHAR CallParam[1024] = { 0 }; + + g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK"); + g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK"); + + Log("######## VentoyJump %dbit ##########", g_system_bit); + + GetCurrentDirectoryA(sizeof(CurDir), CurDir); + Log("Current directory is <%s>", CurDir); + + GetModuleFileNameA(NULL, g_prog_full_path, MAX_PATH); + split_path_name(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 (_stricmp(g_prog_name, "WinLogon.exe") == 0) + { + Log("This time is rejump back ..."); + + strcpy_s(g_prog_full_path, sizeof(g_prog_full_path), argv[1]); + split_path_name(g_prog_full_path, g_prog_dir, g_prog_name); + + return real_main(argc - 1, argv + 1); + } + else if (_stricmp(g_prog_name, "PECMD.exe") == 0) + { + Log("We need to rejump for pecmd ..."); + + ventoy_check_create_directory(); + CopyFileA(g_prog_full_path, "ventoy\\WinLogon.exe", TRUE); + + sprintf_s(CallParam, sizeof(CallParam), "ventoy\\WinLogon.exe %s", g_prog_full_path); + for (i = 1; i < argc; i++) + { + strcat_s(CallParam, sizeof(CallParam), " "); + strcat_s(CallParam, sizeof(CallParam), argv[i]); + } + + Log("Now rejump to <%s> ...", CallParam); + GetStartupInfoA(&Si); + CreateProcessA(NULL, CallParam, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi); + + Log("Wait rejump process..."); + WaitForSingleObject(Pi.hProcess, INFINITE); + Log("rejump finished"); + return 0; + } + else + { + Log("We don't need to rejump ..."); + + strcpy_s(NewArgv0, sizeof(NewArgv0), g_prog_full_path); + argv[0] = NewArgv0; + + return real_main(argc, argv); + } +} + + diff --git a/vtoyjump/vtoyjump/vtoyjump.vcxproj b/vtoyjump/vtoyjump/vtoyjump.vcxproj index eeef6d98..9659c449 100644 --- a/vtoyjump/vtoyjump/vtoyjump.vcxproj +++ b/vtoyjump/vtoyjump/vtoyjump.vcxproj @@ -126,7 +126,7 @@ MaxSpeed true true - VTOY_32;FATFS_INC_FORMAT_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + VTOY_BIT=32;FATFS_INC_FORMAT_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true MultiThreaded @@ -146,7 +146,7 @@ MaxSpeed true true - VTOY_64;FATFS_INC_FORMAT_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) + VTOY_BIT=64;FATFS_INC_FORMAT_SUPPORT=0;WIN32;NDEBUG;_CONSOLE;_LIB;%(PreprocessorDefinitions) true MultiThreaded