/******************************************************************************\r
* vtoyjump.c\r
*\r
-* Copyright (c) 2020, longpanda <admin@ventoy.net>\r
+* Copyright (c) 2021, longpanda <admin@ventoy.net>\r
*\r
* This program is free software; you can redistribute it and/or\r
* modify it under the terms of the GNU General Public License as\r
static ventoy_os_param g_os_param;\r
static ventoy_windows_data g_windows_data;\r
static UINT8 g_os_param_reserved[32];\r
-static BOOL g_64bit_system = FALSE;\r
+static INT g_system_bit = VTOY_BIT;\r
static ventoy_guid g_ventoy_guid = VENTOY_GUID;\r
static HANDLE g_vtoylog_mutex = NULL;\r
static HANDLE g_vtoyins_mutex = NULL;\r
\r
-//Unicode "CmdLine"\r
-static BOOL g_PecmdHasCmdLine = FALSE;\r
-static UCHAR g_aucCmdLineHex[] = \r
-{\r
- 0x43, 0x00, 0x6D, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00\r
-};\r
+static CHAR g_prog_full_path[MAX_PATH];\r
+static CHAR g_prog_dir[MAX_PATH];\r
+static CHAR g_prog_name[MAX_PATH];\r
+\r
+#define VTOY_PECMD_PATH "X:\\Windows\\system32\\ventoy\\PECMD.EXE"\r
+#define ORG_PECMD_PATH "X:\\Windows\\system32\\PECMD.EXE"\r
+#define ORG_PECMD_BK_PATH "X:\\Windows\\system32\\PECMD.EXE_BACK.EXE"\r
\r
-#define VTOY_PID_FILE "X:\\Windows\\System32\\pidventoy"\r
+#define AUTO_RUN_BAT "X:\\VentoyAutoRun.bat"\r
+#define AUTO_RUN_LOG "X:\\VentoyAutoRun.log"\r
+\r
+#define LOG_FILE "X:\\Windows\\system32\\ventoy.log"\r
#define MUTEX_LOCK(hmutex) if (hmutex != NULL) LockStatus = WaitForSingleObject(hmutex, INFINITE)\r
#define MUTEX_UNLOCK(hmutex) if (hmutex != NULL && WAIT_OBJECT_0 == LockStatus) ReleaseMutex(hmutex)\r
\r
+static const char * GetFileNameInPath(const char *fullpath)\r
+{\r
+ int i;\r
+\r
+ if (strstr(fullpath, ":"))\r
+ {\r
+ for (i = (int)strlen(fullpath); i > 0; i--)\r
+ {\r
+ if (fullpath[i - 1] == '/' || fullpath[i - 1] == '\\')\r
+ {\r
+ return fullpath + i;\r
+ }\r
+ }\r
+ }\r
+\r
+ return fullpath;\r
+}\r
+\r
+static int split_path_name(char *fullpath, char *dir, char *name)\r
+{\r
+ CHAR ch;\r
+ CHAR *Pos = NULL;\r
+\r
+ Pos = (CHAR *)GetFileNameInPath(fullpath);\r
+\r
+ strcpy_s(name, MAX_PATH, Pos);\r
+\r
+ ch = *(Pos - 1);\r
+ *(Pos - 1) = 0;\r
+ strcpy_s(dir, MAX_PATH, fullpath);\r
+ *(Pos - 1) = ch;\r
+\r
+ return 0;\r
+}\r
+\r
+\r
void Log(const char *Fmt, ...)\r
{\r
va_list Arg;\r
\r
MUTEX_LOCK(g_vtoylog_mutex);\r
\r
- fopen_s(&File, "ventoy.log", "a+");\r
+ fopen_s(&File, LOG_FILE, "a+");\r
if (File)\r
{\r
fwrite(szBuf, 1, Len, File);\r
return TRUE;\r
}\r
\r
-static BOOL IsPe64(BYTE *buffer)\r
-{\r
- DWORD pe_off;\r
-\r
- if (!CheckPeHead(buffer))\r
- {\r
- return FALSE;\r
- }\r
-\r
- pe_off = *(UINT32 *)(buffer + 60);\r
- if (*(UINT16 *)(buffer + pe_off + 24) == 0x020b)\r
- {\r
- return TRUE;\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
\r
static BOOL CheckOsParam(ventoy_os_param *param)\r
{\r
return bRet;\r
}\r
\r
-static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *DiskExtent)\r
+static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, UINT32 *DiskSig, DISK_EXTENT *DiskExtent)\r
{\r
BOOL Ret;\r
DWORD dwSize;\r
}\r
CloseHandle(Handle);\r
\r
- memcpy(DiskExtent, DiskExtents.Extents, sizeof(DiskExtent));\r
- Log("%C: is in PhysicalDrive%d ", LogicalDrive, DiskExtents.Extents[0].DiskNumber);\r
+ memcpy(DiskExtent, DiskExtents.Extents, sizeof(DISK_EXTENT));\r
+ Log("%C: is in PhysicalDrive%d Offset:%llu", LogicalDrive, DiskExtents.Extents[0].DiskNumber, \r
+ (ULONGLONG)(DiskExtents.Extents[0].StartingOffset.QuadPart));\r
\r
sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\PhysicalDrive%d", DiskExtents.Extents[0].DiskNumber);\r
Handle = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);\r
}\r
\r
memcpy(UUID, SectorBuf + 0x180, 16);\r
+ if (DiskSig)\r
+ {\r
+ memcpy(DiskSig, SectorBuf + 0x1B8, 4);\r
+ }\r
+\r
CloseHandle(Handle);\r
return 0;\r
}\r
\r
for (i = 0; physicalDriveName[i]; i++)\r
{\r
- physicalDriveNameA[i] = toupper((CHAR)(physicalDriveName[i]));\r
+ physicalDriveNameA[i] = (CHAR)toupper((CHAR)(physicalDriveName[i]));\r
}\r
\r
Log("physicalDriveNameA=<%s>", physicalDriveNameA);\r
return bRet ? 0 : 1;\r
}\r
\r
-static BOOL VentoyNeedMountY(const char *IsoPath)\r
+static BOOL VentoyAPINeedMountY(const char *IsoPath)\r
{\r
+ (void)IsoPath;\r
+\r
/* TBD */\r
return FALSE;\r
}\r
DriveYFree = 1;\r
}\r
\r
- if (DriveYFree && VentoyNeedMountY(IsoPath))\r
+ if (DriveYFree && VentoyAPINeedMountY(IsoPath))\r
{\r
return VentoyMountY(Handle);\r
}\r
\r
int VentoyMountISOByAPI(const char *IsoPath)\r
{\r
+ int i;\r
HANDLE Handle;\r
DWORD Status;\r
WCHAR wFilePath[512] = { 0 };\r
\r
if (IsUTF8Encode(IsoPath))\r
{\r
+ Log("This is UTF8 encoding");\r
MultiByteToWideChar(CP_UTF8, 0, IsoPath, (int)strlen(IsoPath), wFilePath, (int)(sizeof(wFilePath) / sizeof(WCHAR)));\r
}\r
else\r
{\r
+ Log("This is ANSI encoding");\r
MultiByteToWideChar(CP_ACP, 0, IsoPath, (int)strlen(IsoPath), wFilePath, (int)(sizeof(wFilePath) / sizeof(WCHAR)));\r
}\r
\r
\r
OpenParameters.Version = OPEN_VIRTUAL_DISK_VERSION_1;\r
\r
- Status = OpenVirtualDisk(&StorageType, wFilePath, VIRTUAL_DISK_ACCESS_READ, 0, &OpenParameters, &Handle);\r
- if (Status != ERROR_SUCCESS)\r
- {\r
- if (ERROR_VIRTDISK_PROVIDER_NOT_FOUND == Status)\r
- {\r
- Log("VirtualDisk for ISO file is not supported in current system");\r
- }\r
- else\r
- {\r
- Log("Failed to open virtual disk ErrorCode:%u", Status);\r
- }\r
- return 1;\r
- }\r
+ for (i = 0; i < 10; i++)\r
+ {\r
+ Status = OpenVirtualDisk(&StorageType, wFilePath, VIRTUAL_DISK_ACCESS_READ, 0, &OpenParameters, &Handle);\r
+ if (ERROR_FILE_NOT_FOUND == Status || ERROR_PATH_NOT_FOUND == Status)\r
+ {\r
+ Log("OpenVirtualDisk ErrorCode:%u, now wait and retry...", Status);\r
+ Sleep(1000);\r
+ }\r
+ else\r
+ {\r
+ if (ERROR_SUCCESS == Status)\r
+ {\r
+ Log("OpenVirtualDisk success");\r
+ }\r
+ else if (ERROR_VIRTDISK_PROVIDER_NOT_FOUND == Status)\r
+ {\r
+ Log("VirtualDisk for ISO file is not supported in current system");\r
+ }\r
+ else\r
+ {\r
+ Log("Failed to open virtual disk ErrorCode:%u", Status);\r
+ }\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (Status != ERROR_SUCCESS)\r
+ {\r
+ return 1;\r
+ }\r
\r
Log("OpenVirtualDisk success");\r
\r
return 1;\r
}\r
\r
-static CHAR GetMountLogicalDrive(void)\r
+static BOOL Is2K10PE(void)\r
+{\r
+ BOOL bRet = FALSE;\r
+ FILE *fp = NULL;\r
+ CHAR szLine[1024];\r
+\r
+ fopen_s(&fp, "X:\\Windows\\System32\\PECMD.INI", "r");\r
+ if (!fp)\r
+ {\r
+ return FALSE;\r
+ }\r
+\r
+ memset(szLine, 0, sizeof(szLine));\r
+ while (fgets(szLine, sizeof(szLine) - 1, fp))\r
+ {\r
+ if (strstr(szLine, "2k10\\"))\r
+ {\r
+ bRet = TRUE;\r
+ break;\r
+ }\r
+ }\r
+\r
+ fclose(fp);\r
+ return bRet;\r
+}\r
+\r
+static CHAR GetIMDiskMountLogicalDrive(void)\r
{\r
CHAR Letter = 'Y';\r
DWORD Drives;\r
DWORD Mask = 0x1000000;\r
\r
+ // fixed use M as mountpoint for 2K10 PE\r
+ if (Is2K10PE())\r
+ {\r
+ Log("Use M: for 2K10 PE");\r
+ return 'M';\r
+ }\r
+\r
Drives = GetLogicalDrives();\r
Log("Drives=0x%x", Drives);\r
\r
return StartSector;\r
}\r
\r
+static int VentoyRunImdisk(const char *IsoPath, const char *imdiskexe)\r
+{\r
+ CHAR Letter;\r
+ CHAR Cmdline[512];\r
+ WCHAR CmdlineW[512];\r
+ PROCESS_INFORMATION Pi;\r
+\r
+ Log("VentoyRunImdisk <%s> <%s>", IsoPath, imdiskexe);\r
+\r
+ Letter = GetIMDiskMountLogicalDrive();\r
+ sprintf_s(Cmdline, sizeof(Cmdline), "%s -a -o ro -f \"%s\" -m %C:", imdiskexe, IsoPath, Letter);\r
+ Log("mount iso to %C: use imdisk cmd <%s>", Letter, Cmdline);\r
+\r
+ if (IsUTF8Encode(IsoPath))\r
+ {\r
+ STARTUPINFOW Si;\r
+ GetStartupInfoW(&Si);\r
+ Si.dwFlags |= STARTF_USESHOWWINDOW;\r
+ Si.wShowWindow = SW_HIDE;\r
+\r
+ Utf8ToUtf16(Cmdline, CmdlineW);\r
+ CreateProcessW(NULL, CmdlineW, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+\r
+ Log("This is UTF8 encoding");\r
+ }\r
+ else\r
+ {\r
+ STARTUPINFOA Si;\r
+ GetStartupInfoA(&Si);\r
+ Si.dwFlags |= STARTF_USESHOWWINDOW;\r
+ Si.wShowWindow = SW_HIDE;\r
+\r
+ CreateProcessA(NULL, Cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+\r
+ Log("This is ANSI encoding");\r
+ }\r
+\r
+ Log("Wait for imdisk process ...");\r
+ WaitForSingleObject(Pi.hProcess, INFINITE);\r
+ Log("imdisk process finished");\r
+\r
+ return 0;\r
+}\r
+\r
int VentoyMountISOByImdisk(const char *IsoPath, DWORD PhyDrive)\r
{\r
int rc = 1;\r
BOOL bRet;\r
- CHAR Letter;\r
DWORD dwBytes;\r
HANDLE hDrive;\r
CHAR PhyPath[MAX_PATH];\r
- WCHAR PhyPathW[MAX_PATH];\r
- PROCESS_INFORMATION Pi;\r
GET_LENGTH_INFORMATION LengthInfo;\r
\r
Log("VentoyMountISOByImdisk %s", IsoPath);\r
\r
+ if (IsFileExist("X:\\Windows\\System32\\imdisk.exe"))\r
+ {\r
+ Log("imdisk.exe exist, use it directly...");\r
+ VentoyRunImdisk(IsoPath, "imdisk.exe");\r
+ return 0;\r
+ }\r
+\r
sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\PhysicalDrive%d", PhyDrive);\r
hDrive = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);\r
if (hDrive == INVALID_HANDLE_VALUE)\r
\r
if (0 == fl_attach_media(VentoyFatDiskRead, NULL))\r
{\r
- if (g_64bit_system)\r
+ if (g_system_bit == 64)\r
{\r
CopyFileFromFatDisk("/ventoy/imdisk/64/imdisk.sys", "ventoy\\imdisk.sys");\r
CopyFileFromFatDisk("/ventoy/imdisk/64/imdisk.exe", "ventoy\\imdisk.exe");\r
\r
if (LoadNtDriver(PhyPath) == 0)\r
{\r
+ VentoyRunImdisk(IsoPath, "ventoy\\imdisk.exe");\r
rc = 0;\r
-\r
- Letter = GetMountLogicalDrive();\r
- sprintf_s(PhyPath, sizeof(PhyPath), "ventoy\\imdisk.exe -a -o ro -f \"%s\" -m %C:", IsoPath, Letter);\r
- Log("mount iso to %C: use imdisk cmd <%s>", Letter, PhyPath);\r
-\r
- if (IsUTF8Encode(IsoPath))\r
- {\r
- STARTUPINFOW Si;\r
- GetStartupInfoW(&Si);\r
- Si.dwFlags |= STARTF_USESHOWWINDOW;\r
- Si.wShowWindow = SW_HIDE;\r
-\r
- Utf8ToUtf16(PhyPath, PhyPathW);\r
- CreateProcessW(NULL, PhyPathW, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
-\r
- Log("This is UTF8 encoding");\r
- }\r
- else\r
- {\r
- STARTUPINFOA Si;\r
- GetStartupInfoA(&Si);\r
- Si.dwFlags |= STARTF_USESHOWWINDOW;\r
- Si.wShowWindow = SW_HIDE;\r
-\r
- CreateProcessA(NULL, PhyPath, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
-\r
- Log("This is ANSI encoding");\r
- }\r
-\r
- WaitForSingleObject(Pi.hProcess, INFINITE);\r
}\r
}\r
fl_shutdown();\r
return FALSE;\r
}\r
\r
+static UCHAR *g_unxz_buffer = NULL;\r
+static int g_unxz_len = 0;\r
+\r
+static void unxz_error(char *x)\r
+{\r
+ Log("%s", x);\r
+}\r
+\r
+static int unxz_flush(void *src, unsigned int size)\r
+{\r
+ memcpy(g_unxz_buffer + g_unxz_len, src, size);\r
+ g_unxz_len += (int)size;\r
+\r
+ return (int)size;\r
+}\r
+\r
static int DecompressInjectionArchive(const char *archive, DWORD PhyDrive)\r
{\r
int rc = 1;\r
+ int writelen = 0;\r
+ UCHAR *Buffer = NULL;\r
+ UCHAR *RawBuffer = NULL;\r
BOOL bRet;\r
DWORD dwBytes;\r
+ DWORD dwSize;\r
HANDLE hDrive;\r
HANDLE hOut;\r
DWORD flags = CREATE_NO_WINDOW;\r
\r
if (0 == fl_attach_media(VentoyFatDiskRead, NULL))\r
{\r
- if (g_64bit_system)\r
+ if (g_system_bit == 64)\r
+ {\r
+ CopyFileFromFatDisk("/ventoy/7z/64/7za.xz", "ventoy\\7za.xz");\r
+ }\r
+ else\r
{\r
- CopyFileFromFatDisk("/ventoy/7z/64/7za.exe", "ventoy\\7za.exe");\r
+ CopyFileFromFatDisk("/ventoy/7z/32/7za.xz", "ventoy\\7za.xz");\r
+ }\r
+\r
+ ReadWholeFile2Buf("ventoy\\7za.xz", &Buffer, &dwSize);\r
+ Log("7za.xz file size:%u", dwSize);\r
+\r
+ RawBuffer = malloc(SIZE_1MB * 4);\r
+ if (RawBuffer)\r
+ {\r
+ g_unxz_buffer = RawBuffer;\r
+ g_unxz_len = 0;\r
+ unxz(Buffer, (int)dwSize, NULL, unxz_flush, NULL, &writelen, unxz_error);\r
+ if (writelen == (int)dwSize)\r
+ {\r
+ Log("Decompress success 7za.xz(%u) ---> 7za.exe(%d)", dwSize, g_unxz_len);\r
+ }\r
+ else\r
+ {\r
+ Log("Decompress failed 7za.xz(%u) ---> 7za.exe(%u)", dwSize, dwSize);\r
+ }\r
+\r
+ SaveBuffer2File("ventoy\\7za.exe", RawBuffer, (DWORD)g_unxz_len);\r
+\r
+ g_unxz_buffer = NULL;\r
+ g_unxz_len = 0;\r
+ free(RawBuffer);\r
}\r
else\r
{\r
- CopyFileFromFatDisk("/ventoy/7z/32/7za.exe", "ventoy\\7za.exe");\r
+ Log("Failed to alloc 4MB memory");\r
}\r
\r
sprintf_s(StrBuf, sizeof(StrBuf), "ventoy\\7za.exe x -y -aoa -oX:\\ %s", archive);\r
return 0;\r
}\r
\r
+static int Windows11BypassCheck(const char *isofile, const char MntLetter)\r
+{\r
+ int Ret = 1;\r
+ DWORD dwHandle;\r
+ DWORD dwSize;\r
+ DWORD dwValue = 1;\r
+ UINT VerLen = 0;\r
+ CHAR *Buffer = NULL;\r
+ VS_FIXEDFILEINFO* VerInfo = NULL;\r
+ CHAR CheckFile[MAX_PATH];\r
+ UINT16 Major, Minor, Build, Revision;\r
+\r
+ Log("Windows11BypassCheck for <%s> %C:", isofile, MntLetter);\r
+\r
+ if (FALSE == IsFileExist("%C:\\sources\\boot.wim", MntLetter) ||\r
+ FALSE == IsFileExist("%C:\\sources\\compatresources.dll", MntLetter))\r
+ {\r
+ Log("boot.wim/compatresources.dll not exist, this is not a windows install media.");\r
+ goto End;\r
+ }\r
+\r
+ if (FALSE == IsFileExist("%C:\\sources\\install.wim", MntLetter) && \r
+ FALSE == IsFileExist("%C:\\sources\\install.esd", MntLetter))\r
+ {\r
+ Log("install.wim/install.esd not exist, this is not a windows install media.");\r
+ goto End;\r
+ }\r
+\r
+ sprintf_s(CheckFile, sizeof(CheckFile), "%C:\\sources\\compatresources.dll", MntLetter);\r
+ dwSize = GetFileVersionInfoSizeA(CheckFile, &dwHandle);\r
+ if (0 == dwSize)\r
+ {\r
+ Log("Failed to get file version info size: %u", LASTERR);\r
+ goto End;\r
+ }\r
+\r
+ Buffer = malloc(dwSize);\r
+ if (!Buffer)\r
+ {\r
+ goto End;\r
+ }\r
+\r
+ if (FALSE == GetFileVersionInfoA(CheckFile, dwHandle, dwSize, Buffer))\r
+ {\r
+ Log("Failed to get file version info : %u", LASTERR);\r
+ goto End;\r
+ }\r
+\r
+ if (VerQueryValueA(Buffer, "\\", (LPVOID)&VerInfo, &VerLen) && VerLen != 0)\r
+ {\r
+ if (VerInfo->dwSignature == VS_FFI_SIGNATURE)\r
+ {\r
+ Major = HIWORD(VerInfo->dwFileVersionMS);\r
+ Minor = LOWORD(VerInfo->dwFileVersionMS);\r
+ Build = HIWORD(VerInfo->dwFileVersionLS);\r
+ Revision = LOWORD(VerInfo->dwFileVersionLS);\r
+\r
+ Log("FileVersionze: <%u %u %u %u>", Major, Minor, Build, Revision);\r
+\r
+ if (Major == 10 && Build > 20000)\r
+ {\r
+ Major = 11;\r
+ }\r
+\r
+ if (Major != 11)\r
+ {\r
+ Log("This is not Windows 11, not need to bypass.", Major);\r
+ goto End;\r
+ }\r
+ }\r
+ }\r
+\r
+ //Now we really need to bypass windows 11 check. create registry\r
+ HKEY hKey = NULL;\r
+ HKEY hSubKey = NULL;\r
+ LSTATUS Status;\r
+\r
+ Status = RegCreateKeyExA(HKEY_LOCAL_MACHINE, "System\\Setup", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwSize);\r
+ if (ERROR_SUCCESS != Status)\r
+ {\r
+ Log("Failed to create reg key System\\Setup %u %u", LASTERR, Status);\r
+ goto End;\r
+ }\r
+\r
+ Status = RegCreateKeyExA(hKey, "LabConfig", 0, NULL, 0, KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_CREATE_SUB_KEY, NULL, &hSubKey, &dwSize);\r
+ if (ERROR_SUCCESS != Status)\r
+ {\r
+ Log("Failed to create LabConfig reg %u %u", LASTERR, Status);\r
+ goto End;\r
+ }\r
+\r
+ //set reg value\r
+ Status += RegSetValueExA(hSubKey, "BypassRAMCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+ Status += RegSetValueExA(hSubKey, "BypassTPMCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+ Status += RegSetValueExA(hSubKey, "BypassSecureBootCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+ Status += RegSetValueExA(hSubKey, "BypassStorageCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+ Status += RegSetValueExA(hSubKey, "BypassCPUCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+\r
+ Log("Create bypass registry %s %u", (Status == ERROR_SUCCESS) ? "SUCCESS" : "FAILED", Status);\r
+\r
+ Ret = 0;\r
+\r
+End:\r
+ if (Buffer)\r
+ {\r
+ free(Buffer);\r
+ }\r
+ \r
+ return Ret; \r
+}\r
+\r
+static BOOL CheckVentoyDisk(DWORD DiskNum)\r
+{\r
+ DWORD dwSize = 0;\r
+ CHAR PhyPath[128];\r
+ UINT8 SectorBuf[512];\r
+ HANDLE Handle;\r
+ UINT8 check[8] = { 0x56, 0x54, 0x00, 0x47, 0x65, 0x00, 0x48, 0x44 };\r
+\r
+ sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\PhysicalDrive%d", DiskNum);\r
+ Handle = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);\r
+ if (Handle == INVALID_HANDLE_VALUE)\r
+ {\r
+ Log("Could not open the disk<%s>, error:%u", PhyPath, GetLastError());\r
+ return FALSE;\r
+ }\r
+\r
+ if (!ReadFile(Handle, SectorBuf, sizeof(SectorBuf), &dwSize, NULL))\r
+ {\r
+ Log("ReadFile failed, dwSize:%u error:%u", dwSize, GetLastError());\r
+ CloseHandle(Handle);\r
+ return FALSE;\r
+ }\r
+\r
+ CloseHandle(Handle);\r
+\r
+ if (memcmp(SectorBuf + 0x190, check, 8) == 0)\r
+ {\r
+ return TRUE;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+\r
static int VentoyHook(ventoy_os_param *param)\r
{\r
+ int i;\r
int rc;\r
- CHAR Letter = 'A';\r
+ BOOL find = FALSE;\r
+ BOOL vtoyfind = FALSE;\r
+ CHAR Letter;\r
+ CHAR MntLetter;\r
+ CHAR VtoyLetter;\r
+ DWORD Drives;\r
+ DWORD NewDrives;\r
+ DWORD VtoyDiskNum;\r
+ UINT32 DiskSig;\r
+ UINT32 VtoySig;\r
DISK_EXTENT DiskExtent;\r
- DWORD Drives = GetLogicalDrives();\r
+ DISK_EXTENT VtoyDiskExtent;\r
UINT8 UUID[16];\r
CHAR IsoPath[MAX_PATH];\r
\r
- Log("Logical Drives=0x%x Path:<%s>", Drives, param->vtoy_img_path);\r
+ Log("VentoyHook Path:<%s>", param->vtoy_img_path);\r
\r
if (IsUTF8Encode(param->vtoy_img_path))\r
{\r
Log("This file is UTF8 encoding\n");\r
}\r
\r
- while (Drives)\r
- {\r
- if (Drives & 0x01)\r
+ for (i = 0; i < 5; i++)\r
+ {\r
+ Letter = 'A';\r
+ Drives = GetLogicalDrives();\r
+ Log("Logic Drives: 0x%x", Drives);\r
+\r
+ while (Drives)\r
{\r
- sprintf_s(IsoPath, sizeof(IsoPath), "%C:\\%s", Letter, param->vtoy_img_path);\r
- if (IsFileExist("%s", IsoPath))\r
+ if (Drives & 0x01)\r
{\r
- Log("File exist under %C:", Letter);\r
- if (GetPhyDiskUUID(Letter, UUID, &DiskExtent) == 0)\r
+ sprintf_s(IsoPath, sizeof(IsoPath), "%C:\\%s", Letter, param->vtoy_img_path);\r
+ if (IsFileExist("%s", IsoPath))\r
{\r
- if (memcmp(UUID, param->vtoy_disk_guid, 16) == 0)\r
+ Log("File exist under %C:", Letter);\r
+ memset(UUID, 0, sizeof(UUID));\r
+ memset(&DiskExtent, 0, sizeof(DiskExtent));\r
+ if (GetPhyDiskUUID(Letter, UUID, NULL, &DiskExtent) == 0)\r
{\r
- Log("Disk UUID match");\r
- break;\r
+ if (memcmp(UUID, param->vtoy_disk_guid, 16) == 0)\r
+ {\r
+ Log("Disk UUID match");\r
+ find = TRUE;\r
+ break;\r
+ }\r
}\r
}\r
+ else\r
+ {\r
+ Log("File NOT exist under %C:", Letter);\r
+ }\r
}\r
- else\r
- {\r
- Log("File NOT exist under %C:", Letter);\r
- }\r
+\r
+ Drives >>= 1;\r
+ Letter++;\r
}\r
\r
- Drives >>= 1;\r
- Letter++;\r
- }\r
+ if (find)\r
+ {\r
+ break;\r
+ }\r
+ else\r
+ {\r
+ Log("Now wait and retry ...");\r
+ Sleep(1000);\r
+ }\r
+ }\r
\r
- if (Drives == 0)\r
+ if (find == FALSE)\r
{\r
Log("Failed to find ISO file");\r
return 1;\r
\r
Log("Find ISO file <%s>", IsoPath);\r
\r
- rc = MountIsoFile(IsoPath, DiskExtent.DiskNumber);\r
+ //Find VtoyLetter in Vlnk Mode\r
+ if (g_os_param_reserved[6] == 1)\r
+ {\r
+ memcpy(&VtoySig, g_os_param_reserved + 7, 4);\r
+ for (i = 0; i < 5; i++)\r
+ {\r
+ VtoyLetter = 'A';\r
+ Drives = GetLogicalDrives();\r
+ Log("Logic Drives: 0x%x VentoySig:%08X", Drives, VtoySig);\r
+\r
+ while (Drives)\r
+ {\r
+ if (Drives & 0x01)\r
+ {\r
+ memset(UUID, 0, sizeof(UUID));\r
+ memset(&VtoyDiskExtent, 0, sizeof(VtoyDiskExtent));\r
+ DiskSig = 0;\r
+ if (GetPhyDiskUUID(VtoyLetter, UUID, &DiskSig, &VtoyDiskExtent) == 0)\r
+ {\r
+ Log("DiskSig=%08X PartStart=%lld", DiskSig, VtoyDiskExtent.StartingOffset.QuadPart);\r
+ if (DiskSig == VtoySig && VtoyDiskExtent.StartingOffset.QuadPart == SIZE_1MB)\r
+ {\r
+ Log("Ventoy Disk Sig match");\r
+ vtoyfind = TRUE;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ Drives >>= 1;\r
+ VtoyLetter++;\r
+ }\r
+\r
+ if (vtoyfind)\r
+ {\r
+ Log("Find Ventoy Letter: %C", VtoyLetter);\r
+ break;\r
+ }\r
+ else\r
+ {\r
+ Log("Now wait and retry ...");\r
+ Sleep(1000);\r
+ }\r
+ }\r
+\r
+ if (vtoyfind == FALSE)\r
+ {\r
+ Log("Failed to find ventoy disk");\r
+ return 1;\r
+ }\r
+\r
+ VtoyDiskNum = VtoyDiskExtent.DiskNumber;\r
+ }\r
+ else\r
+ {\r
+ VtoyLetter = Letter;\r
+ Log("No vlnk mode %C", Letter);\r
+\r
+ VtoyDiskNum = DiskExtent.DiskNumber;\r
+ }\r
+\r
+ if (CheckVentoyDisk(VtoyDiskNum))\r
+ {\r
+ Log("Disk check OK %C: %u", VtoyLetter, VtoyDiskNum);\r
+ }\r
+ else\r
+ {\r
+ Log("Failed to check ventoy disk %u", VtoyDiskNum);\r
+ return 1;\r
+ }\r
+\r
+ Drives = GetLogicalDrives();\r
+ Log("Drives before mount: 0x%x", Drives);\r
+\r
+ rc = MountIsoFile(IsoPath, VtoyDiskNum);\r
+\r
+ NewDrives = GetLogicalDrives();\r
+ Log("Drives after mount: 0x%x (0x%x)", NewDrives, (NewDrives ^ Drives));\r
+\r
+ MntLetter = 'A';\r
+ NewDrives = (NewDrives ^ Drives);\r
+ while (NewDrives)\r
+ {\r
+ if (NewDrives & 0x01)\r
+ {\r
+ if ((NewDrives >> 1) == 0)\r
+ {\r
+ Log("The ISO file is mounted at %C:", MntLetter);\r
+ }\r
+ else\r
+ {\r
+ Log("Maybe the ISO file is mounted at %C:", MntLetter);\r
+ }\r
+ break;\r
+ }\r
+\r
+ NewDrives >>= 1;\r
+ MntLetter++;\r
+ }\r
+\r
Log("Mount ISO FILE: %s", rc == 0 ? "SUCCESS" : "FAILED");\r
\r
+ //Windows 11 bypass check\r
+ if (g_windows_data.windows11_bypass_check == 1)\r
+ {\r
+ Windows11BypassCheck(IsoPath, MntLetter);\r
+ }\r
+\r
// for protect\r
- rc = DeleteVentoyPart2MountPoint(DiskExtent.DiskNumber);\r
+ rc = DeleteVentoyPart2MountPoint(VtoyDiskNum);\r
Log("Delete ventoy mountpoint: %s", rc == 0 ? "SUCCESS" : "NO NEED");\r
\r
if (g_windows_data.auto_install_script[0])\r
{\r
- sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", Letter, g_windows_data.auto_install_script);\r
+ sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", VtoyLetter, g_windows_data.auto_install_script);\r
if (IsFileExist("%s", IsoPath))\r
{\r
Log("use auto install script %s...", IsoPath);\r
\r
if (g_windows_data.injection_archive[0])\r
{\r
- sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", Letter, g_windows_data.injection_archive);\r
+ sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", VtoyLetter, g_windows_data.injection_archive);\r
if (IsFileExist("%s", IsoPath))\r
{\r
Log("decompress injection archive %s...", IsoPath);\r
- DecompressInjectionArchive(IsoPath, DiskExtent.DiskNumber);\r
+ DecompressInjectionArchive(IsoPath, VtoyDiskNum);\r
+\r
+ if (IsFileExist("%s", AUTO_RUN_BAT))\r
+ {\r
+ HANDLE hOut;\r
+ DWORD flags = CREATE_NO_WINDOW;\r
+ CHAR StrBuf[1024];\r
+ STARTUPINFOA Si;\r
+ PROCESS_INFORMATION Pi;\r
+ SECURITY_ATTRIBUTES Sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };\r
+\r
+ Log("%s exist, now run it...", AUTO_RUN_BAT);\r
+\r
+ GetStartupInfoA(&Si);\r
+\r
+ hOut = CreateFileA(AUTO_RUN_LOG,\r
+ FILE_APPEND_DATA,\r
+ FILE_SHARE_WRITE | FILE_SHARE_READ,\r
+ &Sa,\r
+ OPEN_ALWAYS,\r
+ FILE_ATTRIBUTE_NORMAL,\r
+ NULL);\r
+\r
+ Si.dwFlags |= STARTF_USESTDHANDLES;\r
+ if (hOut != INVALID_HANDLE_VALUE)\r
+ {\r
+ Si.hStdError = hOut;\r
+ Si.hStdOutput = hOut;\r
+ }\r
+\r
+ sprintf_s(IsoPath, sizeof(IsoPath), "%C:\\%s", Letter, param->vtoy_img_path);\r
+ sprintf_s(StrBuf, sizeof(StrBuf), "cmd.exe /c %s \"%s\" %C", AUTO_RUN_BAT, IsoPath, MntLetter);\r
+ CreateProcessA(NULL, StrBuf, NULL, NULL, TRUE, flags, NULL, NULL, &Si, &Pi);\r
+ WaitForSingleObject(Pi.hProcess, INFINITE);\r
+\r
+ SAFE_CLOSE_HANDLE(hOut);\r
+ }\r
+ else\r
+ {\r
+ Log("%s not exist...", AUTO_RUN_BAT);\r
+ }\r
}\r
else\r
{\r
return 0;\r
}\r
\r
-const char * GetFileNameInPath(const char *fullpath)\r
-{\r
- int i;\r
- const char *pos = NULL;\r
-\r
- if (strstr(fullpath, ":"))\r
- {\r
- for (i = (int)strlen(fullpath); i > 0; i--)\r
- {\r
- if (fullpath[i - 1] == '/' || fullpath[i - 1] == '\\')\r
- {\r
- return fullpath + i;\r
- }\r
- }\r
- }\r
- \r
- return fullpath;\r
-}\r
\r
int VentoyJumpWimboot(INT argc, CHAR **argv, CHAR *LunchFile)\r
{\r
DWORD size = 0;\r
DWORD Pos;\r
\r
-#ifdef VTOY_32\r
- g_64bit_system = FALSE;\r
-#else\r
- g_64bit_system = TRUE;\r
-#endif\r
- \r
- Log("VentoyJumpWimboot %dbit", g_64bit_system ? 64 : 32);\r
+ Log("VentoyJumpWimboot %dbit", g_system_bit);\r
\r
sprintf_s(LunchFile, MAX_PATH, "X:\\setup.exe");\r
\r
return 0;\r
}\r
\r
-static BOOL VentoyFindCmdLineStr(BYTE *buf, DWORD size)\r
-{\r
- DWORD i = 0;\r
- UINT32 uiDataChk;\r
- UINT32 uiDataHex = *(UINT32 *)(g_aucCmdLineHex);\r
-\r
- for (i = 0; i < size - sizeof(g_aucCmdLineHex); i += 16)\r
- {\r
- uiDataChk = *(UINT32 *)(buf + i);\r
- if (uiDataChk == uiDataHex && memcmp(buf + i, g_aucCmdLineHex, sizeof(g_aucCmdLineHex)) == 0)\r
- {\r
- return TRUE;\r
- }\r
- }\r
- \r
- return FALSE;\r
-}\r
-\r
int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)\r
{\r
int rc = 1;\r
goto End;\r
}\r
\r
- g_64bit_system = IsPe64(Buffer);\r
- Log("VentoyJump %dbit", g_64bit_system ? 64 : 32);\r
+ Log("VentoyJump %dbit", g_system_bit);\r
\r
MUTEX_LOCK(g_vtoyins_mutex);\r
stat = ventoy_check_create_directory();\r
SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart);\r
MUTEX_UNLOCK(g_vtoyins_mutex);\r
\r
- #ifdef VTOY_REJUMP_SUPPORTED\r
- if (_stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0)\r
- {\r
- g_PecmdHasCmdLine = VentoyFindCmdLineStr(Buffer + PeStart, FileSize - PeStart);\r
- }\r
- #endif\r
-\r
break;\r
}\r
}\r
}\r
\r
\r
-\r
-static int ventoy_append_process_id(const char *pidfile)\r
+int real_main(int argc, char **argv)\r
{\r
- DWORD PID = 0;\r
- FILE *fp = NULL;\r
-\r
- PID = GetCurrentProcessId();\r
-\r
- fopen_s(&fp, pidfile, "a+");\r
- if (!fp)\r
- {\r
- return 1;\r
- }\r
-\r
- fprintf_s(fp, "%u\n", PID);\r
-\r
- fclose(fp);\r
- return 0;\r
-}\r
-\r
-static int ventoy_get_instance_id(const char *pidfile)\r
-{\r
- int instance = 0;\r
- FILE *fp = NULL;\r
- char line[256];\r
-\r
- fopen_s(&fp, pidfile, "r");\r
- if (!fp)\r
- {\r
- return 1;\r
- }\r
+ int i = 0;\r
+ int rc = 0;\r
+ CHAR NewFile[MAX_PATH];\r
+ CHAR LunchFile[MAX_PATH];\r
+ CHAR CallParam[1024] = { 0 };\r
+ STARTUPINFOA Si;\r
+ PROCESS_INFORMATION Pi;\r
\r
- while (fgets(line, sizeof(line), fp))\r
- {\r
- instance++;\r
- }\r
+ Log("#### real_main #### argc = %d", argc);\r
+ Log("program full path: <%s>", g_prog_full_path);\r
+ Log("program dir: <%s>", g_prog_dir);\r
+ Log("program name:: <%s>", g_prog_name);\r
\r
- fclose(fp);\r
- return instance + 1;\r
-}\r
+ Log("argc = %d", argc);\r
+ for (i = 0; i < argc; i++)\r
+ {\r
+ Log("argv[%d]=<%s>", i, argv[i]);\r
+ if (i > 0)\r
+ {\r
+ strcat_s(CallParam, sizeof(CallParam), " ");\r
+ strcat_s(CallParam, sizeof(CallParam), argv[i]);\r
+ }\r
+ }\r
\r
-int main(int argc, char **argv)\r
-{\r
- int i = 0;\r
- int rc = 0;\r
- int id = 0;\r
- BOOL ReJump = FALSE;\r
- CHAR *Pos = NULL;\r
- CHAR CurDir[MAX_PATH];\r
- CHAR LunchFile[MAX_PATH];\r
- CHAR CallParam[1024] = { 0 };\r
- DWORD LockStatus = 0;\r
- STARTUPINFOA Si;\r
- PROCESS_INFORMATION Pi;\r
+ GetStartupInfoA(&Si);\r
+ memset(LunchFile, 0, sizeof(LunchFile));\r
\r
-#ifdef VTOY_REJUMP_SUPPORTED\r
- if (argv[0] && strcmp(argv[0], "ventoy\\WinLogon.exe") == 0)\r
- {\r
- GetStartupInfoA(&Si);\r
- Si.dwFlags |= STARTF_USESHOWWINDOW;\r
- Si.wShowWindow = SW_HIDE;\r
+ if (strstr(argv[0], "vtoyjump.exe"))\r
+ {\r
+ rc = VentoyJumpWimboot(argc, argv, LunchFile);\r
+ }\r
+ else\r
+ {\r
+ rc = VentoyJump(argc, argv, LunchFile);\r
+ }\r
\r
- sprintf_s(LunchFile, sizeof(LunchFile), "PECMD.EXE");\r
- for (i = 1; i < argc; i++)\r
- {\r
- strcat_s(LunchFile, sizeof(LunchFile), " ");\r
- strcat_s(LunchFile, sizeof(LunchFile), argv[i]);\r
- }\r
+ Log("LunchFile=<%s> CallParam=<%s>", LunchFile, CallParam);\r
\r
- CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
- WaitForSingleObject(Pi.hProcess, INFINITE);\r
- return 0;\r
- }\r
-#endif\r
+ if (_stricmp(g_prog_name, "winpeshl.exe") != 0 && IsFileExist("ventoy\\%s", g_prog_name))\r
+ {\r
+ sprintf_s(NewFile, sizeof(NewFile), "%s_BACK.EXE", g_prog_full_path);\r
+ MoveFileA(g_prog_full_path, NewFile);\r
+ Log("Move <%s> to <%s>", g_prog_full_path, NewFile);\r
\r
- g_PecmdHasCmdLine = 0;\r
- g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK");\r
- g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK");\r
+ sprintf_s(NewFile, sizeof(NewFile), "ventoy\\%s", g_prog_name);\r
+ CopyFileA(NewFile, g_prog_full_path, TRUE);\r
+ Log("Copy <%s> to <%s>", NewFile, g_prog_full_path);\r
\r
- MUTEX_LOCK(g_vtoyins_mutex);\r
- if (IsFileExist(VTOY_PID_FILE))\r
- {\r
- id = ventoy_get_instance_id(VTOY_PID_FILE);\r
- }\r
+ sprintf_s(LunchFile, sizeof(LunchFile), "%s", g_prog_full_path);\r
+ Log("Final lunchFile is <%s>", LunchFile);\r
+ }\r
else\r
{\r
- id = 1;\r
+ Log("We don't need to recover original <%s>", g_prog_name);\r
}\r
- ventoy_append_process_id(VTOY_PID_FILE);\r
- MUTEX_UNLOCK(g_vtoyins_mutex);\r
\r
- if (argv[0] && argv[0][0] && argv[0][1] == ':')\r
- {\r
- GetCurrentDirectoryA(sizeof(CurDir), CurDir);\r
+ if (g_os_param_reserved[0] == 3)\r
+ {\r
+ Log("Open log for debug ...");\r
+ sprintf_s(LunchFile, sizeof(LunchFile), "%s", "notepad.exe ventoy.log");\r
+ }\r
+ else\r
+ {\r
+ if (CallParam[0])\r
+ {\r
+ strcat_s(LunchFile, sizeof(LunchFile), CallParam);\r
+ }\r
+ else if (NULL == strstr(LunchFile, "setup.exe"))\r
+ {\r
+ Log("Not setup.exe, hide windows.");\r
+ Si.dwFlags |= STARTF_USESHOWWINDOW;\r
+ Si.wShowWindow = SW_HIDE;\r
+ }\r
\r
- strcpy_s(LunchFile, sizeof(LunchFile), argv[0]);\r
- Pos = (char *)GetFileNameInPath(LunchFile);\r
+ Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed");\r
+ }\r
\r
- strcat_s(CurDir, sizeof(CurDir), "\\");\r
- strcat_s(CurDir, sizeof(CurDir), Pos);\r
+ Log("Now launch <%s> ...", LunchFile);\r
\r
- if (_stricmp(argv[0], CurDir) != 0)\r
- {\r
- *Pos = 0;\r
- SetCurrentDirectoryA(LunchFile);\r
- }\r
- }\r
+ if (g_os_param_reserved[0] == 4)\r
+ {\r
+ Log("Open cmd for debug ...");\r
+ sprintf_s(LunchFile, sizeof(LunchFile), "%s", "cmd.exe");\r
+ }\r
\r
-#ifdef VTOY_32\r
- Log("######## VentoyJump 32bit [%d] ##########", id);\r
-#else\r
- Log("######## VentoyJump 64bit [%d] ##########", id);\r
-#endif\r
+ Log("Backup log at this point");\r
+ CopyFileA(LOG_FILE, "X:\\Windows\\ventoy.backup", TRUE);\r
\r
- Log("argc = %d", argc);\r
- for (i = 0; i < argc; i++)\r
- {\r
- Log("argv[%d]=<%s>", i, argv[i]);\r
- if (i > 0)\r
- {\r
- strcat_s(CallParam, sizeof(CallParam), " ");\r
- strcat_s(CallParam, sizeof(CallParam), argv[i]);\r
- }\r
- }\r
+ CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
\r
- if (Pos && *Pos == 0)\r
- {\r
- Log("Old current directory = <%s>", CurDir);\r
- Log("New current directory = <%s>", LunchFile);\r
- }\r
- else\r
+ for (i = 0; rc && i < 1800; i++)\r
{\r
- GetCurrentDirectoryA(sizeof(CurDir), CurDir);\r
- Log("Current directory = <%s>", CurDir);\r
+ Log("Ventoy hook failed, now wait and retry ...");\r
+ Sleep(1000);\r
+ rc = VentoyHook(&g_os_param);\r
}\r
\r
- GetStartupInfoA(&Si);\r
+ Log("Wait process...");\r
+ WaitForSingleObject(Pi.hProcess, INFINITE);\r
\r
- memset(LunchFile, 0, sizeof(LunchFile));\r
+ Log("vtoyjump finished");\r
+ return 0;\r
+}\r
\r
- if (strstr(argv[0], "vtoyjump.exe"))\r
- {\r
- rc = VentoyJumpWimboot(argc, argv, LunchFile);\r
- }\r
- else\r
+static void VentoyToUpper(CHAR *str)\r
+{\r
+ int i;\r
+ for (i = 0; str[i]; i++)\r
{\r
- rc = VentoyJump(argc, argv, LunchFile);\r
+ str[i] = (CHAR)toupper(str[i]);\r
}\r
+}\r
\r
- Log("id=%d LunchFile=<%s> CallParam=<%s>", id, LunchFile, CallParam);\r
+int main(int argc, char **argv)\r
+{\r
+ int i;\r
+ STARTUPINFOA Si;\r
+ PROCESS_INFORMATION Pi;\r
+ CHAR CurDir[MAX_PATH];\r
+ CHAR NewArgv0[MAX_PATH];\r
+ CHAR CallParam[1024] = { 0 };\r
\r
- if (id == 1 && _stricmp(argv[0], "PECMD.EXE") == 0 && _stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0)\r
- {\r
- MUTEX_LOCK(g_vtoyins_mutex);\r
- id = ventoy_get_instance_id(VTOY_PID_FILE);\r
- MUTEX_UNLOCK(g_vtoyins_mutex);\r
+ g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK");\r
+ g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK");\r
\r
- Log("Current instance id is: %d", id);\r
+ Log("######## VentoyJump %dbit ##########", g_system_bit);\r
\r
- if (id == 2)\r
- {\r
- #ifdef VTOY_REJUMP_SUPPORTED\r
- if (g_PecmdHasCmdLine)\r
- {\r
- ReJump = TRUE;\r
- CopyFileA("PECMD.EXE", "ventoy\\WinLogon.exe", TRUE);\r
- }\r
- #endif\r
+ GetCurrentDirectoryA(sizeof(CurDir), CurDir);\r
+ Log("Current directory is <%s>", CurDir);\r
+ \r
+ GetModuleFileNameA(NULL, g_prog_full_path, MAX_PATH);\r
+ split_path_name(g_prog_full_path, g_prog_dir, g_prog_name);\r
\r
- MoveFileA("PECMD.EXE", "PECMD_BACK.EXE");\r
- CopyFileA("ventoy\\PECMD.EXE", "PECMD.EXE", TRUE); \r
- sprintf_s(LunchFile, sizeof(LunchFile), "%s", "PECMD.EXE");\r
- Log("Move original PECMD.EXE <%s>", LunchFile);\r
- }\r
- else\r
- {\r
- Log("%d instance started, don't move PECMD.EXE", id);\r
- }\r
- }\r
+ Log("EXE path: <%s> dir:<%s> name:<%s>", g_prog_full_path, g_prog_dir, g_prog_name);\r
\r
- if (g_os_param_reserved[0] == 3)\r
- {\r
- Log("Open log for debug ...");\r
- sprintf_s(LunchFile, sizeof(LunchFile), "%s", "notepad.exe ventoy.log");\r
- }\r
- else\r
- {\r
- if (CallParam[0])\r
+ if (_stricmp(g_prog_name, "WinLogon.exe") == 0)\r
+ {\r
+ Log("This time is rejump back ...");\r
+ \r
+ strcpy_s(g_prog_full_path, sizeof(g_prog_full_path), argv[1]);\r
+ split_path_name(g_prog_full_path, g_prog_dir, g_prog_name);\r
+\r
+ return real_main(argc - 1, argv + 1);\r
+ }\r
+ else if (_stricmp(g_prog_name, "PECMD.exe") == 0)\r
+ {\r
+ strcpy_s(NewArgv0, sizeof(NewArgv0), g_prog_dir);\r
+ VentoyToUpper(NewArgv0);\r
+ \r
+ if (NULL == strstr(NewArgv0, "SYSTEM32") && IsFileExist(ORG_PECMD_BK_PATH))\r
{\r
- strcat_s(LunchFile, sizeof(LunchFile), CallParam);\r
+ Log("Just call original pecmd.exe");\r
+ strcpy_s(CallParam, sizeof(CallParam), ORG_PECMD_PATH);\r
}\r
- else if (NULL == strstr(LunchFile, "setup.exe"))\r
+ else\r
{\r
- Log("Not setup.exe, hide windows.");\r
- Si.dwFlags |= STARTF_USESHOWWINDOW;\r
- Si.wShowWindow = SW_HIDE;\r
- } \r
+ Log("We need to rejump for pecmd ...");\r
\r
- Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed");\r
- }\r
- \r
- Log("Now launch <%s> ...", LunchFile);\r
-\r
- if (g_os_param_reserved[0] == 4)\r
- {\r
- Log("Open cmd for debug ...");\r
- sprintf_s(LunchFile, sizeof(LunchFile), "%s", "cmd.exe");\r
- }\r
+ ventoy_check_create_directory();\r
+ CopyFileA(g_prog_full_path, "ventoy\\WinLogon.exe", TRUE);\r
\r
-#ifdef VTOY_REJUMP_SUPPORTED\r
- if (ReJump)\r
- {\r
- sprintf_s(CallParam, sizeof(CallParam), "ventoy\\WinLogon.exe%s", LunchFile + strlen("PECMD.EXE"));\r
- Log("Now rejump to pecmd.exe <%s> ...", CallParam);\r
+ sprintf_s(CallParam, sizeof(CallParam), "ventoy\\WinLogon.exe %s", g_prog_full_path);\r
+ }\r
+ \r
+ for (i = 1; i < argc; i++)\r
+ {\r
+ strcat_s(CallParam, sizeof(CallParam), " ");\r
+ strcat_s(CallParam, sizeof(CallParam), argv[i]);\r
+ }\r
\r
- CreateProcessA(NULL, CallParam, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+ Log("Now rejump to <%s> ...", CallParam);\r
+ GetStartupInfoA(&Si);\r
+ CreateProcessA(NULL, CallParam, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
\r
- Log("Wait rejump process...");\r
- WaitForSingleObject(Pi.hProcess, INFINITE);\r
- Log("rejump finished");\r
- return 0;\r
- }\r
-#else\r
- (void)ReJump;\r
-#endif\r
+ Log("Wait rejump process...");\r
+ WaitForSingleObject(Pi.hProcess, INFINITE);\r
+ Log("rejump finished");\r
+ return 0;\r
+ }\r
+ else\r
+ {\r
+ Log("We don't need to rejump ...");\r
\r
- CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+ strcpy_s(NewArgv0, sizeof(NewArgv0), g_prog_full_path);\r
+ argv[0] = NewArgv0;\r
\r
- for (i = 0; rc && i < 1800; i++)\r
- {\r
- Log("Ventoy hook failed, now wait and retry ...");\r
- Sleep(1000);\r
- rc = VentoyHook(&g_os_param);\r
- }\r
+ return real_main(argc, argv);\r
+ }\r
+}\r
\r
- Log("Wait process...");\r
- WaitForSingleObject(Pi.hProcess, INFINITE);\r
\r
- Log("vtoyjump finished");\r
- return 0;\r
-}\r