/******************************************************************************\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
+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 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
FILE *File = NULL;\r
SYSTEMTIME Sys;\r
char szBuf[1024];\r
+ DWORD LockStatus = 0;\r
+ DWORD PID = GetCurrentProcessId();\r
\r
GetLocalTime(&Sys);\r
Len += sprintf_s(szBuf, sizeof(szBuf),\r
- "[%4d/%02d/%02d %02d:%02d:%02d.%03d] ",\r
+ "[%4d/%02d/%02d %02d:%02d:%02d.%03d] [%u] ",\r
Sys.wYear, Sys.wMonth, Sys.wDay,\r
Sys.wHour, Sys.wMinute, Sys.wSecond,\r
- Sys.wMilliseconds);\r
+ Sys.wMilliseconds, PID);\r
\r
va_start(Arg, Fmt);\r
Len += vsnprintf_s(szBuf + Len, sizeof(szBuf)-Len, sizeof(szBuf)-Len, Fmt, Arg);\r
va_end(Arg);\r
\r
- fopen_s(&File, "ventoy.log", "a+");\r
- if (File)\r
- {\r
- fwrite(szBuf, 1, Len, File);\r
- fwrite("\n", 1, 1, File);\r
- fclose(File);\r
- }\r
+ MUTEX_LOCK(g_vtoylog_mutex);\r
+\r
+ fopen_s(&File, LOG_FILE, "a+");\r
+ if (File)\r
+ {\r
+ fwrite(szBuf, 1, Len, File);\r
+ fwrite("\n", 1, 1, File);\r
+ fclose(File);\r
+ }\r
+\r
+ MUTEX_UNLOCK(g_vtoylog_mutex);\r
}\r
\r
\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
- STARTUPINFOA Si;\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
- if (IsUTF8Encode(PhyPath))\r
- {\r
- Utf8ToUtf16(PhyPath, PhyPathW);\r
- hDrive = CreateFileW(PhyPathW, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);\r
- }\r
- else\r
- {\r
- hDrive = CreateFileA(PhyPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);\r
- }\r
- \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
Log("Could not open the disk<%s>, error:%u", PhyPath, GetLastError());\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
-\r
- Log("mount iso to %C: use imdisk cmd <%s>", Letter, PhyPath);\r
-\r
- GetStartupInfoA(&Si);\r
-\r
- Si.dwFlags |= STARTF_USESHOWWINDOW;\r
- Si.wShowWindow = SW_HIDE;\r
-\r
- CreateProcessA(NULL, PhyPath, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\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.exe", "ventoy\\7za.exe");\r
+ CopyFileFromFatDisk("/ventoy/7z/64/7za.xz", "ventoy\\7za.xz");\r
+ }\r
+ else\r
+ {\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 rc;\r
}\r
\r
+static int ventoy_check_create_directory(void)\r
+{\r
+ if (IsDirExist("ventoy"))\r
+ {\r
+ Log("ventoy directory already exist");\r
+ }\r
+ else\r
+ {\r
+ Log("ventoy directory not exist, now create it.");\r
+ if (!CreateDirectoryA("ventoy", NULL))\r
+ {\r
+ Log("Failed to create ventoy directory err:%u", GetLastError());\r
+ return 1;\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)\r
{\r
int rc = 1;\r
+ int stat = 0;\r
DWORD Pos;\r
DWORD PeStart;\r
DWORD FileSize;\r
+ DWORD LockStatus = 0;\r
BYTE *Buffer = NULL; \r
CHAR ExeFileName[MAX_PATH];\r
\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
- if (IsDirExist("ventoy"))\r
+ MUTEX_LOCK(g_vtoyins_mutex);\r
+ stat = ventoy_check_create_directory();\r
+ MUTEX_UNLOCK(g_vtoyins_mutex);\r
+\r
+ if (stat != 0)\r
{\r
- Log("ventoy directory already exist");\r
+ goto End;\r
}\r
- else\r
- {\r
- Log("ventoy directory not exist, now create it.");\r
- if (!CreateDirectoryA("ventoy", NULL))\r
- {\r
- Log("Failed to create ventoy directory err:%u", GetLastError());\r
- goto End;\r
- }\r
- }\r
\r
for (PeStart = 0; PeStart < FileSize; PeStart += 16)\r
{\r
PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data);\r
sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName));\r
\r
+ MUTEX_LOCK(g_vtoyins_mutex);\r
if (IsFileExist("%s", LunchFile))\r
{\r
- Log("vtoyjump multiple call...");\r
+ Log("vtoyjump multiple call ...");\r
rc = 0;\r
+ MUTEX_UNLOCK(g_vtoyins_mutex);\r
goto End;\r
}\r
\r
SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart);\r
+ MUTEX_UNLOCK(g_vtoyins_mutex);\r
+\r
break;\r
}\r
}\r
return rc;\r
}\r
\r
-static int GetPecmdParam(const char *argv, char *CallParamBuf, DWORD BufLen)\r
+\r
+int real_main(int argc, char **argv)\r
{\r
- HKEY hKey;\r
- LSTATUS Ret;\r
- DWORD dw;\r
- DWORD Type;\r
- CHAR *Pos = NULL;\r
- CHAR CallParam[256] = { 0 };\r
- CHAR FileName[MAX_PATH];\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
- Log("GetPecmdParam <%s>", argv);\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
- *CallParamBuf = 0;\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
- strcpy_s(FileName, sizeof(FileName), argv);\r
- for (dw = 0, Pos = FileName; *Pos; Pos++)\r
- {\r
- dw++;\r
- *Pos = toupper(*Pos);\r
- }\r
+ GetStartupInfoA(&Si);\r
+ memset(LunchFile, 0, sizeof(LunchFile));\r
\r
- Log("dw=%lu argv=<%s>", dw, FileName);\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
- if (dw >= 9 && strcmp(FileName + dw - 9, "PECMD.EXE") == 0)\r
- {\r
- Log("Get parameters for pecmd.exe");\r
- Ret = RegCreateKeyEx(HKEY_LOCAL_MACHINE, "System\\Setup", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dw);\r
- if (ERROR_SUCCESS == Ret)\r
- {\r
- memset(FileName, 0, sizeof(FileName));\r
- dw = sizeof(FileName);\r
- Ret = RegQueryValueEx(hKey, "CmdLine", NULL, &Type, FileName, &dw);\r
- if (ERROR_SUCCESS == Ret && Type == REG_SZ)\r
- {\r
- strcpy_s(CallParam, sizeof(CallParam), FileName);\r
- Log("CmdLine:<%s>", CallParam);\r
+ Log("LunchFile=<%s> CallParam=<%s>", LunchFile, CallParam);\r
\r
- if (_strnicmp(CallParam, "PECMD.EXE", 9) == 0)\r
- {\r
- Pos = CallParam + 9;\r
- if (*Pos == ' ' || *Pos == '\t')\r
- {\r
- Pos++;\r
- }\r
- }\r
- else\r
- {\r
- Pos = CallParam;\r
- }\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
- Log("CmdLine2:<%s>", Pos);\r
- sprintf_s(CallParamBuf, BufLen, " %s", Pos);\r
- }\r
- else\r
- {\r
- Log("Failed to RegQueryValueEx %lu %lu", Ret, Type);\r
- }\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
- RegCloseKey(hKey);\r
- return 1;\r
- }\r
- else\r
- {\r
- Log("Failed to create reg key %lu", Ret);\r
- }\r
- }\r
+ sprintf_s(LunchFile, sizeof(LunchFile), "%s", g_prog_full_path);\r
+ Log("Final lunchFile is <%s>", LunchFile);\r
+ }\r
else\r
{\r
- Log("This is NOT pecmd.exe");\r
+ Log("We don't need to recover original <%s>", g_prog_name);\r
}\r
\r
- return 0;\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
+ {\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
-static int GetWpeInitParam(char **argv, int argc, char *CallParamBuf, DWORD BufLen)\r
-{\r
- int i;\r
- DWORD dw;\r
- CHAR *Pos = NULL;\r
- CHAR FileName[MAX_PATH];\r
+ Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed");\r
+ }\r
\r
- Log("GetWpeInitParam argc=%d", argc);\r
+ Log("Now launch <%s> ...", LunchFile);\r
\r
- *CallParamBuf = 0;\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
- strcpy_s(FileName, sizeof(FileName), argv[0]);\r
- for (dw = 0, Pos = FileName; *Pos; Pos++)\r
- {\r
- dw++;\r
- *Pos = toupper(*Pos);\r
- }\r
+ Log("Backup log at this point");\r
+ CopyFileA(LOG_FILE, "X:\\Windows\\ventoy.backup", TRUE);\r
\r
- Log("dw=%lu argv=<%s>", dw, FileName);\r
+ CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
\r
- if (dw >= 11 && strcmp(FileName + dw - 11, "WPEINIT.EXE") == 0)\r
- {\r
- Log("Get parameters for WPEINIT.EXE");\r
- for (i = 1; i < argc; i++)\r
- {\r
- strcat_s(CallParamBuf, BufLen, " ");\r
- strcat_s(CallParamBuf, BufLen, argv[i]);\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
\r
- return 1;\r
- }\r
- else\r
+ Log("Wait process...");\r
+ WaitForSingleObject(Pi.hProcess, INFINITE);\r
+\r
+ Log("vtoyjump finished");\r
+ return 0;\r
+}\r
+\r
+static void VentoyToUpper(CHAR *str)\r
+{\r
+ int i;\r
+ for (i = 0; str[i]; i++)\r
{\r
- Log("This is NOT wpeinit.exe");\r
+ str[i] = (CHAR)toupper(str[i]);\r
}\r
- \r
- return 0;\r
}\r
\r
-\r
int main(int argc, char **argv)\r
{\r
- int i = 0;\r
- int rc = 0;\r
- CHAR *Pos = NULL;\r
- CHAR CurDir[MAX_PATH];\r
- CHAR LunchFile[MAX_PATH];\r
- CHAR CallParam[1024] = { 0 };\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 (argv[0] && argv[0][0] && argv[0][1] == ':')\r
- {\r
- GetCurrentDirectoryA(sizeof(CurDir), CurDir);\r
+ g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK");\r
+ g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK");\r
\r
- strcpy_s(LunchFile, sizeof(LunchFile), argv[0]);\r
- Pos = (char *)GetFileNameInPath(LunchFile);\r
+ Log("######## VentoyJump %dbit ##########", g_system_bit);\r
\r
- strcat_s(CurDir, sizeof(CurDir), "\\");\r
- strcat_s(CurDir, sizeof(CurDir), Pos);\r
- \r
- if (_stricmp(argv[0], CurDir) != 0)\r
- {\r
- *Pos = 0;\r
- SetCurrentDirectoryA(LunchFile);\r
- }\r
- }\r
-\r
- Log("######## VentoyJump ##########");\r
- Log("argc = %d argv[0] = <%s>", argc, argv[0]);\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
- //special process for some WinPE\r
- if (_stricmp(argv[0], "WPEINIT.EXE") == 0)\r
- {\r
- GetCurrentDirectoryA(sizeof(CurDir), CurDir);\r
- if (_stricmp(CurDir, "X:\\") == 0)\r
- {\r
- Log("Set current directory to system32");\r
- SetCurrentDirectoryA("X:\\Windows\\System32");\r
- }\r
- }\r
+ Log("EXE path: <%s> dir:<%s> name:<%s>", g_prog_full_path, g_prog_dir, g_prog_name);\r
\r
- if (Pos && *Pos == 0)\r
+ if (_stricmp(g_prog_name, "WinLogon.exe") == 0)\r
{\r
- Log("Old current directory = <%s>", CurDir);\r
- Log("New current directory = <%s>", LunchFile);\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\r
+ else if (_stricmp(g_prog_name, "PECMD.exe") == 0)\r
{\r
- GetCurrentDirectoryA(sizeof(CurDir), CurDir);\r
- Log("Current directory = <%s>", CurDir);\r
- }\r
-\r
- if (0 == GetWpeInitParam(argv, argc, CallParam, sizeof(CallParam)))\r
- {\r
- GetPecmdParam(argv[0], CallParam, sizeof(CallParam));\r
- }\r
-\r
- GetStartupInfoA(&Si);\r
-\r
- memset(LunchFile, 0, sizeof(LunchFile));\r
-\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
- Log("LunchFile=<%s> CallParam=<%s>", LunchFile, CallParam);\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
+ 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
+ ventoy_check_create_directory();\r
+ CopyFileA(g_prog_full_path, "ventoy\\WinLogon.exe", TRUE);\r
\r
- //sprintf_s(LunchFile, sizeof(LunchFile), "%s", "cmd.exe");\r
- CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\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
- for (i = 0; rc && i < 10; i++)\r
- {\r
- Log("Ventoy hook failed, now wait and retry ...");\r
- Sleep(1000);\r
- rc = VentoyHook(&g_os_param);\r
- }\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 process...");\r
- WaitForSingleObject(Pi.hProcess, INFINITE);\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
- Log("vtoyjump finished");\r
- return 0;\r
+ strcpy_s(NewArgv0, sizeof(NewArgv0), g_prog_full_path);\r
+ argv[0] = NewArgv0;\r
+\r
+ return real_main(argc, argv);\r
+ }\r
}\r
+\r
+\r