return MultiByteToWideChar(CP_UTF8, 0, src, -1, dst, size + 1);\r
}\r
\r
-static BOOL IsPathExist(BOOL Dir, const char *Fmt, ...)\r
+static BOOL IsDirExist(const char *Fmt, ...)\r
+{\r
+ va_list Arg; \r
+ DWORD Attr;\r
+ int UTF8 = 0;\r
+ CHAR FilePathA[MAX_PATH];\r
+ WCHAR FilePathW[MAX_PATH];\r
+\r
+ va_start(Arg, Fmt);\r
+ vsnprintf_s(FilePathA, sizeof(FilePathA), sizeof(FilePathA), Fmt, Arg);\r
+ va_end(Arg);\r
+\r
+ UTF8 = IsUTF8Encode(FilePathA);\r
+\r
+ if (UTF8)\r
+ {\r
+ Utf8ToUtf16(FilePathA, FilePathW);\r
+ Attr = GetFileAttributesW(FilePathW);\r
+ }\r
+ else\r
+ {\r
+ Attr = GetFileAttributesA(FilePathA);\r
+ }\r
+ \r
+ if (Attr != INVALID_FILE_ATTRIBUTES && (Attr & FILE_ATTRIBUTE_DIRECTORY))\r
+ {\r
+ return TRUE;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+static BOOL IsFileExist(const char *Fmt, ...)\r
{\r
va_list Arg;\r
HANDLE hFile;\r
DWORD Attr;\r
+ BOOL bRet = FALSE;\r
int UTF8 = 0;\r
CHAR FilePathA[MAX_PATH];\r
WCHAR FilePathW[MAX_PATH];\r
}\r
if (INVALID_HANDLE_VALUE == hFile)\r
{\r
- return FALSE;\r
+ goto out;\r
}\r
\r
CloseHandle(hFile);\r
Attr = GetFileAttributesA(FilePathA);\r
}\r
\r
- if (Dir)\r
- {\r
- if ((Attr & FILE_ATTRIBUTE_DIRECTORY) == 0)\r
- {\r
- return FALSE;\r
- }\r
- }\r
- else\r
- {\r
- if (Attr & FILE_ATTRIBUTE_DIRECTORY)\r
- {\r
- return FALSE;\r
- }\r
- }\r
+ if (Attr & FILE_ATTRIBUTE_DIRECTORY)\r
+ {\r
+ goto out;\r
+ }\r
\r
- return TRUE;\r
+ bRet = TRUE;\r
+\r
+out:\r
+ Log("File <%s> %s", FilePathA, (bRet ? "exist" : "NOT exist"));\r
+ return bRet;\r
}\r
\r
static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, DISK_EXTENT *DiskExtent)\r
return 0;\r
}\r
\r
+static int VentoyMountAnywhere(HANDLE Handle)\r
+{\r
+ DWORD Status;\r
+ ATTACH_VIRTUAL_DISK_PARAMETERS AttachParameters;\r
+\r
+ Log("VentoyMountAnywhere");\r
+\r
+ memset(&AttachParameters, 0, sizeof(AttachParameters));\r
+ AttachParameters.Version = ATTACH_VIRTUAL_DISK_VERSION_1;\r
+\r
+ Status = AttachVirtualDisk(Handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, 0, &AttachParameters, NULL);\r
+ if (Status != ERROR_SUCCESS)\r
+ {\r
+ Log("Failed to attach virtual disk ErrorCode:%u", Status);\r
+ return 1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int VentoyMountY(HANDLE Handle)\r
+{\r
+ int i;\r
+ BOOL bRet = FALSE;\r
+ DWORD Status;\r
+ DWORD physicalDriveNameSize;\r
+ CHAR *Pos = NULL;\r
+ WCHAR physicalDriveName[MAX_PATH];\r
+ CHAR physicalDriveNameA[MAX_PATH];\r
+ CHAR cdromDriveName[MAX_PATH];\r
+ ATTACH_VIRTUAL_DISK_PARAMETERS AttachParameters;\r
+\r
+ Log("VentoyMountY");\r
+\r
+ memset(&AttachParameters, 0, sizeof(AttachParameters));\r
+ AttachParameters.Version = ATTACH_VIRTUAL_DISK_VERSION_1;\r
+\r
+ Status = AttachVirtualDisk(Handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | ATTACH_VIRTUAL_DISK_FLAG_NO_DRIVE_LETTER | ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, 0, &AttachParameters, NULL);\r
+ if (Status != ERROR_SUCCESS)\r
+ {\r
+ Log("Failed to attach virtual disk ErrorCode:%u", Status);\r
+ return 1;\r
+ }\r
+\r
+ memset(physicalDriveName, 0, sizeof(physicalDriveName));\r
+ memset(physicalDriveNameA, 0, sizeof(physicalDriveNameA));\r
+\r
+ physicalDriveNameSize = MAX_PATH;\r
+ Status = GetVirtualDiskPhysicalPath(Handle, &physicalDriveNameSize, physicalDriveName);\r
+ if (Status != ERROR_SUCCESS)\r
+ {\r
+ Log("Failed GetVirtualDiskPhysicalPath ErrorCode:%u", Status);\r
+ return 1;\r
+ }\r
+\r
+ for (i = 0; physicalDriveName[i]; i++)\r
+ {\r
+ physicalDriveNameA[i] = toupper((CHAR)(physicalDriveName[i]));\r
+ }\r
+\r
+ Log("physicalDriveNameA=<%s>", physicalDriveNameA);\r
+\r
+ Pos = strstr(physicalDriveNameA, "CDROM");\r
+ if (!Pos)\r
+ {\r
+ Log("Not cdrom phy drive");\r
+ return 1;\r
+ }\r
+\r
+ sprintf_s(cdromDriveName, sizeof(cdromDriveName), "\\Device\\%s", Pos);\r
+ Log("cdromDriveName=<%s>", cdromDriveName);\r
+\r
+ for (i = 0; i < 3 && (bRet == FALSE); i++)\r
+ {\r
+ Sleep(1000);\r
+ bRet = DefineDosDeviceA(DDD_RAW_TARGET_PATH, "Y:", cdromDriveName);\r
+ Log("DefineDosDeviceA %s", bRet ? "success" : "failed");\r
+ }\r
+\r
+ return bRet ? 0 : 1;\r
+}\r
+\r
+static BOOL VentoyNeedMountY(const char *IsoPath)\r
+{\r
+ /* TBD */\r
+ return FALSE;\r
+}\r
+\r
+static int VentoyAttachVirtualDisk(HANDLE Handle, const char *IsoPath)\r
+{\r
+ int DriveYFree;\r
+ DWORD Drives;\r
+ \r
+ Drives = GetLogicalDrives();\r
+ if ((1 << 24) & Drives)\r
+ {\r
+ Log("Y: is occupied");\r
+ DriveYFree = 0;\r
+ }\r
+ else\r
+ {\r
+ Log("Y: is free now");\r
+ DriveYFree = 1;\r
+ }\r
+\r
+ if (DriveYFree && VentoyNeedMountY(IsoPath))\r
+ {\r
+ return VentoyMountY(Handle);\r
+ }\r
+ else\r
+ {\r
+ return VentoyMountAnywhere(Handle);\r
+ }\r
+}\r
+\r
int VentoyMountISOByAPI(const char *IsoPath)\r
{\r
HANDLE Handle;\r
WCHAR wFilePath[512] = { 0 };\r
VIRTUAL_STORAGE_TYPE StorageType;\r
OPEN_VIRTUAL_DISK_PARAMETERS OpenParameters;\r
- ATTACH_VIRTUAL_DISK_PARAMETERS AttachParameters;\r
\r
Log("VentoyMountISOByAPI <%s>", IsoPath);\r
\r
\r
memset(&StorageType, 0, sizeof(StorageType));\r
memset(&OpenParameters, 0, sizeof(OpenParameters));\r
- memset(&AttachParameters, 0, sizeof(AttachParameters));\r
-\r
+ \r
OpenParameters.Version = OPEN_VIRTUAL_DISK_VERSION_1;\r
- AttachParameters.Version = ATTACH_VIRTUAL_DISK_VERSION_1;\r
\r
Status = OpenVirtualDisk(&StorageType, wFilePath, VIRTUAL_DISK_ACCESS_READ, 0, &OpenParameters, &Handle);\r
if (Status != ERROR_SUCCESS)\r
\r
Log("OpenVirtualDisk success");\r
\r
- Status = AttachVirtualDisk(Handle, NULL, ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY | ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME, 0, &AttachParameters, NULL);\r
+ Status = VentoyAttachVirtualDisk(Handle, IsoPath);\r
if (Status != ERROR_SUCCESS)\r
{\r
Log("Failed to attach virtual disk ErrorCode:%u", Status);\r
return 1;\r
}\r
\r
+ Log("VentoyAttachVirtualDisk success");\r
+\r
CloseHandle(Handle);\r
return 0;\r
}\r
Drives = GetLogicalDrives();\r
while (Drives)\r
{\r
- if ((Drives & 0x01) && IsPathExist(FALSE, "%C:\\ventoy\\ventoy.cpio", Letter))\r
+ if ((Drives & 0x01) && IsFileExist("%C:\\ventoy\\ventoy.cpio", Letter))\r
{\r
Log("File %C:\\ventoy\\ventoy.cpio exist", Letter);\r
\r
if (Drives & 0x01)\r
{\r
sprintf_s(IsoPath, sizeof(IsoPath), "%C:\\%s", Letter, param->vtoy_img_path);\r
- if (IsPathExist(FALSE, "%s", IsoPath))\r
+ if (IsFileExist("%s", IsoPath))\r
{\r
Log("File exist under %C:", Letter);\r
if (GetPhyDiskUUID(Letter, UUID, &DiskExtent) == 0)\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
- if (IsPathExist(FALSE, "%s", IsoPath))\r
+ if (IsFileExist("%s", IsoPath))\r
{\r
Log("use auto install script %s...", IsoPath);\r
ProcessUnattendedInstallation(IsoPath);\r
if (g_windows_data.injection_archive[0])\r
{\r
sprintf_s(IsoPath, sizeof(IsoPath), "%C:%s", Letter, g_windows_data.injection_archive);\r
- if (IsPathExist(FALSE, "%s", IsoPath))\r
+ if (IsFileExist("%s", IsoPath))\r
{\r
Log("decompress injection archive %s...", IsoPath);\r
DecompressInjectionArchive(IsoPath, DiskExtent.DiskNumber);\r
CHAR ExeFileName[MAX_PATH];\r
\r
sprintf_s(ExeFileName, sizeof(ExeFileName), "%s", argv[0]);\r
- if (!IsPathExist(FALSE, "%s", ExeFileName))\r
+ if (!IsFileExist("%s", ExeFileName))\r
{\r
Log("File %s NOT exist, now try %s.exe", ExeFileName, ExeFileName);\r
sprintf_s(ExeFileName, sizeof(ExeFileName), "%s.exe", argv[0]);\r
\r
- Log("File %s exist ? %s", ExeFileName, IsPathExist(FALSE, "%s", ExeFileName) ? "YES" : "NO");\r
+ Log("File %s exist ? %s", ExeFileName, IsFileExist("%s", ExeFileName) ? "YES" : "NO");\r
}\r
\r
if (ReadWholeFile2Buf(ExeFileName, (void **)&Buffer, &FileSize))\r
g_64bit_system = IsPe64(Buffer);\r
Log("VentoyJump %dbit", g_64bit_system ? 64 : 32);\r
\r
- if (!IsPathExist(TRUE, "ventoy"))\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
\r
PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data);\r
sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName));\r
+\r
+ if (IsFileExist("%s", LunchFile))\r
+ {\r
+ Log("vtoyjump multiple call...");\r
+ rc = 0;\r
+ goto End;\r
+ }\r
+\r
SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart);\r
break;\r
}\r
return rc;\r
}\r
\r
+static int GetPecmdParam(const char *argv, char *CallParamBuf, DWORD BufLen)\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
+\r
+ Log("GetPecmdParam <%s>", argv);\r
+\r
+ *CallParamBuf = 0;\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
+\r
+ Log("dw=%lu argv=<%s>", dw, FileName);\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
+\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
+\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
+\r
+ RegCloseKey(hKey);\r
+ return 1;\r
+ }\r
+ else\r
+ {\r
+ Log("Failed to create reg key %lu", Ret);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ Log("This is NOT pecmd.exe");\r
+ }\r
+\r
+ return 0;\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
+\r
+ Log("GetWpeInitParam argc=%d", argc);\r
+\r
+ *CallParamBuf = 0;\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
+\r
+ Log("dw=%lu argv=<%s>", dw, FileName);\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
+\r
+ return 1;\r
+ }\r
+ else\r
+ {\r
+ Log("This is NOT wpeinit.exe");\r
+ }\r
+ \r
+ return 0;\r
+}\r
+\r
+\r
int main(int argc, char **argv)\r
{\r
int i = 0;\r
CHAR *Pos = NULL;\r
CHAR CurDir[MAX_PATH];\r
CHAR LunchFile[MAX_PATH];\r
+ CHAR CallParam[1024] = { 0 };\r
STARTUPINFOA Si;\r
PROCESS_INFORMATION Pi;\r
\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
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
}\r
else\r
{\r
- if (NULL == strstr(LunchFile, "setup.exe"))\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
+ } \r
+\r
Log("Ventoy jump %s ...", rc == 0 ? "success" : "failed");\r
}\r
\r
Log("Now launch <%s> ...", LunchFile);\r
- CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
\r
- while (rc)\r
+ //sprintf_s(LunchFile, sizeof(LunchFile), "%s", "cmd.exe");\r
+ CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+\r
+ for (i = 0; rc && i < 10; i++)\r
{\r
Log("Ventoy hook failed, now wait and retry ...");\r
Sleep(1000);\r
-\r
rc = VentoyHook(&g_os_param);\r
}\r
\r
- WaitForSingleObject(Pi.hProcess, INFINITE);\r
+ Log("Wait process...");\r
+ WaitForSingleObject(Pi.hProcess, INFINITE);\r
\r
+ Log("vtoyjump finished");\r
return 0;\r
}\r