]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - vtoyjump/vtoyjump/vtoyjump.c
Merge branch 'master' of https://github.com/ventoy/Ventoy
[Ventoy.git] / vtoyjump / vtoyjump / vtoyjump.c
index 46a5fceb6a1cac0dc75e67a1d3d7f742e8a11ba2..8421403d8ee41f8632257300c81f009e88ec763f 100644 (file)
@@ -40,6 +40,9 @@ static CHAR g_prog_full_path[MAX_PATH];
 static CHAR g_prog_dir[MAX_PATH];\r
 static CHAR g_prog_name[MAX_PATH];\r
 \r
+#define AUTO_RUN_BAT    "X:\\VentoyAutoRun.bat"\r
+#define AUTO_RUN_LOG    "X:\\VentoyAutoRun.log"\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
@@ -1245,13 +1248,126 @@ static int ProcessUnattendedInstallation(const char *script)
     return 0;\r
 }\r
 \r
+static int Windows11BypassCheck(const char *isofile, const char MntLetter)\r
+{\r
+    int Ret = 1;\r
+    DWORD dwHandle;\r
+    DWORD dwSize;\r
+    DWORD dwValue = 1;\r
+    UINT VerLen = 0;\r
+    CHAR *Buffer = NULL;\r
+    VS_FIXEDFILEINFO* VerInfo = NULL;\r
+    CHAR CheckFile[MAX_PATH];\r
+    UINT16 Major, Minor, Build, Revision;\r
+\r
+    Log("Windows11BypassCheck for <%s> %C:", isofile, MntLetter);\r
+\r
+    if (FALSE == IsFileExist("%C:\\sources\\boot.wim", MntLetter) ||\r
+        FALSE == IsFileExist("%C:\\sources\\compatresources.dll", MntLetter))\r
+    {\r
+        Log("boot.wim/compatresources.dll not exist, this is not a windows install media.");\r
+        goto End;\r
+    }\r
+\r
+    if (FALSE == IsFileExist("%C:\\sources\\install.wim", MntLetter) && \r
+        FALSE == IsFileExist("%C:\\sources\\install.esd", MntLetter))\r
+    {\r
+        Log("install.wim/install.esd not exist, this is not a windows install media.");\r
+        goto End;\r
+    }\r
+\r
+    sprintf_s(CheckFile, sizeof(CheckFile), "%C:\\sources\\compatresources.dll", MntLetter);\r
+    dwSize = GetFileVersionInfoSizeA(CheckFile, &dwHandle);\r
+    if (0 == dwSize)\r
+    {\r
+        Log("Failed to get file version info size: %u", LASTERR);\r
+        goto End;\r
+    }\r
+\r
+    Buffer = malloc(dwSize);\r
+    if (!Buffer)\r
+    {\r
+        goto End;\r
+    }\r
+\r
+    if (FALSE == GetFileVersionInfoA(CheckFile, dwHandle, dwSize, Buffer))\r
+    {\r
+        Log("Failed to get file version info : %u", LASTERR);\r
+        goto End;\r
+    }\r
+\r
+    if (VerQueryValueA(Buffer, "\\", (LPVOID)&VerInfo, &VerLen) && VerLen != 0)\r
+    {\r
+        if (VerInfo->dwSignature == VS_FFI_SIGNATURE)\r
+        {\r
+            Major = HIWORD(VerInfo->dwFileVersionMS);\r
+            Minor = LOWORD(VerInfo->dwFileVersionMS);\r
+            Build = HIWORD(VerInfo->dwFileVersionLS);\r
+            Revision = LOWORD(VerInfo->dwFileVersionLS);\r
+\r
+            Log("FileVersionze: <%u %u %u %u>", Major, Minor, Build, Revision);\r
+\r
+            if (Major == 10 && Build > 20000)\r
+            {\r
+                Major = 11;\r
+            }\r
+\r
+            if (Major != 11)\r
+            {\r
+                Log("This is not Windows 11, not need to bypass.", Major);\r
+                goto End;\r
+            }\r
+        }\r
+    }\r
+\r
+    //Now we really need to bypass windows 11 check. create registry\r
+    HKEY hKey = NULL;\r
+    HKEY hSubKey = NULL;\r
+    LSTATUS Status;\r
+\r
+    Status = RegCreateKeyExA(HKEY_LOCAL_MACHINE, "System\\Setup", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwSize);\r
+    if (ERROR_SUCCESS != Status)\r
+    {\r
+        Log("Failed to create reg key System\\Setup %u %u", LASTERR, Status);\r
+        goto End;\r
+    }\r
+\r
+    Status = RegCreateKeyExA(hKey, "LabConfig", 0, NULL, 0, KEY_SET_VALUE | KEY_QUERY_VALUE | KEY_CREATE_SUB_KEY, NULL, &hSubKey, &dwSize);\r
+    if (ERROR_SUCCESS != Status)\r
+    {\r
+        Log("Failed to create LabConfig reg  %u %u", LASTERR, Status);\r
+        goto End;\r
+    }\r
+\r
+    //set reg value\r
+    Status += RegSetValueExA(hSubKey, "BypassRAMCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+    Status += RegSetValueExA(hSubKey, "BypassTPMCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+    Status += RegSetValueExA(hSubKey, "BypassSecureBootCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+    Status += RegSetValueExA(hSubKey, "BypassStorageCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+    Status += RegSetValueExA(hSubKey, "BypassCPUCheck", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD));\r
+\r
+    Log("Create bypass registry %s %u", (Status == ERROR_SUCCESS) ? "SUCCESS" : "FAILED", Status);\r
+\r
+    Ret = 0;\r
+\r
+End:\r
+    if (Buffer)\r
+    {\r
+        free(Buffer);\r
+    }\r
+    \r
+    return Ret; \r
+}\r
+\r
 static int VentoyHook(ventoy_os_param *param)\r
 {\r
     int i;\r
     int rc;\r
     BOOL find = FALSE;\r
     CHAR Letter;\r
+    CHAR MntLetter;\r
     DWORD Drives;\r
+    DWORD NewDrives;\r
        DISK_EXTENT DiskExtent;\r
        UINT8 UUID[16];\r
        CHAR IsoPath[MAX_PATH];\r
@@ -1316,9 +1432,43 @@ static int VentoyHook(ventoy_os_param *param)
 \r
        Log("Find ISO file <%s>", IsoPath);\r
     \r
+    Drives = GetLogicalDrives();\r
+    Log("Drives before mount: 0x%x", Drives);\r
+\r
     rc = MountIsoFile(IsoPath, DiskExtent.DiskNumber);\r
+\r
+    NewDrives = GetLogicalDrives();\r
+    Log("Drives after mount: 0x%x (0x%x)", NewDrives, (NewDrives ^ Drives));\r
+\r
+    MntLetter = 'A';\r
+    NewDrives = (NewDrives ^ Drives);\r
+    while (NewDrives)\r
+    {\r
+        if (NewDrives & 0x01)\r
+        {\r
+            if ((NewDrives >> 1) == 0)\r
+            {\r
+                Log("The ISO file is mounted at %C:", MntLetter);\r
+            }\r
+            else\r
+            {\r
+                Log("Maybe the ISO file is mounted at %C:", MntLetter);\r
+            }\r
+            break;\r
+        }\r
+\r
+        NewDrives >>= 1;\r
+        MntLetter++;\r
+    }\r
+\r
     Log("Mount ISO FILE: %s", rc == 0 ? "SUCCESS" : "FAILED");\r
 \r
+    //Windows 11 bypass check\r
+    if (g_windows_data.windows11_bypass_check == 1)\r
+    {\r
+        Windows11BypassCheck(IsoPath, MntLetter);\r
+    }\r
+\r
     // for protect\r
     rc = DeleteVentoyPart2MountPoint(DiskExtent.DiskNumber);\r
     Log("Delete ventoy mountpoint: %s", rc == 0 ? "SUCCESS" : "NO NEED");\r
@@ -1348,6 +1498,46 @@ static int VentoyHook(ventoy_os_param *param)
         {\r
             Log("decompress injection archive %s...", IsoPath);\r
             DecompressInjectionArchive(IsoPath, DiskExtent.DiskNumber);\r
+\r
+            if (IsFileExist("%s", AUTO_RUN_BAT))\r
+            {\r
+                HANDLE hOut;\r
+                DWORD flags = CREATE_NO_WINDOW;\r
+                CHAR StrBuf[1024];\r
+                STARTUPINFOA Si;\r
+                PROCESS_INFORMATION Pi;\r
+                SECURITY_ATTRIBUTES Sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };\r
+\r
+                Log("%s exist, now run it...", AUTO_RUN_BAT);\r
+\r
+                GetStartupInfoA(&Si);\r
+\r
+                hOut = CreateFileA(AUTO_RUN_LOG,\r
+                    FILE_APPEND_DATA,\r
+                    FILE_SHARE_WRITE | FILE_SHARE_READ,\r
+                    &Sa,\r
+                    OPEN_ALWAYS,\r
+                    FILE_ATTRIBUTE_NORMAL,\r
+                    NULL);\r
+\r
+                Si.dwFlags |= STARTF_USESTDHANDLES;\r
+                if (hOut != INVALID_HANDLE_VALUE)\r
+                {\r
+                    Si.hStdError = hOut;\r
+                    Si.hStdOutput = hOut;\r
+                }\r
+\r
+                sprintf_s(IsoPath, sizeof(IsoPath), "%C:\\%s", Letter, param->vtoy_img_path);\r
+                sprintf_s(StrBuf, sizeof(StrBuf), "cmd.exe /c %s \"%s\" %C", AUTO_RUN_BAT, IsoPath, MntLetter);\r
+                CreateProcessA(NULL, StrBuf, NULL, NULL, TRUE, flags, NULL, NULL, &Si, &Pi);\r
+                WaitForSingleObject(Pi.hProcess, INFINITE);\r
+\r
+                SAFE_CLOSE_HANDLE(hOut);\r
+            }\r
+            else\r
+            {\r
+                Log("%s not exist...", AUTO_RUN_BAT);\r
+            }\r
         }\r
         else\r
         {\r