diff --git a/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c b/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c index dc73764d9fe..857e7415b7c 100644 --- a/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c +++ b/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c @@ -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(); diff --git a/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.h b/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.h index 009863199f2..eb22e772e9f 100644 --- a/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.h +++ b/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.h @@ -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 diff --git a/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.inf b/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.inf index 98f999ad9e5..1db9b2182e4 100644 --- a/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.inf +++ b/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.inf @@ -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 @@ -49,3 +51,30 @@ 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 index 00000000000..4c595b464fc --- /dev/null +++ b/EDK2/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyDebug.c @@ -0,0 +1,325 @@ +/****************************************************************************** + * Ventoy.c + * + * Copyright (c) 2020, longpanda + * + * 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 . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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; +} + diff --git a/GRUB2/grub-2.04/grub-core/fs/fat.c b/GRUB2/grub-2.04/grub-core/fs/fat.c index 2b26a8cb2ed..6338d49e8df 100644 --- a/GRUB2/grub-2.04/grub-core/fs/fat.c +++ b/GRUB2/grub-2.04/grub-core/fs/fat.c @@ -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; diff --git a/GRUB2/grub-2.04/grub-core/ventoy/ventoy.c b/GRUB2/grub-2.04/grub-core/ventoy/ventoy.c index d79532f06c5..ba1ec345f99 100644 --- a/GRUB2/grub-2.04/grub-core/ventoy/ventoy.c +++ b/GRUB2/grub-2.04/grub-core/ventoy/ventoy.c @@ -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 }, }; diff --git a/GRUB2/grub-2.04/include/grub/ventoy.h b/GRUB2/grub-2.04/include/grub/ventoy.h index da696c33867..1044005d1c3 100644 --- a/GRUB2/grub-2.04/include/grub/ventoy.h +++ b/GRUB2/grub-2.04/include/grub/ventoy.h @@ -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 index 00000000000..d886a2455a4 --- /dev/null +++ b/IMG/cpio/ventoy/hook/alt/udev_disk_hook.sh @@ -0,0 +1,46 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. /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 index 00000000000..3fabb01ec7c --- /dev/null +++ b/IMG/cpio/ventoy/hook/alt/ventoy-hook.sh @@ -0,0 +1,24 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. $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 index 00000000000..8ee05793258 --- /dev/null +++ b/IMG/cpio/ventoy/hook/clear/disk-hook.sh @@ -0,0 +1,43 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. /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 index 00000000000..a73b70276ea --- /dev/null +++ b/IMG/cpio/ventoy/hook/clear/ventoy-hook.sh @@ -0,0 +1,22 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. $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 index 00000000000..926e1a50f2a --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/deepin-disk.sh @@ -0,0 +1,47 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. /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 index 00000000000..deec6405796 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/deepin-hook.sh @@ -0,0 +1,47 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +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 index 00000000000..047ea6c254c --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/knoppix-disk.sh @@ -0,0 +1,43 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. /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 index 00000000000..b57fd15f7ec --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/knoppix-hook.sh @@ -0,0 +1,23 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +$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 index 00000000000..c16aa9e4fd1 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/porteus-disk.sh @@ -0,0 +1,77 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. /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 index 00000000000..689460ce205 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/porteus-hook.sh @@ -0,0 +1,48 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +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 index 00000000000..6872f5895af --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/puppy-disk.sh @@ -0,0 +1,48 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. /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 index 00000000000..69e18f3d0ca --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/puppy-hook.sh @@ -0,0 +1,22 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +$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 index 00000000000..8ee05793258 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/pve-disk.sh @@ -0,0 +1,43 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. /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 index 00000000000..e54ab4cae7c --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/pve-hook.sh @@ -0,0 +1,21 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +$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 index 00000000000..0e0cbfb96b6 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/slax-disk.sh @@ -0,0 +1,77 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. /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 index 00000000000..93790fa8d97 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/slax-hook.sh @@ -0,0 +1,20 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +$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 index 00000000000..dd8804986da --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/tails-hook.sh @@ -0,0 +1,24 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +$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 index 00000000000..38a9c0508c2 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/veket-disk.sh @@ -0,0 +1,88 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. /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 index 00000000000..922e23666d3 --- /dev/null +++ b/IMG/cpio/ventoy/hook/debian/veket-hook.sh @@ -0,0 +1,22 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +$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 diff --git a/IMG/cpio/ventoy/hook/pclos/disk_hook.sh b/IMG/cpio/ventoy/hook/pclos/disk_hook.sh index ca91ac84193..bf7cb9e69c1 100644 --- a/IMG/cpio/ventoy/hook/pclos/disk_hook.sh +++ b/IMG/cpio/ventoy/hook/pclos/disk_hook.sh @@ -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 index 00000000000..ab1d497554c --- /dev/null +++ b/IMG/cpio/ventoy/hook/rhel7/ventoy-disk.sh @@ -0,0 +1,44 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. /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 + diff --git a/IMG/cpio/ventoy/hook/rhel7/ventoy-hook.sh b/IMG/cpio/ventoy/hook/rhel7/ventoy-hook.sh index 6bb0664cac4..ca3503df8c2 100644 --- a/IMG/cpio/ventoy/hook/rhel7/ventoy-hook.sh +++ b/IMG/cpio/ventoy/hook/rhel7/ventoy-hook.sh @@ -20,10 +20,12 @@ . $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 + diff --git a/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh b/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh index 76098296809..62e413b9d2c 100644 --- a/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh +++ b/IMG/cpio/ventoy/hook/ventoy-hook-lib.sh @@ -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 diff --git a/IMG/cpio/ventoy/hook/ventoy-os-lib.sh b/IMG/cpio/ventoy/hook/ventoy-os-lib.sh index 0be5a0a75ad..b5ea3bf7d8e 100644 --- a/IMG/cpio/ventoy/hook/ventoy-os-lib.sh +++ b/IMG/cpio/ventoy/hook/ventoy-os-lib.sh @@ -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 index 00000000000..55058ecaa2a --- /dev/null +++ b/IMG/cpio/ventoy/hook/zeroshell/disk_hook.sh @@ -0,0 +1,42 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. /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 index 00000000000..e08252d3cc2 --- /dev/null +++ b/IMG/cpio/ventoy/hook/zeroshell/ventoy-hook.sh @@ -0,0 +1,24 @@ +#!/ventoy/busybox/sh +#************************************************************************************ +# Copyright (c) 2020, longpanda +# +# 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 . +# +#************************************************************************************ + +. $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 diff --git a/IMG/cpio/ventoy/init b/IMG/cpio/ventoy/init index d1c331fbd6e..c2b7b507a39 100644 --- a/IMG/cpio/ventoy/init +++ b/IMG/cpio/ventoy/init @@ -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 diff --git a/IMG/cpio/ventoy/tool/vtoytool_install.sh b/IMG/cpio/ventoy/tool/vtoytool_install.sh index c408d012c9b..5a643b683a2 100644 --- a/IMG/cpio/ventoy/tool/vtoytool_install.sh +++ b/IMG/cpio/ventoy/tool/vtoytool_install.sh @@ -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 index 00000000000..b2c20561322 Binary files /dev/null and b/IMG/cpio/ventoy/tool/xzminidec differ diff --git a/IMG/cpio/ventoy/ventoy.sh b/IMG/cpio/ventoy/ventoy.sh index 727102a24c2..2517f0b1268 100644 --- a/IMG/cpio/ventoy/ventoy.sh +++ b/IMG/cpio/ventoy/ventoy.sh @@ -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" } diff --git a/INSTALL/EFI/BOOT/BOOTX64.EFI b/INSTALL/EFI/BOOT/BOOTX64.EFI index 691ee80f8f6..f939c3474db 100644 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 index 00000000000..af684d5100a 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 index 00000000000..4c70a543076 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 index 00000000000..ea294147d72 Binary files /dev/null and b/INSTALL/EFI/BOOT/grubx64_real.efi differ diff --git a/INSTALL/Ventoy2Disk.sh b/INSTALL/Ventoy2Disk.sh index 9e6deef2e6b..1ebf05ccd60 100644 --- a/INSTALL/Ventoy2Disk.sh +++ b/INSTALL/Ventoy2Disk.sh @@ -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 + diff --git a/INSTALL/grub/grub.cfg b/INSTALL/grub/grub.cfg index 3c939c267a9..d9a59fab39b 100644 --- a/INSTALL/grub/grub.cfg +++ b/INSTALL/grub/grub.cfg @@ -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 diff --git a/INSTALL/grub/i386-pc/core.img b/INSTALL/grub/i386-pc/core.img index ce96631d084..0033e1ed4d1 100644 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 index 00000000000..81982bd78c0 Binary files /dev/null and b/INSTALL/tool/ENROLL_THIS_KEY_IN_MOKMANAGER.cer differ diff --git a/INSTALL/ventoy/ipxe.krn b/INSTALL/ventoy/ipxe.krn index b55f455cfc7..5c0fa25697b 100644 Binary files a/INSTALL/ventoy/ipxe.krn and b/INSTALL/ventoy/ipxe.krn differ diff --git a/INSTALL/ventoy/ventoy.cpio b/INSTALL/ventoy/ventoy.cpio index cfc127bb1c0..da7f43ef05f 100644 Binary files a/INSTALL/ventoy/ventoy.cpio and b/INSTALL/ventoy/ventoy.cpio differ diff --git a/INSTALL/ventoy/ventoy_x64.efi b/INSTALL/ventoy/ventoy_x64.efi index a8bf53e532f..1b18a87b7ff 100644 Binary files a/INSTALL/ventoy/ventoy_x64.efi and b/INSTALL/ventoy/ventoy_x64.efi differ diff --git a/README.md b/README.md index ebb8b1ef848..47ac841913e 100644 --- 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 diff --git a/VtoyTool/vtoydump.c b/VtoyTool/vtoydump.c index c393ee248e0..ef11ce8067a 100644 --- a/VtoyTool/vtoydump.c +++ b/VtoyTool/vtoydump.c @@ -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); } diff --git a/VtoyTool/vtoytool/00/vtoytool_32 b/VtoyTool/vtoytool/00/vtoytool_32 index 098b4527780..8ebeaa4b643 100644 Binary files a/VtoyTool/vtoytool/00/vtoytool_32 and b/VtoyTool/vtoytool/00/vtoytool_32 differ diff --git a/VtoyTool/vtoytool/00/vtoytool_64 b/VtoyTool/vtoytool/00/vtoytool_64 index 1f9ec62e80d..0bd3dca2c6a 100644 Binary files a/VtoyTool/vtoytool/00/vtoytool_64 and b/VtoyTool/vtoytool/00/vtoytool_64 differ