static HANDLE g_vtoylog_mutex = NULL;\r
static HANDLE g_vtoyins_mutex = NULL;\r
\r
+//Unicode "CmdLine"\r
+static BOOL g_PecmdHasCmdLine = FALSE;\r
+static UCHAR g_aucCmdLineHex[] = \r
+{\r
+ 0x43, 0x00, 0x6D, 0x00, 0x64, 0x00, 0x4C, 0x00, 0x69, 0x00, 0x6E, 0x00, 0x65, 0x00\r
+};\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
return 0;\r
}\r
\r
+static BOOL VentoyFindCmdLineStr(BYTE *buf, DWORD size)\r
+{\r
+ DWORD i = 0;\r
+ UINT32 uiDataChk;\r
+ UINT32 uiDataHex = *(UINT32 *)(g_aucCmdLineHex);\r
+\r
+ for (i = 0; i < size - sizeof(g_aucCmdLineHex); i += 16)\r
+ {\r
+ uiDataChk = *(UINT32 *)(buf + i);\r
+ if (uiDataChk == uiDataHex && memcmp(buf + i, g_aucCmdLineHex, sizeof(g_aucCmdLineHex)) == 0)\r
+ {\r
+ return TRUE;\r
+ }\r
+ }\r
+ \r
+ return FALSE;\r
+}\r
+\r
int VentoyJump(INT argc, CHAR **argv, CHAR *LunchFile)\r
{\r
int rc = 1;\r
SaveBuffer2File(LunchFile, Buffer + PeStart, FileSize - PeStart);\r
MUTEX_UNLOCK(g_vtoyins_mutex);\r
\r
+ #ifdef VTOY_REJUMP_SUPPORTED\r
+ if (_stricmp(LunchFile, "ventoy\\PECMD.EXE") == 0)\r
+ {\r
+ g_PecmdHasCmdLine = VentoyFindCmdLineStr(Buffer + PeStart, FileSize - PeStart);\r
+ }\r
+ #endif\r
+\r
break;\r
}\r
}\r
int i = 0;\r
int rc = 0;\r
int id = 0;\r
+ BOOL ReJump = FALSE;\r
CHAR *Pos = NULL;\r
CHAR CurDir[MAX_PATH];\r
CHAR LunchFile[MAX_PATH];\r
STARTUPINFOA Si;\r
PROCESS_INFORMATION Pi;\r
\r
+#ifdef VTOY_REJUMP_SUPPORTED\r
+ if (argv[0] && strcmp(argv[0], "ventoy\\WinLogon.exe") == 0)\r
+ {\r
+ GetStartupInfoA(&Si);\r
+ Si.dwFlags |= STARTF_USESHOWWINDOW;\r
+ Si.wShowWindow = SW_HIDE;\r
+\r
+ sprintf_s(LunchFile, sizeof(LunchFile), "PECMD.EXE");\r
+ for (i = 1; i < argc; i++)\r
+ {\r
+ strcat_s(LunchFile, sizeof(LunchFile), " ");\r
+ strcat_s(LunchFile, sizeof(LunchFile), argv[i]);\r
+ }\r
+\r
+ CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
+ WaitForSingleObject(Pi.hProcess, INFINITE);\r
+ return 0;\r
+ }\r
+#endif\r
+\r
+ g_PecmdHasCmdLine = 0;\r
g_vtoylog_mutex = CreateMutexA(NULL, FALSE, "VTOYLOG_LOCK");\r
g_vtoyins_mutex = CreateMutexA(NULL, FALSE, "VTOYINS_LOCK");\r
\r
\r
if (id == 2)\r
{\r
+ #ifdef VTOY_REJUMP_SUPPORTED\r
+ if (g_PecmdHasCmdLine)\r
+ {\r
+ ReJump = TRUE;\r
+ CopyFileA("PECMD.EXE", "ventoy\\WinLogon.exe", TRUE);\r
+ }\r
+ #endif\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
sprintf_s(LunchFile, sizeof(LunchFile), "%s", "cmd.exe");\r
}\r
\r
+#ifdef VTOY_REJUMP_SUPPORTED\r
+ if (ReJump)\r
+ {\r
+ sprintf_s(CallParam, sizeof(CallParam), "ventoy\\WinLogon.exe%s", LunchFile + strlen("PECMD.EXE"));\r
+ Log("Now rejump to pecmd.exe <%s> ...", CallParam);\r
+\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
+ (void)ReJump;\r
+#endif\r
+\r
CreateProcessA(NULL, LunchFile, NULL, NULL, FALSE, 0, NULL, NULL, &Si, &Pi);\r
\r
for (i = 0; rc && i < 1800; i++)\r