static UINT8 g_os_param_reserved[32];\r
static BOOL g_64bit_system = FALSE;\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
+#define VTOY_PID_FILE "X:\\Windows\\System32\\pidventoy"\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
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 += 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
fopen_s(&File, "ventoy.log", "a+");\r
if (File)\r
{\r
fwrite("\n", 1, 1, File);\r
fclose(File);\r
}\r
+\r
+ MUTEX_UNLOCK(g_vtoylog_mutex);\r
}\r
\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
g_64bit_system = IsPe64(Buffer);\r
Log("VentoyJump %dbit", g_64bit_system ? 64 : 32);\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
+\r
+\r
+static int ventoy_append_process_id(const char *pidfile)\r
+{\r
+ DWORD PID = 0;\r
+ FILE *fp = NULL;\r
+\r
+ PID = GetCurrentProcessId();\r
+\r
+ fopen_s(&fp, pidfile, "a+");\r
+ if (!fp)\r
+ {\r
+ return 1;\r
+ }\r
+\r
+ fprintf_s(fp, "%u\n", PID);\r
+\r
+ fclose(fp);\r
+ return 0;\r
+}\r
+\r
+static int ventoy_get_instance_id(const char *pidfile)\r
+{\r
+ int instance = 0;\r
+ FILE *fp = NULL;\r
+ char line[256];\r
+\r
+ fopen_s(&fp, pidfile, "r");\r
+ if (!fp)\r
+ {\r
+ return 1;\r
+ }\r
+\r
+ while (fgets(line, sizeof(line), fp))\r
+ {\r
+ instance++;\r
+ }\r
+\r
+ fclose(fp);\r
+ return instance + 1;\r
+}\r
+\r
int main(int argc, char **argv)\r
{\r
int i = 0;\r
int rc = 0;\r
+ int id = 0;\r
CHAR *Pos = NULL;\r
CHAR CurDir[MAX_PATH];\r
CHAR LunchFile[MAX_PATH];\r
CHAR CallParam[1024] = { 0 };\r
+ DWORD LockStatus = 0;\r
STARTUPINFOA Si;\r
PROCESS_INFORMATION Pi;\r
\r
+ g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK");\r
+ g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK");\r
+\r
+ MUTEX_LOCK(g_vtoyins_mutex);\r
+ if (IsFileExist(VTOY_PID_FILE))\r
+ {\r
+ id = ventoy_get_instance_id(VTOY_PID_FILE);\r
+ }\r
+ else\r
+ {\r
+ id = 1;\r
+ }\r
+ ventoy_append_process_id(VTOY_PID_FILE);\r
+ MUTEX_UNLOCK(g_vtoyins_mutex);\r
+\r
if (argv[0] && argv[0][0] && argv[0][1] == ':')\r
{\r
GetCurrentDirectoryA(sizeof(CurDir), CurDir);\r
}\r
}\r
\r
- Log("######## VentoyJump ##########");\r
+ Log("######## VentoyJump [%d] ##########", id);\r
Log("argc = %d", argc);\r
for (i = 0; i < argc; i++)\r
{\r
rc = VentoyJump(argc, argv, LunchFile);\r
}\r
\r
- Log("LunchFile=<%s> CallParam=<%s>", LunchFile, CallParam);\r
+ Log("id=%d LunchFile=<%s> CallParam=<%s>", id, LunchFile, CallParam);\r
\r
- if (_stricmp(argv[0], "PECMD.EXE") == 0 && _stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0)\r
+ if (id == 1 && _stricmp(argv[0], "PECMD.EXE") == 0 && _stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0)\r
{\r
- MoveFileA("PECMD.EXE", "PECMD_BACK.EXE");\r
- MoveFileA("ventoy\\PECMD.EXE", "PECMD.EXE");\r
- sprintf_s(LunchFile, sizeof(LunchFile), "%s", "PECMD.EXE");\r
- Log("Move original PECMD.EXE <%s>", LunchFile);\r
+ MUTEX_LOCK(g_vtoyins_mutex);\r
+ id = ventoy_get_instance_id(VTOY_PID_FILE);\r
+ MUTEX_UNLOCK(g_vtoyins_mutex);\r
+\r
+ Log("Current instance id is: %d", id);\r
+\r
+ if (id == 2)\r
+ {\r
+ MoveFileA("PECMD.EXE", "PECMD_BACK.EXE");\r
+ CopyFileA("ventoy\\PECMD.EXE", "PECMD.EXE", TRUE); \r
+ sprintf_s(LunchFile, sizeof(LunchFile), "%s", "PECMD.EXE");\r
+ Log("Move original PECMD.EXE <%s>", LunchFile);\r
+ }\r
+ else\r
+ {\r
+ Log("%d instance started, don't move PECMD.EXE", id);\r
+ }\r
}\r
\r
if (g_os_param_reserved[0] == 3)\r