#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
+#define BREAK() BreakAndLaunchCmd(__LINE__)\r
+\r
+static void BreakAndLaunchCmd(int line)\r
+{\r
+ STARTUPINFOA Si;\r
+ PROCESS_INFORMATION Pi;\r
+\r
+ Log("Break at line:%d", line);\r
+ \r
+ GetStartupInfoA(&Si);\r
+ Si.dwFlags |= STARTF_USESHOWWINDOW;\r
+ Si.wShowWindow = SW_NORMAL;\r
+\r
+ CreateProcessA(NULL, "cmd.exe", NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+ WaitForSingleObject(Pi.hProcess, INFINITE);\r
+}\r
+\r
static const char * GetFileNameInPath(const char *fullpath)\r
{\r
int i;\r
return 0;\r
}\r
\r
+static int Utf16ToUtf8(const WCHAR *src, char *dst)\r
+{\r
+ int len;\r
+ int size;\r
+\r
+ len = (int)wcslen(src) + 1;\r
+ size = WideCharToMultiByte(CP_UTF8, 0, src, len, NULL, 0, NULL, NULL);\r
+ return WideCharToMultiByte(CP_UTF8, 0, src, len, dst, size, NULL, NULL);\r
+}\r
+\r
static int Utf8ToUtf16(const char* src, WCHAR * dst)\r
{\r
int size = MultiByteToWideChar(CP_UTF8, 0, src, -1, dst, 0);\r
return rc;\r
}\r
\r
-static int VentoyRunImdisk(const char *IsoPath, const char *imdiskexe)\r
+static int VentoyRunImdisk(const char *IsoPath, const char *imdiskexe, const char *ExOpt)\r
{\r
CHAR Letter;\r
CHAR Cmdline[512];\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
+\r
+ if (ExOpt)\r
+ {\r
+ sprintf_s(Cmdline, sizeof(Cmdline), "%s -a -o ro,%s -f \"%s\" -m %C:", imdiskexe, ExOpt, IsoPath, Letter);\r
+ }\r
+ else\r
+ {\r
+ sprintf_s(Cmdline, sizeof(Cmdline), "%s -a -o ro -f \"%s\" -m %C:", imdiskexe, IsoPath, Letter);\r
+ }\r
+ \r
Log("mount iso to %C: use imdisk cmd <%s>", Letter, Cmdline);\r
\r
if (IsUTF8Encode(IsoPath))\r
\r
if (0 == VentoyCopyImdisk(PhyDrive, ImPath))\r
{\r
- VentoyRunImdisk(IsoPath, ImPath);\r
+ VentoyRunImdisk(IsoPath, ImPath, NULL);\r
rc = 0;\r
}\r
\r
return FALSE;\r
}\r
\r
+static BOOL VentoyIsLenovoRecovery(CHAR *IsoPath, CHAR *VTLRIPath)\r
+{\r
+ int n;\r
+ int UTF8 = 0;\r
+ HANDLE hFile;\r
+ DWORD Attr;\r
+ WCHAR FilePathW[MAX_PATH];\r
+\r
+ UTF8 = IsUTF8Encode(IsoPath);\r
+\r
+ if (UTF8)\r
+ {\r
+ Utf8ToUtf16(IsoPath, FilePathW);\r
+\r
+ n = (int)wcslen(FilePathW);\r
+ if (n > 4 && _wcsicmp(FilePathW + n - 4, L".iso") == 0)\r
+ {\r
+ FilePathW[n - 3] = L'V';\r
+ FilePathW[n - 2] = L'T';\r
+ FilePathW[n - 1] = L'L';\r
+ FilePathW[n - 0] = L'R';\r
+ FilePathW[n + 1] = L'I';\r
+ FilePathW[n + 2] = 0;\r
+\r
+ hFile = CreateFileW(FilePathW, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);\r
+ if (hFile != INVALID_HANDLE_VALUE)\r
+ {\r
+ CloseHandle(hFile);\r
+ Attr = GetFileAttributesW(FilePathW);\r
+\r
+ if ((Attr & FILE_ATTRIBUTE_DIRECTORY) == 0)\r
+ {\r
+ Utf16ToUtf8(FilePathW, VTLRIPath);\r
+ return TRUE;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ n = (int)strlen(IsoPath);\r
+ if (n > 4 && _stricmp(IsoPath + n - 4, ".iso") == 0)\r
+ {\r
+ IsoPath[n - 4] = 0;\r
+ sprintf_s(VTLRIPath, MAX_PATH, "%s.VTLRI", IsoPath);\r
+ IsoPath[n - 4] = '.';\r
+\r
+ if (IsFileExist(VTLRIPath))\r
+ {\r
+ return TRUE;\r
+ }\r
+ }\r
+ }\r
+ \r
+ return FALSE;\r
+}\r
+\r
+static int MountVTLRI(CHAR *ImgPath, DWORD PhyDrive)\r
+{\r
+ CHAR ImDiskPath[256];\r
+ \r
+ Log("MountVTLRI <%s> %u", ImgPath, PhyDrive);\r
+\r
+ VentoyCopyImdisk(PhyDrive, ImDiskPath);\r
+\r
+ VentoyRunImdisk(ImgPath, ImDiskPath, "rem");\r
+\r
+ return 0;\r
+}\r
\r
static int VentoyHook(ventoy_os_param *param)\r
{\r
DISK_EXTENT VtoyDiskExtent;\r
UINT8 UUID[16];\r
CHAR IsoPath[MAX_PATH];\r
+ CHAR VTLRIPath[MAX_PATH];\r
\r
Log("VentoyHook Path:<%s>", param->vtoy_img_path);\r
\r
\r
Drives = GetLogicalDrives();\r
Log("Drives before mount: 0x%x", Drives);\r
-\r
- rc = MountIsoFile(IsoPath, VtoyDiskNum);\r
+ \r
+ if (VentoyIsLenovoRecovery(IsoPath, VTLRIPath))\r
+ {\r
+ Log("This is lenovo recovery image, mount VTLRI file.");\r
+ rc = MountVTLRI(VTLRIPath, VtoyDiskNum);\r
+ }\r
+ else\r
+ {\r
+ Log("This is normal image, mount ISO file.");\r
+ rc = MountIsoFile(IsoPath, VtoyDiskNum);\r
+ }\r
\r
NewDrives = GetLogicalDrives();\r
Log("Drives after mount: 0x%x (0x%x)", NewDrives, (NewDrives ^ Drives));\r