static HANDLE g_vtoylog_mutex = NULL;\r
static HANDLE g_vtoyins_mutex = NULL;\r
\r
+static BOOL g_wimboot_mode = FALSE;\r
+\r
static DWORD g_vtoy_disk_drive;\r
\r
static CHAR g_prog_full_path[MAX_PATH];\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 WIMBOOT_FILE "X:\\Windows\\system32\\vtoy_wimboot"\r
+#define WIMBOOT_DONE "X:\\Windows\\system32\\vtoy_wimboot_done"\r
+\r
#define AUTO_RUN_BAT "X:\\VentoyAutoRun.bat"\r
#define AUTO_RUN_LOG "X:\\VentoyAutoRun.log"\r
\r
#define VTOY_AUTO_FILE "X:\\_vtoy_auto_install"\r
\r
-#define WINPESHL_INI "X:\\Windows\\system32\\winpeshl.ini"\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
+ 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
return 0;\r
}\r
\r
+static void TrimString(CHAR *String, BOOL TrimLeft)\r
+{\r
+ CHAR *Pos1 = String;\r
+ CHAR *Pos2 = String;\r
+ size_t Len = strlen(String);\r
+\r
+ while (Len > 0)\r
+ {\r
+ if (String[Len - 1] != ' ' && String[Len - 1] != '\t')\r
+ {\r
+ break;\r
+ }\r
+ String[Len - 1] = 0;\r
+ Len--;\r
+ }\r
+\r
+ if (TrimLeft)\r
+ { \r
+ while (*Pos1 == ' ' || *Pos1 == '\t')\r
+ {\r
+ Pos1++;\r
+ }\r
+\r
+ while (*Pos1)\r
+ {\r
+ *Pos2++ = *Pos1++;\r
+ }\r
+ *Pos2++ = 0;\r
+ }\r
+\r
+ return;\r
+}\r
\r
void Log(const char *Fmt, ...)\r
{\r
- va_list Arg;\r
- int Len = 0;\r
- FILE *File = NULL;\r
- SYSTEMTIME Sys;\r
- char szBuf[1024];\r
+ va_list Arg;\r
+ int Len = 0;\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] [%u] ",\r
- Sys.wYear, Sys.wMonth, Sys.wDay,\r
- Sys.wHour, Sys.wMinute, Sys.wSecond,\r
+ GetLocalTime(&Sys);\r
+ Len += sprintf_s(szBuf, sizeof(szBuf),\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, 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
+ va_start(Arg, Fmt);\r
+ Len += vsnprintf_s(szBuf + Len, sizeof(szBuf)-Len, sizeof(szBuf)-Len, Fmt, Arg);\r
+ va_end(Arg);\r
\r
MUTEX_LOCK(g_vtoylog_mutex);\r
\r
\r
static int LoadNtDriver(const char *DrvBinPath)\r
{\r
- int i;\r
- int rc = 0;\r
- BOOL Ret;\r
- DWORD Status;\r
- SC_HANDLE hServiceMgr;\r
- SC_HANDLE hService;\r
- char name[256] = { 0 };\r
-\r
- for (i = (int)strlen(DrvBinPath) - 1; i >= 0; i--)\r
- {\r
- if (DrvBinPath[i] == '\\' || DrvBinPath[i] == '/')\r
- {\r
- sprintf_s(name, sizeof(name), "%s", DrvBinPath + i + 1);\r
- break;\r
- }\r
- }\r
-\r
- Log("Load NT driver: %s %s", DrvBinPath, name);\r
-\r
- hServiceMgr = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);\r
- if (hServiceMgr == NULL)\r
- {\r
- Log("OpenSCManager failed Error:%u", GetLastError());\r
- return 1;\r
- }\r
-\r
- Log("OpenSCManager OK");\r
-\r
- hService = CreateServiceA(hServiceMgr,\r
- name,\r
- name,\r
- SERVICE_ALL_ACCESS,\r
- SERVICE_KERNEL_DRIVER,\r
- SERVICE_DEMAND_START,\r
- SERVICE_ERROR_NORMAL,\r
- DrvBinPath,\r
- NULL, NULL, NULL, NULL, NULL);\r
- if (hService == NULL)\r
- {\r
- Status = GetLastError();\r
- if (Status != ERROR_IO_PENDING && Status != ERROR_SERVICE_EXISTS)\r
- {\r
- Log("CreateService failed v %u", Status);\r
- CloseServiceHandle(hServiceMgr);\r
- return 1;\r
- }\r
-\r
- hService = OpenServiceA(hServiceMgr, name, SERVICE_ALL_ACCESS);\r
- if (hService == NULL)\r
- {\r
- Log("OpenService failed %u", Status);\r
- CloseServiceHandle(hServiceMgr);\r
- return 1;\r
- }\r
- }\r
-\r
- Log("CreateService imdisk OK");\r
-\r
- Ret = StartServiceA(hService, 0, NULL);\r
- if (Ret)\r
- {\r
- Log("StartService OK");\r
- }\r
- else\r
- {\r
- Status = GetLastError();\r
- if (Status == ERROR_SERVICE_ALREADY_RUNNING)\r
- {\r
- rc = 0;\r
- }\r
- else\r
- {\r
- Log("StartService error %u", Status);\r
- rc = 1;\r
- }\r
- }\r
-\r
- CloseServiceHandle(hService);\r
- CloseServiceHandle(hServiceMgr);\r
-\r
- Log("Load NT driver %s", rc ? "failed" : "success");\r
-\r
- return rc;\r
+ int i;\r
+ int rc = 0;\r
+ BOOL Ret;\r
+ DWORD Status;\r
+ SC_HANDLE hServiceMgr;\r
+ SC_HANDLE hService;\r
+ char name[256] = { 0 };\r
+\r
+ for (i = (int)strlen(DrvBinPath) - 1; i >= 0; i--)\r
+ {\r
+ if (DrvBinPath[i] == '\\' || DrvBinPath[i] == '/')\r
+ {\r
+ sprintf_s(name, sizeof(name), "%s", DrvBinPath + i + 1);\r
+ break;\r
+ }\r
+ }\r
+\r
+ Log("Load NT driver: %s %s", DrvBinPath, name);\r
+\r
+ hServiceMgr = OpenSCManagerA(NULL, NULL, SC_MANAGER_ALL_ACCESS);\r
+ if (hServiceMgr == NULL)\r
+ {\r
+ Log("OpenSCManager failed Error:%u", GetLastError());\r
+ return 1;\r
+ }\r
+\r
+ Log("OpenSCManager OK");\r
+\r
+ hService = CreateServiceA(hServiceMgr,\r
+ name,\r
+ name,\r
+ SERVICE_ALL_ACCESS,\r
+ SERVICE_KERNEL_DRIVER,\r
+ SERVICE_DEMAND_START,\r
+ SERVICE_ERROR_NORMAL,\r
+ DrvBinPath,\r
+ NULL, NULL, NULL, NULL, NULL);\r
+ if (hService == NULL)\r
+ {\r
+ Status = GetLastError();\r
+ if (Status != ERROR_IO_PENDING && Status != ERROR_SERVICE_EXISTS)\r
+ {\r
+ Log("CreateService failed v %u", Status);\r
+ CloseServiceHandle(hServiceMgr);\r
+ return 1;\r
+ }\r
+\r
+ hService = OpenServiceA(hServiceMgr, name, SERVICE_ALL_ACCESS);\r
+ if (hService == NULL)\r
+ {\r
+ Log("OpenService failed %u", Status);\r
+ CloseServiceHandle(hServiceMgr);\r
+ return 1;\r
+ }\r
+ }\r
+\r
+ Log("CreateService imdisk OK");\r
+\r
+ Ret = StartServiceA(hService, 0, NULL);\r
+ if (Ret)\r
+ {\r
+ Log("StartService OK");\r
+ }\r
+ else\r
+ {\r
+ Status = GetLastError();\r
+ if (Status == ERROR_SERVICE_ALREADY_RUNNING)\r
+ {\r
+ rc = 0;\r
+ }\r
+ else\r
+ {\r
+ Log("StartService error %u", Status);\r
+ rc = 1;\r
+ }\r
+ }\r
+\r
+ CloseServiceHandle(hService);\r
+ CloseServiceHandle(hServiceMgr);\r
+\r
+ Log("Load NT driver %s", rc ? "failed" : "success");\r
+\r
+ return rc;\r
}\r
\r
static int ReadWholeFile2Buf(const char *Fullpath, void **Data, DWORD *Size)\r
{\r
- int rc = 1;\r
- DWORD FileSize;\r
- DWORD dwSize;\r
- HANDLE Handle;\r
- BYTE *Buffer = NULL;\r
+ int rc = 1;\r
+ DWORD FileSize;\r
+ DWORD dwSize;\r
+ HANDLE Handle;\r
+ BYTE *Buffer = NULL;\r
\r
- Log("ReadWholeFile2Buf <%s>", Fullpath);\r
+ Log("ReadWholeFile2Buf <%s>", Fullpath);\r
\r
- Handle = CreateFileA(Fullpath, 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 file<%s>, error:%u", Fullpath, GetLastError());\r
- goto End;\r
- }\r
+ Handle = CreateFileA(Fullpath, 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 file<%s>, error:%u", Fullpath, GetLastError());\r
+ goto End;\r
+ }\r
\r
- FileSize = SetFilePointer(Handle, 0, NULL, FILE_END);\r
+ FileSize = SetFilePointer(Handle, 0, NULL, FILE_END);\r
\r
- Buffer = malloc(FileSize);\r
- if (!Buffer)\r
- {\r
- Log("Failed to alloc memory size:%u", FileSize);\r
- goto End;\r
- }\r
+ Buffer = malloc(FileSize);\r
+ if (!Buffer)\r
+ {\r
+ Log("Failed to alloc memory size:%u", FileSize);\r
+ goto End;\r
+ }\r
\r
- SetFilePointer(Handle, 0, NULL, FILE_BEGIN);\r
- if (!ReadFile(Handle, Buffer, FileSize, &dwSize, NULL))\r
- {\r
- Log("ReadFile failed, dwSize:%u error:%u", dwSize, GetLastError());\r
- goto End;\r
- }\r
+ SetFilePointer(Handle, 0, NULL, FILE_BEGIN);\r
+ if (!ReadFile(Handle, Buffer, FileSize, &dwSize, NULL))\r
+ {\r
+ Log("ReadFile failed, dwSize:%u error:%u", dwSize, GetLastError());\r
+ goto End;\r
+ }\r
\r
- *Data = Buffer;\r
- *Size = FileSize;\r
+ *Data = Buffer;\r
+ *Size = FileSize;\r
\r
- Log("Success read file size:%u", FileSize);\r
+ Log("Success read file size:%u", FileSize);\r
\r
- rc = 0;\r
+ rc = 0;\r
\r
End:\r
- SAFE_CLOSE_HANDLE(Handle);\r
+ SAFE_CLOSE_HANDLE(Handle);\r
\r
- return rc;\r
+ return rc;\r
}\r
\r
static BOOL CheckPeHead(BYTE *Buffer, DWORD Size, DWORD Offset)\r
{\r
- UINT32 PeOffset;\r
+ UINT32 PeOffset;\r
BYTE *Head = NULL;\r
DWORD End;\r
ventoy_windows_data *pdata = NULL;\r
}\r
}\r
\r
- if (Head[0] != 'M' || Head[1] != 'Z')\r
- {\r
- return FALSE;\r
- }\r
+ if (Head[0] != 'M' || Head[1] != 'Z')\r
+ {\r
+ return FALSE;\r
+ }\r
\r
- PeOffset = *(UINT32 *)(Head + 60);\r
- if (*(UINT32 *)(Head + PeOffset) != 0x00004550)\r
- {\r
- return FALSE;\r
- }\r
+ PeOffset = *(UINT32 *)(Head + 60);\r
+ if (*(UINT32 *)(Head + PeOffset) != 0x00004550)\r
+ {\r
+ return FALSE;\r
+ }\r
\r
- return TRUE;\r
+ return TRUE;\r
}\r
\r
\r
static BOOL CheckOsParam(ventoy_os_param *param)\r
{\r
- UINT32 i;\r
- BYTE Sum = 0;\r
-\r
- if (memcmp(¶m->guid, &g_ventoy_guid, sizeof(ventoy_guid)))\r
- {\r
- return FALSE;\r
- }\r
-\r
- for (i = 0; i < sizeof(ventoy_os_param); i++)\r
- {\r
- Sum += *((BYTE *)param + i);\r
- }\r
- \r
- if (Sum)\r
- {\r
- return FALSE;\r
- }\r
-\r
- if (param->vtoy_img_location_addr % 4096)\r
- {\r
- return FALSE;\r
- }\r
-\r
- return TRUE;\r
+ UINT32 i;\r
+ BYTE Sum = 0;\r
+\r
+ if (memcmp(¶m->guid, &g_ventoy_guid, sizeof(ventoy_guid)))\r
+ {\r
+ return FALSE;\r
+ }\r
+\r
+ for (i = 0; i < sizeof(ventoy_os_param); i++)\r
+ {\r
+ Sum += *((BYTE *)param + i);\r
+ }\r
+ \r
+ if (Sum)\r
+ {\r
+ return FALSE;\r
+ }\r
+\r
+ if (param->vtoy_img_location_addr % 4096)\r
+ {\r
+ return FALSE;\r
+ }\r
+\r
+ return TRUE;\r
}\r
\r
static int SaveBuffer2File(const char *Fullpath, void *Buffer, DWORD Length)\r
{\r
- int rc = 1;\r
- DWORD dwSize;\r
- HANDLE Handle;\r
+ int rc = 1;\r
+ DWORD dwSize;\r
+ HANDLE Handle;\r
\r
- Log("SaveBuffer2File <%s> len:%u", Fullpath, Length);\r
+ Log("SaveBuffer2File <%s> len:%u", Fullpath, Length);\r
\r
- Handle = CreateFileA(Fullpath, GENERIC_READ | GENERIC_WRITE,\r
- FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_NEW, 0, 0);\r
- if (Handle == INVALID_HANDLE_VALUE)\r
- {\r
- Log("Could not create new file, error:%u", GetLastError());\r
- goto End;\r
- }\r
+ Handle = CreateFileA(Fullpath, GENERIC_READ | GENERIC_WRITE,\r
+ FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_NEW, 0, 0);\r
+ if (Handle == INVALID_HANDLE_VALUE)\r
+ {\r
+ Log("Could not create new file, error:%u", GetLastError());\r
+ goto End;\r
+ }\r
\r
- WriteFile(Handle, Buffer, Length, &dwSize, NULL);\r
+ WriteFile(Handle, Buffer, Length, &dwSize, NULL);\r
\r
- rc = 0;\r
+ rc = 0;\r
\r
End:\r
- SAFE_CLOSE_HANDLE(Handle);\r
+ SAFE_CLOSE_HANDLE(Handle);\r
\r
- return rc;\r
+ return rc;\r
}\r
\r
static int IsUTF8Encode(const char *src)\r
\r
static BOOL IsFileExist(const char *Fmt, ...)\r
{\r
- va_list Arg;\r
- HANDLE hFile;\r
- DWORD Attr;\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
+ 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
+ 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
{\r
hFile = CreateFileA(FilePathA, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);\r
}\r
- if (INVALID_HANDLE_VALUE == hFile)\r
- {\r
+ if (INVALID_HANDLE_VALUE == hFile)\r
+ {\r
goto out;\r
- }\r
+ }\r
\r
- CloseHandle(hFile);\r
+ CloseHandle(hFile);\r
\r
if (UTF8)\r
{\r
{\r
Attr = GetFileAttributesA(FilePathA);\r
}\r
- \r
+ \r
if (Attr & FILE_ATTRIBUTE_DIRECTORY)\r
{\r
goto out;\r
\r
static int GetPhyDiskUUID(const char LogicalDrive, UINT8 *UUID, UINT32 *DiskSig, DISK_EXTENT *DiskExtent)\r
{\r
- BOOL Ret;\r
- DWORD dwSize;\r
- HANDLE Handle;\r
- VOLUME_DISK_EXTENTS DiskExtents;\r
- CHAR PhyPath[128];\r
- UINT8 SectorBuf[512];\r
-\r
- Log("GetPhyDiskUUID %C", LogicalDrive);\r
-\r
- sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\%C:", LogicalDrive);\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 1;\r
- }\r
-\r
- Ret = DeviceIoControl(Handle,\r
- IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,\r
- NULL,\r
- 0,\r
- &DiskExtents,\r
- (DWORD)(sizeof(DiskExtents)),\r
- (LPDWORD)&dwSize,\r
- NULL);\r
- if (!Ret || DiskExtents.NumberOfDiskExtents == 0)\r
- {\r
- Log("DeviceIoControl IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS failed, error:%u", GetLastError());\r
- CloseHandle(Handle);\r
- return 1;\r
- }\r
- CloseHandle(Handle);\r
+ BOOL Ret;\r
+ DWORD dwSize;\r
+ HANDLE Handle;\r
+ VOLUME_DISK_EXTENTS DiskExtents;\r
+ CHAR PhyPath[128];\r
+ UINT8 SectorBuf[512];\r
+\r
+ Log("GetPhyDiskUUID %C", LogicalDrive);\r
+\r
+ sprintf_s(PhyPath, sizeof(PhyPath), "\\\\.\\%C:", LogicalDrive);\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 1;\r
+ }\r
+\r
+ Ret = DeviceIoControl(Handle,\r
+ IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,\r
+ NULL,\r
+ 0,\r
+ &DiskExtents,\r
+ (DWORD)(sizeof(DiskExtents)),\r
+ (LPDWORD)&dwSize,\r
+ NULL);\r
+ if (!Ret || DiskExtents.NumberOfDiskExtents == 0)\r
+ {\r
+ Log("DeviceIoControl IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS failed, error:%u", GetLastError());\r
+ CloseHandle(Handle);\r
+ return 1;\r
+ }\r
+ CloseHandle(Handle);\r
\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
- if (Handle == INVALID_HANDLE_VALUE)\r
- {\r
- Log("Could not open the disk<%s>, error:%u", PhyPath, GetLastError());\r
- return 1;\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 1;\r
- }\r
- \r
- memcpy(UUID, SectorBuf + 0x180, 16);\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
+ if (Handle == INVALID_HANDLE_VALUE)\r
+ {\r
+ Log("Could not open the disk<%s>, error:%u", PhyPath, GetLastError());\r
+ return 1;\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 1;\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
+ CloseHandle(Handle);\r
+ return 0;\r
}\r
\r
static int VentoyMountAnywhere(HANDLE Handle)\r
\r
static BOOL VentoyAPINeedMountY(const char *IsoPath)\r
{\r
- (void)IsoPath;\r
+ (void)IsoPath;\r
\r
/* TBD */\r
return FALSE;\r
DriveYFree = 1;\r
}\r
\r
- if (DriveYFree && VentoyAPINeedMountY(IsoPath))\r
+ if (DriveYFree && VentoyAPINeedMountY(IsoPath))\r
{\r
return VentoyMountY(Handle);\r
}\r
int VentoyMountISOByAPI(const char *IsoPath)\r
{\r
int i;\r
- HANDLE Handle;\r
- DWORD Status;\r
- WCHAR wFilePath[512] = { 0 };\r
- VIRTUAL_STORAGE_TYPE StorageType;\r
- OPEN_VIRTUAL_DISK_PARAMETERS OpenParameters;\r
+ HANDLE Handle;\r
+ DWORD Status;\r
+ WCHAR wFilePath[512] = { 0 };\r
+ VIRTUAL_STORAGE_TYPE StorageType;\r
+ OPEN_VIRTUAL_DISK_PARAMETERS OpenParameters;\r
\r
- Log("VentoyMountISOByAPI <%s>", IsoPath);\r
+ Log("VentoyMountISOByAPI <%s>", IsoPath);\r
\r
if (IsUTF8Encode(IsoPath))\r
{\r
MultiByteToWideChar(CP_ACP, 0, IsoPath, (int)strlen(IsoPath), wFilePath, (int)(sizeof(wFilePath) / sizeof(WCHAR)));\r
}\r
\r
- memset(&StorageType, 0, sizeof(StorageType));\r
- memset(&OpenParameters, 0, sizeof(OpenParameters));\r
- \r
- OpenParameters.Version = OPEN_VIRTUAL_DISK_VERSION_1;\r
+ memset(&StorageType, 0, sizeof(StorageType));\r
+ memset(&OpenParameters, 0, sizeof(OpenParameters));\r
+ \r
+ OpenParameters.Version = OPEN_VIRTUAL_DISK_VERSION_1;\r
\r
for (i = 0; i < 10; i++)\r
{\r
}\r
}\r
\r
- if (Status != ERROR_SUCCESS)\r
+ if (Status != ERROR_SUCCESS)\r
+ {\r
+ return 1;\r
+ }\r
+\r
+ Log("OpenVirtualDisk success");\r
+\r
+ Status = VentoyAttachVirtualDisk(Handle, IsoPath);\r
+ if (Status != ERROR_SUCCESS)\r
+ {\r
+ Log("Failed to attach virtual disk ErrorCode:%u", Status);\r
+ CloseHandle(Handle);\r
+ return 1;\r
+ }\r
+\r
+ Log("VentoyAttachVirtualDisk success");\r
+\r
+ CloseHandle(Handle);\r
+ return 0;\r
+}\r
+\r
+\r
+static HANDLE g_FatPhyDrive;\r
+static UINT64 g_Part2StartSec;\r
+\r
+static int CopyFileFromFatDisk(const CHAR* SrcFile, const CHAR *DstFile)\r
+{\r
+ int rc = 1;\r
+ int size = 0;\r
+ char *buf = NULL;\r
+ void *flfile = NULL;\r
+\r
+ Log("CopyFileFromFatDisk (%s)==>(%s)", SrcFile, DstFile);\r
+\r
+ flfile = fl_fopen(SrcFile, "rb");\r
+ if (flfile)\r
+ {\r
+ fl_fseek(flfile, 0, SEEK_END);\r
+ size = (int)fl_ftell(flfile);\r
+ fl_fseek(flfile, 0, SEEK_SET);\r
+\r
+ buf = (char *)malloc(size);\r
+ if (buf)\r
+ {\r
+ fl_fread(buf, 1, size, flfile);\r
+\r
+ rc = 0;\r
+ SaveBuffer2File(DstFile, buf, size);\r
+ free(buf);\r
+ }\r
+\r
+ fl_fclose(flfile);\r
+ }\r
+\r
+ return rc;\r
+}\r
+\r
+static int VentoyFatDiskRead(uint32 Sector, uint8 *Buffer, uint32 SectorCount)\r
+{\r
+ DWORD dwSize;\r
+ BOOL bRet;\r
+ DWORD ReadSize;\r
+ LARGE_INTEGER liCurrentPosition;\r
+\r
+ liCurrentPosition.QuadPart = Sector + g_Part2StartSec;\r
+ liCurrentPosition.QuadPart *= 512;\r
+ SetFilePointerEx(g_FatPhyDrive, liCurrentPosition, &liCurrentPosition, FILE_BEGIN);\r
+\r
+ ReadSize = (DWORD)(SectorCount * 512);\r
+\r
+ bRet = ReadFile(g_FatPhyDrive, Buffer, ReadSize, &dwSize, NULL);\r
+ if (bRet == FALSE || dwSize != ReadSize)\r
+ {\r
+ Log("ReadFile error bRet:%u WriteSize:%u dwSize:%u ErrCode:%u", bRet, ReadSize, dwSize, GetLastError());\r
+ }\r
+\r
+ return 1;\r
+}\r
+\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
+ while (Mask)\r
+ {\r
+ if ((Drives & Mask) == 0)\r
+ {\r
+ break;\r
+ }\r
+\r
+ Letter--;\r
+ Mask >>= 1;\r
+ }\r
+\r
+ return Letter;\r
+}\r
+\r
+UINT64 GetVentoyEfiPartStartSector(HANDLE hDrive)\r
+{\r
+ BOOL bRet;\r
+ DWORD dwSize; \r
+ MBR_HEAD MBR; \r
+ VTOY_GPT_INFO *pGpt = NULL;\r
+ UINT64 StartSector = 0;\r
+\r
+ SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);\r
+\r
+ bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL);\r
+ Log("Read MBR Ret:%u Size:%u code:%u", bRet, dwSize, LASTERR);\r
+\r
+ if ((!bRet) || (dwSize != sizeof(MBR)))\r
+ {\r
+ 0;\r
+ }\r
+\r
+ if (MBR.PartTbl[0].FsFlag == 0xEE)\r
+ {\r
+ Log("GPT partition style");\r
+\r
+ pGpt = malloc(sizeof(VTOY_GPT_INFO));\r
+ if (!pGpt)\r
+ {\r
+ return 0;\r
+ }\r
+\r
+ SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);\r
+ bRet = ReadFile(hDrive, pGpt, sizeof(VTOY_GPT_INFO), &dwSize, NULL); \r
+ if ((!bRet) || (dwSize != sizeof(VTOY_GPT_INFO)))\r
+ {\r
+ Log("Failed to read gpt info %d %u %d", bRet, dwSize, LASTERR);\r
+ return 0;\r
+ }\r
+\r
+ StartSector = pGpt->PartTbl[1].StartLBA;\r
+ free(pGpt);\r
+ }\r
+ else\r
+ {\r
+ Log("MBR partition style");\r
+ StartSector = MBR.PartTbl[1].StartSectorId;\r
+ }\r
+\r
+ Log("GetVentoyEfiPart StartSector: %llu", StartSector);\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
+ DWORD dwBytes;\r
+ HANDLE hDrive;\r
+ CHAR PhyPath[MAX_PATH];\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
+ Log("Could not open the disk<%s>, error:%u", PhyPath, GetLastError());\r
+ goto End;\r
+ }\r
+\r
+ bRet = DeviceIoControl(hDrive, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &LengthInfo, sizeof(LengthInfo), &dwBytes, NULL);\r
+ if (!bRet)\r
{\r
- return 1;\r
+ Log("Could not get phy disk %s size, error:%u", PhyPath, GetLastError());\r
+ goto End;\r
}\r
\r
- Log("OpenVirtualDisk success");\r
+ g_FatPhyDrive = hDrive;\r
+ g_Part2StartSec = GetVentoyEfiPartStartSector(hDrive);\r
\r
- Status = VentoyAttachVirtualDisk(Handle, IsoPath);\r
- if (Status != ERROR_SUCCESS)\r
- {\r
- Log("Failed to attach virtual disk ErrorCode:%u", Status);\r
- CloseHandle(Handle);\r
- return 1;\r
- }\r
+ Log("Parse FAT fs...");\r
\r
- Log("VentoyAttachVirtualDisk success");\r
+ fl_init();\r
\r
- CloseHandle(Handle);\r
- return 0;\r
-}\r
+ if (0 == fl_attach_media(VentoyFatDiskRead, NULL))\r
+ {\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
+ CopyFileFromFatDisk("/ventoy/imdisk/64/imdisk.cpl", "ventoy\\imdisk.cpl");\r
+ }\r
+ else\r
+ {\r
+ CopyFileFromFatDisk("/ventoy/imdisk/32/imdisk.sys", "ventoy\\imdisk.sys");\r
+ CopyFileFromFatDisk("/ventoy/imdisk/32/imdisk.exe", "ventoy\\imdisk.exe");\r
+ CopyFileFromFatDisk("/ventoy/imdisk/32/imdisk.cpl", "ventoy\\imdisk.cpl");\r
+ }\r
+ \r
+ GetCurrentDirectoryA(sizeof(PhyPath), PhyPath);\r
+ strcat_s(PhyPath, sizeof(PhyPath), "\\ventoy\\imdisk.sys");\r
+\r
+ if (LoadNtDriver(PhyPath) == 0)\r
+ {\r
+ VentoyRunImdisk(IsoPath, "ventoy\\imdisk.exe");\r
+ rc = 0;\r
+ }\r
+ }\r
+ fl_shutdown();\r
\r
+End:\r
\r
-static HANDLE g_FatPhyDrive;\r
-static UINT64 g_Part2StartSec;\r
+ SAFE_CLOSE_HANDLE(hDrive);\r
\r
-static int CopyFileFromFatDisk(const CHAR* SrcFile, const CHAR *DstFile)\r
-{\r
- int rc = 1;\r
- int size = 0;\r
- char *buf = NULL;\r
- void *flfile = NULL;\r
-\r
- Log("CopyFileFromFatDisk (%s)==>(%s)", SrcFile, DstFile);\r
-\r
- flfile = fl_fopen(SrcFile, "rb");\r
- if (flfile)\r
- {\r
- fl_fseek(flfile, 0, SEEK_END);\r
- size = (int)fl_ftell(flfile);\r
- fl_fseek(flfile, 0, SEEK_SET);\r
-\r
- buf = (char *)malloc(size);\r
- if (buf)\r
- {\r
- fl_fread(buf, 1, size, flfile);\r
-\r
- rc = 0;\r
- SaveBuffer2File(DstFile, buf, size);\r
- free(buf);\r
- }\r
-\r
- fl_fclose(flfile);\r
- }\r
-\r
- return rc;\r
+ return rc;\r
}\r
\r
-static int VentoyFatDiskRead(uint32 Sector, uint8 *Buffer, uint32 SectorCount)\r
+static int GetIsoId(CONST CHAR *IsoPath, IsoId *ids)\r
{\r
- DWORD dwSize;\r
- BOOL bRet;\r
- DWORD ReadSize;\r
- LARGE_INTEGER liCurrentPosition;\r
+ int i;\r
+ int n = 0;\r
+ HANDLE hFile;\r
+ DWORD dwSize = 0;\r
+ BOOL bRet[8];\r
\r
- liCurrentPosition.QuadPart = Sector + g_Part2StartSec;\r
- liCurrentPosition.QuadPart *= 512;\r
- SetFilePointerEx(g_FatPhyDrive, liCurrentPosition, &liCurrentPosition, FILE_BEGIN);\r
+ hFile = CreateFileA(IsoPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);\r
+ if (hFile == INVALID_HANDLE_VALUE)\r
+ {\r
+ return 1;\r
+ }\r
\r
- ReadSize = (DWORD)(SectorCount * 512);\r
+ SetFilePointer(hFile, 2048 * 16 + 8, NULL, FILE_BEGIN);\r
+ bRet[n++] = ReadFile(hFile, ids->SystemId, 32, &dwSize, NULL);\r
+ \r
+ SetFilePointer(hFile, 2048 * 16 + 40, NULL, FILE_BEGIN);\r
+ bRet[n++] = ReadFile(hFile, ids->VolumeId, 32, &dwSize, NULL);\r
\r
- bRet = ReadFile(g_FatPhyDrive, Buffer, ReadSize, &dwSize, NULL);\r
- if (bRet == FALSE || dwSize != ReadSize)\r
- {\r
- Log("ReadFile error bRet:%u WriteSize:%u dwSize:%u ErrCode:%u", bRet, ReadSize, dwSize, GetLastError());\r
- }\r
+ SetFilePointer(hFile, 2048 * 16 + 318, NULL, FILE_BEGIN);\r
+ bRet[n++] = ReadFile(hFile, ids->PulisherId, 128, &dwSize, NULL);\r
\r
- return 1;\r
-}\r
+ SetFilePointer(hFile, 2048 * 16 + 446, NULL, FILE_BEGIN);\r
+ bRet[n++] = ReadFile(hFile, ids->PreparerId, 128, &dwSize, NULL);\r
\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
+ CloseHandle(hFile);\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
- while (Mask)\r
- {\r
- if ((Drives & Mask) == 0)\r
- {\r
- break;\r
- }\r
-\r
- Letter--;\r
- Mask >>= 1;\r
- }\r
-\r
- return Letter;\r
-}\r
\r
-UINT64 GetVentoyEfiPartStartSector(HANDLE hDrive)\r
-{\r
- BOOL bRet;\r
- DWORD dwSize; \r
- MBR_HEAD MBR; \r
- VTOY_GPT_INFO *pGpt = NULL;\r
- UINT64 StartSector = 0;\r
-\r
- SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);\r
-\r
- bRet = ReadFile(hDrive, &MBR, sizeof(MBR), &dwSize, NULL);\r
- Log("Read MBR Ret:%u Size:%u code:%u", bRet, dwSize, LASTERR);\r
-\r
- if ((!bRet) || (dwSize != sizeof(MBR)))\r
- {\r
- 0;\r
- }\r
-\r
- if (MBR.PartTbl[0].FsFlag == 0xEE)\r
- {\r
- Log("GPT partition style");\r
-\r
- pGpt = malloc(sizeof(VTOY_GPT_INFO));\r
- if (!pGpt)\r
- {\r
- return 0;\r
- }\r
-\r
- SetFilePointer(hDrive, 0, NULL, FILE_BEGIN);\r
- bRet = ReadFile(hDrive, pGpt, sizeof(VTOY_GPT_INFO), &dwSize, NULL); \r
- if ((!bRet) || (dwSize != sizeof(VTOY_GPT_INFO)))\r
- {\r
- Log("Failed to read gpt info %d %u %d", bRet, dwSize, LASTERR);\r
- return 0;\r
- }\r
-\r
- StartSector = pGpt->PartTbl[1].StartLBA;\r
- free(pGpt);\r
- }\r
- else\r
- {\r
- Log("MBR partition style");\r
- StartSector = MBR.PartTbl[1].StartSectorId;\r
- }\r
-\r
- Log("GetVentoyEfiPart StartSector: %llu", StartSector);\r
- return StartSector;\r
-}\r
+ for (i = 0; i < n; i++)\r
+ {\r
+ if (bRet[i] == FALSE)\r
+ {\r
+ return 1;\r
+ }\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
+ TrimString(ids->SystemId, FALSE);\r
+ TrimString(ids->VolumeId, FALSE);\r
+ TrimString(ids->PulisherId, FALSE);\r
+ TrimString(ids->PreparerId, FALSE);\r
+\r
+ Log("ISO ID: System<%s> Volume<%s> Pulisher<%s> Preparer<%s>", \r
+ ids->SystemId, ids->VolumeId, ids->PulisherId, ids->PreparerId);\r
+\r
+ return 0;\r
}\r
\r
-int VentoyMountISOByImdisk(const char *IsoPath, DWORD PhyDrive)\r
+static int CheckSkipMountIso(CONST CHAR *IsoPath)\r
{\r
- int rc = 1;\r
- BOOL bRet;\r
- DWORD dwBytes;\r
- HANDLE hDrive;\r
- CHAR PhyPath[MAX_PATH];\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
- Log("Could not open the disk<%s>, error:%u", PhyPath, GetLastError());\r
- goto End;\r
- }\r
-\r
- bRet = DeviceIoControl(hDrive, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &LengthInfo, sizeof(LengthInfo), &dwBytes, NULL);\r
- if (!bRet)\r
- {\r
- Log("Could not get phy disk %s size, error:%u", PhyPath, GetLastError());\r
- goto End;\r
- }\r
-\r
- g_FatPhyDrive = hDrive;\r
- g_Part2StartSec = GetVentoyEfiPartStartSector(hDrive);\r
-\r
- Log("Parse FAT fs...");\r
-\r
- fl_init();\r
-\r
- if (0 == fl_attach_media(VentoyFatDiskRead, NULL))\r
- {\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
- CopyFileFromFatDisk("/ventoy/imdisk/64/imdisk.cpl", "ventoy\\imdisk.cpl");\r
- }\r
- else\r
- {\r
- CopyFileFromFatDisk("/ventoy/imdisk/32/imdisk.sys", "ventoy\\imdisk.sys");\r
- CopyFileFromFatDisk("/ventoy/imdisk/32/imdisk.exe", "ventoy\\imdisk.exe");\r
- CopyFileFromFatDisk("/ventoy/imdisk/32/imdisk.cpl", "ventoy\\imdisk.cpl");\r
- }\r
- \r
- GetCurrentDirectoryA(sizeof(PhyPath), PhyPath);\r
- strcat_s(PhyPath, sizeof(PhyPath), "\\ventoy\\imdisk.sys");\r
-\r
- if (LoadNtDriver(PhyPath) == 0)\r
- {\r
- VentoyRunImdisk(IsoPath, "ventoy\\imdisk.exe");\r
- rc = 0;\r
- }\r
- }\r
- fl_shutdown();\r
+ BOOL InRoot = FALSE;\r
+ int slashcnt = 0;\r
+ CONST CHAR *p = NULL;\r
+ IsoId ID;\r
\r
-End:\r
+ // C:\\xxx\r
+ for (p = IsoPath; *p; p++)\r
+ {\r
+ if (*p == '\\' || *p == '/')\r
+ {\r
+ slashcnt++;\r
+ }\r
+ }\r
+\r
+ if (slashcnt == 2)\r
+ {\r
+ InRoot = TRUE;\r
+ }\r
\r
- SAFE_CLOSE_HANDLE(hDrive);\r
+ memset(&ID, 0, sizeof(ID));\r
+ if (GetIsoId(IsoPath, &ID))\r
+ {\r
+ return 0;\r
+ }\r
+\r
+ //Bob.Ombs.Modified.Win10PEx64.iso will auto find ISO file in root, so we can skip the mount\r
+ if (InRoot && strcmp(ID.VolumeId, "Modified-Win10PEx64") == 0)\r
+ {\r
+ return 1;\r
+ }\r
\r
- return rc;\r
+ return 0;\r
}\r
\r
static int MountIsoFile(CONST CHAR *IsoPath, DWORD PhyDrive)\r
{\r
+ if (CheckSkipMountIso(IsoPath))\r
+ {\r
+ Log("Skip mount ISO file for <%s>", IsoPath);\r
+ return 0;\r
+ }\r
+\r
if (IsWindows8OrGreater())\r
{\r
Log("This is Windows 8 or latter...");\r
}\r
\r
g_FatPhyDrive = hDrive;\r
- g_Part2StartSec = GetVentoyEfiPartStartSector(hDrive);\r
+ g_Part2StartSec = GetVentoyEfiPartStartSector(hDrive);\r
\r
Log("Parse FAT fs...");\r
\r
\r
if (0 == fl_attach_media(VentoyFatDiskRead, NULL))\r
{\r
- if (g_system_bit == 64)\r
+ if (g_system_bit == 64)\r
{\r
CopyFileFromFatDisk("/ventoy/7z/64/7za.xz", "ventoy\\7za.xz");\r
}\r
char szLine[4096];\r
\r
fopen_s(&fp, script, "r");\r
- if (!fp)\r
- {\r
- return 0;\r
- }\r
+ if (!fp)\r
+ {\r
+ return 0;\r
+ }\r
\r
szLine[0] = szLine[4095] = 0;\r
\r
return 0;\r
}\r
\r
-static void TrimString(CHAR *String)\r
-{\r
- CHAR *Pos1 = String;\r
- CHAR *Pos2 = String;\r
- size_t Len = strlen(String);\r
-\r
- while (Len > 0)\r
- {\r
- if (String[Len - 1] != ' ' && String[Len - 1] != '\t')\r
- {\r
- break;\r
- }\r
- String[Len - 1] = 0;\r
- Len--;\r
- }\r
-\r
- while (*Pos1 == ' ' || *Pos1 == '\t')\r
- {\r
- Pos1++;\r
- }\r
-\r
- while (*Pos1)\r
- {\r
- *Pos2++ = *Pos1++;\r
- }\r
- *Pos2++ = 0;\r
-\r
- return;\r
-}\r
-\r
static int GetRegDwordValue(HKEY Key, LPCSTR SubKey, LPCSTR ValueName, DWORD *pValue)\r
{\r
HKEY hKey;\r
if (pDevDesc->VendorIdOffset)\r
{\r
safe_strcpy(pDiskInfo[i].VendorId, (char *)pDevDesc + pDevDesc->VendorIdOffset);\r
- TrimString(pDiskInfo[i].VendorId);\r
+ TrimString(pDiskInfo[i].VendorId, TRUE);\r
}\r
\r
if (pDevDesc->ProductIdOffset)\r
{\r
safe_strcpy(pDiskInfo[i].ProductId, (char *)pDevDesc + pDevDesc->ProductIdOffset);\r
- TrimString(pDiskInfo[i].ProductId);\r
+ TrimString(pDiskInfo[i].ProductId, TRUE);\r
}\r
\r
if (pDevDesc->ProductRevisionOffset)\r
{\r
safe_strcpy(pDiskInfo[i].ProductRev, (char *)pDevDesc + pDevDesc->ProductRevisionOffset);\r
- TrimString(pDiskInfo[i].ProductRev);\r
+ TrimString(pDiskInfo[i].ProductRev, TRUE);\r
}\r
\r
if (pDevDesc->SerialNumberOffset)\r
{\r
safe_strcpy(pDiskInfo[i].SerialNumber, (char *)pDevDesc + pDevDesc->SerialNumberOffset);\r
- TrimString(pDiskInfo[i].SerialNumber);\r
+ TrimString(pDiskInfo[i].SerialNumber, TRUE);\r
}\r
\r
free(pDevDesc);\r
}\r
\r
fopen_s(&fp, script, "r");\r
- if (!fp)\r
- {\r
+ if (!fp)\r
+ {\r
free(pDiskInfo);\r
- return 0;\r
- }\r
+ return 0;\r
+ }\r
\r
fopen_s(&fout, tmpfile, "w+");\r
- if (!fout)\r
- {\r
- fclose(fp);\r
+ if (!fout)\r
+ {\r
+ fclose(fp);\r
free(pDiskInfo);\r
- return 0;\r
- }\r
+ return 0;\r
+ }\r
\r
szLine[0] = szLine[4095] = 0;\r
\r
DWORD VtoyDiskNum;\r
UINT32 DiskSig;\r
UINT32 VtoySig;\r
- DISK_EXTENT DiskExtent;\r
+ DISK_EXTENT DiskExtent;\r
DISK_EXTENT VtoyDiskExtent;\r
- UINT8 UUID[16];\r
- CHAR IsoPath[MAX_PATH];\r
+ UINT8 UUID[16];\r
+ CHAR IsoPath[MAX_PATH];\r
\r
- Log("VentoyHook Path:<%s>", param->vtoy_img_path);\r
+ Log("VentoyHook Path:<%s>", param->vtoy_img_path);\r
\r
if (IsUTF8Encode(param->vtoy_img_path))\r
{\r
}\r
\r
if (find == FALSE)\r
- {\r
- Log("Failed to find ISO file");\r
- return 1;\r
- }\r
+ {\r
+ Log("Failed to find ISO file");\r
+ return 1;\r
+ }\r
\r
- Log("Find ISO file <%s>", IsoPath);\r
+ Log("Find ISO file <%s>", IsoPath);\r
\r
//Find VtoyLetter in Vlnk Mode\r
if (g_os_param_reserved[6] == 1)\r
return len;\r
}\r
\r
-int VentoyJumpWimboot(INT argc, CHAR **argv, CHAR *LunchFile)\r
-{\r
- int rc = 1;\r
- char *buf = NULL;\r
- DWORD size = 0;\r
- DWORD Pos;\r
-\r
- Log("VentoyJumpWimboot %dbit", g_system_bit);\r
-\r
- sprintf_s(LunchFile, MAX_PATH, "X:\\setup.exe");\r
-\r
- ReadWholeFile2Buf("wimboot.data", &buf, &size);\r
- Log("wimboot.data size:%d", size);\r
-\r
- memcpy(&g_os_param, buf, sizeof(ventoy_os_param));\r
- memcpy(&g_windows_data, buf + sizeof(ventoy_os_param), sizeof(ventoy_windows_data));\r
- ExtractWindowsDataFile(buf + sizeof(ventoy_os_param));\r
- memcpy(g_os_param_reserved, g_os_param.vtoy_reserved, sizeof(g_os_param_reserved));\r
-\r
- if (g_os_param_reserved[0] == 1)\r
- {\r
- Log("break here for debug .....");\r
- goto End;\r
- }\r
-\r
- // convert / to \\ \r
- for (Pos = 0; Pos < sizeof(g_os_param.vtoy_img_path) && g_os_param.vtoy_img_path[Pos]; Pos++)\r
- {\r
- if (g_os_param.vtoy_img_path[Pos] == '/')\r
- {\r
- g_os_param.vtoy_img_path[Pos] = '\\';\r
- }\r
- }\r
-\r
- if (g_os_param_reserved[0] == 2)\r
- {\r
- Log("skip hook for debug .....");\r
- rc = 0;\r
- goto End;\r
- }\r
-\r
- rc = VentoyHook(&g_os_param);\r
-\r
-End:\r
-\r
- if (buf)\r
- {\r
- free(buf);\r
- }\r
-\r
- return rc;\r
-}\r
-\r
static int ventoy_check_create_directory(void)\r
{\r
if (IsDirExist("ventoy"))\r
\r
int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)\r
{\r
- int rc = 1;\r
+ int rc = 1;\r
int stat = 0;\r
int exlen = 0;\r
- DWORD Pos;\r
- DWORD PeStart;\r
+ DWORD Pos;\r
+ DWORD PeStart;\r
DWORD FileSize;\r
DWORD LockStatus = 0;\r
- BYTE *Buffer = NULL; \r
- CHAR ExeFileName[MAX_PATH];\r
+ BYTE *Buffer = NULL; \r
+ CHAR ExeFileName[MAX_PATH];\r
\r
- sprintf_s(ExeFileName, sizeof(ExeFileName), "%s", argv[0]);\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
+ sprintf_s(ExeFileName, sizeof(ExeFileName), "%s", argv[0]);\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, IsFileExist("%s", ExeFileName) ? "YES" : "NO");\r
- }\r
+ Log("File %s exist ? %s", ExeFileName, IsFileExist("%s", ExeFileName) ? "YES" : "NO");\r
+ }\r
\r
- if (ReadWholeFile2Buf(ExeFileName, (void **)&Buffer, &FileSize))\r
- {\r
- goto End;\r
- }\r
- \r
- Log("VentoyJump %dbit", g_system_bit);\r
+ if (ReadWholeFile2Buf(ExeFileName, (void **)&Buffer, &FileSize))\r
+ {\r
+ goto End;\r
+ }\r
+ \r
+ Log("VentoyJump %dbit", g_system_bit);\r
\r
MUTEX_LOCK(g_vtoyins_mutex);\r
stat = ventoy_check_create_directory();\r
goto End;\r
}\r
\r
- for (PeStart = 0; PeStart < FileSize; PeStart += 16)\r
- {\r
- if (CheckOsParam((ventoy_os_param *)(Buffer + PeStart)) && \r
+ for (PeStart = 0; PeStart < FileSize; PeStart += 16)\r
+ {\r
+ if (CheckOsParam((ventoy_os_param *)(Buffer + PeStart)) && \r
CheckPeHead(Buffer, FileSize, PeStart + sizeof(ventoy_os_param)))\r
- {\r
- Log("Find os pararm at %u", PeStart);\r
+ {\r
+ Log("Find os pararm at %u", PeStart);\r
\r
memcpy(&g_os_param, Buffer + PeStart, sizeof(ventoy_os_param));\r
memcpy(&g_windows_data, Buffer + PeStart + sizeof(ventoy_os_param), sizeof(ventoy_windows_data)); \r
memcpy(g_os_param_reserved, g_os_param.vtoy_reserved, sizeof(g_os_param_reserved));\r
\r
if (g_os_param_reserved[0] == 1)\r
- {\r
- Log("break here for debug .....");\r
- goto End;\r
- }\r
+ {\r
+ Log("break here for debug .....");\r
+ goto End;\r
+ }\r
\r
- // convert / to \\ \r
+ // convert / to \\ \r
for (Pos = 0; Pos < sizeof(g_os_param.vtoy_img_path) && g_os_param.vtoy_img_path[Pos]; Pos++)\r
- {\r
+ {\r
if (g_os_param.vtoy_img_path[Pos] == '/')\r
- {\r
+ {\r
g_os_param.vtoy_img_path[Pos] = '\\';\r
- }\r
- }\r
+ }\r
+ }\r
\r
- PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data) + exlen;\r
- sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName));\r
+ PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data) + exlen;\r
+ sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName));\r
\r
MUTEX_LOCK(g_vtoyins_mutex);\r
if (IsFileExist("%s", LunchFile))\r
goto End;\r
}\r
\r
- SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart);\r
+ SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart);\r
MUTEX_UNLOCK(g_vtoyins_mutex);\r
\r
- break;\r
- }\r
- }\r
+ break;\r
+ }\r
+ }\r
\r
- if (PeStart >= FileSize)\r
- {\r
- Log("OS param not found");\r
- goto End;\r
- }\r
+ if (PeStart >= FileSize)\r
+ {\r
+ Log("OS param not found");\r
+ goto End;\r
+ }\r
\r
if (g_os_param_reserved[0] == 2)\r
{\r
\r
End:\r
\r
- if (Buffer)\r
- {\r
- free(Buffer);\r
- }\r
+ if (Buffer)\r
+ {\r
+ free(Buffer);\r
+ }\r
\r
- return rc;\r
+ return rc;\r
}\r
\r
\r
int real_main(int argc, char **argv)\r
{\r
- int i = 0;\r
- int rc = 0;\r
- int wimboot = 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("#### real_main #### argc = %d", argc);\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("#### 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
+ Log("program name: <%s>", g_prog_name);\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
- GetStartupInfoA(&Si);\r
- memset(LunchFile, 0, sizeof(LunchFile));\r
-\r
- if (strstr(argv[0], "vtoyjump.exe"))\r
- {\r
- wimboot = 1;\r
- DeleteFileA(WINPESHL_INI);\r
- IsFileExist(WINPESHL_INI);\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 (_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
- 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
- sprintf_s(LunchFile, sizeof(LunchFile), "%s", g_prog_full_path);\r
- Log("Final lunchFile is <%s>", LunchFile);\r
- }\r
- else if (wimboot && IsFileExist(WINPESHL_INI))\r
- {\r
- sprintf_s(LunchFile, MAX_PATH, "X:\\Windows\\system32\\winpeshl.exe");\r
- Log("winpeshl.ini updated, now recall winpeshl.exe");\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
+ GetStartupInfoA(&Si);\r
+ memset(LunchFile, 0, sizeof(LunchFile));\r
+\r
+ rc = VentoyJump(argc, argv, LunchFile);\r
+\r
+ Log("LunchFile=<%s> CallParam=<%s>", LunchFile, 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
+ 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
+ sprintf_s(LunchFile, sizeof(LunchFile), "%s", g_prog_full_path);\r
+ Log("Final lunchFile is <%s>", LunchFile);\r
}\r
else\r
{\r
Log("We don't need to recover original <%s>", g_prog_name);\r
}\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
- 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
+ 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
+ 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
\r
Log("Backup log at this point");\r
CopyFileA(LOG_FILE, "X:\\Windows\\ventoy.backup", TRUE);\r
\r
- CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+ CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\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
+ 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
- Log("Wait process...");\r
- WaitForSingleObject(Pi.hProcess, INFINITE);\r
+ Log("Wait process...");\r
+ WaitForSingleObject(Pi.hProcess, INFINITE);\r
\r
- Log("vtoyjump finished");\r
- return 0;\r
+ Log("vtoyjump finished");\r
+ return 0;\r
}\r
\r
static void VentoyToUpper(CHAR *str)\r
}\r
}\r
\r
+static int vtoy_remove_duplicate_file(char *File)\r
+{\r
+ CHAR szCmd[MAX_PATH];\r
+ CHAR NewFile[MAX_PATH];\r
+ STARTUPINFOA Si;\r
+ PROCESS_INFORMATION Pi;\r
+\r
+ Log("<1> Copy New file", File);\r
+ sprintf_s(NewFile, sizeof(NewFile), "%s_NEW", File);\r
+ CopyFileA(File, NewFile, FALSE);\r
+\r
+ Log("<2> Remove file <%s>", File);\r
+ GetStartupInfoA(&Si);\r
+ Si.dwFlags |= STARTF_USESHOWWINDOW;\r
+ Si.wShowWindow = SW_HIDE;\r
+ sprintf_s(szCmd, sizeof(szCmd), "cmd.exe /c del /F /Q %s", File);\r
+ CreateProcessA(NULL, szCmd, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+ WaitForSingleObject(Pi.hProcess, INFINITE);\r
+\r
+ Log("<3> Copy back file <%s>", File);\r
+ MoveFileA(NewFile, File);\r
+\r
+ return 0;\r
+}\r
+\r
int main(int argc, char **argv)\r
{\r
- int i;\r
- STARTUPINFOA Si;\r
- PROCESS_INFORMATION Pi;\r
- CHAR CurDir[MAX_PATH];\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
+ CHAR CallParam[1024] = { 0 };\r
\r
- g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK");\r
- g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK");\r
+ g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK");\r
+ g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK");\r
\r
- Log("######## VentoyJump %dbit ##########", g_system_bit);\r
+ Log("######## VentoyJump %dbit ##########", g_system_bit);\r
\r
- GetCurrentDirectoryA(sizeof(CurDir), CurDir);\r
- Log("Current directory is <%s>", CurDir);\r
- \r
- GetModuleFileNameA(NULL, g_prog_full_path, MAX_PATH);\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
- Log("EXE path: <%s> dir:<%s> name:<%s>", g_prog_full_path, g_prog_dir, g_prog_name);\r
+ Log("EXE path: <%s> dir:<%s> name:<%s>", g_prog_full_path, g_prog_dir, g_prog_name);\r
+\r
+ if (IsFileExist(WIMBOOT_FILE))\r
+ {\r
+ Log("This is wimboot mode ...");\r
+ g_wimboot_mode = TRUE;\r
+\r
+ if (!IsFileExist(WIMBOOT_DONE))\r
+ {\r
+ vtoy_remove_duplicate_file(g_prog_full_path);\r
+ SaveBuffer2File(WIMBOOT_DONE, g_prog_full_path, 1);\r
+ }\r
+ }\r
+ else\r
+ {\r
+ Log("This is normal mode ...");\r
+ }\r
\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
+ 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
+ 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
\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
- 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
- {\r
- Log("We don't need to rejump ...");\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
+ 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
+ {\r
+ Log("We don't need to rejump ...");\r
\r
ventoy_check_create_directory();\r
strcpy_s(NewArgv0, sizeof(NewArgv0), g_prog_full_path);\r
argv[0] = NewArgv0;\r
\r
- return real_main(argc, argv);\r
- }\r
+ return real_main(argc, argv);\r
+ }\r
}\r
\r
-\r