]> glassweightruler.freedombox.rocks Git - Ventoy.git/commitdiff
1.0.07 release v1.0.07
authorlongpanda <admin@ventoy.net>
Fri, 24 Apr 2020 13:58:00 +0000 (21:58 +0800)
committerlongpanda <admin@ventoy.net>
Fri, 24 Apr 2020 13:58:07 +0000 (21:58 +0800)
52 files changed:
EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c
EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.h
EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.inf
EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyDebug.c [new file with mode: 0644]
GRUB2/grub-2.04/grub-core/fs/fat.c
GRUB2/grub-2.04/grub-core/ventoy/ventoy.c
GRUB2/grub-2.04/include/grub/ventoy.h
IMG/cpio/ventoy/hook/alt/udev_disk_hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/alt/ventoy-hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/clear/disk-hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/clear/ventoy-hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/deepin-disk.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/deepin-hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/knoppix-disk.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/knoppix-hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/porteus-disk.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/porteus-hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/puppy-disk.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/puppy-hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/pve-disk.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/pve-hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/slax-disk.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/slax-hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/tails-hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/veket-disk.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/debian/veket-hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/pclos/disk_hook.sh
IMG/cpio/ventoy/hook/rhel7/ventoy-disk.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/rhel7/ventoy-hook.sh
IMG/cpio/ventoy/hook/ventoy-hook-lib.sh
IMG/cpio/ventoy/hook/ventoy-os-lib.sh
IMG/cpio/ventoy/hook/zeroshell/disk_hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/hook/zeroshell/ventoy-hook.sh [new file with mode: 0644]
IMG/cpio/ventoy/init
IMG/cpio/ventoy/tool/vtoytool_install.sh
IMG/cpio/ventoy/tool/xzminidec [new file with mode: 0644]
IMG/cpio/ventoy/ventoy.sh
INSTALL/EFI/BOOT/BOOTX64.EFI
INSTALL/EFI/BOOT/MokManager.efi [new file with mode: 0644]
INSTALL/EFI/BOOT/grubx64.efi [new file with mode: 0644]
INSTALL/EFI/BOOT/grubx64_real.efi [new file with mode: 0644]
INSTALL/Ventoy2Disk.sh
INSTALL/grub/grub.cfg
INSTALL/grub/i386-pc/core.img
INSTALL/tool/ENROLL_THIS_KEY_IN_MOKMANAGER.cer [new file with mode: 0644]
INSTALL/ventoy/ipxe.krn
INSTALL/ventoy/ventoy.cpio
INSTALL/ventoy/ventoy_x64.efi
README.md
VtoyTool/vtoydump.c
VtoyTool/vtoytool/00/vtoytool_32
VtoyTool/vtoytool/00/vtoytool_64

index dc73764d9fe8663c6bd6e2ce524b385637ede2ac..857e7415b7c535b0d4db5a7c274de6979baa2b82 100644 (file)
@@ -53,15 +53,27 @@ ventoy_sector_flag *g_sector_flag = NULL;
 UINT32 g_sector_flag_num = 0;
 static grub_env_get_pf grub_env_get = NULL;
 
+EFI_FILE_OPEN g_original_fopen = NULL;
+EFI_FILE_CLOSE g_original_fclose = NULL;
+EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME g_original_open_volume = NULL;
+
+ventoy_grub_param_file_replace *g_file_replace_list = NULL;
+ventoy_efi_file_replace g_efi_file_replace;
+
+CHAR16 gFirstTryBootFile[256] = {0};
+
 CONST CHAR16 gIso9660EfiDriverPath[] = ISO9660_EFI_DRIVER_PATH;
 
 /* Boot filename */
+UINTN gBootFileStartIndex = 1;
 CONST CHAR16 *gEfiBootFileName[] = 
 {
+    L"@",
     EFI_REMOVABLE_MEDIA_FILE_NAME,
     L"\\EFI\\BOOT\\GRUBX64.EFI",
     L"\\EFI\\BOOT\\BOOTx64.EFI",
     L"\\EFI\\BOOT\\bootx64.efi",
+    L"\\efi\\boot\\bootx64.efi",
 };
 
 /* EFI block device vendor device path GUID */
@@ -886,6 +898,7 @@ static int ventoy_update_image_location(ventoy_os_param *param)
 STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
 {   
     UINT32 i = 0;
+    UINT32 old_cnt = 0;
     UINTN size = 0;
     UINT8 chksum = 0;
     CHAR16 *pPos = NULL;
@@ -915,8 +928,33 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
         gLoadIsoEfi = TRUE;
     }
 
+    pPos = StrStr(pCmdLine, L"FirstTry=@");
+    if (pPos)
+    {
+        pPos += StrLen(L"FirstTry=");
+        for (i = 0; i < ARRAY_SIZE(gFirstTryBootFile); i++, pPos++)
+        {
+            if (*pPos != L' ' && *pPos != L'\t' && *pPos)
+            {
+                gFirstTryBootFile[i] = (*pPos == '@') ? '\\' : *pPos;
+            }
+            else
+            {
+                break;
+            }
+        }
+
+        gEfiBootFileName[0] = gFirstTryBootFile;
+        gBootFileStartIndex = 0;
+    }
+
     debug("cmdline:<%s>", pCmdLine);
 
+    if (gFirstTryBootFile[0])
+    {
+        debug("First Try:<%s>", gFirstTryBootFile);
+    }
+
     pPos = StrStr(pCmdLine, L"env_param=");
     if (!pPos)
     {
@@ -926,6 +964,18 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
     pGrubParam = (ventoy_grub_param *)StrHexToUintn(pPos + StrLen(L"env_param="));
     grub_env_get = pGrubParam->grub_env_get;
 
+    g_file_replace_list = &pGrubParam->file_replace;
+    old_cnt = g_file_replace_list->old_file_cnt;
+    debug("file replace: magic:0x%x virtid:%u name count:%u <%a> <%a> <%a> <%a>",
+        g_file_replace_list->magic,
+        g_file_replace_list->new_file_virtual_id,
+        old_cnt,
+        old_cnt > 0 ? g_file_replace_list->old_file_name[0] : "",
+        old_cnt > 1 ? g_file_replace_list->old_file_name[1] : "",
+        old_cnt > 2 ? g_file_replace_list->old_file_name[2] : "",
+        old_cnt > 3 ? g_file_replace_list->old_file_name[3] : ""
+        );
+
     pPos = StrStr(pCmdLine, L"mem:");
     g_chain = (ventoy_chain_head *)StrHexToUintn(pPos + 4);
 
@@ -970,8 +1020,85 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
     return EFI_SUCCESS;
 }
 
+EFI_STATUS EFIAPI ventoy_wrapper_file_open
+(
+    EFI_FILE_HANDLE This, 
+    EFI_FILE_HANDLE *New,
+    CHAR16 *Name, 
+    UINT64 Mode, 
+    UINT64 Attributes
+)
+{
+    UINT32 i = 0;
+    UINT32 j = 0;
+    UINT64 Sectors = 0;
+    EFI_STATUS Status = EFI_SUCCESS;
+    CHAR8 TmpName[256];
+    ventoy_virt_chunk *virt = NULL;
+
+    Status = g_original_fopen(This, New, Name, Mode, Attributes);
+    if (EFI_ERROR(Status))
+    {
+        return Status;
+    }
+
+    if (g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC &&
+        g_file_replace_list->new_file_virtual_id < g_virt_chunk_num)
+    {
+        AsciiSPrint(TmpName, sizeof(TmpName), "%s", Name);
+        for (j = 0; j < 4; j++)
+        {
+            if (0 == AsciiStrCmp(g_file_replace_list[i].old_file_name[j], TmpName))
+            {
+                g_original_fclose(*New);
+                *New = &g_efi_file_replace.WrapperHandle;
+                ventoy_wrapper_file_procotol(*New);
+
+                virt = g_virt_chunk + g_file_replace_list->new_file_virtual_id;
+
+                Sectors = (virt->mem_sector_end - virt->mem_sector_start) + (virt->remap_sector_end - virt->remap_sector_start);
+                
+                g_efi_file_replace.BlockIoSectorStart = virt->mem_sector_start;
+                g_efi_file_replace.FileSizeBytes = Sectors * 2048;
+
+                if (gDebugPrint)
+                {
+                    debug("## ventoy_wrapper_file_open <%s> BlockStart:%lu Sectors:%lu Bytes:%lu", Name,
+                        g_efi_file_replace.BlockIoSectorStart, Sectors, Sectors * 2048);
+                    sleep(3);
+                }
+                
+                return Status;
+            }
+        }
+    }
+
+    return Status;
+}
+
+EFI_STATUS EFIAPI ventoy_wrapper_open_volume
+(
+    IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL     *This,
+    OUT EFI_FILE_PROTOCOL                 **Root
+)
+{
+    EFI_STATUS Status = EFI_SUCCESS;
+    
+    Status = g_original_open_volume(This, Root);
+    if (!EFI_ERROR(Status))
+    {
+        g_original_fopen = (*Root)->Open;
+        g_original_fclose = (*Root)->Close;
+        (*Root)->Open = ventoy_wrapper_file_open;
+    }
+
+    return Status;
+}
+
+
 EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
 {
+    UINTN t = 0;
     UINTN i = 0;
     UINTN j = 0;
     UINTN Find = 0;
@@ -982,78 +1109,99 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
     EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *pFile = NULL;
     EFI_DEVICE_PATH_PROTOCOL *pDevPath = NULL;
 
-    Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid, 
-                                     NULL, &Count, &Handles);
-    if (EFI_ERROR(Status))
+    for (t = 0; t < 3; t++)
     {
-        return Status;
-    }
-
-    debug("ventoy_boot fs count:%u", Count);
+        Count = 0;
+        Handles = NULL;
 
-    for (i = 0; i < Count; i++)
-    {
-        Status = gBS->HandleProtocol(Handles[i], &gEfiSimpleFileSystemProtocolGuid, (VOID **)&pFile);
+        Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid, 
+                                     NULL, &Count, &Handles);
         if (EFI_ERROR(Status))
         {
-            continue;
+            return Status;
         }
 
-        Status = gBS->OpenProtocol(Handles[i], &gEfiDevicePathProtocolGuid, 
-                                   (VOID **)&pDevPath,
-                                   ImageHandle,
-                                   Handles[i],
-                                   EFI_OPEN_PROTOCOL_GET_PROTOCOL);
-        if (EFI_ERROR(Status))
-        {
-            debug("Failed to open device path protocol %r", Status);
-            continue;
-        }
+        debug("ventoy_boot fs count:%u", Count);
 
-        debug("Handle:%p FS DP: <%s>", Handles[i], ConvertDevicePathToText(pDevPath, FALSE, FALSE));
-        if (CompareMem(gBlockData.Path, pDevPath, gBlockData.DevicePathCompareLen))
+        for (i = 0; i < Count; i++)
         {
-            debug("Not ventoy disk file system");
-            continue;
-        }
+            Status = gBS->HandleProtocol(Handles[i], &gEfiSimpleFileSystemProtocolGuid, (VOID **)&pFile);
+            if (EFI_ERROR(Status))
+            {
+                continue;
+            }
 
-        for (j = 0; j < ARRAY_SIZE(gEfiBootFileName); j++)
-        {
-            Status = ventoy_load_image(ImageHandle, pDevPath, gEfiBootFileName[j], 
-                                       StrSize(gEfiBootFileName[j]), &Image);
-            if (EFI_SUCCESS == Status)
+            debug("FS:%u Protocol:%p  OpenVolume:%p", i, pFile, pFile->OpenVolume);
+
+            Status = gBS->OpenProtocol(Handles[i], &gEfiDevicePathProtocolGuid, 
+                                       (VOID **)&pDevPath,
+                                       ImageHandle,
+                                       Handles[i],
+                                       EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+            if (EFI_ERROR(Status))
             {
-                break;
+                debug("Failed to open device path protocol %r", Status);
+                continue;
             }
-            debug("Failed to load image %r <%s>", Status, gEfiBootFileName[j]);
-        }
 
-        if (j >= ARRAY_SIZE(gEfiBootFileName))
-        {
-            continue;
-        }
+            debug("Handle:%p FS DP: <%s>", Handles[i], ConvertDevicePathToText(pDevPath, FALSE, FALSE));
+            if (CompareMem(gBlockData.Path, pDevPath, gBlockData.DevicePathCompareLen))
+            {
+                debug("Not ventoy disk file system");
+                continue;
+            }
 
-        Find++;
-        debug("Find boot file, now try to boot .....");
-        ventoy_debug_pause();
+            for (j = gBootFileStartIndex; j < ARRAY_SIZE(gEfiBootFileName); j++)
+            {
+                Status = ventoy_load_image(ImageHandle, pDevPath, gEfiBootFileName[j], 
+                                           StrSize(gEfiBootFileName[j]), &Image);
+                if (EFI_SUCCESS == Status)
+                {
+                    break;
+                }
+                debug("Failed to load image %r <%s>", Status, gEfiBootFileName[j]);
+            }
 
-        if (gDebugPrint)
-        {
-            gST->ConIn->Reset(gST->ConIn, FALSE);
+            if (j >= ARRAY_SIZE(gEfiBootFileName))
+            {
+                continue;
+            }
+
+            Find++;
+            debug("Find boot file, now try to boot .....");
+            ventoy_debug_pause();
+
+            if (gDebugPrint)
+            {
+                gST->ConIn->Reset(gST->ConIn, FALSE);
+                //ventoy_wrapper_system();
+            }
+
+            if (g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC)
+            {
+                g_original_open_volume = pFile->OpenVolume;
+                pFile->OpenVolume = ventoy_wrapper_open_volume;
+            }
+            
+            Status = gBS->StartImage(Image, NULL, NULL);
+            if (EFI_ERROR(Status))
+            {
+                debug("Failed to start image %r", Status);
+                sleep(3);
+                gBS->UnloadImage(Image);
+                break;
+            }
         }
-        
-        Status = gBS->StartImage(Image, NULL, NULL);
-        if (EFI_ERROR(Status))
+
+        FreePool(Handles);
+
+        if (Find == 0)
         {
-            debug("Failed to start image %r", Status);
-            sleep(3);
-            gBS->UnloadImage(Image);
-            break;
+            debug("Fs not found, now wait and retry...");
+            sleep(2);
         }
     }
 
-    FreePool(Handles);
-
     if (Find == 0)
     {
         return EFI_NOT_FOUND;
@@ -1190,9 +1338,21 @@ EFI_STATUS EFIAPI VentoyEfiMain
         Status = ventoy_boot(ImageHandle);
         if (EFI_NOT_FOUND == Status)
         {
-            gST->ConOut->OutputString(gST->ConOut, L"No bootfile found for UEFI!\r\n");
-            gST->ConOut->OutputString(gST->ConOut, L"Maybe the image does not support " VENTOY_UEFI_DESC  L"!\r\n");
-            sleep(300);
+            if (!gLoadIsoEfi)
+            {
+                gLoadIsoEfi = TRUE;
+                ventoy_find_iso_disk_fs(ImageHandle);
+                ventoy_load_isoefi_driver(ImageHandle);
+
+                Status = ventoy_boot(ImageHandle);
+            }
+
+            if (EFI_NOT_FOUND == Status)
+            {
+                gST->ConOut->OutputString(gST->ConOut, L"No bootfile found for UEFI!\r\n");
+                gST->ConOut->OutputString(gST->ConOut, L"Maybe the image does not support " VENTOY_UEFI_DESC  L"!\r\n");
+                sleep(60);
+            }
         }
 
         ventoy_clean_env();
index 009863199f2a191b67255dbde4bbd45e4f8458dc..eb22e772e9fc20926d9e376ec98f9d76e56d4e37 100644 (file)
@@ -205,6 +205,7 @@ typedef struct vtoy_block_data
 #define ISO9660_EFI_DRIVER_PATH  L"\\ventoy\\iso9660_x64.efi"
 
 #define debug(expr, ...) if (gDebugPrint) VtoyDebug("[VTOY] "expr"\r\n", ##__VA_ARGS__)
+#define trace(expr, ...) VtoyDebug("[VTOY] "expr"\r\n", ##__VA_ARGS__)
 #define sleep(sec) gBS->Stall(1000000 * (sec))
 
 #define ventoy_debug_pause() \
@@ -219,9 +220,32 @@ if (gDebugPrint) \
 typedef const char * (*grub_env_get_pf)(const char *name);
 
 #pragma pack(1)
+
+#define GRUB_FILE_REPLACE_MAGIC  0x1258BEEF
+
+typedef struct ventoy_efi_file_replace
+{
+    UINT64 BlockIoSectorStart;
+
+    UINT64 CurPos;
+    UINT64 FileSizeBytes;
+
+    EFI_FILE_PROTOCOL  WrapperHandle;
+}ventoy_efi_file_replace;
+
+typedef struct ventoy_grub_param_file_replace
+{
+    UINT32 magic;
+    char   old_file_name[4][256];
+    UINT32 old_file_cnt;
+    UINT32 new_file_virtual_id;
+}ventoy_grub_param_file_replace;
+
 typedef struct ventoy_grub_param
 {
     grub_env_get_pf grub_env_get;
+
+    ventoy_grub_param_file_replace file_replace;
 }ventoy_grub_param;
 
 typedef struct ventoy_ram_disk
@@ -233,8 +257,44 @@ typedef struct ventoy_ram_disk
 #pragma pack()
 
 
+typedef struct well_known_guid 
+{
+       EFI_GUID *guid;
+       const char *name;
+}well_known_guid;
+
+typedef struct ventoy_system_wrapper
+{
+    EFI_LOCATE_PROTOCOL NewLocateProtocol;
+    EFI_LOCATE_PROTOCOL OriLocateProtocol;
+
+    EFI_HANDLE_PROTOCOL NewHandleProtocol;
+    EFI_HANDLE_PROTOCOL OriHandleProtocol;
+    
+    EFI_OPEN_PROTOCOL NewOpenProtocol;
+    EFI_OPEN_PROTOCOL OriOpenProtocol;
+} ventoy_system_wrapper;
+
+#define ventoy_wrapper(bs, wrapper, func, newfunc) \
+{\
+    wrapper.Ori##func = bs->func;\
+    wrapper.New##func = newfunc;\
+    bs->func = wrapper.New##func;\
+}
+
+extern ventoy_efi_file_replace g_efi_file_replace;
 extern BOOLEAN gDebugPrint;
 VOID EFIAPI VtoyDebug(IN CONST CHAR8  *Format, ...);
+EFI_STATUS EFIAPI ventoy_wrapper_system(VOID);
+EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File);
+EFI_STATUS EFIAPI ventoy_block_io_read 
+(
+    IN EFI_BLOCK_IO_PROTOCOL          *This,
+    IN UINT32                          MediaId,
+    IN EFI_LBA                         Lba,
+    IN UINTN                           BufferSize,
+    OUT VOID                          *Buffer
+);
 
 #endif
 
index 98f999ad9e5e658f3594a000eb62eca96a194cb0..1db9b2182e417255e64dcb5b032d8c4df4d3514a 100644 (file)
@@ -28,6 +28,7 @@
 [Sources]
   Ventoy.h
   Ventoy.c
+  VentoyDebug.c
 
 [Packages]
   MdePkg/MdePkg.dec
@@ -42,6 +43,7 @@
 [Guids]
   gShellVariableGuid
   gEfiVirtualCdGuid
+  gEfiFileInfoGuid
   
 [Protocols]
   gEfiLoadedImageProtocolGuid
   gEfiDevicePathProtocolGuid
   gEfiSimpleFileSystemProtocolGuid
   gEfiRamDiskProtocolGuid
+  gEfiAbsolutePointerProtocolGuid
+  gEfiAcpiTableProtocolGuid
+  gEfiBlockIo2ProtocolGuid
+  gEfiBusSpecificDriverOverrideProtocolGuid
+  gEfiComponentNameProtocolGuid
+  gEfiComponentName2ProtocolGuid
+  gEfiDriverBindingProtocolGuid
+  gEfiDiskIoProtocolGuid
+  gEfiDiskIo2ProtocolGuid
+  gEfiGraphicsOutputProtocolGuid
+  gEfiHiiConfigAccessProtocolGuid
+  gEfiHiiFontProtocolGuid
+  gEfiLoadFileProtocolGuid
+  gEfiLoadFile2ProtocolGuid
+  gEfiLoadedImageProtocolGuid
+  gEfiLoadedImageDevicePathProtocolGuid
+  gEfiPciIoProtocolGuid
+  gEfiSerialIoProtocolGuid
+  gEfiSimpleTextInProtocolGuid
+  gEfiSimpleTextInputExProtocolGuid
+  gEfiSimpleTextOutProtocolGuid
+  
+  
+  
+  
+  
+  
diff --git a/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyDebug.c b/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyDebug.c
new file mode 100644 (file)
index 0000000..4c595b4
--- /dev/null
@@ -0,0 +1,325 @@
+/******************************************************************************
+ * Ventoy.c
+ *
+ * Copyright (c) 2020, longpanda <admin@ventoy.net>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <Uefi.h>
+#include <Library/DebugLib.h>
+#include <Library/PrintLib.h>
+#include <Library/UefiLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Library/UefiApplicationEntryPoint.h>
+#include <Protocol/LoadedImage.h>
+#include <Guid/FileInfo.h>
+#include <Guid/FileSystemInfo.h>
+#include <Protocol/BlockIo.h>
+#include <Protocol/RamDisk.h>
+#include <Protocol/SimpleFileSystem.h>
+#include <Ventoy.h>
+
+STATIC ventoy_system_wrapper g_system_wrapper;
+
+static struct well_known_guid g_efi_well_known_guids[] = 
+{
+       { &gEfiAbsolutePointerProtocolGuid, "AbsolutePointer" },
+       { &gEfiAcpiTableProtocolGuid, "AcpiTable" },
+       { &gEfiBlockIoProtocolGuid, "BlockIo" },
+       { &gEfiBlockIo2ProtocolGuid, "BlockIo2" },
+       { &gEfiBusSpecificDriverOverrideProtocolGuid, "BusSpecificDriverOverride" },
+       { &gEfiComponentNameProtocolGuid, "ComponentName" },
+       { &gEfiComponentName2ProtocolGuid, "ComponentName2" },
+       { &gEfiDevicePathProtocolGuid, "DevicePath" },
+       { &gEfiDriverBindingProtocolGuid, "DriverBinding" },
+       { &gEfiDiskIoProtocolGuid, "DiskIo" },
+       { &gEfiDiskIo2ProtocolGuid, "DiskIo2" },
+       { &gEfiGraphicsOutputProtocolGuid, "GraphicsOutput" },
+       { &gEfiHiiConfigAccessProtocolGuid, "HiiConfigAccess" },
+       { &gEfiHiiFontProtocolGuid, "HiiFont" },
+       { &gEfiLoadFileProtocolGuid, "LoadFile" },
+       { &gEfiLoadFile2ProtocolGuid, "LoadFile2" },
+       { &gEfiLoadedImageProtocolGuid, "LoadedImage" },
+       { &gEfiLoadedImageDevicePathProtocolGuid, "LoadedImageDevicePath"},
+       { &gEfiPciIoProtocolGuid, "PciIo" },
+       { &gEfiSerialIoProtocolGuid, "SerialIo" },
+       { &gEfiSimpleFileSystemProtocolGuid, "SimpleFileSystem" },
+       { &gEfiSimpleTextInProtocolGuid, "SimpleTextInput" },
+       { &gEfiSimpleTextInputExProtocolGuid, "SimpleTextInputEx" },
+       { &gEfiSimpleTextOutProtocolGuid, "SimpleTextOutput" },
+};
+
+STATIC CHAR8 gEfiGuidName[128];
+
+static const char * ventoy_get_guid_name(EFI_GUID *guid)
+{
+    UINTN i;
+
+    for (i = 0; i < ARRAY_SIZE(g_efi_well_known_guids); i++)
+    {
+        if (CompareGuid(g_efi_well_known_guids[i].guid, guid))
+        {
+            return g_efi_well_known_guids[i].name;
+        }
+    }
+
+    AsciiSPrint(gEfiGuidName, sizeof(gEfiGuidName), "%g", guid);
+    return gEfiGuidName;
+}
+
+EFI_STATUS EFIAPI
+ventoy_wrapper_fs_open(EFI_FILE_HANDLE This, EFI_FILE_HANDLE *New, CHAR16 *Name, UINT64 Mode, UINT64 Attributes)
+{
+    (VOID)This;
+    (VOID)New;
+    (VOID)Name;
+    (VOID)Mode;
+    (VOID)Attributes;
+    return EFI_SUCCESS;
+}
+
+EFI_STATUS EFIAPI
+ventoy_wrapper_file_open_ex(EFI_FILE_HANDLE This, EFI_FILE_HANDLE *New, CHAR16 *Name, UINT64 Mode, UINT64 Attributes, EFI_FILE_IO_TOKEN *Token)
+{
+       return ventoy_wrapper_fs_open(This, New, Name, Mode, Attributes);
+}
+
+EFI_STATUS EFIAPI
+ventoy_wrapper_file_delete(EFI_FILE_HANDLE This)
+{
+    (VOID)This;
+       return EFI_SUCCESS;
+}
+
+EFI_STATUS EFIAPI
+ventoy_wrapper_file_set_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN Len, VOID *Data)
+{
+       return EFI_SUCCESS;
+}
+
+EFI_STATUS EFIAPI
+ventoy_wrapper_file_flush(EFI_FILE_HANDLE This)
+{
+    (VOID)This;
+       return EFI_SUCCESS;
+}
+
+/* Ex version */
+EFI_STATUS EFIAPI
+ventoy_wrapper_file_flush_ex(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token)
+{
+    (VOID)This;
+    (VOID)Token;
+       return EFI_SUCCESS;
+}
+
+
+EFI_STATUS EFIAPI
+ventoy_wrapper_file_write(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data)
+{
+    (VOID)This;
+    (VOID)Len;
+    (VOID)Data;
+
+       return EFI_WRITE_PROTECTED;
+}
+
+EFI_STATUS EFIAPI
+ventoy_wrapper_file_write_ex(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN *Token)
+{
+       return ventoy_wrapper_file_write(This, &(Token->BufferSize), Token->Buffer);
+}
+
+
+static EFI_STATUS EFIAPI
+ventoy_wrapper_file_close(EFI_FILE_HANDLE This)
+{
+    (VOID)This;
+    return EFI_SUCCESS;
+}
+
+
+static EFI_STATUS EFIAPI
+ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position)
+{
+    (VOID)This;
+    
+    g_efi_file_replace.CurPos = Position;
+    return EFI_SUCCESS;
+}
+
+static EFI_STATUS EFIAPI
+ventoy_wrapper_file_get_pos(EFI_FILE_HANDLE This, UINT64 *Position)
+{
+    (VOID)This;
+
+    *Position = g_efi_file_replace.CurPos;
+
+    return EFI_SUCCESS;
+}
+
+
+static EFI_STATUS EFIAPI
+ventoy_wrapper_file_get_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN *Len, VOID *Data)
+{
+    EFI_FILE_INFO *Info = (EFI_FILE_INFO *) Data;
+
+    debug("ventoy_wrapper_file_get_info ... %u", *Len);
+
+    if (!CompareGuid(Type, &gEfiFileInfoGuid))
+    {
+        return EFI_INVALID_PARAMETER;
+    }
+
+    if (*Len == 0)
+    {
+        *Len = 384;
+        return EFI_BUFFER_TOO_SMALL;
+    }
+
+    ZeroMem(Data, sizeof(EFI_FILE_INFO));
+
+    Info->Size = sizeof(EFI_FILE_INFO);
+    Info->FileSize = g_efi_file_replace.FileSizeBytes;
+    Info->PhysicalSize = g_efi_file_replace.FileSizeBytes;
+    Info->Attribute = EFI_FILE_READ_ONLY;
+    //Info->FileName = EFI_FILE_READ_ONLY;
+
+    *Len = Info->Size;
+    
+    return EFI_SUCCESS;
+}
+
+static EFI_STATUS EFIAPI
+ventoy_wrapper_file_read(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data)
+{
+    EFI_LBA Lba;
+    UINTN ReadLen = *Len;
+    
+    (VOID)This;
+
+    debug("ventoy_wrapper_file_read ... %u", *Len);
+
+    if (g_efi_file_replace.CurPos + ReadLen > g_efi_file_replace.FileSizeBytes)
+    {
+        ReadLen = g_efi_file_replace.FileSizeBytes - g_efi_file_replace.CurPos;
+    }
+
+    Lba = g_efi_file_replace.CurPos / 2048 + g_efi_file_replace.BlockIoSectorStart;
+
+    ventoy_block_io_read(NULL, 0, Lba, ReadLen, Data);
+
+    *Len = ReadLen;
+
+    g_efi_file_replace.CurPos += ReadLen;
+
+    return EFI_SUCCESS;
+}
+
+
+EFI_STATUS EFIAPI
+ventoy_wrapper_file_read_ex(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN *Token)
+{
+       return ventoy_wrapper_file_read(This, &(Token->BufferSize), Token->Buffer);
+}
+
+EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File)
+{
+    File->Revision    = EFI_FILE_PROTOCOL_REVISION2;
+    File->Open        = ventoy_wrapper_fs_open;
+    File->Close       = ventoy_wrapper_file_close;
+    File->Delete      = ventoy_wrapper_file_delete;
+    File->Read        = ventoy_wrapper_file_read;
+    File->Write       = ventoy_wrapper_file_write;
+    File->GetPosition = ventoy_wrapper_file_get_pos;
+    File->SetPosition = ventoy_wrapper_file_set_pos;
+    File->GetInfo     = ventoy_wrapper_file_get_info;
+    File->SetInfo     = ventoy_wrapper_file_set_info;
+    File->Flush       = ventoy_wrapper_file_flush;
+    File->OpenEx      = ventoy_wrapper_file_open_ex;
+    File->ReadEx      = ventoy_wrapper_file_read_ex;
+    File->WriteEx     = ventoy_wrapper_file_write_ex;
+    File->FlushEx     = ventoy_wrapper_file_flush_ex;
+
+    return EFI_SUCCESS;
+}
+
+STATIC EFI_STATUS EFIAPI ventoy_handle_protocol
+(
+    IN  EFI_HANDLE                Handle,
+    IN  EFI_GUID                 *Protocol,
+    OUT VOID                    **Interface
+)
+{
+    EFI_STATUS Status = EFI_SUCCESS;
+    
+    debug("ventoy_handle_protocol:%a", ventoy_get_guid_name(Protocol)); 
+    Status = g_system_wrapper.OriHandleProtocol(Handle, Protocol, Interface);
+
+    if (CompareGuid(Protocol, &gEfiSimpleFileSystemProtocolGuid))
+    {
+        EFI_FILE_PROTOCOL *FileProtocol = NULL;
+        EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *pFile = *((EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **)(Interface));
+        
+        pFile->OpenVolume(pFile, &FileProtocol);
+        
+        debug("Handle FS Protocol: %p OpenVolume:%p, FileProtocol:%p, Open:%p", 
+            pFile, pFile->OpenVolume, FileProtocol, FileProtocol->Open); 
+
+        sleep(3);
+    }
+
+    return Status;
+}
+
+STATIC EFI_STATUS EFIAPI ventoy_open_protocol
+(
+    IN  EFI_HANDLE                 Handle,
+    IN  EFI_GUID                  *Protocol,
+    OUT VOID                     **Interface, OPTIONAL
+    IN  EFI_HANDLE                 AgentHandle,
+    IN  EFI_HANDLE                 ControllerHandle,
+    IN  UINT32                     Attributes
+)
+{
+    debug("ventoy_open_protocol:%a", ventoy_get_guid_name(Protocol));
+    return g_system_wrapper.OriOpenProtocol(Handle, Protocol, Interface, AgentHandle, ControllerHandle, Attributes);
+}
+
+STATIC EFI_STATUS EFIAPI ventoy_locate_protocol
+(
+    IN  EFI_GUID   *Protocol,
+    IN  VOID       *Registration, OPTIONAL
+    OUT VOID      **Interface
+)
+{
+    debug("ventoy_locate_protocol:%a", ventoy_get_guid_name(Protocol));
+    return g_system_wrapper.OriLocateProtocol(Protocol, Registration, Interface);
+}
+
+EFI_STATUS EFIAPI ventoy_wrapper_system(VOID)
+{
+    ventoy_wrapper(gBS, g_system_wrapper, LocateProtocol, ventoy_locate_protocol);
+    ventoy_wrapper(gBS, g_system_wrapper, HandleProtocol, ventoy_handle_protocol);
+    ventoy_wrapper(gBS, g_system_wrapper, OpenProtocol,    ventoy_open_protocol);
+
+    return EFI_SUCCESS;
+}
+
index 2b26a8cb2ed086b99d6a43231008152d0da55f2d..6338d49e8df1894f2adcbbaccd00105cb862a7fc 100644 (file)
@@ -558,7 +558,7 @@ grub_fat_read_data (grub_disk_t disk, grub_fshelp_node_t node,
          if (next_cluster >= node->data->cluster_eof_mark)
            return ret;
 
-         if (next_cluster < 2 || next_cluster >= node->data->num_clusters)
+         if (next_cluster < 2 || (next_cluster - 2) >= node->data->num_clusters)
            {
              grub_error (GRUB_ERR_BAD_FS, "invalid cluster %u",
                          next_cluster);
@@ -1409,7 +1409,7 @@ int grub_fat_get_file_chunk(grub_uint64_t part_start, grub_file_t file, ventoy_i
                 return 0;
             }
 
-            if (next_cluster < 2 || next_cluster >= node->data->num_clusters)
+            if (next_cluster < 2 || (next_cluster - 2) >= node->data->num_clusters)
             {
                 grub_error (GRUB_ERR_BAD_FS, "invalid cluster %u", next_cluster);
                 return -1;
index d79532f06c55f90421e9f84b564ab9ff8d35d6da..ba1ec345f9903b7391d606f6cb01eb4d0556280c 100644 (file)
@@ -65,7 +65,7 @@ grub_uint32_t g_ventoy_cpio_size = 0;
 cpio_newc_header *g_ventoy_initrd_head = NULL;
 grub_uint8_t *g_ventoy_runtime_buf = NULL;
 
-ventoy_grub_param g_grub_param;
+ventoy_grub_param *g_grub_param = NULL;
 
 ventoy_guid  g_ventoy_guid = VENTOY_GUID;
 
@@ -1085,6 +1085,8 @@ static grub_err_t ventoy_cmd_img_sector(grub_extcmd_context_t ctxt, int argc, ch
 
     grub_file_close(file);
 
+    grub_memset(&g_grub_param->file_replace, 0, sizeof(g_grub_param->file_replace));
+
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
 }
 
@@ -1109,6 +1111,33 @@ static grub_err_t ventoy_cmd_dump_img_sector(grub_extcmd_context_t ctxt, int arg
     VENTOY_CMD_RETURN(GRUB_ERR_NONE);
 }
 
+static grub_err_t ventoy_cmd_add_replace_file(grub_extcmd_context_t ctxt, int argc, char **args)
+{
+    int i;
+    ventoy_grub_param_file_replace *replace = NULL;
+    
+    (void)ctxt;
+    (void)argc;
+    (void)args;
+
+    if (argc >= 2)
+    {
+        replace = &(g_grub_param->file_replace);
+        replace->magic = GRUB_FILE_REPLACE_MAGIC;
+            
+        replace->old_name_cnt = 0;
+        for (i = 0; i < 4 && i + 1 < argc; i++)
+        {
+            replace->old_name_cnt++;
+            grub_snprintf(replace->old_file_name[i], sizeof(replace->old_file_name[i]), "%s", args[i + 1]);
+        }
+        
+        replace->new_file_virtual_id = (grub_uint32_t)grub_strtoul(args[0], NULL, 10);
+    }
+
+    VENTOY_CMD_RETURN(GRUB_ERR_NONE);
+}
+
 grub_file_t ventoy_grub_file_open(enum grub_file_type type, const char *fmt, ...)
 {
     va_list ap;
@@ -1162,10 +1191,14 @@ static int ventoy_env_init(void)
     grub_env_set("vtdebug_flag", "");
 
     ventoy_filt_register(0, ventoy_wrapper_open);
-    
-    g_grub_param.grub_env_get = grub_env_get;
-    grub_snprintf(buf, sizeof(buf), "%p", &g_grub_param);
-    grub_env_set("env_param", buf);
+
+    g_grub_param = (ventoy_grub_param *)grub_zalloc(sizeof(ventoy_grub_param));
+    if (g_grub_param)
+    {
+        g_grub_param->grub_env_get = grub_env_get;
+        grub_snprintf(buf, sizeof(buf), "%p", g_grub_param);
+        grub_env_set("env_param", buf);
+    }
 
     return 0;
 }
@@ -1204,6 +1237,9 @@ static cmd_para ventoy_cmds[] =
     { "vt_windows_reset",      ventoy_cmd_wimdows_reset, 0, NULL, "", "", NULL },
     { "vt_windows_locate_wim", ventoy_cmd_wimdows_locate_wim, 0, NULL, "", "", NULL },
     { "vt_windows_chain_data", ventoy_cmd_windows_chain_data, 0, NULL, "", "", NULL },
+
+    { "vt_add_replace_file", ventoy_cmd_add_replace_file, 0, NULL, "", "", NULL },
+
     
     { "vt_load_plugin", ventoy_cmd_load_plugin, 0, NULL, "", "", NULL },
 };
index da696c338678a5d1fb2ee5cdafcf70adeec54850..1044005d1c36121a259263d74fabb556912a856a 100644 (file)
@@ -183,9 +183,22 @@ typedef struct ventoy_img_chunk_list
 typedef const char * (*grub_env_get_pf)(const char *name);
 
 #pragma pack(1)
+
+#define GRUB_FILE_REPLACE_MAGIC  0x1258BEEF
+
+typedef struct ventoy_grub_param_file_replace
+{
+    grub_uint32_t magic;
+    char old_file_name[4][256];
+    grub_uint32_t old_name_cnt;
+    grub_uint32_t new_file_virtual_id;
+}ventoy_grub_param_file_replace;
+
 typedef struct ventoy_grub_param
 {
     grub_env_get_pf grub_env_get;
+
+    ventoy_grub_param_file_replace file_replace;
 }ventoy_grub_param;
 
 #pragma pack()
diff --git a/IMG/cpio/ventoy/hook/alt/udev_disk_hook.sh b/IMG/cpio/ventoy/hook/alt/udev_disk_hook.sh
new file mode 100644 (file)
index 0000000..d886a24
--- /dev/null
@@ -0,0 +1,46 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+if is_ventoy_hook_finished || not_ventoy_disk "${1:0:-1}"; then
+    exit 0
+fi
+
+ventoy_udev_disk_common_hook $* "noreplace"
+
+if ! [ -e $VTOY_DM_PATH ]; then
+    blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
+    mknod -m 0666 $VTOY_DM_PATH b $blkdev_num
+fi
+
+# 
+# We do a trick for ATL series here.
+# Use /dev/loop7 and wapper it as a cdrom with bind mount.
+# Then the installer will accept /dev/loop7 as the install medium.
+#
+ventoy_copy_device_mapper  /dev/loop7
+$BUSYBOX_PATH/mkdir -p /tmp/loop7/device/
+echo 5 > /tmp/loop7/device/type
+$BUSYBOX_PATH/mount --bind /tmp/loop7 /sys/block/loop7 >> $VTLOG 2>&1
+
+
+# OK finish
+set_ventoy_hook_finish
+
diff --git a/IMG/cpio/ventoy/hook/alt/ventoy-hook.sh b/IMG/cpio/ventoy/hook/alt/ventoy-hook.sh
new file mode 100644 (file)
index 0000000..3fabb01
--- /dev/null
@@ -0,0 +1,24 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. $VTOY_PATH/hook/ventoy-os-lib.sh
+
+ventoy_systemd_udevd_work_around
+
+ventoy_add_udev_rule "$VTOY_PATH/hook/alt/udev_disk_hook.sh %k"
diff --git a/IMG/cpio/ventoy/hook/clear/disk-hook.sh b/IMG/cpio/ventoy/hook/clear/disk-hook.sh
new file mode 100644 (file)
index 0000000..8ee0579
--- /dev/null
@@ -0,0 +1,43 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+if is_ventoy_hook_finished; then
+    exit 0
+fi
+
+vtlog "####### $0 $* ########"
+
+VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
+
+wait_for_usb_disk_ready
+
+vtdiskname=$(get_ventoy_disk_name)
+if [ "$vtdiskname" = "unknown" ]; then
+    vtlog "ventoy disk not found"
+    PATH=$VTPATH_OLD
+    exit 0
+fi
+
+ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
+
+PATH=$VTPATH_OLD
+
+set_ventoy_hook_finish
diff --git a/IMG/cpio/ventoy/hook/clear/ventoy-hook.sh b/IMG/cpio/ventoy/hook/clear/ventoy-hook.sh
new file mode 100644 (file)
index 0000000..a73b702
--- /dev/null
@@ -0,0 +1,22 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. $VTOY_PATH/hook/ventoy-os-lib.sh
+
+$SED "/find_and_mount_installer *$/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/clear/disk-hook.sh" -i  /init
diff --git a/IMG/cpio/ventoy/hook/debian/deepin-disk.sh b/IMG/cpio/ventoy/hook/debian/deepin-disk.sh
new file mode 100644 (file)
index 0000000..926e1a5
--- /dev/null
@@ -0,0 +1,47 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+vtlog "####### $0 $* ########"
+
+VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
+
+vtmountpoint=$1
+
+if is_ventoy_hook_finished; then
+    PATH=$VTPATH_OLD
+    exit 0
+fi
+
+wait_for_usb_disk_ready
+
+vtdiskname=$(get_ventoy_disk_name)
+if [ "$vtdiskname" = "unknown" ]; then
+    vtlog "ventoy disk not found"
+    PATH=$VTPATH_OLD
+    exit 0
+fi
+
+ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
+
+$BUSYBOX_PATH/mount -t iso9660 $VTOY_DM_PATH $vtmountpoint
+
+# OK finish
+set_ventoy_hook_finish
diff --git a/IMG/cpio/ventoy/hook/debian/deepin-hook.sh b/IMG/cpio/ventoy/hook/debian/deepin-hook.sh
new file mode 100644 (file)
index 0000000..deec640
--- /dev/null
@@ -0,0 +1,47 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+drop_initramfs_workaround() {
+    mainfilelist=$($FIND / -name 9990-main.sh)
+    
+    echo "mainfilelist=$mainfilelist" >> $VTLOG
+    
+    if [ -z "$mainfilelist" ]; then 
+        return
+    fi
+
+    for vtfile in $mainfilelist; do
+        vtcnt=$($GREP -c 'panic.*Unable to find a medium' $vtfile)
+        if [ $vtcnt -ne 1 ]; then
+            return
+        fi
+    done
+    
+    echo "direct_hook insert ..." >> $VTLOG
+    
+    for vtfile in $mainfilelist; do
+        $SED "s#panic.*Unable to find a medium.*#$BUSYBOX_PATH/sh  $VTOY_PATH/hook/debian/deepin-disk.sh \$mountpoint; livefs_root=\$mountpoint#" -i $vtfile
+    done
+}
+
+ventoy_systemd_udevd_work_around
+ventoy_add_udev_rule "$VTOY_PATH/hook/debian/udev_disk_hook.sh %k"
+
+drop_initramfs_workaround
+
diff --git a/IMG/cpio/ventoy/hook/debian/knoppix-disk.sh b/IMG/cpio/ventoy/hook/debian/knoppix-disk.sh
new file mode 100644 (file)
index 0000000..047ea6c
--- /dev/null
@@ -0,0 +1,43 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+vtlog "####### $0 $* ########"
+
+VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
+
+wait_for_usb_disk_ready
+
+vtdiskname=$(get_ventoy_disk_name)
+if [ "$vtdiskname" = "unknown" ]; then
+    vtlog "ventoy disk not found"
+    PATH=$VTPATH_OLD
+    exit 0
+fi
+
+ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
+
+if ! [ -e $VTOY_DM_PATH ]; then
+    blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
+    mknod -m 0666 $VTOY_DM_PATH b $blkdev_num
+fi
+
+PATH=$VTPATH_OLD
+
diff --git a/IMG/cpio/ventoy/hook/debian/knoppix-hook.sh b/IMG/cpio/ventoy/hook/debian/knoppix-hook.sh
new file mode 100644 (file)
index 0000000..b57fd15
--- /dev/null
@@ -0,0 +1,23 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+$SED '/^findknoppix/a\ return 0'  -i /init
+$SED '/^findknoppix/a\ trymount $ROOTDEV /mnt-system >/dev/null 2>&1'  -i /init
+$SED '/^findknoppix/a\ ROOTDEV=/dev/mapper/ventoy'  -i /init
+$SED "/^findknoppix/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/knoppix-disk.sh"  -i /init
diff --git a/IMG/cpio/ventoy/hook/debian/porteus-disk.sh b/IMG/cpio/ventoy/hook/debian/porteus-disk.sh
new file mode 100644 (file)
index 0000000..c16aa9e
--- /dev/null
@@ -0,0 +1,77 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+vtlog "####### $0 $* ########"
+
+VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
+
+
+ventoy_os_install_dmsetup_by_fuse() {
+    vtlog "ventoy_os_install_dmsetup_by_fuse $*"
+
+    mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso $VTOY_PATH/mnt/squashfs
+
+    vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table
+    vtoy_fuse_iso -f $VTOY_PATH/ventoy_dm_table -m $VTOY_PATH/mnt/fuse
+
+    mount -t iso9660  $VTOY_PATH/mnt/fuse/ventoy.iso    $VTOY_PATH/mnt/iso
+    
+    sfsfile=$(ls $VTOY_PATH/mnt/iso/porteus/base/*kernel.xzm)
+    
+    mount -t squashfs $sfsfile  $VTOY_PATH/mnt/squashfs
+
+    KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/md/dm-mod.ko*)
+    vtlog "insmod $KoName"
+    insmod $KoName 
+
+    umount $VTOY_PATH/mnt/squashfs
+    umount $VTOY_PATH/mnt/iso
+    umount $VTOY_PATH/mnt/fuse
+}
+
+ventoy_os_install_dmsetup() {
+    vtlog "ventoy_os_install_dmsetup"
+    
+    if grep -q 'device-mapper' /proc/devices; then
+        vtlog "device-mapper module already loaded"
+        return;
+    fi
+    
+    vtKerVer=$(uname -r)
+    
+    ventoy_os_install_dmsetup_by_fuse $1 $vtKerVer
+}
+
+wait_for_usb_disk_ready
+
+vtdiskname=$(get_ventoy_disk_name)
+if [ "$vtdiskname" = "unknown" ]; then
+    vtlog "ventoy disk not found"
+    PATH=$VTPATH_OLD
+    exit 0
+fi
+
+ventoy_os_install_dmsetup $vtdiskname
+
+ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
+
+PATH=$VTPATH_OLD
+
diff --git a/IMG/cpio/ventoy/hook/debian/porteus-hook.sh b/IMG/cpio/ventoy/hook/debian/porteus-hook.sh
new file mode 100644 (file)
index 0000000..689460c
--- /dev/null
@@ -0,0 +1,48 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+porteus_hook() {
+    $SED "/searching *for *\$SGN *file/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/porteus-disk.sh"  -i $1
+    $SED "/searching *for *\$CFG *file/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/porteus-disk.sh"  -i $1
+}
+
+if $GREP -q exfat /proc/filesystems; then
+    vtPath=$($VTOY_PATH/tool/vtoydump -p $VTOY_PATH/ventoy_os_param)
+    
+    $GREP '`value from`' /usr/* -r | $AWK -F: '{print $1}' | while read vtline; do
+        echo "hooking $vtline ..." >> $VTLOG
+        $SED "s#\`value from\`#$vtPath#g"  -i $vtline
+    done
+
+else
+    for vtfile in '/init' '/linuxrc' ; do
+        if [ -e $vtfile ]; then
+            if ! $GREP -q ventoy $vtfile; then
+                echo "hooking $vtfile ..."  >> $VTLOG
+                porteus_hook $vtfile
+            fi
+        fi
+    done
+fi
+
+
+# replace blkid in system
+vtblkid=$($BUSYBOX_PATH/which blkid)
+$BUSYBOX_PATH/rm -f $vtblkid
+$BUSYBOX_PATH/cp -a $BUSYBOX_PATH/blkid $vtblkid
diff --git a/IMG/cpio/ventoy/hook/debian/puppy-disk.sh b/IMG/cpio/ventoy/hook/debian/puppy-disk.sh
new file mode 100644 (file)
index 0000000..6872f58
--- /dev/null
@@ -0,0 +1,48 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+if is_ventoy_hook_finished; then
+    exit 0
+fi
+
+vtlog "####### $0 $* ########"
+
+VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
+
+wait_for_usb_disk_ready
+
+vtdiskname=$(get_ventoy_disk_name)
+if [ "$vtdiskname" = "unknown" ]; then
+    vtlog "ventoy disk not found"
+    PATH=$VTPATH_OLD
+    exit 0
+fi
+
+ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
+
+if ! [ -e $VTOY_DM_PATH ]; then
+    blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
+    mknod -m 0666 $VTOY_DM_PATH b $blkdev_num
+fi
+
+PATH=$VTPATH_OLD
+
+set_ventoy_hook_finish
diff --git a/IMG/cpio/ventoy/hook/debian/puppy-hook.sh b/IMG/cpio/ventoy/hook/debian/puppy-hook.sh
new file mode 100644 (file)
index 0000000..69e18f3
--- /dev/null
@@ -0,0 +1,22 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+$SED '1 apmedia=usbhd'  -i /init
+$SED "/^ *HAVE_PARTS=/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/puppy-disk.sh"  -i /init
+$SED "/^ *HAVE_PARTS=/a\ HAVE_PARTS='mapper/ventoy|iso9660'"  -i /init
diff --git a/IMG/cpio/ventoy/hook/debian/pve-disk.sh b/IMG/cpio/ventoy/hook/debian/pve-disk.sh
new file mode 100644 (file)
index 0000000..8ee0579
--- /dev/null
@@ -0,0 +1,43 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+if is_ventoy_hook_finished; then
+    exit 0
+fi
+
+vtlog "####### $0 $* ########"
+
+VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
+
+wait_for_usb_disk_ready
+
+vtdiskname=$(get_ventoy_disk_name)
+if [ "$vtdiskname" = "unknown" ]; then
+    vtlog "ventoy disk not found"
+    PATH=$VTPATH_OLD
+    exit 0
+fi
+
+ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
+
+PATH=$VTPATH_OLD
+
+set_ventoy_hook_finish
diff --git a/IMG/cpio/ventoy/hook/debian/pve-hook.sh b/IMG/cpio/ventoy/hook/debian/pve-hook.sh
new file mode 100644 (file)
index 0000000..e54ab4c
--- /dev/null
@@ -0,0 +1,21 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+$SED "/\/sys\/block\/hd\*/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/pve-disk.sh"  -i /init
+$SED "s#/sys/block/hd\*#/sys/block/dm* /sys/block/hd*#"  -i /init
diff --git a/IMG/cpio/ventoy/hook/debian/slax-disk.sh b/IMG/cpio/ventoy/hook/debian/slax-disk.sh
new file mode 100644 (file)
index 0000000..0e0cbfb
--- /dev/null
@@ -0,0 +1,77 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+vtlog "####### $0 $* ########"
+
+VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
+
+
+ventoy_os_install_dmsetup_by_fuse() {
+    vtlog "ventoy_os_install_dmsetup_by_fuse $*"
+
+    mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso $VTOY_PATH/mnt/squashfs
+
+    vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table
+    vtoy_fuse_iso -f $VTOY_PATH/ventoy_dm_table -m $VTOY_PATH/mnt/fuse
+
+    mount -t iso9660  $VTOY_PATH/mnt/fuse/ventoy.iso    $VTOY_PATH/mnt/iso
+    mount -t squashfs $VTOY_PATH/mnt/iso/slax/01-core.sb  $VTOY_PATH/mnt/squashfs
+
+    KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/md/dm-mod.ko*)
+    vtlog "insmod $KoName"
+    insmod $KoName
+
+    umount $VTOY_PATH/mnt/squashfs
+    umount $VTOY_PATH/mnt/iso
+    umount $VTOY_PATH/mnt/fuse
+}
+
+
+ventoy_os_install_dmsetup() {
+    vtlog "ventoy_os_install_dmsetup"
+    
+    if grep -q 'device-mapper' /proc/devices; then
+        vtlog "device-mapper module already loaded"
+        return;
+    fi
+    
+    vtKerVer=$(uname -r)
+    
+    if modprobe fuse 2>>$VTLOG; then
+        ventoy_os_install_dmsetup_by_fuse $1 $vtKerVer
+    fi
+}
+
+wait_for_usb_disk_ready
+
+vtdiskname=$(get_ventoy_disk_name)
+if [ "$vtdiskname" = "unknown" ]; then
+    vtlog "ventoy disk not found"
+    PATH=$VTPATH_OLD
+    exit 0
+fi
+
+ventoy_os_install_dmsetup $vtdiskname
+
+ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
+
+PATH=$VTPATH_OLD
+
diff --git a/IMG/cpio/ventoy/hook/debian/slax-hook.sh b/IMG/cpio/ventoy/hook/debian/slax-hook.sh
new file mode 100644 (file)
index 0000000..93790fa
--- /dev/null
@@ -0,0 +1,20 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+$SED "/find_data/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/slax-disk.sh"  -i /init
diff --git a/IMG/cpio/ventoy/hook/debian/tails-hook.sh b/IMG/cpio/ventoy/hook/debian/tails-hook.sh
new file mode 100644 (file)
index 0000000..dd88049
--- /dev/null
@@ -0,0 +1,24 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+$SED "s#.*livefs_root=.*find_livefs.*#$BUSYBOX_PATH/mount -t iso9660 /dev/mapper/ventoy \$mountpoint; livefs_root=\$mountpoint#" -i /usr/lib/live/boot/9990-main.sh
+$SED "s#.*livefs_root=.*find_livefs.*#$BUSYBOX_PATH/mount -t iso9660 /dev/mapper/ventoy \$mountpoint; livefs_root=\$mountpoint#" -i /usr/bin/boot/9990-main.sh
+
+ventoy_systemd_udevd_work_around
+ventoy_add_udev_rule "$VTOY_PATH/hook/debian/udev_disk_hook.sh %k"
diff --git a/IMG/cpio/ventoy/hook/debian/veket-disk.sh b/IMG/cpio/ventoy/hook/debian/veket-disk.sh
new file mode 100644 (file)
index 0000000..38a9c05
--- /dev/null
@@ -0,0 +1,88 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+if is_ventoy_hook_finished; then
+    exit 0
+fi
+
+vtlog "####### $0 $* ########"
+
+VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
+
+ventoy_os_install_dmsetup_by_fuse() {
+    vtlog "ventoy_os_install_dmsetup_by_fuse $*"
+
+    mkdir -p $VTOY_PATH/mnt/fuse $VTOY_PATH/mnt/iso $VTOY_PATH/mnt/squashfs
+
+    vtoydm -p -f $VTOY_PATH/ventoy_image_map -d $1 > $VTOY_PATH/ventoy_dm_table
+    vtoy_fuse_iso -f $VTOY_PATH/ventoy_dm_table -m $VTOY_PATH/mnt/fuse
+
+    mount -t iso9660  $VTOY_PATH/mnt/fuse/ventoy.iso    $VTOY_PATH/mnt/iso
+    
+    sfsfile=$(ls $VTOY_PATH/mnt/iso/adrv_veket*.sfs)
+    
+    mount -t squashfs $sfsfile  $VTOY_PATH/mnt/squashfs
+
+    KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/dax/dax.ko*)
+    vtlog "insmod $KoName"
+    insmod $KoName 
+    
+    KoName=$(ls $VTOY_PATH/mnt/squashfs/lib/modules/$2/kernel/drivers/md/dm-mod.ko*)
+    vtlog "insmod $KoName"
+    insmod $KoName 
+
+    umount $VTOY_PATH/mnt/squashfs
+    umount $VTOY_PATH/mnt/iso
+    umount $VTOY_PATH/mnt/fuse
+}
+
+ventoy_os_install_dmsetup() {
+    vtlog "ventoy_os_install_dmsetup"
+    
+    if grep -q 'device-mapper' /proc/devices; then
+        vtlog "device-mapper module already loaded"
+        return;
+    fi
+    
+    vtKerVer=$(uname -r)
+    
+    ventoy_os_install_dmsetup_by_fuse $1 $vtKerVer
+}
+
+wait_for_usb_disk_ready
+
+vtdiskname=$(get_ventoy_disk_name)
+if [ "$vtdiskname" = "unknown" ]; then
+    vtlog "ventoy disk not found"
+    PATH=$VTPATH_OLD
+    exit 0
+fi
+
+ventoy_os_install_dmsetup $vtdiskname
+
+ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
+
+blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
+mknod -m 0666 /dev/ventoy b $blkdev_num
+
+PATH=$VTPATH_OLD
+
+set_ventoy_hook_finish
diff --git a/IMG/cpio/ventoy/hook/debian/veket-hook.sh b/IMG/cpio/ventoy/hook/debian/veket-hook.sh
new file mode 100644 (file)
index 0000000..922e236
--- /dev/null
@@ -0,0 +1,22 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+$SED '1 apmedia=usbhd'  -i /init
+$SED "/^ *HAVE_PARTS=/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/veket-disk.sh"  -i /init
+$SED "/^ *HAVE_PARTS=/a\ HAVE_PARTS='ventoy|iso9660'"  -i /init
index ca91ac84193a1d798ba0846294916f1913addf6d..bf7cb9e69c1c76ddf91305118037b342ff2ed21f 100644 (file)
@@ -64,6 +64,8 @@ ventoy_os_install_device_mapper() {
     fi
 }
 
+wait_for_usb_disk_ready
+
 vtdiskname=$(get_ventoy_disk_name)
 ventoy_os_install_device_mapper $vtdiskname
 
diff --git a/IMG/cpio/ventoy/hook/rhel7/ventoy-disk.sh b/IMG/cpio/ventoy/hook/rhel7/ventoy-disk.sh
new file mode 100644 (file)
index 0000000..ab1d497
--- /dev/null
@@ -0,0 +1,44 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+if is_ventoy_hook_finished; then
+    exit 0
+fi
+
+vtlog "####### $0 $* ########"
+
+VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
+
+wait_for_usb_disk_ready
+
+vtdiskname=$(get_ventoy_disk_name)
+if [ "$vtdiskname" = "unknown" ]; then
+    vtlog "ventoy disk not found"
+    PATH=$VTPATH_OLD
+    exit 0
+fi
+
+ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2"
+
+PATH=$VTPATH_OLD
+
+set_ventoy_hook_finish
+
index 6bb0664cac47fab87a3b1f733641a94b3deb6b4d..ca3503df8c27a057c875816dd303a5d5c1ec2cf5 100644 (file)
 . $VTOY_PATH/hook/ventoy-os-lib.sh
 
 ventoy_systemd_udevd_work_around
-
 ventoy_add_udev_rule "$VTOY_PATH/hook/default/udev_disk_hook.sh %k noreplace"
 
+#$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-disk.sh /lib/dracut/hooks/initqueue/01-ventoy-disk.sh
+
 # suppress write protected mount warning
 if [ -e /usr/sbin/anaconda-diskroot ]; then
     $SED  's/^mount $dev $repodir/mount -oro $dev $repodir/' -i /usr/sbin/anaconda-diskroot
 fi
+
index 76098296809275cb50dfbc0278dfb8477ac8e377..62e413b9d2c5daf3363d5743666902b96b6aea05 100644 (file)
@@ -226,7 +226,7 @@ wait_for_ventoy_dm_disk_label() {
         if ls -l /dev/disk/by-label/ | $GREP -q "$DM"; then
             break
         else
-            $SLEEP 0.3
+            $SLEEP 1
         fi
     done
 }
@@ -395,7 +395,7 @@ ventoy_udev_disk_common_hook() {
     else
         vtlog "==== create ventoy device mapper failed ===="
         
-        $SLEEP 5
+        $SLEEP 3
         
         if $GREP -q "/dev/$VTDISK" /proc/mounts; then
             $GREP "/dev/$VTDISK" /proc/mounts | while read vtLine; do
index 0be5a0a75ad0947495fca5e5dda0b849eca2b318..b5ea3bf7d8e49d34a20e0a4a12bb5c7bdadc7946 100644 (file)
@@ -80,14 +80,19 @@ ventoy_add_udev_rule() {
 # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=869719
 #
 ventoy_systemd_udevd_work_around() {
-    VTSYSTEMUDEV="$VT_RULE_DIR_PREFIX/lib/systemd/system/systemd-udevd.service"
-    if [ -e $VTSYSTEMUDEV ]; then
-        if $GREP -q 'SystemCallArchitectures.*native' $VTSYSTEMUDEV; then
-            $SED "s/.*\(SystemCallArchitectures.*native\)/#\1/g"  -i $VTSYSTEMUDEV
+    for vtdir in 'lib' 'usr/lib'; do
+    
+        VTSYSTEMUDEV="$VT_RULE_DIR_PREFIX/$vtdir/systemd/system/systemd-udevd.service"
+        if [ -e $VTSYSTEMUDEV ]; then
+            if $GREP -q 'SystemCallArchitectures.*native' $VTSYSTEMUDEV; then
+                $SED "s/.*\(SystemCallArchitectures.*native\)/#\1/g"  -i $VTSYSTEMUDEV
+                break
+            fi
         fi
-    fi
+    done
 }
 
+
 ventoy_print_yum_repo() {
     echo "[$1]"
     echo "name=$1"
diff --git a/IMG/cpio/ventoy/hook/zeroshell/disk_hook.sh b/IMG/cpio/ventoy/hook/zeroshell/disk_hook.sh
new file mode 100644 (file)
index 0000000..55058ec
--- /dev/null
@@ -0,0 +1,42 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. /ventoy/hook/ventoy-hook-lib.sh
+
+vtlog "####### $0 $* ########"
+
+VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
+
+wait_for_usb_disk_ready
+
+vtdiskname=$(get_ventoy_disk_name)
+if [ "$vtdiskname" = "unknown" ]; then
+    vtlog "ventoy disk not found"
+    PATH=$VTPATH_OLD
+    exit 0
+fi
+
+ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
+
+if ! [ -e $VTOY_DM_PATH ]; then
+    blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
+    mknod -m 0666 $VTOY_DM_PATH b $blkdev_num
+fi
+
+PATH=$VTPATH_OLD
diff --git a/IMG/cpio/ventoy/hook/zeroshell/ventoy-hook.sh b/IMG/cpio/ventoy/hook/zeroshell/ventoy-hook.sh
new file mode 100644 (file)
index 0000000..e08252d
--- /dev/null
@@ -0,0 +1,24 @@
+#!/ventoy/busybox/sh
+#************************************************************************************
+# Copyright (c) 2020, longpanda <admin@ventoy.net>
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 3 of the
+# License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# 
+#************************************************************************************
+
+. $VTOY_PATH/hook/ventoy-os-lib.sh
+
+
+$SED "/while.*\$device/i\ device=/dev/mapper/ventoy"  -i /init
+$SED "/while.*\$device/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/zeroshell/disk_hook.sh"  -i /init
index d1c331fbd6e0f05b78da31f38fc50303b73ef357..c2b7b507a39b1c631efc24b265b48b7667632a05 100644 (file)
@@ -76,8 +76,19 @@ ventoy_unpack_initramfs() {
     for vtx in '1F8B zcat' '1F9E zcat' '425A bzcat' '5D00 lzcat' 'FD37 xzcat' '894C lzopcat' '0221 lz4cat' '28B5 zstdcat' '3037 cat'; do
         if [ "${vtx:0:4}" = "${vtmagic:0:4}" ]; then
             echo "vtx=$vtx" >> $VTLOG            
-            if [ $vtskip -eq 0 ]; then
-                ${vtx:5} $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
+            if [ $vtskip -eq 0 ]; then            
+                if [ "${vtx:5}" = "xzcat" ]; then
+                    rm -f $VTOY_PATH/xzlog
+                    ${vtx:5} $vtfile 2> $VTOY_PATH/xzlog | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
+                    
+                    if grep -q 'corrupted data' $VTOY_PATH/xzlog; then
+                        echo 'xzcat failed, now try xzminidec...' >> $VTLOG        
+                        cat $vtfile | xzminidec | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
+                    fi
+                    
+                else
+                    ${vtx:5} $vtfile | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
+                fi
             else
                 dd if=$vtfile skip=$vtskip iflag=skip_bytes status=none | ${vtx:5} | (cpio -idmu 2>>$VTLOG; cat > $vttmp)
             fi
@@ -104,64 +115,36 @@ ventoy_unpack_initrd() {
 # This export is for busybox cpio command
 export EXTRACT_UNSAFE_SYMLINKS=1
 
-# special process
-need_xzminidec() {
-    if [ -e /initrd001 ]; then
-        testmagic=$(hexdump -n 2 -e '2/1 "%02X"' /initrd001)
-    else
-        testmagic='xxxx'
-    fi
-    
-    if [ "FD37" = "${testmagic:0:4}" ]; then
-        if echo $vtkerver | grep -q 'kaspersky'; then
-            true
-        elif echo $vtkerver | grep -q 'kiosk.*Gentoo'; then
-            true
-        elif echo $vtkerver | grep -q 'porteus '; then
-            true
-        else
-            false
-        fi
+for vtfile in $(ls /initrd*); do    
+    #decompress first initrd
+    vtmagic=$(hexdump -n 2 -e '2/1 "%02X"' $vtfile)
+
+    if ventoy_is_initrd_ramdisk; then
+        ventoy_unpack_initrd $vtfile $vtmagic ${vtfile}_tmp
+        mv ${vtfile}_tmp $vtfile
+        break
     else
-        false
+        ventoy_unpack_initramfs $vtfile 0 $vtmagic ${vtfile}_tmp
     fi
-}
 
-if need_xzminidec; then
-    echo "use xzminidec" >> $VTLOG
-    cat /initrd001 | xzminidec | cpio -idmu 2>>$VTLOG
-    rm -f /initrd001
-else
-    for vtfile in $(ls /initrd*); do    
-        #decompress first initrd
-        vtmagic=$(hexdump -n 2 -e '2/1 "%02X"' $vtfile)
-
-        if ventoy_is_initrd_ramdisk; then
-            ventoy_unpack_initrd $vtfile $vtmagic ${vtfile}_tmp
-            mv ${vtfile}_tmp $vtfile
+    #only for cpio,cpio,...,initrd sequence, initrd,cpio or initrd,initrd sequence is not supported
+    while [ -e ${vtfile}_tmp ] && [ $(stat -c '%s' ${vtfile}_tmp) -gt 512 ]; do
+        mv ${vtfile}_tmp $vtfile
+        vtdump=$(hexdump -n 512 -e '512/1 "%02X"' $vtfile)
+        vtmagic=$(echo $vtdump | sed 's/^\(00\)*//')
+        let vtoffset="(${#vtdump}-${#vtmagic})/2"
+        
+        if [ -z "$vtmagic" ]; then
+            echo "terminate with all zero data file" >> $VTLOG
             break
-        else
-            ventoy_unpack_initramfs $vtfile 0 $vtmagic ${vtfile}_tmp
         fi
-
-        #only for cpio,cpio,...,initrd sequence, initrd,cpio or initrd,initrd sequence is not supported
-        while [ -e ${vtfile}_tmp ] && [ $(stat -c '%s' ${vtfile}_tmp) -gt 512 ]; do
-            mv ${vtfile}_tmp $vtfile
-            vtdump=$(hexdump -n 512 -e '512/1 "%02X"' $vtfile)
-            vtmagic=$(echo $vtdump | sed 's/^\(00\)*//')
-            let vtoffset="(${#vtdump}-${#vtmagic})/2"
-            
-            if [ -z "$vtmagic" ]; then
-                echo "terminate with all zero data file" >> $VTLOG
-                break
-            fi
-            
-            ventoy_unpack_initramfs $vtfile $vtoffset ${vtmagic:0:4} ${vtfile}_tmp
-        done
         
-        rm -f $vtfile ${vtfile}_tmp
+        ventoy_unpack_initramfs $vtfile $vtoffset ${vtmagic:0:4} ${vtfile}_tmp
     done
-fi
+    
+    rm -f $vtfile ${vtfile}_tmp
+done
+
 
 #break here for debug
 if [ "$VTOY_BREAK_LEVEL" = "02" ] || [ "$VTOY_BREAK_LEVEL" = "12" ]; then
index c408d012c9bdddfd1c7063e0673895a541848662..5a643b683a2e36b0d32658559ff066195c0912a8 100644 (file)
@@ -52,3 +52,12 @@ else
     $BUSYBOX_PATH/cp -a $VTOY_PATH/tool/unsquashfs_32 $VTOY_PATH/tool/vtoy_unsquashfs
 fi
 
+
+if $VTOY_PATH/tool/unsquashfs_64 -t 2>>$VTLOG; then
+    echo "use unsquashfs_64" >>$VTLOG
+    $BUSYBOX_PATH/cp -a $VTOY_PATH/tool/unsquashfs_64  $VTOY_PATH/tool/vtoy_unsquashfs
+else
+    echo "use unsquashfs_32" >>$VTLOG    
+    $BUSYBOX_PATH/cp -a $VTOY_PATH/tool/unsquashfs_32 $VTOY_PATH/tool/vtoy_unsquashfs
+fi
+
diff --git a/IMG/cpio/ventoy/tool/xzminidec b/IMG/cpio/ventoy/tool/xzminidec
new file mode 100644 (file)
index 0000000..b2c2056
Binary files /dev/null and b/IMG/cpio/ventoy/tool/xzminidec differ
index 727102a24c279a86794bf1c2178ef9e444801904..2517f0b12688713f8f3dc8efedea2d79adcca6dc 100644 (file)
@@ -130,6 +130,7 @@ ventoy_get_os_type() {
             echo 'xen'; return
         elif $GREP -q 'SUSE ' /etc/os-release; then
             echo 'suse'; return
+       
         fi
     fi
     
@@ -156,6 +157,14 @@ ventoy_get_os_type() {
         echo 'debian'; return
     fi
     
+    if $GREP -q 'Clear Linux ' /proc/version; then
+        echo 'clear'; return
+    fi
+    
+    if $GREP -q 'artix' /proc/version; then
+        echo 'arch'; return
+    fi
+    
     echo "default"
 }
 
index 691ee80f8f663b091981a0b7ac480ffda5511cc1..f939c3474db20be826a0ee55500b468754d548c9 100644 (file)
Binary files a/INSTALL/EFI/BOOT/BOOTX64.EFI and b/INSTALL/EFI/BOOT/BOOTX64.EFI differ
diff --git a/INSTALL/EFI/BOOT/MokManager.efi b/INSTALL/EFI/BOOT/MokManager.efi
new file mode 100644 (file)
index 0000000..af684d5
Binary files /dev/null and b/INSTALL/EFI/BOOT/MokManager.efi differ
diff --git a/INSTALL/EFI/BOOT/grubx64.efi b/INSTALL/EFI/BOOT/grubx64.efi
new file mode 100644 (file)
index 0000000..4c70a54
Binary files /dev/null and b/INSTALL/EFI/BOOT/grubx64.efi differ
diff --git a/INSTALL/EFI/BOOT/grubx64_real.efi b/INSTALL/EFI/BOOT/grubx64_real.efi
new file mode 100644 (file)
index 0000000..ea29414
Binary files /dev/null and b/INSTALL/EFI/BOOT/grubx64_real.efi differ
index 9e6deef2e6b48c8c0763bf8e2d666a87ca3cfb6c..1ebf05ccd601f6b8cee6f8c580199d6438ee8aca 100644 (file)
@@ -1,5 +1,11 @@
 #!/bin/sh
 
+OLDDIR=$PWD
+
+if ! [ -f ./tool/ventoy_lib.sh ]; then
+    cd ${0%Ventoy2Disk.sh}
+fi
+
 . ./tool/ventoy_lib.sh
 
 print_usage() {
@@ -18,12 +24,7 @@ echo '*             longpanda  admin@ventoy.net                 *'
 echo '***********************************************************'
 echo ''
 
-vtdebug "############# Ventoy2Disk ################"
-
-if ! [ -e ventoy/version ]; then
-    vterr "Please run under the correct directory!"
-    exit 1
-fi
+vtdebug "############# Ventoy2Disk $0 ################"
 
 if [ "$1" = "-i" ]; then
     MODE="install"
@@ -34,11 +35,13 @@ elif [ "$1" = "-u" ]; then
     MODE="update"
 else
     print_usage
+    cd $OLDDIR
     exit 1
 fi
 
 if ! [ -b "$2" ]; then
     print_usage
+    cd $OLDDIR
     exit 1
 fi
 
@@ -46,6 +49,7 @@ if [ -z "$SUDO_USER" ]; then
     if [ "$USER" != "root" ]; then
         vterr "EUID is $EUID root permission is required."
         echo ''
+        cd $OLDDIR
         exit 1
     fi
 fi
@@ -67,6 +71,7 @@ cd ../
 
 if ! check_tool_work_ok; then
     vterr "Some tools can not run in current system. Please check log.txt for detail."
+    cd $OLDDIR
     exit 1
 fi
 
@@ -75,17 +80,26 @@ DISK=$2
 
 if ! [ -b "$DISK" ]; then
     vterr "Disk $DISK does not exist"
+    cd $OLDDIR
     exit 1
 fi
 
 
 if [ -e /sys/class/block/${DISK#/dev/}/start ]; then
     vterr "$DISK is a partition, please use the whole disk"
+    cd $OLDDIR
     exit 1
 fi
 
+grep "^$DISK" /proc/mounts | while read mtline; do
+    mtpnt=$(echo $mtline | awk '{print $2}')
+    vtdebug "Trying to umount $mtpnt ..."
+    umount $mtpnt >/dev/null 2>&1
+done
+
 if grep "$DISK" /proc/mounts; then
     vterr "$DISK is already mounted, please umount it first!"
+    cd $OLDDIR
     exit 1
 fi
 
@@ -95,6 +109,7 @@ if [ "$MODE" = "install" ]; then
     
     if ! fdisk -v >/dev/null 2>&1; then
         vterr "fdisk is needed by ventoy installation, but is not found in the system."
+        cd $OLDDIR
         exit 1
     fi
     
@@ -105,6 +120,7 @@ if [ "$MODE" = "install" ]; then
             vtwarn "Use -u option to do a safe upgrade operation."
             vtwarn "OR if you really want to reinstall ventoy to $DISK, please use -I option."
             vtwarn ""
+            cd $OLDDIR
             exit 1
         fi
     fi
@@ -114,6 +130,7 @@ if [ "$MODE" = "install" ]; then
 
     if [ $disk_sector_num -gt 4294967296 ]; then
         vterr "$DISK is over 2TB size, MBR will not work on it."
+        cd $OLDDIR
         exit 1
     fi
 
@@ -150,7 +167,7 @@ if [ "$MODE" = "install" ]; then
         exit 1
     fi
 
-    if ! dd if=/dev/zero of=$DISK bs=1 count=512 status=none; then
+    if ! dd if=/dev/zero of=$DISK bs=1 count=512 status=none conv=fsync; then
         vterr "Write data to $DISK failed, please check whether it's in use."
         exit 1
     fi
@@ -178,15 +195,15 @@ if [ "$MODE" = "install" ]; then
 
     chmod +x ./tool/vtoy_gen_uuid
 
-    dd status=none if=./boot/boot.img of=$DISK bs=1 count=446
-    ./tool/xzcat ./boot/core.img.xz | dd status=none of=$DISK bs=512 count=2047 seek=1
-    ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector
+    dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=446
+    ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1
+    ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start_sector
     
     #disk uuid
-    ./tool/vtoy_gen_uuid | dd status=none of=${DISK} seek=384 bs=1 count=16
+    ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} seek=384 bs=1 count=16
     
     #disk signature
-    ./tool/vtoy_gen_uuid | dd status=none of=${DISK} skip=12 seek=440 bs=1 count=4
+    ./tool/vtoy_gen_uuid | dd status=none conv=fsync of=${DISK} skip=12 seek=440 bs=1 count=4
 
     sync
 
@@ -203,6 +220,7 @@ else
         echo ""
         vtwarn "Please use -i option if you want to install ventoy to $DISK"
         echo ""
+        cd $OLDDIR
         exit 1
     fi
 
@@ -214,19 +232,20 @@ else
     read -p "Update Ventoy  $oldver ===> $curver   Continue? (y/n)"  Answer
     if [ "$Answer" != "y" ]; then
         if [ "$Answer" != "Y" ]; then
+            cd $OLDDIR
             exit 0
         fi
     fi
 
     PART2=$(get_disk_part_name $DISK 2)
     
-    dd status=none if=./boot/boot.img of=$DISK bs=1 count=440
+    dd status=none conv=fsync if=./boot/boot.img of=$DISK bs=1 count=440
     
-    ./tool/xzcat ./boot/core.img.xz | dd status=none of=$DISK bs=512 count=2047 seek=1  
+    ./tool/xzcat ./boot/core.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=2047 seek=1  
 
     disk_sector_num=$(cat /sys/block/${DISK#/dev/}/size) 
     part2_start=$(expr $disk_sector_num - $VENTOY_SECTOR_NUM)
-    ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start
+    ./tool/xzcat ./ventoy/ventoy.disk.img.xz | dd status=none conv=fsync of=$DISK bs=512 count=$VENTOY_SECTOR_NUM seek=$part2_start
 
     sync
 
@@ -236,3 +255,5 @@ else
     
 fi
 
+cd $OLDDIR
+
index 3c939c267a98c162a1dea3499b76deb1f983552d..d9a59fab39b0ce831b3430d71200962189fe2597 100644 (file)
@@ -76,7 +76,18 @@ function distro_specify_initrd_file {
         vt_linux_specify_initrd_file /boot/initrd.xz
     elif [ -f (loop)/boot/initrd ]; then
         vt_linux_specify_initrd_file /boot/initrd
+    elif [ -f (loop)/boot/x86_64/loader/initrd ]; then
+        vt_linux_specify_initrd_file /boot/x86_64/loader/initrd
+    elif [ -f (loop)/boot/initramfs-x86_64.img ]; then
+        vt_linux_specify_initrd_file /boot/initramfs-x86_64.img
         
+
+    fi
+}
+
+function distro_specify_initrd_file_phase2 {
+    if [ -f (loop)/boot/initrd.img ]; then
+        vt_linux_specify_initrd_file /boot/initrd.img
     fi
 }
 
@@ -137,6 +148,17 @@ function uefi_linux_menu_func {
         
         distro_specify_initrd_file
         
+        vt_linux_initrd_count vtcount
+        if [ $vtcount -eq 0 ]; then
+            distro_specify_initrd_file_phase2
+            
+            if [ "$vt_efi_dir" = "NO" ]; then
+                if [ -f (loop)/efi.img ];  then
+                    vt_add_replace_file 0 "initrd"
+                fi
+            fi
+        fi
+        
         locate_initrd
     fi
     
@@ -179,6 +201,14 @@ function uefi_iso_menu_func {
     loopback loop ${1}${chosen_path}
     get_os_type (loop)
     
+    if [ -d (loop)/EFI ]; then
+        set vt_efi_dir=YES
+    elif [ -d (loop)/efi ]; then
+        set vt_efi_dir=YES
+    else
+        set vt_efi_dir=NO
+    fi
+    
     if [ -n "$vtcompat" ]; then
         set ventoy_compatible=YES
         unset vtcompat
@@ -193,6 +223,8 @@ function uefi_iso_menu_func {
     if [ "$vtoy_os" = "Windows" ]; then
         if [ "$ventoy_fs_probe" = "iso9660" ]; then
             set ventoy_compatible=YES
+        elif [ -f (loop)/HBCD_PE.ini ]; then
+            set ventoy_compatible=YES
         fi
     
         uefi_windows_menu_func  $1
@@ -279,6 +311,11 @@ function legacy_linux_menu_func {
         
         distro_specify_initrd_file
         
+        vt_linux_initrd_count vtcount
+        if [ $vtcount -eq 0 ]; then
+            distro_specify_initrd_file_phase2
+        fi
+        
         locate_initrd
     fi
     
@@ -330,7 +367,10 @@ function legacy_iso_menu_func {
     if [ "$vtoy_os" = "Windows" ]; then
         if [ "$ventoy_fs_probe" = "iso9660" ]; then
             set ventoy_compatible=YES
+        elif [ -f (loop)/HBCD_PE.ini ]; then
+            set ventoy_compatible=YES
         fi
+        
         legacy_windows_menu_func  $1
     else
         legacy_linux_menu_func  $1
@@ -355,7 +395,7 @@ function legacy_iso_memdisk {
 #############################################################
 #############################################################
 
-set VENTOY_VERSION="1.0.06"
+set VENTOY_VERSION="1.0.07"
 
 #disable timeout
 unset timeout
@@ -385,7 +425,11 @@ if [ -f $iso_path/ventoy/ventoy.json ]; then
    vt_load_plugin $iso_path
 fi
 
-terminal_output  gfxterm
+if [ -n "$vtoy_gfxmode" ]; then
+    set gfxmode=$vtoy_gfxmode
+else
+    set gfxmode=1920x1080,1366x768,1024x768
+fi
 
 if [ -n "$vtoy_theme" ]; then
     set theme=$vtoy_theme
@@ -393,11 +437,7 @@ else
     set theme=$prefix/themes/ventoy/theme.txt
 fi
 
-if [ -n "$vtoy_gfxmode" ]; then
-    set gfxmode=$vtoy_gfxmode
-else
-    set gfxmode=1024x768
-fi
+terminal_output  gfxterm
 
 #colect all image files (iso files)
 set ventoy_img_count=0
index ce96631d084208d240c4058b1cf041ff7412d051..0033e1ed4d122524ee510934e0293d81fb9ecbb3 100644 (file)
Binary files a/INSTALL/grub/i386-pc/core.img and b/INSTALL/grub/i386-pc/core.img differ
diff --git a/INSTALL/tool/ENROLL_THIS_KEY_IN_MOKMANAGER.cer b/INSTALL/tool/ENROLL_THIS_KEY_IN_MOKMANAGER.cer
new file mode 100644 (file)
index 0000000..81982bd
Binary files /dev/null and b/INSTALL/tool/ENROLL_THIS_KEY_IN_MOKMANAGER.cer differ
index b55f455cfc7d6e6b972615a93efb719502248fe9..5c0fa25697b1dfd65e15877d785fca89679bfb2d 100644 (file)
Binary files a/INSTALL/ventoy/ipxe.krn and b/INSTALL/ventoy/ipxe.krn differ
index cfc127bb1c0e3d14dd6f64c91d75642b71ea2b83..da7f43ef05fee418358f3fa54ddc0a1d28070bea 100644 (file)
Binary files a/INSTALL/ventoy/ventoy.cpio and b/INSTALL/ventoy/ventoy.cpio differ
index a8bf53e532f74a5c7a60de706d84f84e3a21e064..1b18a87b7ff12ef1d5795f2f0bd0b10300a4913a 100644 (file)
Binary files a/INSTALL/ventoy/ventoy_x64.efi and b/INSTALL/ventoy/ventoy_x64.efi differ
index ebb8b1ef8488a4e57cd79239adeddb3ef13f7d2b..47ac841913e13ae47ba91bb007dd01808c37ec82 100644 (file)
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 Ventoy is an open source tool to create bootable USB drive for ISO files.   
 With ventoy, you don't need to format the disk again and again, you just need to copy the iso file to the USB drive and boot it.   
 You can copy many iso files at a time and ventoy will give you a boot menu to select them.  
-Both Legacy BIOS and UEFI are supported in the same way. 160+ ISO files are tested.  
+Both Legacy BIOS and UEFI are supported in the same way. 200+ ISO files are tested.  
 A "Ventoy Compatible" concept is introduced by ventoy, which can help to support any ISO file.  
 
 See http://www.ventoy.net for detail.
@@ -13,9 +13,10 @@ See http://www.ventoy.net for detail.
 * Fast (limited only by the speed of copying iso file)
 * Directly boot from iso file, no extraction needed
 * Legacy + UEFI supported in the same way
+* UEFI Secure Boot supported (since 1.0.07+) Notes
 * ISO files larger than 4GB supported
 * Native boot menu style for Legacy & UEFI
-* Most type of OS supported, 100+ iso files tested
+* Most type of OS supported, 200+ iso files tested
 * Not only boot but also complete installation process
 * "Ventoy Compatible" concept
 * Plugin Framework
index c393ee248e0bf15bcaee2130332396161afe5540..ef11ce8067a8679740a484021a66dc3dafd2eac0 100644 (file)
@@ -328,6 +328,11 @@ static int vtoy_find_disk_by_size(unsigned long long size, char *diskname)
     int rc = 0;
 
     dir = opendir("/sys/block");
+    if (!dir)
+    {
+        return 0;
+    }
+    
     while ((p = readdir(dir)) != NULL)
     {
         if (!vtoy_is_possible_blkdev(p->d_name))
@@ -357,6 +362,11 @@ static int vtoy_find_disk_by_guid(uint8_t *guid, char *diskname)
     uint8_t vtguid[16];
 
     dir = opendir("/sys/block");
+    if (!dir)
+    {
+        return 0;
+    }
+    
     while ((p = readdir(dir)) != NULL)
     {
         if (!vtoy_is_possible_blkdev(p->d_name))
@@ -378,6 +388,12 @@ static int vtoy_find_disk_by_guid(uint8_t *guid, char *diskname)
     return count;    
 }
 
+static int vtoy_printf_iso_path(ventoy_os_param *param)
+{
+    printf("%s\n", param->vtoy_img_path);
+    return 0;
+}
+
 static int vtoy_print_os_param(ventoy_os_param *param, char *diskname)
 {
     int   cnt = 0;
@@ -458,12 +474,13 @@ int vtoydump_main(int argc, char **argv)
 {
     int rc;
     int ch;
+    int print_path = 0;
     char filename[256] = {0};
     char diskname[256] = {0};
     char device[64] = {0};
     ventoy_os_param *param = NULL;
 
-    while ((ch = getopt(argc, argv, "c:f:v::")) != -1)
+    while ((ch = getopt(argc, argv, "c:f:p:v::")) != -1)
     {
         if (ch == 'f')
         {
@@ -477,6 +494,11 @@ int vtoydump_main(int argc, char **argv)
         {
             strncpy(device, optarg, sizeof(device) - 1);
         }
+        else if (ch == 'p')
+        {
+            print_path = 1;
+            strncpy(filename, optarg, sizeof(filename) - 1);
+        }
         else
         {
             fprintf(stderr, "Usage: %s -f datafile [ -v ] \n", argv[0]);
@@ -513,7 +535,11 @@ int vtoydump_main(int argc, char **argv)
         vtoy_dump_os_param(param);
     }
 
-    if (device[0])
+    if (print_path)
+    {
+        rc = vtoy_printf_iso_path(param);
+    }
+    else if (device[0])
     {
         rc = vtoy_check_device(param, device);
     }
index 098b452778038a52bb769a247ed7d4ff4fcccc0f..8ebeaa4b643570b1860bc509acd63c6989710128 100644 (file)
Binary files a/VtoyTool/vtoytool/00/vtoytool_32 and b/VtoyTool/vtoytool/00/vtoytool_32 differ
index 1f9ec62e80d99131e734e42625fab08e186c47aa..0bd3dca2c6ae2966b5c21b382971bb2b3958e4a0 100644 (file)
Binary files a/VtoyTool/vtoytool/00/vtoytool_64 and b/VtoyTool/vtoytool/00/vtoytool_64 differ