mirror of https://github.com/ventoy/Ventoy.git
Compatibility improvement for some WinPE
This commit is contained in:
parent
5fea6eab7e
commit
88793d548a
|
@ -921,7 +921,7 @@ function legacy_windows_menu_func {
|
||||||
loopback loop "$1$2"
|
loopback loop "$1$2"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD"; do
|
for file in "boot/bcd" "/efi/microsoft/boot/bcd" "SSTR/BCD" "boot/bce"; do
|
||||||
vt_windows_collect_wim_patch bcd (loop)/$file
|
vt_windows_collect_wim_patch bcd (loop)/$file
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -33,6 +33,12 @@ static ventoy_windows_data g_windows_data;
|
||||||
static UINT8 g_os_param_reserved[32];
|
static UINT8 g_os_param_reserved[32];
|
||||||
static BOOL g_64bit_system = FALSE;
|
static BOOL g_64bit_system = FALSE;
|
||||||
static ventoy_guid g_ventoy_guid = VENTOY_GUID;
|
static ventoy_guid g_ventoy_guid = VENTOY_GUID;
|
||||||
|
static HANDLE g_vtoylog_mutex = NULL;
|
||||||
|
static HANDLE g_vtoyins_mutex = NULL;
|
||||||
|
|
||||||
|
#define VTOY_PID_FILE "X:\\Windows\\System32\\pidventoy"
|
||||||
|
#define MUTEX_LOCK(hmutex) if (hmutex != NULL) LockStatus = WaitForSingleObject(hmutex, INFINITE)
|
||||||
|
#define MUTEX_UNLOCK(hmutex) if (hmutex != NULL && WAIT_OBJECT_0 == LockStatus) ReleaseMutex(hmutex)
|
||||||
|
|
||||||
void Log(const char *Fmt, ...)
|
void Log(const char *Fmt, ...)
|
||||||
{
|
{
|
||||||
|
@ -41,6 +47,7 @@ void Log(const char *Fmt, ...)
|
||||||
FILE *File = NULL;
|
FILE *File = NULL;
|
||||||
SYSTEMTIME Sys;
|
SYSTEMTIME Sys;
|
||||||
char szBuf[1024];
|
char szBuf[1024];
|
||||||
|
DWORD LockStatus = 0;
|
||||||
DWORD PID = GetCurrentProcessId();
|
DWORD PID = GetCurrentProcessId();
|
||||||
|
|
||||||
GetLocalTime(&Sys);
|
GetLocalTime(&Sys);
|
||||||
|
@ -54,6 +61,8 @@ void Log(const char *Fmt, ...)
|
||||||
Len += vsnprintf_s(szBuf + Len, sizeof(szBuf)-Len, sizeof(szBuf)-Len, Fmt, Arg);
|
Len += vsnprintf_s(szBuf + Len, sizeof(szBuf)-Len, sizeof(szBuf)-Len, Fmt, Arg);
|
||||||
va_end(Arg);
|
va_end(Arg);
|
||||||
|
|
||||||
|
MUTEX_LOCK(g_vtoylog_mutex);
|
||||||
|
|
||||||
fopen_s(&File, "ventoy.log", "a+");
|
fopen_s(&File, "ventoy.log", "a+");
|
||||||
if (File)
|
if (File)
|
||||||
{
|
{
|
||||||
|
@ -61,6 +70,8 @@ void Log(const char *Fmt, ...)
|
||||||
fwrite("\n", 1, 1, File);
|
fwrite("\n", 1, 1, File);
|
||||||
fclose(File);
|
fclose(File);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MUTEX_UNLOCK(g_vtoylog_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1305,12 +1316,33 @@ End:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ventoy_check_create_directory(void)
|
||||||
|
{
|
||||||
|
if (IsDirExist("ventoy"))
|
||||||
|
{
|
||||||
|
Log("ventoy directory already exist");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log("ventoy directory not exist, now create it.");
|
||||||
|
if (!CreateDirectoryA("ventoy", NULL))
|
||||||
|
{
|
||||||
|
Log("Failed to create ventoy directory err:%u", GetLastError());
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
|
int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
|
||||||
{
|
{
|
||||||
int rc = 1;
|
int rc = 1;
|
||||||
|
int stat = 0;
|
||||||
DWORD Pos;
|
DWORD Pos;
|
||||||
DWORD PeStart;
|
DWORD PeStart;
|
||||||
DWORD FileSize;
|
DWORD FileSize;
|
||||||
|
DWORD LockStatus = 0;
|
||||||
BYTE *Buffer = NULL;
|
BYTE *Buffer = NULL;
|
||||||
CHAR ExeFileName[MAX_PATH];
|
CHAR ExeFileName[MAX_PATH];
|
||||||
|
|
||||||
|
@ -1331,19 +1363,14 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
|
||||||
g_64bit_system = IsPe64(Buffer);
|
g_64bit_system = IsPe64(Buffer);
|
||||||
Log("VentoyJump %dbit", g_64bit_system ? 64 : 32);
|
Log("VentoyJump %dbit", g_64bit_system ? 64 : 32);
|
||||||
|
|
||||||
if (IsDirExist("ventoy"))
|
MUTEX_LOCK(g_vtoyins_mutex);
|
||||||
|
stat = ventoy_check_create_directory();
|
||||||
|
MUTEX_UNLOCK(g_vtoyins_mutex);
|
||||||
|
|
||||||
|
if (stat != 0)
|
||||||
{
|
{
|
||||||
Log("ventoy directory already exist");
|
goto End;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
Log("ventoy directory not exist, now create it.");
|
|
||||||
if (!CreateDirectoryA("ventoy", NULL))
|
|
||||||
{
|
|
||||||
Log("Failed to create ventoy directory err:%u", GetLastError());
|
|
||||||
goto End;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (PeStart = 0; PeStart < FileSize; PeStart += 16)
|
for (PeStart = 0; PeStart < FileSize; PeStart += 16)
|
||||||
{
|
{
|
||||||
|
@ -1374,14 +1401,18 @@ int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)
|
||||||
PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data);
|
PeStart += sizeof(ventoy_os_param) + sizeof(ventoy_windows_data);
|
||||||
sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName));
|
sprintf_s(LunchFile, MAX_PATH, "ventoy\\%s", GetFileNameInPath(ExeFileName));
|
||||||
|
|
||||||
|
MUTEX_LOCK(g_vtoyins_mutex);
|
||||||
if (IsFileExist("%s", LunchFile))
|
if (IsFileExist("%s", LunchFile))
|
||||||
{
|
{
|
||||||
Log("vtoyjump multiple call...");
|
Log("vtoyjump multiple call ...");
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
MUTEX_UNLOCK(g_vtoyins_mutex);
|
||||||
goto End;
|
goto End;
|
||||||
}
|
}
|
||||||
|
|
||||||
SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart);
|
SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart);
|
||||||
|
MUTEX_UNLOCK(g_vtoyins_mutex);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1411,17 +1442,76 @@ End:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int ventoy_append_process_id(const char *pidfile)
|
||||||
|
{
|
||||||
|
DWORD PID = 0;
|
||||||
|
FILE *fp = NULL;
|
||||||
|
|
||||||
|
PID = GetCurrentProcessId();
|
||||||
|
|
||||||
|
fopen_s(&fp, pidfile, "a+");
|
||||||
|
if (!fp)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf_s(fp, "%u\n", PID);
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ventoy_get_instance_id(const char *pidfile)
|
||||||
|
{
|
||||||
|
int instance = 0;
|
||||||
|
FILE *fp = NULL;
|
||||||
|
char line[256];
|
||||||
|
|
||||||
|
fopen_s(&fp, pidfile, "r");
|
||||||
|
if (!fp)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (fgets(line, sizeof(line), fp))
|
||||||
|
{
|
||||||
|
instance++;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
return instance + 1;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
int id = 0;
|
||||||
CHAR *Pos = NULL;
|
CHAR *Pos = NULL;
|
||||||
CHAR CurDir[MAX_PATH];
|
CHAR CurDir[MAX_PATH];
|
||||||
CHAR LunchFile[MAX_PATH];
|
CHAR LunchFile[MAX_PATH];
|
||||||
CHAR CallParam[1024] = { 0 };
|
CHAR CallParam[1024] = { 0 };
|
||||||
|
DWORD LockStatus = 0;
|
||||||
STARTUPINFOA Si;
|
STARTUPINFOA Si;
|
||||||
PROCESS_INFORMATION Pi;
|
PROCESS_INFORMATION Pi;
|
||||||
|
|
||||||
|
g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK");
|
||||||
|
g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK");
|
||||||
|
|
||||||
|
MUTEX_LOCK(g_vtoyins_mutex);
|
||||||
|
if (IsFileExist(VTOY_PID_FILE))
|
||||||
|
{
|
||||||
|
id = ventoy_get_instance_id(VTOY_PID_FILE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
id = 1;
|
||||||
|
}
|
||||||
|
ventoy_append_process_id(VTOY_PID_FILE);
|
||||||
|
MUTEX_UNLOCK(g_vtoyins_mutex);
|
||||||
|
|
||||||
if (argv[0] && argv[0][0] && argv[0][1] == ':')
|
if (argv[0] && argv[0][0] && argv[0][1] == ':')
|
||||||
{
|
{
|
||||||
GetCurrentDirectoryA(sizeof(CurDir), CurDir);
|
GetCurrentDirectoryA(sizeof(CurDir), CurDir);
|
||||||
|
@ -1439,7 +1529,7 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log("######## VentoyJump ##########");
|
Log("######## VentoyJump [%d] ##########", id);
|
||||||
Log("argc = %d", argc);
|
Log("argc = %d", argc);
|
||||||
for (i = 0; i < argc; i++)
|
for (i = 0; i < argc; i++)
|
||||||
{
|
{
|
||||||
|
@ -1475,14 +1565,27 @@ int main(int argc, char **argv)
|
||||||
rc = VentoyJump(argc, argv, LunchFile);
|
rc = VentoyJump(argc, argv, LunchFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
Log("LunchFile=<%s> CallParam=<%s>", LunchFile, CallParam);
|
Log("id=%d LunchFile=<%s> CallParam=<%s>", id, LunchFile, CallParam);
|
||||||
|
|
||||||
if (_stricmp(argv[0], "PECMD.EXE") == 0 && _stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0)
|
if (id == 1 && _stricmp(argv[0], "PECMD.EXE") == 0 && _stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0)
|
||||||
{
|
{
|
||||||
MoveFileA("PECMD.EXE", "PECMD_BACK.EXE");
|
MUTEX_LOCK(g_vtoyins_mutex);
|
||||||
MoveFileA("ventoy\\PECMD.EXE", "PECMD.EXE");
|
id = ventoy_get_instance_id(VTOY_PID_FILE);
|
||||||
sprintf_s(LunchFile, sizeof(LunchFile), "%s", "PECMD.EXE");
|
MUTEX_UNLOCK(g_vtoyins_mutex);
|
||||||
Log("Move original PECMD.EXE <%s>", LunchFile);
|
|
||||||
|
Log("Current instance id is: %d", id);
|
||||||
|
|
||||||
|
if (id == 2)
|
||||||
|
{
|
||||||
|
MoveFileA("PECMD.EXE", "PECMD_BACK.EXE");
|
||||||
|
CopyFileA("ventoy\\PECMD.EXE", "PECMD.EXE", TRUE);
|
||||||
|
sprintf_s(LunchFile, sizeof(LunchFile), "%s", "PECMD.EXE");
|
||||||
|
Log("Move original PECMD.EXE <%s>", LunchFile);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Log("%d instance started, don't move PECMD.EXE", id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_os_param_reserved[0] == 3)
|
if (g_os_param_reserved[0] == 3)
|
||||||
|
|
Loading…
Reference in New Issue