Merge branch 'master' into patch-3
@ -202,3 +202,10 @@
|
|||||||
https://busybox.net/downloads/binaries/1.31.0-i686-uclibc/ busybox_ASH
|
https://busybox.net/downloads/binaries/1.31.0-i686-uclibc/ busybox_ASH
|
||||||
SHA-256: 2943f02f85fee0c9551aec47110a558a73f919c032b3c51e56d6f197b5ec4d7b
|
SHA-256: 2943f02f85fee0c9551aec47110a558a73f919c032b3c51e56d6f197b5ec4d7b
|
||||||
|
|
||||||
|
5.12 7za.exe
|
||||||
|
download from https://www.7-zip.org/a/7z1900-extra.7z
|
||||||
|
ISNTALL/ventoy/7z/64/7za.exe SHA-256: 8117e40ee7f824f63373a4f5625bb62749f69159d0c449b3ce2f35aad3b83549
|
||||||
|
ISNTALL/ventoy/7z/32/7za.exe SHA-256: ea308c76a2f927b160a143d94072b0dce232e04b751f0c6432a94e05164e716d
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include <Ventoy.h>
|
#include <Ventoy.h>
|
||||||
|
|
||||||
BOOLEAN gDebugPrint = FALSE;
|
BOOLEAN gDebugPrint = FALSE;
|
||||||
|
BOOLEAN gLoadIsoEfi = FALSE;
|
||||||
ventoy_ram_disk g_ramdisk_param;
|
ventoy_ram_disk g_ramdisk_param;
|
||||||
ventoy_chain_head *g_chain;
|
ventoy_chain_head *g_chain;
|
||||||
ventoy_img_chunk *g_chunk;
|
ventoy_img_chunk *g_chunk;
|
||||||
@ -52,6 +53,10 @@ static grub_env_get_pf grub_env_get = NULL;
|
|||||||
ventoy_grub_param_file_replace *g_file_replace_list = NULL;
|
ventoy_grub_param_file_replace *g_file_replace_list = NULL;
|
||||||
ventoy_efi_file_replace g_efi_file_replace;
|
ventoy_efi_file_replace g_efi_file_replace;
|
||||||
|
|
||||||
|
CONST CHAR16 gIso9660EfiDriverPath[] = ISO9660_EFI_DRIVER_PATH;
|
||||||
|
|
||||||
|
BOOLEAN g_fix_windows_1st_cdrom_issue = FALSE;
|
||||||
|
|
||||||
STATIC BOOLEAN g_hook_keyboard = FALSE;
|
STATIC BOOLEAN g_hook_keyboard = FALSE;
|
||||||
|
|
||||||
CHAR16 gFirstTryBootFile[256] = {0};
|
CHAR16 gFirstTryBootFile[256] = {0};
|
||||||
@ -482,6 +487,93 @@ STATIC EFI_STATUS EFIAPI ventoy_find_iso_disk(IN EFI_HANDLE ImageHandle)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
STATIC EFI_STATUS EFIAPI ventoy_find_iso_disk_fs(IN EFI_HANDLE ImageHandle)
|
||||||
|
{
|
||||||
|
UINTN i = 0;
|
||||||
|
UINTN Count = 0;
|
||||||
|
EFI_HANDLE Parent = NULL;
|
||||||
|
EFI_HANDLE *Handles = NULL;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
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))
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug("ventoy_find_iso_disk_fs fs count:%u", Count);
|
||||||
|
|
||||||
|
for (i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
Status = gBS->HandleProtocol(Handles[i], &gEfiSimpleFileSystemProtocolGuid, (VOID **)&pFile);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
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("Handle:%p FS DP: <%s>", Handles[i], ConvertDevicePathToText(pDevPath, FALSE, FALSE));
|
||||||
|
Parent = ventoy_get_parent_handle(pDevPath);
|
||||||
|
|
||||||
|
if (Parent == gBlockData.RawBlockIoHandle)
|
||||||
|
{
|
||||||
|
debug("Find ventoy disk fs");
|
||||||
|
gBlockData.DiskFsHandle = Handles[i];
|
||||||
|
gBlockData.pDiskFs = pFile;
|
||||||
|
gBlockData.pDiskFsDevPath = pDevPath;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FreePool(Handles);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS EFIAPI ventoy_load_isoefi_driver(IN EFI_HANDLE ImageHandle)
|
||||||
|
{
|
||||||
|
EFI_HANDLE Image = NULL;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
CHAR16 LogVar[4] = L"5";
|
||||||
|
|
||||||
|
Status = ventoy_load_image(ImageHandle, gBlockData.pDiskFsDevPath,
|
||||||
|
gIso9660EfiDriverPath,
|
||||||
|
sizeof(gIso9660EfiDriverPath),
|
||||||
|
&Image);
|
||||||
|
debug("load iso efi driver status:%r", Status);
|
||||||
|
|
||||||
|
if (gDebugPrint)
|
||||||
|
{
|
||||||
|
gRT->SetVariable(L"FS_LOGGING", &gShellVariableGuid,
|
||||||
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||||
|
sizeof(LogVar), LogVar);
|
||||||
|
}
|
||||||
|
|
||||||
|
gRT->SetVariable(L"FS_NAME_NOCASE", &gShellVariableGuid,
|
||||||
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
||||||
|
sizeof(LogVar), LogVar);
|
||||||
|
|
||||||
|
gBlockData.IsoDriverImage = Image;
|
||||||
|
Status = gBS->StartImage(Image, NULL, NULL);
|
||||||
|
debug("Start iso efi driver status:%r", Status);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
||||||
{
|
{
|
||||||
UINT32 i = 0;
|
UINT32 i = 0;
|
||||||
@ -493,6 +585,7 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
|||||||
EFI_STATUS Status = EFI_SUCCESS;
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
ventoy_grub_param *pGrubParam = NULL;
|
ventoy_grub_param *pGrubParam = NULL;
|
||||||
EFI_LOADED_IMAGE_PROTOCOL *pImageInfo = NULL;
|
EFI_LOADED_IMAGE_PROTOCOL *pImageInfo = NULL;
|
||||||
|
ventoy_chain_head *chain = NULL;
|
||||||
|
|
||||||
Status = gBS->HandleProtocol(ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **)&pImageInfo);
|
Status = gBS->HandleProtocol(ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **)&pImageInfo);
|
||||||
if (EFI_ERROR(Status))
|
if (EFI_ERROR(Status))
|
||||||
@ -510,6 +603,11 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
|||||||
gDebugPrint = TRUE;
|
gDebugPrint = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (StrStr(pCmdLine, L"isoefi=on"))
|
||||||
|
{
|
||||||
|
gLoadIsoEfi = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
pPos = StrStr(pCmdLine, L"FirstTry=@");
|
pPos = StrStr(pCmdLine, L"FirstTry=@");
|
||||||
if (pPos)
|
if (pPos)
|
||||||
{
|
{
|
||||||
@ -559,12 +657,15 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
|||||||
);
|
);
|
||||||
|
|
||||||
pPos = StrStr(pCmdLine, L"mem:");
|
pPos = StrStr(pCmdLine, L"mem:");
|
||||||
g_chain = (ventoy_chain_head *)StrHexToUintn(pPos + 4);
|
chain = (ventoy_chain_head *)StrHexToUintn(pPos + 4);
|
||||||
|
|
||||||
pPos = StrStr(pPos, L"size:");
|
pPos = StrStr(pPos, L"size:");
|
||||||
size = StrDecimalToUintn(pPos + 5);
|
size = StrDecimalToUintn(pPos + 5);
|
||||||
|
|
||||||
debug("memory addr:%p size:%lu", g_chain, size);
|
debug("memory addr:%p size:%lu", chain, size);
|
||||||
|
|
||||||
|
g_chain = AllocatePool(size);
|
||||||
|
CopyMem(g_chain, chain, size);
|
||||||
|
|
||||||
if (StrStr(pCmdLine, L"memdisk"))
|
if (StrStr(pCmdLine, L"memdisk"))
|
||||||
{
|
{
|
||||||
@ -583,12 +684,12 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
|||||||
g_os_param_reserved = (UINT8 *)(g_chain->os_param.vtoy_reserved);
|
g_os_param_reserved = (UINT8 *)(g_chain->os_param.vtoy_reserved);
|
||||||
|
|
||||||
/* Workaround for Windows & ISO9660 */
|
/* Workaround for Windows & ISO9660 */
|
||||||
if (g_os_param_reserved[2] == 1 && g_os_param_reserved[3] == 0)
|
if (g_os_param_reserved[2] == ventoy_chain_windows && g_os_param_reserved[3] == 0)
|
||||||
{
|
{
|
||||||
g_fixup_iso9660_secover_enable = TRUE;
|
g_fixup_iso9660_secover_enable = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_os_param_reserved[2] == 1 && g_os_param_reserved[4] != 1)
|
if (g_os_param_reserved[2] == ventoy_chain_windows && g_os_param_reserved[4] != 1)
|
||||||
{
|
{
|
||||||
g_hook_keyboard = TRUE;
|
g_hook_keyboard = TRUE;
|
||||||
}
|
}
|
||||||
@ -613,6 +714,17 @@ STATIC EFI_STATUS EFIAPI ventoy_parse_cmdline(IN EFI_HANDLE ImageHandle)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_fix_windows_1st_cdrom_issue = FALSE;
|
||||||
|
if (ventoy_chain_windows == g_os_param_reserved[2] ||
|
||||||
|
ventoy_chain_wim == g_os_param_reserved[2])
|
||||||
|
{
|
||||||
|
if (ventoy_is_cdrom_dp_exist())
|
||||||
|
{
|
||||||
|
debug("fixup the 1st cdrom influences when boot windows ...");
|
||||||
|
g_fix_windows_1st_cdrom_issue = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FreePool(pCmdLine);
|
FreePool(pCmdLine);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -622,6 +734,11 @@ EFI_STATUS EFIAPI ventoy_clean_env(VOID)
|
|||||||
FreePool(g_sector_flag);
|
FreePool(g_sector_flag);
|
||||||
g_sector_flag_num = 0;
|
g_sector_flag_num = 0;
|
||||||
|
|
||||||
|
if (gLoadIsoEfi && gBlockData.IsoDriverImage)
|
||||||
|
{
|
||||||
|
gBS->UnloadImage(gBlockData.IsoDriverImage);
|
||||||
|
}
|
||||||
|
|
||||||
gBS->DisconnectController(gBlockData.Handle, NULL, NULL);
|
gBS->DisconnectController(gBlockData.Handle, NULL, NULL);
|
||||||
|
|
||||||
gBS->UninstallMultipleProtocolInterfaces(gBlockData.Handle,
|
gBS->UninstallMultipleProtocolInterfaces(gBlockData.Handle,
|
||||||
@ -636,6 +753,44 @@ EFI_STATUS EFIAPI ventoy_clean_env(VOID)
|
|||||||
FreePool((VOID *)(UINTN)g_chain->os_param.vtoy_img_location_addr);
|
FreePool((VOID *)(UINTN)g_chain->os_param.vtoy_img_location_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FreePool(g_chain);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS ventoy_hook_start(VOID)
|
||||||
|
{
|
||||||
|
/* don't add debug print in this function */
|
||||||
|
|
||||||
|
if (g_fix_windows_1st_cdrom_issue)
|
||||||
|
{
|
||||||
|
ventoy_hook_1st_cdrom_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* let this the last */
|
||||||
|
if (g_hook_keyboard)
|
||||||
|
{
|
||||||
|
ventoy_hook_keyboard_start();
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS ventoy_hook_stop(VOID)
|
||||||
|
{
|
||||||
|
/* don't add debug print in this function */
|
||||||
|
|
||||||
|
if (g_fix_windows_1st_cdrom_issue)
|
||||||
|
{
|
||||||
|
ventoy_hook_1st_cdrom_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* let this the last */
|
||||||
|
if (g_hook_keyboard)
|
||||||
|
{
|
||||||
|
ventoy_hook_keyboard_stop();
|
||||||
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -725,17 +880,11 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
|||||||
pFile->OpenVolume = ventoy_wrapper_open_volume;
|
pFile->OpenVolume = ventoy_wrapper_open_volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_hook_keyboard)
|
ventoy_hook_start();
|
||||||
{
|
|
||||||
ventoy_hook_keyboard_start();
|
|
||||||
}
|
|
||||||
/* can't add debug print here */
|
/* can't add debug print here */
|
||||||
//ventoy_wrapper_system();
|
//ventoy_wrapper_system();
|
||||||
Status = gBS->StartImage(Image, NULL, NULL);
|
Status = gBS->StartImage(Image, NULL, NULL);
|
||||||
if (g_hook_keyboard)
|
ventoy_hook_stop();
|
||||||
{
|
|
||||||
ventoy_hook_keyboard_stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (EFI_ERROR(Status))
|
if (EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
@ -808,6 +957,12 @@ EFI_STATUS EFIAPI VentoyEfiMain
|
|||||||
ventoy_save_variable();
|
ventoy_save_variable();
|
||||||
ventoy_find_iso_disk(ImageHandle);
|
ventoy_find_iso_disk(ImageHandle);
|
||||||
|
|
||||||
|
if (gLoadIsoEfi)
|
||||||
|
{
|
||||||
|
ventoy_find_iso_disk_fs(ImageHandle);
|
||||||
|
ventoy_load_isoefi_driver(ImageHandle);
|
||||||
|
}
|
||||||
|
|
||||||
ventoy_debug_pause();
|
ventoy_debug_pause();
|
||||||
|
|
||||||
ventoy_install_blockio(ImageHandle, g_chain->virt_img_size_in_bytes);
|
ventoy_install_blockio(ImageHandle, g_chain->virt_img_size_in_bytes);
|
||||||
|
@ -25,6 +25,15 @@
|
|||||||
|
|
||||||
#define VENTOY_GUID { 0x77772020, 0x2e77, 0x6576, { 0x6e, 0x74, 0x6f, 0x79, 0x2e, 0x6e, 0x65, 0x74 }}
|
#define VENTOY_GUID { 0x77772020, 0x2e77, 0x6576, { 0x6e, 0x74, 0x6f, 0x79, 0x2e, 0x6e, 0x65, 0x74 }}
|
||||||
|
|
||||||
|
typedef enum ventoy_chain_type
|
||||||
|
{
|
||||||
|
ventoy_chain_linux = 0, /* 0: linux */
|
||||||
|
ventoy_chain_windows, /* 1: windows */
|
||||||
|
ventoy_chain_wim, /* 2: wim */
|
||||||
|
|
||||||
|
ventoy_chain_max
|
||||||
|
}ventoy_chain_type;
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
typedef struct ventoy_guid
|
typedef struct ventoy_guid
|
||||||
@ -159,6 +168,8 @@ typedef struct ventoy_virt_chunk
|
|||||||
#define VTOY_BLOCK_DEVICE_PATH_GUID \
|
#define VTOY_BLOCK_DEVICE_PATH_GUID \
|
||||||
{ 0x37b87ac6, 0xc180, 0x4583, { 0xa7, 0x05, 0x41, 0x4d, 0xa8, 0xf7, 0x7e, 0xd2 }}
|
{ 0x37b87ac6, 0xc180, 0x4583, { 0xa7, 0x05, 0x41, 0x4d, 0xa8, 0xf7, 0x7e, 0xd2 }}
|
||||||
|
|
||||||
|
#define ISO9660_EFI_DRIVER_PATH L"\\ventoy\\iso9660_x64.efi"
|
||||||
|
|
||||||
#define VTOY_BLOCK_DEVICE_PATH_NAME L"ventoy"
|
#define VTOY_BLOCK_DEVICE_PATH_NAME L"ventoy"
|
||||||
|
|
||||||
#if defined (MDE_CPU_IA32)
|
#if defined (MDE_CPU_IA32)
|
||||||
@ -199,6 +210,7 @@ typedef struct vtoy_block_data
|
|||||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *pDiskFs;
|
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *pDiskFs;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *pDiskFsDevPath;
|
EFI_DEVICE_PATH_PROTOCOL *pDiskFsDevPath;
|
||||||
|
|
||||||
|
EFI_HANDLE IsoDriverImage;
|
||||||
}vtoy_block_data;
|
}vtoy_block_data;
|
||||||
|
|
||||||
|
|
||||||
@ -216,6 +228,7 @@ if (gDebugPrint) \
|
|||||||
}
|
}
|
||||||
|
|
||||||
typedef const char * (*grub_env_get_pf)(const char *name);
|
typedef const char * (*grub_env_get_pf)(const char *name);
|
||||||
|
typedef int (*grub_env_printf_pf)(const char *fmt, ...);
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
@ -242,8 +255,8 @@ typedef struct ventoy_grub_param_file_replace
|
|||||||
typedef struct ventoy_grub_param
|
typedef struct ventoy_grub_param
|
||||||
{
|
{
|
||||||
grub_env_get_pf grub_env_get;
|
grub_env_get_pf grub_env_get;
|
||||||
|
|
||||||
ventoy_grub_param_file_replace file_replace;
|
ventoy_grub_param_file_replace file_replace;
|
||||||
|
grub_env_printf_pf grub_env_printf;
|
||||||
}ventoy_grub_param;
|
}ventoy_grub_param;
|
||||||
|
|
||||||
typedef struct ventoy_ram_disk
|
typedef struct ventoy_ram_disk
|
||||||
@ -279,6 +292,18 @@ typedef struct ventoy_system_wrapper
|
|||||||
|
|
||||||
EFI_OPEN_PROTOCOL NewOpenProtocol;
|
EFI_OPEN_PROTOCOL NewOpenProtocol;
|
||||||
EFI_OPEN_PROTOCOL OriOpenProtocol;
|
EFI_OPEN_PROTOCOL OriOpenProtocol;
|
||||||
|
|
||||||
|
EFI_LOCATE_HANDLE_BUFFER NewLocateHandleBuffer;
|
||||||
|
EFI_LOCATE_HANDLE_BUFFER OriLocateHandleBuffer;
|
||||||
|
|
||||||
|
EFI_PROTOCOLS_PER_HANDLE NewProtocolsPerHandle;
|
||||||
|
EFI_PROTOCOLS_PER_HANDLE OriProtocolsPerHandle;
|
||||||
|
|
||||||
|
EFI_LOCATE_HANDLE NewLocateHandle;
|
||||||
|
EFI_LOCATE_HANDLE OriLocateHandle;
|
||||||
|
|
||||||
|
EFI_LOCATE_DEVICE_PATH NewLocateDevicePath;
|
||||||
|
EFI_LOCATE_DEVICE_PATH OriLocateDevicePath;
|
||||||
} ventoy_system_wrapper;
|
} ventoy_system_wrapper;
|
||||||
|
|
||||||
#define ventoy_wrapper(bs, wrapper, func, newfunc) \
|
#define ventoy_wrapper(bs, wrapper, func, newfunc) \
|
||||||
@ -317,6 +342,7 @@ extern UINTN g_iso_buf_size;
|
|||||||
extern ventoy_grub_param_file_replace *g_file_replace_list;
|
extern ventoy_grub_param_file_replace *g_file_replace_list;
|
||||||
extern BOOLEAN g_fixup_iso9660_secover_enable;
|
extern BOOLEAN g_fixup_iso9660_secover_enable;
|
||||||
extern EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *g_con_simple_input_ex;
|
extern EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *g_con_simple_input_ex;
|
||||||
|
extern BOOLEAN g_fix_windows_1st_cdrom_issue;
|
||||||
|
|
||||||
EFI_STATUS EFIAPI ventoy_wrapper_open_volume
|
EFI_STATUS EFIAPI ventoy_wrapper_open_volume
|
||||||
(
|
(
|
||||||
@ -327,6 +353,9 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im
|
|||||||
EFI_STATUS EFIAPI ventoy_wrapper_push_openvolume(IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME OpenVolume);
|
EFI_STATUS EFIAPI ventoy_wrapper_push_openvolume(IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_OPEN_VOLUME OpenVolume);
|
||||||
EFI_STATUS ventoy_hook_keyboard_start(VOID);
|
EFI_STATUS ventoy_hook_keyboard_start(VOID);
|
||||||
EFI_STATUS ventoy_hook_keyboard_stop(VOID);
|
EFI_STATUS ventoy_hook_keyboard_stop(VOID);
|
||||||
|
BOOLEAN ventoy_is_cdrom_dp_exist(VOID);
|
||||||
|
EFI_STATUS ventoy_hook_1st_cdrom_start(VOID);
|
||||||
|
EFI_STATUS ventoy_hook_1st_cdrom_stop(VOID);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -36,9 +36,9 @@
|
|||||||
#include <Protocol/SimpleFileSystem.h>
|
#include <Protocol/SimpleFileSystem.h>
|
||||||
#include <Ventoy.h>
|
#include <Ventoy.h>
|
||||||
|
|
||||||
#define PROCOTOL_SLEEP_SECONDS 0
|
#define PROCOTOL_SLEEP_MSECONDS 0
|
||||||
|
|
||||||
#define debug_sleep() if (PROCOTOL_SLEEP_SECONDS) sleep(PROCOTOL_SLEEP_SECONDS)
|
#define debug_sleep() if (PROCOTOL_SLEEP_MSECONDS) gBS->Stall(1000 * PROCOTOL_SLEEP_MSECONDS)
|
||||||
|
|
||||||
STATIC ventoy_system_wrapper g_system_wrapper;
|
STATIC ventoy_system_wrapper g_system_wrapper;
|
||||||
|
|
||||||
@ -126,7 +126,7 @@ STATIC EFI_STATUS EFIAPI ventoy_open_protocol
|
|||||||
IN UINT32 Attributes
|
IN UINT32 Attributes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
debug("ventoy_open_protocol:%a", ventoy_get_guid_name(Protocol)); debug_sleep();
|
debug("ventoy_open_protocol:<%p> %a", Handle, ventoy_get_guid_name(Protocol)); debug_sleep();
|
||||||
return g_system_wrapper.OriOpenProtocol(Handle, Protocol, Interface, AgentHandle, ControllerHandle, Attributes);
|
return g_system_wrapper.OriOpenProtocol(Handle, Protocol, Interface, AgentHandle, ControllerHandle, Attributes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -141,11 +141,87 @@ STATIC EFI_STATUS EFIAPI ventoy_locate_protocol
|
|||||||
return g_system_wrapper.OriLocateProtocol(Protocol, Registration, Interface);
|
return g_system_wrapper.OriLocateProtocol(Protocol, Registration, Interface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS EFIAPI ventoy_locate_handle_buffer
|
||||||
|
(
|
||||||
|
IN EFI_LOCATE_SEARCH_TYPE SearchType,
|
||||||
|
IN EFI_GUID *Protocol, OPTIONAL
|
||||||
|
IN VOID *SearchKey, OPTIONAL
|
||||||
|
IN OUT UINTN *NoHandles,
|
||||||
|
OUT EFI_HANDLE **Buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
debug("ventoy_locate_handle_buffer:%a", ventoy_get_guid_name(Protocol)); debug_sleep();
|
||||||
|
return g_system_wrapper.OriLocateHandleBuffer(SearchType, Protocol, SearchKey, NoHandles, Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS EFIAPI ventoy_protocol_per_handle
|
||||||
|
(
|
||||||
|
IN EFI_HANDLE Handle,
|
||||||
|
OUT EFI_GUID ***ProtocolBuffer,
|
||||||
|
OUT UINTN *ProtocolBufferCount
|
||||||
|
)
|
||||||
|
{
|
||||||
|
debug("ventoy_protocol_per_handle:%p", Handle); debug_sleep();
|
||||||
|
return g_system_wrapper.OriProtocolsPerHandle(Handle, ProtocolBuffer, ProtocolBufferCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI ventoy_locate_handle
|
||||||
|
(
|
||||||
|
IN EFI_LOCATE_SEARCH_TYPE SearchType,
|
||||||
|
IN EFI_GUID *Protocol, OPTIONAL
|
||||||
|
IN VOID *SearchKey, OPTIONAL
|
||||||
|
IN OUT UINTN *BufferSize,
|
||||||
|
OUT EFI_HANDLE *Buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN i;
|
||||||
|
EFI_HANDLE Handle;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
|
||||||
|
debug("ventoy_locate_handle: %d %a %p", SearchType, ventoy_get_guid_name(Protocol), SearchKey);
|
||||||
|
Status = g_system_wrapper.OriLocateHandle(SearchType, Protocol, SearchKey, BufferSize, Buffer);
|
||||||
|
debug("ventoy_locate_handle: %r Handle Count:%u", Status, *BufferSize/sizeof(EFI_HANDLE));
|
||||||
|
|
||||||
|
if (EFI_SUCCESS == Status)
|
||||||
|
{
|
||||||
|
for (i = 0; i < *BufferSize / sizeof(EFI_HANDLE); i++)
|
||||||
|
{
|
||||||
|
if (Buffer[i] == gBlockData.Handle)
|
||||||
|
{
|
||||||
|
Handle = Buffer[0];
|
||||||
|
Buffer[0] = Buffer[i];
|
||||||
|
Buffer[i] = Handle;
|
||||||
|
debug("####### Handle at %u", i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
debug_sleep();
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS EFIAPI ventoy_locate_device_path
|
||||||
|
(
|
||||||
|
IN EFI_GUID *Protocol,
|
||||||
|
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
|
||||||
|
OUT EFI_HANDLE *Device
|
||||||
|
)
|
||||||
|
{
|
||||||
|
debug("ventoy_locate_device_path:%a", ventoy_get_guid_name(Protocol)); debug_sleep();
|
||||||
|
return g_system_wrapper.OriLocateDevicePath(Protocol, DevicePath, Device);
|
||||||
|
}
|
||||||
|
|
||||||
EFI_STATUS EFIAPI ventoy_wrapper_system(VOID)
|
EFI_STATUS EFIAPI ventoy_wrapper_system(VOID)
|
||||||
{
|
{
|
||||||
ventoy_wrapper(gBS, g_system_wrapper, LocateProtocol, ventoy_locate_protocol);
|
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, HandleProtocol, ventoy_handle_protocol);
|
||||||
ventoy_wrapper(gBS, g_system_wrapper, OpenProtocol, ventoy_open_protocol);
|
ventoy_wrapper(gBS, g_system_wrapper, OpenProtocol, ventoy_open_protocol);
|
||||||
|
ventoy_wrapper(gBS, g_system_wrapper, LocateHandleBuffer, ventoy_locate_handle_buffer);
|
||||||
|
ventoy_wrapper(gBS, g_system_wrapper, ProtocolsPerHandle, ventoy_protocol_per_handle);
|
||||||
|
ventoy_wrapper(gBS, g_system_wrapper, LocateHandle, ventoy_locate_handle);
|
||||||
|
ventoy_wrapper(gBS, g_system_wrapper, LocateDevicePath, ventoy_locate_device_path);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,47 @@ EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *g_con_simple_input_ex = NULL;
|
|||||||
STATIC EFI_INPUT_READ_KEY_EX g_org_read_key_ex = NULL;
|
STATIC EFI_INPUT_READ_KEY_EX g_org_read_key_ex = NULL;
|
||||||
STATIC EFI_INPUT_READ_KEY g_org_read_key = NULL;
|
STATIC EFI_INPUT_READ_KEY g_org_read_key = NULL;
|
||||||
|
|
||||||
|
STATIC EFI_LOCATE_HANDLE g_org_locate_handle = NULL;
|
||||||
|
|
||||||
|
BOOLEAN ventoy_is_cdrom_dp_exist(VOID)
|
||||||
|
{
|
||||||
|
UINTN i = 0;
|
||||||
|
UINTN Count = 0;
|
||||||
|
EFI_HANDLE *Handles = NULL;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath = NULL;
|
||||||
|
|
||||||
|
Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiDevicePathProtocolGuid,
|
||||||
|
NULL, &Count, &Handles);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
Status = gBS->HandleProtocol(Handles[i], &gEfiDevicePathProtocolGuid, (VOID **)&DevicePath);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!IsDevicePathEnd(DevicePath))
|
||||||
|
{
|
||||||
|
if (MEDIA_DEVICE_PATH == DevicePath->Type && MEDIA_CDROM_DP == DevicePath->SubType)
|
||||||
|
{
|
||||||
|
FreePool(Handles);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
DevicePath = NextDevicePathNode(DevicePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FreePool(Handles);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* Block IO procotol */
|
/* Block IO procotol */
|
||||||
#endif
|
#endif
|
||||||
@ -126,7 +167,7 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector
|
|||||||
MapLba, secRead * 2048, pCurBuf);
|
MapLba, secRead * 2048, pCurBuf);
|
||||||
if (EFI_ERROR(Status))
|
if (EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
debug("Raw disk read block failed %r", Status);
|
debug("Raw disk read block failed %r LBA:%lu Count:%u", Status, MapLba, secRead);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -475,7 +516,7 @@ EFI_STATUS EFIAPI ventoy_connect_driver(IN EFI_HANDLE ControllerHandle, IN CONST
|
|||||||
if (i < Count)
|
if (i < Count)
|
||||||
{
|
{
|
||||||
Status = gBS->ConnectController(ControllerHandle, DrvHandles, NULL, TRUE);
|
Status = gBS->ConnectController(ControllerHandle, DrvHandles, NULL, TRUE);
|
||||||
debug("Connect partition driver:<%r>", Status);
|
debug("ventoy_connect_driver:<%s> <%r>", DrvName, Status);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -517,7 +558,7 @@ EFI_STATUS EFIAPI ventoy_connect_driver(IN EFI_HANDLE ControllerHandle, IN CONST
|
|||||||
if (i < Count)
|
if (i < Count)
|
||||||
{
|
{
|
||||||
Status = gBS->ConnectController(ControllerHandle, DrvHandles, NULL, TRUE);
|
Status = gBS->ConnectController(ControllerHandle, DrvHandles, NULL, TRUE);
|
||||||
debug("Connect partition driver:<%r>", Status);
|
debug("ventoy_connect_driver:<%s> <%r>", DrvName, Status);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -535,6 +576,9 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im
|
|||||||
EFI_BLOCK_IO_PROTOCOL *pBlockIo = &(gBlockData.BlockIo);
|
EFI_BLOCK_IO_PROTOCOL *pBlockIo = &(gBlockData.BlockIo);
|
||||||
|
|
||||||
ventoy_fill_device_path();
|
ventoy_fill_device_path();
|
||||||
|
|
||||||
|
debug("install block io protocol %p", ImageHandle);
|
||||||
|
ventoy_debug_pause();
|
||||||
|
|
||||||
gBlockData.Media.BlockSize = 2048;
|
gBlockData.Media.BlockSize = 2048;
|
||||||
gBlockData.Media.LastBlock = ImgSize / 2048 - 1;
|
gBlockData.Media.LastBlock = ImgSize / 2048 - 1;
|
||||||
@ -561,7 +605,6 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im
|
|||||||
|
|
||||||
Status = ventoy_connect_driver(gBlockData.Handle, L"Disk I/O Driver");
|
Status = ventoy_connect_driver(gBlockData.Handle, L"Disk I/O Driver");
|
||||||
debug("Connect disk IO driver %r", Status);
|
debug("Connect disk IO driver %r", Status);
|
||||||
ventoy_debug_pause();
|
|
||||||
|
|
||||||
Status = ventoy_connect_driver(gBlockData.Handle, L"Partition Driver");
|
Status = ventoy_connect_driver(gBlockData.Handle, L"Partition Driver");
|
||||||
debug("Connect partition driver %r", Status);
|
debug("Connect partition driver %r", Status);
|
||||||
@ -656,8 +699,16 @@ STATIC EFI_STATUS EFIAPI
|
|||||||
ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position)
|
ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position)
|
||||||
{
|
{
|
||||||
(VOID)This;
|
(VOID)This;
|
||||||
|
|
||||||
|
if (Position <= g_efi_file_replace.FileSizeBytes)
|
||||||
|
{
|
||||||
|
g_efi_file_replace.CurPos = Position;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_efi_file_replace.CurPos = g_efi_file_replace.FileSizeBytes;
|
||||||
|
}
|
||||||
|
|
||||||
g_efi_file_replace.CurPos = Position;
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -772,6 +823,8 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
|||||||
CHAR8 TmpName[256];
|
CHAR8 TmpName[256];
|
||||||
ventoy_virt_chunk *virt = NULL;
|
ventoy_virt_chunk *virt = NULL;
|
||||||
|
|
||||||
|
debug("## ventoy_wrapper_file_open <%s> ", Name);
|
||||||
|
|
||||||
Status = g_original_fopen(This, New, Name, Mode, Attributes);
|
Status = g_original_fopen(This, New, Name, Mode, Attributes);
|
||||||
if (EFI_ERROR(Status))
|
if (EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
@ -807,6 +860,11 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (StrCmp(Name, L"\\EFI\\BOOT") == 0)
|
||||||
|
{
|
||||||
|
(*New)->Open = ventoy_wrapper_file_open;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
@ -916,3 +974,55 @@ EFI_STATUS ventoy_hook_keyboard_stop(VOID)
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Fixup the 1st cdrom influnce for Windows boot */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
STATIC EFI_STATUS EFIAPI ventoy_wrapper_locate_handle
|
||||||
|
(
|
||||||
|
IN EFI_LOCATE_SEARCH_TYPE SearchType,
|
||||||
|
IN EFI_GUID *Protocol, OPTIONAL
|
||||||
|
IN VOID *SearchKey, OPTIONAL
|
||||||
|
IN OUT UINTN *BufferSize,
|
||||||
|
OUT EFI_HANDLE *Buffer
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN i;
|
||||||
|
EFI_HANDLE Handle = NULL;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
|
||||||
|
Status = g_org_locate_handle(SearchType, Protocol, SearchKey, BufferSize, Buffer);
|
||||||
|
|
||||||
|
if (EFI_SUCCESS == Status && Protocol && CompareGuid(&gEfiBlockIoProtocolGuid, Protocol))
|
||||||
|
{
|
||||||
|
for (i = 0; i < (*BufferSize) / sizeof(EFI_HANDLE); i++)
|
||||||
|
{
|
||||||
|
if (Buffer[i] == gBlockData.Handle)
|
||||||
|
{
|
||||||
|
Handle = Buffer[0];
|
||||||
|
Buffer[0] = Buffer[i];
|
||||||
|
Buffer[i] = Handle;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS ventoy_hook_1st_cdrom_start(VOID)
|
||||||
|
{
|
||||||
|
g_org_locate_handle = gBS->LocateHandle;
|
||||||
|
gBS->LocateHandle = ventoy_wrapper_locate_handle;
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS ventoy_hook_1st_cdrom_stop(VOID)
|
||||||
|
{
|
||||||
|
gBS->LocateHandle = g_org_locate_handle;
|
||||||
|
g_org_locate_handle = NULL;
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,179 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* Memhole.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 <VtoyUtil.h>
|
||||||
|
|
||||||
|
STATIC BOOLEAN IsMemContiguous
|
||||||
|
(
|
||||||
|
IN CONST EFI_MEMORY_DESCRIPTOR *Prev,
|
||||||
|
IN CONST EFI_MEMORY_DESCRIPTOR *Curr,
|
||||||
|
IN CONST EFI_MEMORY_DESCRIPTOR *Next
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN Addr1 = 0;
|
||||||
|
UINTN Addr2 = 0;
|
||||||
|
|
||||||
|
if (Prev == NULL || Curr == NULL || Next == NULL)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Prev->Type == EfiBootServicesData &&
|
||||||
|
Curr->Type == EfiConventionalMemory &&
|
||||||
|
Next->Type == EfiBootServicesData)
|
||||||
|
{
|
||||||
|
Addr1 = Prev->PhysicalStart + MultU64x64(SIZE_4KB, Prev->NumberOfPages);
|
||||||
|
Addr2 = Curr->PhysicalStart + MultU64x64(SIZE_4KB, Curr->NumberOfPages);
|
||||||
|
|
||||||
|
if (Addr1 == Curr->PhysicalStart && Addr2 == Next->PhysicalStart)
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC EFI_MEMORY_DESCRIPTOR* GetMemDesc
|
||||||
|
(
|
||||||
|
OUT UINTN *pSize,
|
||||||
|
OUT UINTN *pItemSize,
|
||||||
|
OUT UINTN *pDescCount
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN Size = 0;
|
||||||
|
UINTN MapKey = 0;
|
||||||
|
UINTN ItemSize = 0;
|
||||||
|
UINTN DescCount = 0;
|
||||||
|
UINT32 Version = 0;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
EFI_MEMORY_DESCRIPTOR *pDesc = NULL;
|
||||||
|
EFI_MEMORY_DESCRIPTOR *Curr = NULL;
|
||||||
|
|
||||||
|
Status = gBS->GetMemoryMap(&Size, pDesc, &MapKey, &ItemSize, &Version);
|
||||||
|
if (EFI_BUFFER_TOO_SMALL != Status)
|
||||||
|
{
|
||||||
|
debug("GetMemoryMap: %r", Status);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Size += SIZE_1KB;
|
||||||
|
pDesc = AllocatePool(Size);
|
||||||
|
if (!pDesc)
|
||||||
|
{
|
||||||
|
debug("AllocatePool: %lu failed", Size);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZeroMem(pDesc, Size);
|
||||||
|
|
||||||
|
Status = gBS->GetMemoryMap(&Size, pDesc, &MapKey, &ItemSize, &Version);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
debug("GetMemoryMap: %r", Status);
|
||||||
|
FreePool(pDesc);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Curr = pDesc;
|
||||||
|
while (Curr && Curr < (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)pDesc + Size))
|
||||||
|
{
|
||||||
|
DescCount++;
|
||||||
|
Curr = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Curr + ItemSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
*pSize = Size;
|
||||||
|
*pItemSize = ItemSize;
|
||||||
|
*pDescCount = DescCount;
|
||||||
|
|
||||||
|
debug("GetMemoryMap: ItemSize:%lu Count:%lu", ItemSize, DescCount);
|
||||||
|
|
||||||
|
return pDesc;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS FixWindowsMemhole(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine)
|
||||||
|
{
|
||||||
|
UINTN Size = 0;
|
||||||
|
UINTN ItemSize = 0;
|
||||||
|
UINTN DescCount = 0;
|
||||||
|
UINTN TotalMem = 0;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
EFI_PHYSICAL_ADDRESS AllocAddr = 0;
|
||||||
|
EFI_MEMORY_DESCRIPTOR *pDescs = NULL;
|
||||||
|
EFI_MEMORY_DESCRIPTOR *Prev = NULL;
|
||||||
|
EFI_MEMORY_DESCRIPTOR *Next = NULL;
|
||||||
|
EFI_MEMORY_DESCRIPTOR *Curr = NULL;
|
||||||
|
|
||||||
|
(VOID)ImageHandle;
|
||||||
|
(VOID)CmdLine;
|
||||||
|
|
||||||
|
pDescs = GetMemDesc(&Size, &ItemSize, &DescCount);
|
||||||
|
if (!pDescs)
|
||||||
|
{
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DescCount < 500)
|
||||||
|
{
|
||||||
|
FreePool(pDescs);
|
||||||
|
Printf("There is no need to fixup (%lu)\n", DescCount);
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
Curr = pDescs;
|
||||||
|
while ((UINT8 *)Curr < (UINT8 *)pDescs + Size)
|
||||||
|
{
|
||||||
|
Next = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Curr + ItemSize);
|
||||||
|
|
||||||
|
if (IsMemContiguous(Prev, Curr, Next))
|
||||||
|
{
|
||||||
|
AllocAddr = Curr->PhysicalStart;
|
||||||
|
Status = gBS->AllocatePages(AllocateAddress, EfiBootServicesData, Curr->NumberOfPages, &AllocAddr);
|
||||||
|
if (EFI_SUCCESS == Status)
|
||||||
|
{
|
||||||
|
TotalMem += MultU64x64(SIZE_4KB, Curr->NumberOfPages);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Prev = Curr;
|
||||||
|
Curr = Next;
|
||||||
|
}
|
||||||
|
|
||||||
|
Printf("Fixup Windows mmap issue OK (%lu)\n", TotalMem);
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,135 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* VtoyUtil.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 <VtoyUtil.h>
|
||||||
|
|
||||||
|
BOOLEAN gVtoyDebugPrint = FALSE;
|
||||||
|
STATIC CONST CHAR16 *gCurFeature= NULL;
|
||||||
|
STATIC CHAR16 *gCmdLine = NULL;
|
||||||
|
STATIC grub_env_printf_pf g_env_printf = NULL;
|
||||||
|
|
||||||
|
STATIC VtoyUtilFeature gFeatureList[] =
|
||||||
|
{
|
||||||
|
{ L"fix_windows_mmap", FixWindowsMemhole },
|
||||||
|
};
|
||||||
|
|
||||||
|
VOID EFIAPI VtoyUtilDebug(IN CONST CHAR8 *Format, ...)
|
||||||
|
{
|
||||||
|
VA_LIST Marker;
|
||||||
|
CHAR8 Buffer[512];
|
||||||
|
|
||||||
|
VA_START (Marker, Format);
|
||||||
|
AsciiVSPrint(Buffer, sizeof(Buffer), Format, Marker);
|
||||||
|
VA_END (Marker);
|
||||||
|
|
||||||
|
if (g_env_printf)
|
||||||
|
{
|
||||||
|
g_env_printf("%s", Buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS ParseCmdline(IN EFI_HANDLE ImageHandle)
|
||||||
|
{
|
||||||
|
CHAR16 *pPos = NULL;
|
||||||
|
CHAR16 *pCmdLine = NULL;
|
||||||
|
EFI_STATUS Status = EFI_SUCCESS;
|
||||||
|
ventoy_grub_param *pGrubParam = NULL;
|
||||||
|
EFI_LOADED_IMAGE_PROTOCOL *pImageInfo = NULL;
|
||||||
|
|
||||||
|
Status = gBS->HandleProtocol(ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **)&pImageInfo);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
pCmdLine = (CHAR16 *)AllocatePool(pImageInfo->LoadOptionsSize + 4);
|
||||||
|
SetMem(pCmdLine, pImageInfo->LoadOptionsSize + 4, 0);
|
||||||
|
CopyMem(pCmdLine, pImageInfo->LoadOptions, pImageInfo->LoadOptionsSize);
|
||||||
|
|
||||||
|
if (StrStr(pCmdLine, L"debug"))
|
||||||
|
{
|
||||||
|
gVtoyDebugPrint = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pPos = StrStr(pCmdLine, L"env_param=");
|
||||||
|
if (!pPos)
|
||||||
|
{
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
pGrubParam = (ventoy_grub_param *)StrHexToUintn(pPos + StrLen(L"env_param="));
|
||||||
|
g_env_printf = pGrubParam->grub_env_printf;
|
||||||
|
|
||||||
|
pPos = StrStr(pCmdLine, L"feature=");
|
||||||
|
if (!pPos)
|
||||||
|
{
|
||||||
|
return EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
gCurFeature = pPos + StrLen(L"feature=");
|
||||||
|
|
||||||
|
gCmdLine = pCmdLine;
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI VtoyUtilEfiMain
|
||||||
|
(
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN i;
|
||||||
|
UINTN Len;
|
||||||
|
|
||||||
|
ParseCmdline(ImageHandle);
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(gFeatureList); i++)
|
||||||
|
{
|
||||||
|
Len = StrLen(gFeatureList[i].Cmd);
|
||||||
|
if (StrnCmp(gFeatureList[i].Cmd, gCurFeature, Len) == 0)
|
||||||
|
{
|
||||||
|
debug("Find main proc <%s>", gFeatureList[i].Cmd);
|
||||||
|
gFeatureList[i].MainProc(ImageHandle, gCurFeature + Len);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FreePool(gCmdLine);
|
||||||
|
gCmdLine = NULL;
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,61 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* VtoyUtil.h
|
||||||
|
*
|
||||||
|
* 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/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __VTOYUTIL_H__
|
||||||
|
#define __VTOYUTIL_H__
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
|
||||||
|
typedef EFI_STATUS (*VTOY_UTIL_PROC_PF)(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine);
|
||||||
|
typedef const char * (*grub_env_get_pf)(const char *name);
|
||||||
|
typedef int (*grub_env_printf_pf)(const char *fmt, ...);
|
||||||
|
|
||||||
|
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;
|
||||||
|
grub_env_printf_pf grub_env_printf;
|
||||||
|
}ventoy_grub_param;
|
||||||
|
#pragma pack()
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct VtoyUtilFeature
|
||||||
|
{
|
||||||
|
CONST CHAR16 *Cmd;
|
||||||
|
VTOY_UTIL_PROC_PF MainProc;
|
||||||
|
}VtoyUtilFeature;
|
||||||
|
|
||||||
|
extern BOOLEAN gVtoyDebugPrint;
|
||||||
|
VOID EFIAPI VtoyUtilDebug(IN CONST CHAR8 *Format, ...);
|
||||||
|
#define debug(expr, ...) if (gVtoyDebugPrint) VtoyUtilDebug("[VTOY] "expr"\n", ##__VA_ARGS__)
|
||||||
|
#define Printf VtoyUtilDebug
|
||||||
|
|
||||||
|
EFI_STATUS FixWindowsMemhole(IN EFI_HANDLE ImageHandle, IN CONST CHAR16 *CmdLine);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,80 @@
|
|||||||
|
#************************************************************************************
|
||||||
|
# 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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
[Defines]
|
||||||
|
INF_VERSION = 0x00010005
|
||||||
|
BASE_NAME = VtoyUtil
|
||||||
|
FILE_GUID = a43466a0-68c6-469d-ba4b-678bbe90bc47
|
||||||
|
MODULE_TYPE = UEFI_APPLICATION
|
||||||
|
VERSION_STRING = 1.0
|
||||||
|
ENTRY_POINT = VtoyUtilEfiMain
|
||||||
|
|
||||||
|
|
||||||
|
[Sources]
|
||||||
|
VtoyUtil.h
|
||||||
|
VtoyUtil.c
|
||||||
|
Memhole.c
|
||||||
|
|
||||||
|
[Packages]
|
||||||
|
MdePkg/MdePkg.dec
|
||||||
|
MdeModulePkg/MdeModulePkg.dec
|
||||||
|
ShellPkg/ShellPkg.dec
|
||||||
|
|
||||||
|
[LibraryClasses]
|
||||||
|
UefiApplicationEntryPoint
|
||||||
|
UefiLib
|
||||||
|
DebugLib
|
||||||
|
|
||||||
|
[Guids]
|
||||||
|
gShellVariableGuid
|
||||||
|
gEfiVirtualCdGuid
|
||||||
|
gEfiFileInfoGuid
|
||||||
|
|
||||||
|
[Protocols]
|
||||||
|
gEfiLoadedImageProtocolGuid
|
||||||
|
gEfiBlockIoProtocolGuid
|
||||||
|
gEfiDevicePathProtocolGuid
|
||||||
|
gEfiSimpleFileSystemProtocolGuid
|
||||||
|
gEfiRamDiskProtocolGuid
|
||||||
|
gEfiAbsolutePointerProtocolGuid
|
||||||
|
gEfiAcpiTableProtocolGuid
|
||||||
|
gEfiBlockIo2ProtocolGuid
|
||||||
|
gEfiBusSpecificDriverOverrideProtocolGuid
|
||||||
|
gEfiComponentNameProtocolGuid
|
||||||
|
gEfiComponentName2ProtocolGuid
|
||||||
|
gEfiDriverBindingProtocolGuid
|
||||||
|
gEfiDiskIoProtocolGuid
|
||||||
|
gEfiDiskIo2ProtocolGuid
|
||||||
|
gEfiGraphicsOutputProtocolGuid
|
||||||
|
gEfiHiiConfigAccessProtocolGuid
|
||||||
|
gEfiHiiFontProtocolGuid
|
||||||
|
gEfiLoadFileProtocolGuid
|
||||||
|
gEfiLoadFile2ProtocolGuid
|
||||||
|
gEfiLoadedImageProtocolGuid
|
||||||
|
gEfiLoadedImageDevicePathProtocolGuid
|
||||||
|
gEfiPciIoProtocolGuid
|
||||||
|
gEfiSerialIoProtocolGuid
|
||||||
|
gEfiSimpleTextInProtocolGuid
|
||||||
|
gEfiSimpleTextInputExProtocolGuid
|
||||||
|
gEfiSimpleTextOutProtocolGuid
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -204,6 +204,7 @@
|
|||||||
|
|
||||||
[Components]
|
[Components]
|
||||||
MdeModulePkg/Application/Ventoy/Ventoy.inf
|
MdeModulePkg/Application/Ventoy/Ventoy.inf
|
||||||
|
MdeModulePkg/Application/VtoyUtil/VtoyUtil.inf
|
||||||
MdeModulePkg/Application/HelloWorld/HelloWorld.inf
|
MdeModulePkg/Application/HelloWorld/HelloWorld.inf
|
||||||
MdeModulePkg/Application/DumpDynPcd/DumpDynPcd.inf
|
MdeModulePkg/Application/DumpDynPcd/DumpDynPcd.inf
|
||||||
MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo.inf
|
MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo.inf
|
||||||
|
@ -1578,10 +1578,12 @@ module = {
|
|||||||
name = ventoy;
|
name = ventoy;
|
||||||
common = ventoy/ventoy.c;
|
common = ventoy/ventoy.c;
|
||||||
common = ventoy/ventoy_linux.c;
|
common = ventoy/ventoy_linux.c;
|
||||||
|
common = ventoy/ventoy_unix.c;
|
||||||
common = ventoy/ventoy_windows.c;
|
common = ventoy/ventoy_windows.c;
|
||||||
common = ventoy/ventoy_plugin.c;
|
common = ventoy/ventoy_plugin.c;
|
||||||
common = ventoy/ventoy_json.c;
|
common = ventoy/ventoy_json.c;
|
||||||
common = ventoy/lzx.c;
|
common = ventoy/lzx.c;
|
||||||
|
common = ventoy/xpress.c;
|
||||||
common = ventoy/huffman.c;
|
common = ventoy/huffman.c;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ grub_env_new_context (int export_all)
|
|||||||
grub_err_t
|
grub_err_t
|
||||||
grub_env_context_open (void)
|
grub_env_context_open (void)
|
||||||
{
|
{
|
||||||
return grub_env_new_context (1);
|
return grub_env_new_context (grub_env_get("ventoy_new_context") ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int grub_extractor_level = 0;
|
int grub_extractor_level = 0;
|
||||||
|
@ -853,12 +853,16 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GRUB_TERM_KEY_F6:
|
case GRUB_TERM_KEY_F6:
|
||||||
cmdstr = grub_env_get("VTOY_F6_CMD");
|
if (0 == g_ventoy_fn_mutex) {
|
||||||
if (cmdstr)
|
cmdstr = grub_env_get("VTOY_F6_CMD");
|
||||||
{
|
if (cmdstr)
|
||||||
menu_fini ();
|
{
|
||||||
grub_script_execute_sourcecode(cmdstr);
|
menu_fini ();
|
||||||
goto refresh;
|
g_ventoy_fn_mutex = 1;
|
||||||
|
grub_script_execute_sourcecode(cmdstr);
|
||||||
|
g_ventoy_fn_mutex = 0;
|
||||||
|
goto refresh;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GRUB_TERM_KEY_F7:
|
case GRUB_TERM_KEY_F7:
|
||||||
|
@ -305,6 +305,18 @@ static grub_err_t ventoy_cmd_break(grub_extcmd_context_t ctxt, int argc, char **
|
|||||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static grub_err_t ventoy_cmd_strstr(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
(void)ctxt;
|
||||||
|
|
||||||
|
if (argc != 2)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (grub_strstr(args[0], args[1])) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
static grub_err_t ventoy_cmd_incr(grub_extcmd_context_t ctxt, int argc, char **args)
|
static grub_err_t ventoy_cmd_incr(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
{
|
{
|
||||||
long value_long = 0;
|
long value_long = 0;
|
||||||
@ -891,8 +903,8 @@ static int ventoy_colect_img_files(const char *filename, const struct grub_dirho
|
|||||||
*((img_info **)(node->tail)) = img;
|
*((img_info **)(node->tail)) = img;
|
||||||
g_ventoy_img_count++;
|
g_ventoy_img_count++;
|
||||||
|
|
||||||
img->alias = ventoy_plugin_get_menu_alias(img->path);
|
img->alias = ventoy_plugin_get_menu_alias(vtoy_alias_image_file, img->path);
|
||||||
img->class = ventoy_plugin_get_menu_class(img->name);
|
img->class = ventoy_plugin_get_menu_class(vtoy_class_image_file, img->name);
|
||||||
if (!img->class)
|
if (!img->class)
|
||||||
{
|
{
|
||||||
img->class = g_menu_class[type];
|
img->class = g_menu_class[type];
|
||||||
@ -1029,7 +1041,9 @@ static img_iterator_node * ventoy_get_min_child(img_iterator_node *node)
|
|||||||
static int ventoy_dynamic_tree_menu(img_iterator_node *node)
|
static int ventoy_dynamic_tree_menu(img_iterator_node *node)
|
||||||
{
|
{
|
||||||
int offset = 1;
|
int offset = 1;
|
||||||
img_info *img;
|
img_info *img = NULL;
|
||||||
|
const char *dir_class = NULL;
|
||||||
|
const char *dir_alias = NULL;
|
||||||
img_iterator_node *child = NULL;
|
img_iterator_node *child = NULL;
|
||||||
|
|
||||||
if (node->isocnt == 0 || node->done == 1)
|
if (node->isocnt == 0 || node->done == 1)
|
||||||
@ -1055,9 +1069,25 @@ static int ventoy_dynamic_tree_menu(img_iterator_node *node)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
node->dir[node->dirlen - 1] = 0;
|
node->dir[node->dirlen - 1] = 0;
|
||||||
vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos,
|
dir_class = ventoy_plugin_get_menu_class(vtoy_class_directory, node->dir);
|
||||||
"submenu \"%-10s [%s]\" --class=\"vtoydir\" {\n",
|
if (!dir_class)
|
||||||
"DIR", node->dir + offset);
|
{
|
||||||
|
dir_class = "vtoydir";
|
||||||
|
}
|
||||||
|
|
||||||
|
dir_alias = ventoy_plugin_get_menu_alias(vtoy_alias_directory, node->dir);
|
||||||
|
if (dir_alias)
|
||||||
|
{
|
||||||
|
vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos,
|
||||||
|
"submenu \"%-10s %s\" --class=\"%s\" {\n",
|
||||||
|
"DIR", dir_alias, dir_class);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos,
|
||||||
|
"submenu \"%-10s [%s]\" --class=\"%s\" {\n",
|
||||||
|
"DIR", node->dir + offset, dir_class);
|
||||||
|
}
|
||||||
|
|
||||||
vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos,
|
vtoy_ssprintf(g_tree_script_buf, g_tree_script_pos,
|
||||||
"menuentry \"%-10s [../]\" --class=\"vtoyret\" VTOY_RET {\n "
|
"menuentry \"%-10s [../]\" --class=\"vtoyret\" VTOY_RET {\n "
|
||||||
@ -1371,7 +1401,7 @@ static grub_err_t ventoy_cmd_chosen_img_path(grub_extcmd_context_t ctxt, int arg
|
|||||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ventoy_get_disk_guid(const char *filename, grub_uint8_t *guid)
|
int ventoy_get_disk_guid(const char *filename, grub_uint8_t *guid)
|
||||||
{
|
{
|
||||||
grub_disk_t disk;
|
grub_disk_t disk;
|
||||||
char *device_name;
|
char *device_name;
|
||||||
@ -1441,6 +1471,7 @@ grub_uint32_t ventoy_get_iso_boot_catlog(grub_file_t file)
|
|||||||
int ventoy_has_efi_eltorito(grub_file_t file, grub_uint32_t sector)
|
int ventoy_has_efi_eltorito(grub_file_t file, grub_uint32_t sector)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
int x86count = 0;
|
||||||
grub_uint8_t buf[512];
|
grub_uint8_t buf[512];
|
||||||
|
|
||||||
grub_file_seek(file, sector * 2048);
|
grub_file_seek(file, sector * 2048);
|
||||||
@ -1452,6 +1483,11 @@ int ventoy_has_efi_eltorito(grub_file_t file, grub_uint32_t sector)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (buf[0] == 0x01 && buf[1] == 0x00)
|
||||||
|
{
|
||||||
|
x86count++;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 64; i < (int)sizeof(buf); i += 32)
|
for (i = 64; i < (int)sizeof(buf); i += 32)
|
||||||
{
|
{
|
||||||
if ((buf[i] == 0x90 || buf[i] == 0x91) && buf[i + 1] == 0xEF)
|
if ((buf[i] == 0x90 || buf[i] == 0x91) && buf[i + 1] == 0xEF)
|
||||||
@ -1459,6 +1495,12 @@ int ventoy_has_efi_eltorito(grub_file_t file, grub_uint32_t sector)
|
|||||||
debug("%s efi eltorito offset %d 0x%02x\n", file->name, i, buf[i]);
|
debug("%s efi eltorito offset %d 0x%02x\n", file->name, i, buf[i]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((buf[i] == 0x90 || buf[i] == 0x91) && buf[i + 1] == 0x00 && x86count == 1)
|
||||||
|
{
|
||||||
|
debug("0x9100 assume %s efi eltorito offset %d 0x%02x\n", file->name, i, buf[i]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("%s does not contain efi eltorito\n", file->name);
|
debug("%s does not contain efi eltorito\n", file->name);
|
||||||
@ -1662,7 +1704,7 @@ static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int ar
|
|||||||
(void)argc;
|
(void)argc;
|
||||||
(void)args;
|
(void)args;
|
||||||
|
|
||||||
debug("select auto installation %d\n", argc);
|
debug("select auto installation argc:%d\n", argc);
|
||||||
|
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
{
|
{
|
||||||
@ -1672,7 +1714,14 @@ static grub_err_t ventoy_cmd_sel_auto_install(grub_extcmd_context_t ctxt, int ar
|
|||||||
node = ventoy_plugin_find_install_template(args[0]);
|
node = ventoy_plugin_find_install_template(args[0]);
|
||||||
if (!node)
|
if (!node)
|
||||||
{
|
{
|
||||||
debug("Install template not found for %s\n", args[0]);
|
debug("Auto install template not found for %s\n", args[0]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node->autosel >= 0 && node->autosel <= node->templatenum)
|
||||||
|
{
|
||||||
|
node->cursel = node->autosel - 1;
|
||||||
|
debug("Auto install template auto select %d\n", node->autosel);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1720,7 +1769,7 @@ static grub_err_t ventoy_cmd_sel_persistence(grub_extcmd_context_t ctxt, int arg
|
|||||||
(void)argc;
|
(void)argc;
|
||||||
(void)args;
|
(void)args;
|
||||||
|
|
||||||
debug("select persistece %d\n", argc);
|
debug("select persistence argc:%d\n", argc);
|
||||||
|
|
||||||
if (argc < 1)
|
if (argc < 1)
|
||||||
{
|
{
|
||||||
@ -1734,6 +1783,13 @@ static grub_err_t ventoy_cmd_sel_persistence(grub_extcmd_context_t ctxt, int arg
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (node->autosel >= 0 && node->autosel <= node->backendnum)
|
||||||
|
{
|
||||||
|
node->cursel = node->autosel - 1;
|
||||||
|
debug("Persistence image auto select %d\n", node->autosel);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
buf = (char *)grub_malloc(VTOY_MAX_SCRIPT_BUF);
|
buf = (char *)grub_malloc(VTOY_MAX_SCRIPT_BUF);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
{
|
{
|
||||||
@ -1973,32 +2029,22 @@ static grub_err_t ventoy_cmd_dump_img_list(grub_extcmd_context_t ctxt, int argc,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static grub_err_t ventoy_cmd_dump_auto_install(grub_extcmd_context_t ctxt, int argc, char **args)
|
static grub_err_t ventoy_cmd_dump_injection(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
{
|
{
|
||||||
(void)ctxt;
|
(void)ctxt;
|
||||||
(void)argc;
|
(void)argc;
|
||||||
(void)args;
|
(void)args;
|
||||||
|
|
||||||
{
|
ventoy_plugin_dump_injection();
|
||||||
grub_file_t file;
|
|
||||||
char *buf;
|
|
||||||
char name[128];
|
|
||||||
|
|
||||||
file = grub_file_open("(hd0,1)/ventoy/ventoy.disk.img.xz", GRUB_FILE_TYPE_NONE);
|
return 0;
|
||||||
if (file)
|
|
||||||
{
|
|
||||||
grub_printf("Open File OK (size:%llu)\n", (ulonglong)file->size);
|
|
||||||
|
|
||||||
buf = grub_malloc(file->size);
|
|
||||||
grub_file_read(file, buf, file->size);
|
|
||||||
|
|
||||||
grub_file_close(file);
|
|
||||||
|
|
||||||
grub_snprintf(name, sizeof(name), "mem:0x%llx:size:%llu", (ulonglong)(ulong)buf, (ulonglong)file->size);
|
|
||||||
grub_printf("<%s>\n", name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static grub_err_t ventoy_cmd_dump_auto_install(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
(void)ctxt;
|
||||||
|
(void)argc;
|
||||||
|
(void)args;
|
||||||
|
|
||||||
ventoy_plugin_dump_auto_install();
|
ventoy_plugin_dump_auto_install();
|
||||||
|
|
||||||
@ -2144,7 +2190,7 @@ static grub_err_t ventoy_cmd_find_bootable_hdd(grub_extcmd_context_t ctxt, int a
|
|||||||
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Usage: %s variable\n", cmd_raw_name);
|
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Usage: %s variable\n", cmd_raw_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
isopath = grub_env_get("iso_path");
|
isopath = grub_env_get("vtoy_iso_part");
|
||||||
if (!isopath)
|
if (!isopath)
|
||||||
{
|
{
|
||||||
debug("isopath is null %p\n", isopath);
|
debug("isopath is null %p\n", isopath);
|
||||||
@ -2197,6 +2243,129 @@ static grub_err_t ventoy_cmd_find_bootable_hdd(grub_extcmd_context_t ctxt, int a
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static grub_err_t ventoy_cmd_read_1st_line(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
int len = 1024;
|
||||||
|
grub_file_t file;
|
||||||
|
char *buf = NULL;
|
||||||
|
|
||||||
|
(void)ctxt;
|
||||||
|
(void)argc;
|
||||||
|
|
||||||
|
if (argc != 2)
|
||||||
|
{
|
||||||
|
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Usage: %s file var \n", cmd_raw_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", args[0]);
|
||||||
|
if (!file)
|
||||||
|
{
|
||||||
|
debug("failed to open file %s\n", args[0]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = grub_malloc(len);
|
||||||
|
if (!buf)
|
||||||
|
{
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf[len - 1] = 0;
|
||||||
|
grub_file_read(file, buf, len - 1);
|
||||||
|
|
||||||
|
ventoy_get_line(buf);
|
||||||
|
ventoy_set_env(args[1], buf);
|
||||||
|
|
||||||
|
end:
|
||||||
|
|
||||||
|
grub_check_free(buf);
|
||||||
|
grub_file_close(file);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t ventoy_cmd_parse_volume(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
grub_file_t file;
|
||||||
|
char buf[64];
|
||||||
|
ventoy_iso9660_vd pvd;
|
||||||
|
|
||||||
|
(void)ctxt;
|
||||||
|
(void)argc;
|
||||||
|
|
||||||
|
if (argc != 3)
|
||||||
|
{
|
||||||
|
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Usage: %s sysid volid \n", cmd_raw_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", args[0]);
|
||||||
|
if (!file)
|
||||||
|
{
|
||||||
|
debug("failed to open file %s\n", args[0]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_file_seek(file, 16 * 2048);
|
||||||
|
len = (int)grub_file_read(file, &pvd, sizeof(pvd));
|
||||||
|
if (len != sizeof(pvd))
|
||||||
|
{
|
||||||
|
debug("failed to read pvd %d\n", len);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_memset(buf, 0, sizeof(buf));
|
||||||
|
grub_memcpy(buf, pvd.sys, sizeof(pvd.sys));
|
||||||
|
ventoy_set_env(args[1], buf);
|
||||||
|
|
||||||
|
grub_memset(buf, 0, sizeof(buf));
|
||||||
|
grub_memcpy(buf, pvd.vol, sizeof(pvd.vol));
|
||||||
|
ventoy_set_env(args[2], buf);
|
||||||
|
|
||||||
|
end:
|
||||||
|
grub_file_close(file);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_err_t ventoy_cmd_parse_create_date(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
grub_file_t file;
|
||||||
|
char buf[64];
|
||||||
|
|
||||||
|
(void)ctxt;
|
||||||
|
(void)argc;
|
||||||
|
|
||||||
|
if (argc != 2)
|
||||||
|
{
|
||||||
|
return grub_error(GRUB_ERR_BAD_ARGUMENT, "Usage: %s var \n", cmd_raw_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
file = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s", args[0]);
|
||||||
|
if (!file)
|
||||||
|
{
|
||||||
|
debug("failed to open file %s\n", args[0]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_memset(buf, 0, sizeof(buf));
|
||||||
|
grub_file_seek(file, 16 * 2048 + 813);
|
||||||
|
len = (int)grub_file_read(file, buf, 17);
|
||||||
|
if (len != 17)
|
||||||
|
{
|
||||||
|
debug("failed to read create date %d\n", len);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_set_env(args[1], buf);
|
||||||
|
|
||||||
|
end:
|
||||||
|
grub_file_close(file);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
grub_uint64_t ventoy_grub_get_file_size(const char *fmt, ...)
|
grub_uint64_t ventoy_grub_get_file_size(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
grub_uint64_t size = 0;
|
grub_uint64_t size = 0;
|
||||||
@ -2267,14 +2436,37 @@ int ventoy_is_file_exist(const char *fmt, ...)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ventoy_is_dir_exist(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
int len;
|
||||||
|
char *pos = NULL;
|
||||||
|
char buf[256] = {0};
|
||||||
|
|
||||||
|
grub_snprintf(buf, sizeof(buf), "%s", "[ -d ");
|
||||||
|
pos = buf + 5;
|
||||||
|
|
||||||
|
va_start (ap, fmt);
|
||||||
|
len = grub_vsnprintf(pos, 255, fmt, ap);
|
||||||
|
va_end (ap);
|
||||||
|
|
||||||
|
grub_strncpy(pos + len, " ]", 2);
|
||||||
|
|
||||||
|
debug("script exec %s\n", buf);
|
||||||
|
|
||||||
|
if (0 == grub_script_execute_sourcecode(buf))
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int ventoy_env_init(void)
|
static int ventoy_env_init(void)
|
||||||
{
|
{
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
grub_env_set("vtdebug_flag", "");
|
grub_env_set("vtdebug_flag", "");
|
||||||
grub_env_export("vtdebug_flag");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
g_tree_script_buf = grub_malloc(VTOY_MAX_SCRIPT_BUF);
|
g_tree_script_buf = grub_malloc(VTOY_MAX_SCRIPT_BUF);
|
||||||
g_list_script_buf = grub_malloc(VTOY_MAX_SCRIPT_BUF);
|
g_list_script_buf = grub_malloc(VTOY_MAX_SCRIPT_BUF);
|
||||||
@ -2285,6 +2477,7 @@ static int ventoy_env_init(void)
|
|||||||
if (g_grub_param)
|
if (g_grub_param)
|
||||||
{
|
{
|
||||||
g_grub_param->grub_env_get = grub_env_get;
|
g_grub_param->grub_env_get = grub_env_get;
|
||||||
|
g_grub_param->grub_env_printf = (grub_env_printf_pf)grub_printf;
|
||||||
grub_snprintf(buf, sizeof(buf), "%p", g_grub_param);
|
grub_snprintf(buf, sizeof(buf), "%p", g_grub_param);
|
||||||
grub_env_set("env_param", buf);
|
grub_env_set("env_param", buf);
|
||||||
}
|
}
|
||||||
@ -2295,6 +2488,7 @@ static int ventoy_env_init(void)
|
|||||||
static cmd_para ventoy_cmds[] =
|
static cmd_para ventoy_cmds[] =
|
||||||
{
|
{
|
||||||
{ "vt_incr", ventoy_cmd_incr, 0, NULL, "{Var} {INT}", "Increase integer variable", NULL },
|
{ "vt_incr", ventoy_cmd_incr, 0, NULL, "{Var} {INT}", "Increase integer variable", NULL },
|
||||||
|
{ "vt_strstr", ventoy_cmd_strstr, 0, NULL, "", "", NULL },
|
||||||
{ "vt_debug", ventoy_cmd_debug, 0, NULL, "{on|off}", "turn debug on/off", NULL },
|
{ "vt_debug", ventoy_cmd_debug, 0, NULL, "{on|off}", "turn debug on/off", NULL },
|
||||||
{ "vtdebug", ventoy_cmd_debug, 0, NULL, "{on|off}", "turn debug on/off", NULL },
|
{ "vtdebug", ventoy_cmd_debug, 0, NULL, "{on|off}", "turn debug on/off", NULL },
|
||||||
{ "vtbreak", ventoy_cmd_break, 0, NULL, "{level}", "set debug break", NULL },
|
{ "vtbreak", ventoy_cmd_break, 0, NULL, "{level}", "set debug break", NULL },
|
||||||
@ -2314,6 +2508,7 @@ static cmd_para ventoy_cmds[] =
|
|||||||
{ "vt_dynamic_menu", ventoy_cmd_dynamic_menu, 0, NULL, "", "", NULL },
|
{ "vt_dynamic_menu", ventoy_cmd_dynamic_menu, 0, NULL, "", "", NULL },
|
||||||
{ "vt_check_mode", ventoy_cmd_check_mode, 0, NULL, "", "", NULL },
|
{ "vt_check_mode", ventoy_cmd_check_mode, 0, NULL, "", "", NULL },
|
||||||
{ "vt_dump_img_list", ventoy_cmd_dump_img_list, 0, NULL, "", "", NULL },
|
{ "vt_dump_img_list", ventoy_cmd_dump_img_list, 0, NULL, "", "", NULL },
|
||||||
|
{ "vt_dump_injection", ventoy_cmd_dump_injection, 0, NULL, "", "", NULL },
|
||||||
{ "vt_dump_auto_install", ventoy_cmd_dump_auto_install, 0, NULL, "", "", NULL },
|
{ "vt_dump_auto_install", ventoy_cmd_dump_auto_install, 0, NULL, "", "", NULL },
|
||||||
{ "vt_dump_persistence", ventoy_cmd_dump_persistence, 0, NULL, "", "", NULL },
|
{ "vt_dump_persistence", ventoy_cmd_dump_persistence, 0, NULL, "", "", NULL },
|
||||||
{ "vt_select_auto_install", ventoy_cmd_sel_auto_install, 0, NULL, "", "", NULL },
|
{ "vt_select_auto_install", ventoy_cmd_sel_auto_install, 0, NULL, "", "", NULL },
|
||||||
@ -2351,6 +2546,16 @@ static cmd_para ventoy_cmds[] =
|
|||||||
|
|
||||||
{ "vt_load_plugin", ventoy_cmd_load_plugin, 0, NULL, "", "", NULL },
|
{ "vt_load_plugin", ventoy_cmd_load_plugin, 0, NULL, "", "", NULL },
|
||||||
{ "vt_check_plugin_json", ventoy_cmd_plugin_check_json, 0, NULL, "", "", NULL },
|
{ "vt_check_plugin_json", ventoy_cmd_plugin_check_json, 0, NULL, "", "", NULL },
|
||||||
|
|
||||||
|
{ "vt_1st_line", ventoy_cmd_read_1st_line, 0, NULL, "", "", NULL },
|
||||||
|
{ "vt_parse_iso_volume", ventoy_cmd_parse_volume, 0, NULL, "", "", NULL },
|
||||||
|
{ "vt_parse_iso_create_date", ventoy_cmd_parse_create_date, 0, NULL, "", "", NULL },
|
||||||
|
{ "vt_parse_freenas_ver", ventoy_cmd_parse_freenas_ver, 0, NULL, "", "", NULL },
|
||||||
|
{ "vt_unix_parse_freebsd_ver", ventoy_cmd_unix_freebsd_ver, 0, NULL, "", "", NULL },
|
||||||
|
{ "vt_unix_reset", ventoy_cmd_unix_reset, 0, NULL, "", "", NULL },
|
||||||
|
{ "vt_unix_replace_conf", ventoy_cmd_unix_replace_conf, 0, NULL, "", "", NULL },
|
||||||
|
{ "vt_unix_replace_ko", ventoy_cmd_unix_replace_ko, 0, NULL, "", "", NULL },
|
||||||
|
{ "vt_unix_chain_data", ventoy_cmd_unix_chain_data, 0, NULL, "", "", NULL },
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -123,6 +123,16 @@ typedef struct ventoy_udf_override
|
|||||||
grub_uint32_t position;
|
grub_uint32_t position;
|
||||||
}ventoy_udf_override;
|
}ventoy_udf_override;
|
||||||
|
|
||||||
|
typedef struct ventoy_iso9660_vd
|
||||||
|
{
|
||||||
|
grub_uint8_t type;
|
||||||
|
grub_uint8_t id[5];
|
||||||
|
grub_uint8_t ver;
|
||||||
|
grub_uint8_t res;
|
||||||
|
char sys[32];
|
||||||
|
char vol[32];
|
||||||
|
}ventoy_iso9660_vd;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
#define img_type_iso 0
|
#define img_type_iso 0
|
||||||
@ -225,6 +235,7 @@ void ventoy_debug(const char *fmt, ...);
|
|||||||
#define FLAG_HEADER_COMPRESS_RESERVED 0x00010000
|
#define FLAG_HEADER_COMPRESS_RESERVED 0x00010000
|
||||||
#define FLAG_HEADER_COMPRESS_XPRESS 0x00020000
|
#define FLAG_HEADER_COMPRESS_XPRESS 0x00020000
|
||||||
#define FLAG_HEADER_COMPRESS_LZX 0x00040000
|
#define FLAG_HEADER_COMPRESS_LZX 0x00040000
|
||||||
|
#define FLAG_HEADER_COMPRESS_LZMS 0x00080000
|
||||||
|
|
||||||
#define RESHDR_FLAG_FREE 0x01
|
#define RESHDR_FLAG_FREE 0x01
|
||||||
#define RESHDR_FLAG_METADATA 0x02
|
#define RESHDR_FLAG_METADATA 0x02
|
||||||
@ -460,6 +471,7 @@ int ventoy_cpio_newc_fill_head(void *buf, int filesize, const void *filedata, co
|
|||||||
grub_file_t ventoy_grub_file_open(enum grub_file_type type, const char *fmt, ...);
|
grub_file_t ventoy_grub_file_open(enum grub_file_type type, const char *fmt, ...);
|
||||||
grub_uint64_t ventoy_grub_get_file_size(const char *fmt, ...);
|
grub_uint64_t ventoy_grub_get_file_size(const char *fmt, ...);
|
||||||
int ventoy_is_file_exist(const char *fmt, ...);
|
int ventoy_is_file_exist(const char *fmt, ...);
|
||||||
|
int ventoy_is_dir_exist(const char *fmt, ...);
|
||||||
int ventoy_fill_data(grub_uint32_t buflen, char *buffer);
|
int ventoy_fill_data(grub_uint32_t buflen, char *buffer);
|
||||||
grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_wimdows_reset(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_wimdows_reset(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
@ -600,6 +612,7 @@ typedef struct install_template
|
|||||||
int pathlen;
|
int pathlen;
|
||||||
char isopath[256];
|
char isopath[256];
|
||||||
|
|
||||||
|
int autosel;
|
||||||
int cursel;
|
int cursel;
|
||||||
int templatenum;
|
int templatenum;
|
||||||
file_fullpath *templatepath;
|
file_fullpath *templatepath;
|
||||||
@ -612,6 +625,7 @@ typedef struct persistence_config
|
|||||||
int pathlen;
|
int pathlen;
|
||||||
char isopath[256];
|
char isopath[256];
|
||||||
|
|
||||||
|
int autosel;
|
||||||
int cursel;
|
int cursel;
|
||||||
int backendnum;
|
int backendnum;
|
||||||
file_fullpath *backendpath;
|
file_fullpath *backendpath;
|
||||||
@ -619,8 +633,12 @@ typedef struct persistence_config
|
|||||||
struct persistence_config *next;
|
struct persistence_config *next;
|
||||||
}persistence_config;
|
}persistence_config;
|
||||||
|
|
||||||
|
#define vtoy_alias_image_file 0
|
||||||
|
#define vtoy_alias_directory 1
|
||||||
|
|
||||||
typedef struct menu_alias
|
typedef struct menu_alias
|
||||||
{
|
{
|
||||||
|
int type;
|
||||||
int pathlen;
|
int pathlen;
|
||||||
char isopath[256];
|
char isopath[256];
|
||||||
char alias[256];
|
char alias[256];
|
||||||
@ -628,8 +646,12 @@ typedef struct menu_alias
|
|||||||
struct menu_alias *next;
|
struct menu_alias *next;
|
||||||
}menu_alias;
|
}menu_alias;
|
||||||
|
|
||||||
|
#define vtoy_class_image_file 0
|
||||||
|
#define vtoy_class_directory 1
|
||||||
|
|
||||||
typedef struct menu_class
|
typedef struct menu_class
|
||||||
{
|
{
|
||||||
|
int type;
|
||||||
int patlen;
|
int patlen;
|
||||||
char pattern[256];
|
char pattern[256];
|
||||||
char class[64];
|
char class[64];
|
||||||
@ -637,6 +659,15 @@ typedef struct menu_class
|
|||||||
struct menu_class *next;
|
struct menu_class *next;
|
||||||
}menu_class;
|
}menu_class;
|
||||||
|
|
||||||
|
typedef struct injection_config
|
||||||
|
{
|
||||||
|
int pathlen;
|
||||||
|
char isopath[256];
|
||||||
|
char archive[256];
|
||||||
|
|
||||||
|
struct injection_config *next;
|
||||||
|
}injection_config;
|
||||||
|
|
||||||
extern int g_ventoy_menu_esc;
|
extern int g_ventoy_menu_esc;
|
||||||
extern int g_ventoy_suppress_esc;
|
extern int g_ventoy_suppress_esc;
|
||||||
extern int g_ventoy_last_entry;
|
extern int g_ventoy_last_entry;
|
||||||
@ -646,16 +677,36 @@ extern int g_ventoy_iso_uefi_drv;
|
|||||||
extern int g_ventoy_case_insensitive;
|
extern int g_ventoy_case_insensitive;
|
||||||
extern grub_uint8_t g_ventoy_chain_type;
|
extern grub_uint8_t g_ventoy_chain_type;
|
||||||
|
|
||||||
|
|
||||||
|
#define ventoy_unix_fill_virt(new_data, new_len) \
|
||||||
|
{ \
|
||||||
|
data_secs = (new_len + 2047) / 2048; \
|
||||||
|
cur->mem_sector_start = sector; \
|
||||||
|
cur->mem_sector_end = cur->mem_sector_start + data_secs; \
|
||||||
|
cur->mem_sector_offset = offset; \
|
||||||
|
cur->remap_sector_start = 0; \
|
||||||
|
cur->remap_sector_end = 0; \
|
||||||
|
cur->org_sector_start = 0; \
|
||||||
|
grub_memcpy(override + offset, new_data, new_len); \
|
||||||
|
cur++; \
|
||||||
|
sector += data_secs; \
|
||||||
|
offset += new_len; \
|
||||||
|
chain->virt_img_size_in_bytes += data_secs * 2048; \
|
||||||
|
}
|
||||||
|
|
||||||
|
char * ventoy_get_line(char *start);
|
||||||
int ventoy_cmp_img(img_info *img1, img_info *img2);
|
int ventoy_cmp_img(img_info *img1, img_info *img2);
|
||||||
void ventoy_swap_img(img_info *img1, img_info *img2);
|
void ventoy_swap_img(img_info *img1, img_info *img2);
|
||||||
char * ventoy_plugin_get_cur_install_template(const char *isopath);
|
char * ventoy_plugin_get_cur_install_template(const char *isopath);
|
||||||
install_template * ventoy_plugin_find_install_template(const char *isopath);
|
install_template * ventoy_plugin_find_install_template(const char *isopath);
|
||||||
persistence_config * ventoy_plugin_find_persistent(const char *isopath);
|
persistence_config * ventoy_plugin_find_persistent(const char *isopath);
|
||||||
|
void ventoy_plugin_dump_injection(void);
|
||||||
void ventoy_plugin_dump_auto_install(void);
|
void ventoy_plugin_dump_auto_install(void);
|
||||||
int ventoy_fill_windows_rtdata(void *buf, char *isopath);
|
int ventoy_fill_windows_rtdata(void *buf, char *isopath);
|
||||||
int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list);
|
int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list);
|
||||||
const char * ventoy_plugin_get_menu_alias(const char *isopath);
|
const char * ventoy_plugin_get_injection(const char *isopath);
|
||||||
const char * ventoy_plugin_get_menu_class(const char *isoname);
|
const char * ventoy_plugin_get_menu_alias(int type, const char *isopath);
|
||||||
|
const char * ventoy_plugin_get_menu_class(int type, const char *name);
|
||||||
int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
int ventoy_get_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
||||||
int ventoy_check_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
int ventoy_check_block_list(grub_file_t file, ventoy_img_chunk_list *chunklist, grub_disk_addr_t start);
|
||||||
void ventoy_plugin_dump_persistence(void);
|
void ventoy_plugin_dump_persistence(void);
|
||||||
@ -664,6 +715,13 @@ grub_err_t ventoy_cmd_linux_get_main_initrd_index(grub_extcmd_context_t ctxt, in
|
|||||||
grub_err_t ventoy_cmd_collect_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_collect_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_wim_patch_count(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_wim_patch_count(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
grub_err_t ventoy_cmd_locate_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
|
grub_err_t ventoy_cmd_locate_wim_patch(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
grub_err_t ventoy_cmd_unix_chain_data(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
int ventoy_get_disk_guid(const char *filename, grub_uint8_t *guid);
|
||||||
|
grub_err_t ventoy_cmd_unix_reset(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
grub_err_t ventoy_cmd_unix_replace_conf(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
grub_err_t ventoy_cmd_unix_replace_ko(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
grub_err_t ventoy_cmd_unix_freebsd_ver(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
grub_err_t ventoy_cmd_parse_freenas_ver(grub_extcmd_context_t ctxt, int argc, char **args);
|
||||||
|
|
||||||
#endif /* __VENTOY_DEF_H__ */
|
#endif /* __VENTOY_DEF_H__ */
|
||||||
|
|
||||||
|
@ -38,8 +38,7 @@
|
|||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
char * ventoy_get_line(char *start)
|
||||||
static char * ventoy_get_line(char *start)
|
|
||||||
{
|
{
|
||||||
if (start == NULL)
|
if (start == NULL)
|
||||||
{
|
{
|
||||||
@ -909,6 +908,8 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||||||
char *template_file = NULL;
|
char *template_file = NULL;
|
||||||
char *template_buf = NULL;
|
char *template_buf = NULL;
|
||||||
char *persistent_buf = NULL;
|
char *persistent_buf = NULL;
|
||||||
|
char *injection_buf = NULL;
|
||||||
|
const char *injection_file = NULL;
|
||||||
grub_uint8_t *buf = NULL;
|
grub_uint8_t *buf = NULL;
|
||||||
grub_uint32_t mod;
|
grub_uint32_t mod;
|
||||||
grub_uint32_t headlen;
|
grub_uint32_t headlen;
|
||||||
@ -917,8 +918,9 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||||||
grub_uint32_t img_chunk_size;
|
grub_uint32_t img_chunk_size;
|
||||||
grub_uint32_t template_size = 0;
|
grub_uint32_t template_size = 0;
|
||||||
grub_uint32_t persistent_size = 0;
|
grub_uint32_t persistent_size = 0;
|
||||||
|
grub_uint32_t injection_size = 0;
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
grub_file_t scriptfile;
|
grub_file_t tmpfile;
|
||||||
ventoy_img_chunk_list chunk_list;
|
ventoy_img_chunk_list chunk_list;
|
||||||
|
|
||||||
(void)ctxt;
|
(void)ctxt;
|
||||||
@ -960,18 +962,18 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||||||
if (template_file)
|
if (template_file)
|
||||||
{
|
{
|
||||||
debug("auto install template: <%s>\n", template_file);
|
debug("auto install template: <%s>\n", template_file);
|
||||||
scriptfile = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[2], template_file);
|
tmpfile = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[2], template_file);
|
||||||
if (scriptfile)
|
if (tmpfile)
|
||||||
{
|
{
|
||||||
debug("auto install script size %d\n", (int)scriptfile->size);
|
debug("auto install script size %d\n", (int)tmpfile->size);
|
||||||
template_size = scriptfile->size;
|
template_size = tmpfile->size;
|
||||||
template_buf = grub_malloc(template_size);
|
template_buf = grub_malloc(template_size);
|
||||||
if (template_buf)
|
if (template_buf)
|
||||||
{
|
{
|
||||||
grub_file_read(scriptfile, template_buf, template_size);
|
grub_file_read(tmpfile, template_buf, template_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_file_close(scriptfile);
|
grub_file_close(tmpfile);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -983,7 +985,34 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||||||
debug("auto install script skipped or not configed %s\n", args[1]);
|
debug("auto install script skipped or not configed %s\n", args[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_ventoy_cpio_buf = grub_malloc(file->size + 4096 + template_size + persistent_size + img_chunk_size);
|
injection_file = ventoy_plugin_get_injection(args[1]);
|
||||||
|
if (injection_file)
|
||||||
|
{
|
||||||
|
debug("injection archive: <%s>\n", injection_file);
|
||||||
|
tmpfile = ventoy_grub_file_open(VENTOY_FILE_TYPE, "%s%s", args[2], injection_file);
|
||||||
|
if (tmpfile)
|
||||||
|
{
|
||||||
|
debug("injection archive size:%d\n", (int)tmpfile->size);
|
||||||
|
injection_size = tmpfile->size;
|
||||||
|
injection_buf = grub_malloc(injection_size);
|
||||||
|
if (injection_buf)
|
||||||
|
{
|
||||||
|
grub_file_read(tmpfile, injection_buf, injection_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_file_close(tmpfile);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("Failed to open injection archive %s%s\n", args[2], injection_file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("injection not configed %s\n", args[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_ventoy_cpio_buf = grub_malloc(file->size + 4096 + template_size + persistent_size + injection_size + img_chunk_size);
|
||||||
if (NULL == g_ventoy_cpio_buf)
|
if (NULL == g_ventoy_cpio_buf)
|
||||||
{
|
{
|
||||||
grub_file_close(file);
|
grub_file_close(file);
|
||||||
@ -1020,6 +1049,15 @@ grub_err_t ventoy_cmd_load_cpio(grub_extcmd_context_t ctxt, int argc, char **arg
|
|||||||
persistent_buf = NULL;
|
persistent_buf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (injection_size > 0 && injection_buf)
|
||||||
|
{
|
||||||
|
headlen = ventoy_cpio_newc_fill_head(buf, injection_size, injection_buf, "ventoy/ventoy_injection");
|
||||||
|
buf += headlen + ventoy_align(injection_size, 4);
|
||||||
|
|
||||||
|
grub_free(injection_buf);
|
||||||
|
injection_buf = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* step2: insert os param to cpio */
|
/* step2: insert os param to cpio */
|
||||||
headlen = ventoy_cpio_newc_fill_head(buf, 0, NULL, "ventoy/ventoy_os_param");
|
headlen = ventoy_cpio_newc_fill_head(buf, 0, NULL, "ventoy/ventoy_os_param");
|
||||||
padlen = sizeof(ventoy_os_param);
|
padlen = sizeof(ventoy_os_param);
|
||||||
@ -1144,7 +1182,7 @@ grub_err_t ventoy_cmd_linux_chain_data(grub_extcmd_context_t ctxt, int argc, cha
|
|||||||
grub_memset(chain, 0, sizeof(ventoy_chain_head));
|
grub_memset(chain, 0, sizeof(ventoy_chain_head));
|
||||||
|
|
||||||
/* part 1: os parameter */
|
/* part 1: os parameter */
|
||||||
g_ventoy_chain_type = 0;
|
g_ventoy_chain_type = ventoy_chain_linux;
|
||||||
ventoy_fill_os_param(file, &(chain->os_param));
|
ventoy_fill_os_param(file, &(chain->os_param));
|
||||||
|
|
||||||
/* part 2: chain head */
|
/* part 2: chain head */
|
||||||
|
@ -44,6 +44,7 @@ static install_template *g_install_template_head = NULL;
|
|||||||
static persistence_config *g_persistence_head = NULL;
|
static persistence_config *g_persistence_head = NULL;
|
||||||
static menu_alias *g_menu_alias_head = NULL;
|
static menu_alias *g_menu_alias_head = NULL;
|
||||||
static menu_class *g_menu_class_head = NULL;
|
static menu_class *g_menu_class_head = NULL;
|
||||||
|
static injection_config *g_injection_head = NULL;
|
||||||
|
|
||||||
static int ventoy_plugin_control_check(VTOY_JSON *json, const char *isodisk)
|
static int ventoy_plugin_control_check(VTOY_JSON *json, const char *isodisk)
|
||||||
{
|
{
|
||||||
@ -310,11 +311,13 @@ static int ventoy_plugin_check_fullpath
|
|||||||
(
|
(
|
||||||
VTOY_JSON *json,
|
VTOY_JSON *json,
|
||||||
const char *isodisk,
|
const char *isodisk,
|
||||||
const char *key
|
const char *key,
|
||||||
|
int *pathnum
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
int cnt = 0;
|
||||||
VTOY_JSON *node = json;
|
VTOY_JSON *node = json;
|
||||||
VTOY_JSON *child = NULL;
|
VTOY_JSON *child = NULL;
|
||||||
|
|
||||||
@ -334,6 +337,7 @@ static int ventoy_plugin_check_fullpath
|
|||||||
|
|
||||||
if (JSON_TYPE_STRING == node->enDataType)
|
if (JSON_TYPE_STRING == node->enDataType)
|
||||||
{
|
{
|
||||||
|
cnt = 1;
|
||||||
ret = ventoy_plugin_check_path(isodisk, node->unData.pcStrVal);
|
ret = ventoy_plugin_check_path(isodisk, node->unData.pcStrVal);
|
||||||
grub_printf("%s: %s [%s]\n", key, node->unData.pcStrVal, ret ? "FAIL" : "OK");
|
grub_printf("%s: %s [%s]\n", key, node->unData.pcStrVal, ret ? "FAIL" : "OK");
|
||||||
}
|
}
|
||||||
@ -350,10 +354,12 @@ static int ventoy_plugin_check_fullpath
|
|||||||
rc = ventoy_plugin_check_path(isodisk, child->unData.pcStrVal);
|
rc = ventoy_plugin_check_path(isodisk, child->unData.pcStrVal);
|
||||||
grub_printf("%s: %s [%s]\n", key, child->unData.pcStrVal, rc ? "FAIL" : "OK");
|
grub_printf("%s: %s [%s]\n", key, child->unData.pcStrVal, rc ? "FAIL" : "OK");
|
||||||
ret += rc;
|
ret += rc;
|
||||||
|
cnt++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*pathnum = cnt;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -443,6 +449,8 @@ static int ventoy_plugin_parse_fullpath
|
|||||||
|
|
||||||
static int ventoy_plugin_auto_install_check(VTOY_JSON *json, const char *isodisk)
|
static int ventoy_plugin_auto_install_check(VTOY_JSON *json, const char *isodisk)
|
||||||
{
|
{
|
||||||
|
int pathnum = 0;
|
||||||
|
int autosel = 0;
|
||||||
const char *iso = NULL;
|
const char *iso = NULL;
|
||||||
VTOY_JSON *pNode = NULL;
|
VTOY_JSON *pNode = NULL;
|
||||||
|
|
||||||
@ -465,7 +473,19 @@ static int ventoy_plugin_auto_install_check(VTOY_JSON *json, const char *isodisk
|
|||||||
if (0 == ventoy_plugin_check_path(isodisk, iso))
|
if (0 == ventoy_plugin_check_path(isodisk, iso))
|
||||||
{
|
{
|
||||||
grub_printf("image: %s [OK]\n", iso);
|
grub_printf("image: %s [OK]\n", iso);
|
||||||
ventoy_plugin_check_fullpath(pNode->pstChild, isodisk, "template");
|
ventoy_plugin_check_fullpath(pNode->pstChild, isodisk, "template", &pathnum);
|
||||||
|
|
||||||
|
if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "autosel", &autosel))
|
||||||
|
{
|
||||||
|
if (autosel >= 0 && autosel <= pathnum)
|
||||||
|
{
|
||||||
|
grub_printf("autosel: %d [OK]\n", autosel);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grub_printf("autosel: %d [FAIL]\n", autosel);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -484,6 +504,7 @@ static int ventoy_plugin_auto_install_check(VTOY_JSON *json, const char *isodisk
|
|||||||
static int ventoy_plugin_auto_install_entry(VTOY_JSON *json, const char *isodisk)
|
static int ventoy_plugin_auto_install_entry(VTOY_JSON *json, const char *isodisk)
|
||||||
{
|
{
|
||||||
int pathnum = 0;
|
int pathnum = 0;
|
||||||
|
int autosel = 0;
|
||||||
const char *iso = NULL;
|
const char *iso = NULL;
|
||||||
VTOY_JSON *pNode = NULL;
|
VTOY_JSON *pNode = NULL;
|
||||||
install_template *node = NULL;
|
install_template *node = NULL;
|
||||||
@ -522,6 +543,15 @@ static int ventoy_plugin_auto_install_entry(VTOY_JSON *json, const char *isodisk
|
|||||||
node->templatepath = templatepath;
|
node->templatepath = templatepath;
|
||||||
node->templatenum = pathnum;
|
node->templatenum = pathnum;
|
||||||
|
|
||||||
|
node->autosel = -1;
|
||||||
|
if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "autosel", &autosel))
|
||||||
|
{
|
||||||
|
if (autosel >= 0 && autosel <= pathnum)
|
||||||
|
{
|
||||||
|
node->autosel = autosel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (g_install_template_head)
|
if (g_install_template_head)
|
||||||
{
|
{
|
||||||
node->next = g_install_template_head;
|
node->next = g_install_template_head;
|
||||||
@ -538,6 +568,8 @@ static int ventoy_plugin_auto_install_entry(VTOY_JSON *json, const char *isodisk
|
|||||||
|
|
||||||
static int ventoy_plugin_persistence_check(VTOY_JSON *json, const char *isodisk)
|
static int ventoy_plugin_persistence_check(VTOY_JSON *json, const char *isodisk)
|
||||||
{
|
{
|
||||||
|
int autosel = 0;
|
||||||
|
int pathnum = 0;
|
||||||
const char *iso = NULL;
|
const char *iso = NULL;
|
||||||
VTOY_JSON *pNode = NULL;
|
VTOY_JSON *pNode = NULL;
|
||||||
|
|
||||||
@ -560,7 +592,19 @@ static int ventoy_plugin_persistence_check(VTOY_JSON *json, const char *isodisk)
|
|||||||
if (0 == ventoy_plugin_check_path(isodisk, iso))
|
if (0 == ventoy_plugin_check_path(isodisk, iso))
|
||||||
{
|
{
|
||||||
grub_printf("image: %s [OK]\n", iso);
|
grub_printf("image: %s [OK]\n", iso);
|
||||||
ventoy_plugin_check_fullpath(pNode->pstChild, isodisk, "backend");
|
ventoy_plugin_check_fullpath(pNode->pstChild, isodisk, "backend", &pathnum);
|
||||||
|
|
||||||
|
if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "autosel", &autosel))
|
||||||
|
{
|
||||||
|
if (autosel >= 0 && autosel <= pathnum)
|
||||||
|
{
|
||||||
|
grub_printf("autosel: %d [OK]\n", autosel);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grub_printf("autosel: %d [FAIL]\n", autosel);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -578,6 +622,7 @@ static int ventoy_plugin_persistence_check(VTOY_JSON *json, const char *isodisk)
|
|||||||
|
|
||||||
static int ventoy_plugin_persistence_entry(VTOY_JSON *json, const char *isodisk)
|
static int ventoy_plugin_persistence_entry(VTOY_JSON *json, const char *isodisk)
|
||||||
{
|
{
|
||||||
|
int autosel = 0;
|
||||||
int pathnum = 0;
|
int pathnum = 0;
|
||||||
const char *iso = NULL;
|
const char *iso = NULL;
|
||||||
VTOY_JSON *pNode = NULL;
|
VTOY_JSON *pNode = NULL;
|
||||||
@ -619,6 +664,15 @@ static int ventoy_plugin_persistence_entry(VTOY_JSON *json, const char *isodisk)
|
|||||||
node->backendpath = backendpath;
|
node->backendpath = backendpath;
|
||||||
node->backendnum = pathnum;
|
node->backendnum = pathnum;
|
||||||
|
|
||||||
|
node->autosel = -1;
|
||||||
|
if (JSON_SUCCESS == vtoy_json_get_int(pNode->pstChild, "autosel", &autosel))
|
||||||
|
{
|
||||||
|
if (autosel >= 0 && autosel <= pathnum)
|
||||||
|
{
|
||||||
|
node->autosel = autosel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (g_persistence_head)
|
if (g_persistence_head)
|
||||||
{
|
{
|
||||||
node->next = g_persistence_head;
|
node->next = g_persistence_head;
|
||||||
@ -635,7 +689,8 @@ static int ventoy_plugin_persistence_entry(VTOY_JSON *json, const char *isodisk)
|
|||||||
|
|
||||||
static int ventoy_plugin_menualias_check(VTOY_JSON *json, const char *isodisk)
|
static int ventoy_plugin_menualias_check(VTOY_JSON *json, const char *isodisk)
|
||||||
{
|
{
|
||||||
const char *iso = NULL;
|
int type;
|
||||||
|
const char *path = NULL;
|
||||||
const char *alias = NULL;
|
const char *alias = NULL;
|
||||||
VTOY_JSON *pNode = NULL;
|
VTOY_JSON *pNode = NULL;
|
||||||
|
|
||||||
@ -649,17 +704,38 @@ static int ventoy_plugin_menualias_check(VTOY_JSON *json, const char *isodisk)
|
|||||||
|
|
||||||
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
||||||
{
|
{
|
||||||
iso = vtoy_json_get_string_ex(pNode->pstChild, "image");
|
type = vtoy_alias_image_file;
|
||||||
alias = vtoy_json_get_string_ex(pNode->pstChild, "alias");
|
path = vtoy_json_get_string_ex(pNode->pstChild, "image");
|
||||||
if (iso && iso[0] == '/' && alias)
|
if (!path)
|
||||||
{
|
{
|
||||||
if (ventoy_is_file_exist("%s%s", isodisk, iso))
|
path = vtoy_json_get_string_ex(pNode->pstChild, "dir");
|
||||||
{
|
type = vtoy_alias_directory;
|
||||||
grub_printf("image: <%s> [ OK ]\n", iso);
|
}
|
||||||
|
|
||||||
|
alias = vtoy_json_get_string_ex(pNode->pstChild, "alias");
|
||||||
|
if (path && path[0] == '/' && alias)
|
||||||
|
{
|
||||||
|
if (vtoy_alias_image_file == type)
|
||||||
|
{
|
||||||
|
if (ventoy_is_file_exist("%s%s", isodisk, path))
|
||||||
|
{
|
||||||
|
grub_printf("image: <%s> [ OK ]\n", path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grub_printf("image: <%s> [ NOT EXIST ]\n", path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
grub_printf("image: <%s> [ NOT EXIST ]\n", iso);
|
if (ventoy_is_dir_exist("%s%s", isodisk, path))
|
||||||
|
{
|
||||||
|
grub_printf("dir: <%s> [ OK ]\n", path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
grub_printf("dir: <%s> [ NOT EXIST ]\n", path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_printf("alias: <%s>\n\n", alias);
|
grub_printf("alias: <%s>\n\n", alias);
|
||||||
@ -671,7 +747,8 @@ static int ventoy_plugin_menualias_check(VTOY_JSON *json, const char *isodisk)
|
|||||||
|
|
||||||
static int ventoy_plugin_menualias_entry(VTOY_JSON *json, const char *isodisk)
|
static int ventoy_plugin_menualias_entry(VTOY_JSON *json, const char *isodisk)
|
||||||
{
|
{
|
||||||
const char *iso = NULL;
|
int type;
|
||||||
|
const char *path = NULL;
|
||||||
const char *alias = NULL;
|
const char *alias = NULL;
|
||||||
VTOY_JSON *pNode = NULL;
|
VTOY_JSON *pNode = NULL;
|
||||||
menu_alias *node = NULL;
|
menu_alias *node = NULL;
|
||||||
@ -698,14 +775,22 @@ static int ventoy_plugin_menualias_entry(VTOY_JSON *json, const char *isodisk)
|
|||||||
|
|
||||||
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
||||||
{
|
{
|
||||||
iso = vtoy_json_get_string_ex(pNode->pstChild, "image");
|
type = vtoy_alias_image_file;
|
||||||
|
path = vtoy_json_get_string_ex(pNode->pstChild, "image");
|
||||||
|
if (!path)
|
||||||
|
{
|
||||||
|
path = vtoy_json_get_string_ex(pNode->pstChild, "dir");
|
||||||
|
type = vtoy_alias_directory;
|
||||||
|
}
|
||||||
|
|
||||||
alias = vtoy_json_get_string_ex(pNode->pstChild, "alias");
|
alias = vtoy_json_get_string_ex(pNode->pstChild, "alias");
|
||||||
if (iso && iso[0] == '/' && alias)
|
if (path && path[0] == '/' && alias)
|
||||||
{
|
{
|
||||||
node = grub_zalloc(sizeof(menu_alias));
|
node = grub_zalloc(sizeof(menu_alias));
|
||||||
if (node)
|
if (node)
|
||||||
{
|
{
|
||||||
node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", iso);
|
node->type = type;
|
||||||
|
node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", path);
|
||||||
grub_snprintf(node->alias, sizeof(node->alias), "%s", alias);
|
grub_snprintf(node->alias, sizeof(node->alias), "%s", alias);
|
||||||
|
|
||||||
if (g_menu_alias_head)
|
if (g_menu_alias_head)
|
||||||
@ -721,8 +806,99 @@ static int ventoy_plugin_menualias_entry(VTOY_JSON *json, const char *isodisk)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int ventoy_plugin_injection_check(VTOY_JSON *json, const char *isodisk)
|
||||||
|
{
|
||||||
|
const char *path = NULL;
|
||||||
|
const char *archive = NULL;
|
||||||
|
VTOY_JSON *pNode = NULL;
|
||||||
|
|
||||||
|
(void)isodisk;
|
||||||
|
|
||||||
|
if (json->enDataType != JSON_TYPE_ARRAY)
|
||||||
|
{
|
||||||
|
grub_printf("Not array %d\n", json->enDataType);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
||||||
|
{
|
||||||
|
path = vtoy_json_get_string_ex(pNode->pstChild, "image");
|
||||||
|
if (!path)
|
||||||
|
{
|
||||||
|
grub_printf("image not found\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
archive = vtoy_json_get_string_ex(pNode->pstChild, "archive");
|
||||||
|
if (!archive)
|
||||||
|
{
|
||||||
|
grub_printf("archive not found\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
grub_printf("image: <%s> [%s]\n", path, ventoy_check_file_exist("%s%s", isodisk, path) ? "OK" : "NOT EXIST");
|
||||||
|
grub_printf("archive: <%s> [%s]\n\n", archive, ventoy_check_file_exist("%s%s", isodisk, archive) ? "OK" : "NOT EXIST");
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ventoy_plugin_injection_entry(VTOY_JSON *json, const char *isodisk)
|
||||||
|
{
|
||||||
|
const char *path = NULL;
|
||||||
|
const char *archive = NULL;
|
||||||
|
VTOY_JSON *pNode = NULL;
|
||||||
|
injection_config *node = NULL;
|
||||||
|
injection_config *next = NULL;
|
||||||
|
|
||||||
|
(void)isodisk;
|
||||||
|
|
||||||
|
if (json->enDataType != JSON_TYPE_ARRAY)
|
||||||
|
{
|
||||||
|
debug("Not array %d\n", json->enDataType);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_injection_head)
|
||||||
|
{
|
||||||
|
for (node = g_injection_head; node; node = next)
|
||||||
|
{
|
||||||
|
next = node->next;
|
||||||
|
grub_free(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_injection_head = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
||||||
|
{
|
||||||
|
path = vtoy_json_get_string_ex(pNode->pstChild, "image");
|
||||||
|
archive = vtoy_json_get_string_ex(pNode->pstChild, "archive");
|
||||||
|
if (path && path[0] == '/' && archive && archive[0] == '/')
|
||||||
|
{
|
||||||
|
node = grub_zalloc(sizeof(injection_config));
|
||||||
|
if (node)
|
||||||
|
{
|
||||||
|
node->pathlen = grub_snprintf(node->isopath, sizeof(node->isopath), "%s", path);
|
||||||
|
grub_snprintf(node->archive, sizeof(node->archive), "%s", archive);
|
||||||
|
|
||||||
|
if (g_injection_head)
|
||||||
|
{
|
||||||
|
node->next = g_injection_head;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_injection_head = node;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int ventoy_plugin_menuclass_entry(VTOY_JSON *json, const char *isodisk)
|
static int ventoy_plugin_menuclass_entry(VTOY_JSON *json, const char *isodisk)
|
||||||
{
|
{
|
||||||
|
int type;
|
||||||
const char *key = NULL;
|
const char *key = NULL;
|
||||||
const char *class = NULL;
|
const char *class = NULL;
|
||||||
VTOY_JSON *pNode = NULL;
|
VTOY_JSON *pNode = NULL;
|
||||||
@ -751,13 +927,21 @@ static int ventoy_plugin_menuclass_entry(VTOY_JSON *json, const char *isodisk)
|
|||||||
|
|
||||||
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
||||||
{
|
{
|
||||||
|
type = vtoy_class_image_file;
|
||||||
key = vtoy_json_get_string_ex(pNode->pstChild, "key");
|
key = vtoy_json_get_string_ex(pNode->pstChild, "key");
|
||||||
|
if (!key)
|
||||||
|
{
|
||||||
|
key = vtoy_json_get_string_ex(pNode->pstChild, "dir");
|
||||||
|
type = vtoy_class_directory;
|
||||||
|
}
|
||||||
|
|
||||||
class = vtoy_json_get_string_ex(pNode->pstChild, "class");
|
class = vtoy_json_get_string_ex(pNode->pstChild, "class");
|
||||||
if (key && class)
|
if (key && class)
|
||||||
{
|
{
|
||||||
node = grub_zalloc(sizeof(menu_class));
|
node = grub_zalloc(sizeof(menu_class));
|
||||||
if (node)
|
if (node)
|
||||||
{
|
{
|
||||||
|
node->type = type;
|
||||||
node->patlen = grub_snprintf(node->pattern, sizeof(node->pattern), "%s", key);
|
node->patlen = grub_snprintf(node->pattern, sizeof(node->pattern), "%s", key);
|
||||||
grub_snprintf(node->class, sizeof(node->class), "%s", class);
|
grub_snprintf(node->class, sizeof(node->class), "%s", class);
|
||||||
|
|
||||||
@ -779,6 +963,7 @@ static int ventoy_plugin_menuclass_entry(VTOY_JSON *json, const char *isodisk)
|
|||||||
|
|
||||||
static int ventoy_plugin_menuclass_check(VTOY_JSON *json, const char *isodisk)
|
static int ventoy_plugin_menuclass_check(VTOY_JSON *json, const char *isodisk)
|
||||||
{
|
{
|
||||||
|
int type;
|
||||||
const char *key = NULL;
|
const char *key = NULL;
|
||||||
const char *class = NULL;
|
const char *class = NULL;
|
||||||
VTOY_JSON *pNode = NULL;
|
VTOY_JSON *pNode = NULL;
|
||||||
@ -793,11 +978,18 @@ static int ventoy_plugin_menuclass_check(VTOY_JSON *json, const char *isodisk)
|
|||||||
|
|
||||||
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
for (pNode = json->pstChild; pNode; pNode = pNode->pstNext)
|
||||||
{
|
{
|
||||||
|
type = vtoy_class_image_file;
|
||||||
key = vtoy_json_get_string_ex(pNode->pstChild, "key");
|
key = vtoy_json_get_string_ex(pNode->pstChild, "key");
|
||||||
|
if (!key)
|
||||||
|
{
|
||||||
|
key = vtoy_json_get_string_ex(pNode->pstChild, "dir");
|
||||||
|
type = vtoy_class_directory;
|
||||||
|
}
|
||||||
|
|
||||||
class = vtoy_json_get_string_ex(pNode->pstChild, "class");
|
class = vtoy_json_get_string_ex(pNode->pstChild, "class");
|
||||||
if (key && class)
|
if (key && class)
|
||||||
{
|
{
|
||||||
grub_printf("key: <%s>\n", key);
|
grub_printf("%s: <%s>\n", (type == vtoy_class_directory) ? "dir" : "key", key);
|
||||||
grub_printf("class: <%s>\n\n", class);
|
grub_printf("class: <%s>\n\n", class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -813,6 +1005,7 @@ static plugin_entry g_plugin_entries[] =
|
|||||||
{ "persistence", ventoy_plugin_persistence_entry, ventoy_plugin_persistence_check },
|
{ "persistence", ventoy_plugin_persistence_entry, ventoy_plugin_persistence_check },
|
||||||
{ "menu_alias", ventoy_plugin_menualias_entry, ventoy_plugin_menualias_check },
|
{ "menu_alias", ventoy_plugin_menualias_entry, ventoy_plugin_menualias_check },
|
||||||
{ "menu_class", ventoy_plugin_menuclass_entry, ventoy_plugin_menuclass_check },
|
{ "menu_class", ventoy_plugin_menuclass_entry, ventoy_plugin_menuclass_check },
|
||||||
|
{ "injection", ventoy_plugin_injection_entry, ventoy_plugin_injection_check },
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ventoy_parse_plugin_config(VTOY_JSON *json, const char *isodisk)
|
static int ventoy_parse_plugin_config(VTOY_JSON *json, const char *isodisk)
|
||||||
@ -894,6 +1087,20 @@ grub_err_t ventoy_cmd_load_plugin(grub_extcmd_context_t ctxt, int argc, char **a
|
|||||||
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
VENTOY_CMD_RETURN(GRUB_ERR_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ventoy_plugin_dump_injection(void)
|
||||||
|
{
|
||||||
|
injection_config *node = NULL;
|
||||||
|
|
||||||
|
for (node = g_injection_head; node; node = node->next)
|
||||||
|
{
|
||||||
|
grub_printf("\nIMAGE:<%s>\n", node->isopath);
|
||||||
|
grub_printf("ARCHIVE:<%s>\n", node->archive);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ventoy_plugin_dump_auto_install(void)
|
void ventoy_plugin_dump_auto_install(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -901,7 +1108,7 @@ void ventoy_plugin_dump_auto_install(void)
|
|||||||
|
|
||||||
for (node = g_install_template_head; node; node = node->next)
|
for (node = g_install_template_head; node; node = node->next)
|
||||||
{
|
{
|
||||||
grub_printf("\nIMAGE:<%s>\n", node->isopath);
|
grub_printf("\nIMAGE:<%s> <%d>\n", node->isopath, node->templatenum);
|
||||||
for (i = 0; i < node->templatenum; i++)
|
for (i = 0; i < node->templatenum; i++)
|
||||||
{
|
{
|
||||||
grub_printf("SCRIPT %d:<%s>\n", i, node->templatepath[i].path);
|
grub_printf("SCRIPT %d:<%s>\n", i, node->templatepath[i].path);
|
||||||
@ -920,7 +1127,7 @@ void ventoy_plugin_dump_persistence(void)
|
|||||||
|
|
||||||
for (node = g_persistence_head; node; node = node->next)
|
for (node = g_persistence_head; node; node = node->next)
|
||||||
{
|
{
|
||||||
grub_printf("\nIMAGE:<%s>\n", node->isopath);
|
grub_printf("\nIMAGE:<%s> <%d>\n", node->isopath, node->backendnum);
|
||||||
|
|
||||||
for (i = 0; i < node->backendnum; i++)
|
for (i = 0; i < node->backendnum; i++)
|
||||||
{
|
{
|
||||||
@ -1050,14 +1257,31 @@ end:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * ventoy_plugin_get_menu_alias(const char *isopath)
|
const char * ventoy_plugin_get_injection(const char *isopath)
|
||||||
|
{
|
||||||
|
injection_config *node = NULL;
|
||||||
|
int len = (int)grub_strlen(isopath);
|
||||||
|
|
||||||
|
for (node = g_injection_head; node; node = node->next)
|
||||||
|
{
|
||||||
|
if (node->pathlen == len && grub_strcmp(node->isopath, isopath) == 0)
|
||||||
|
{
|
||||||
|
return node->archive;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * ventoy_plugin_get_menu_alias(int type, const char *isopath)
|
||||||
{
|
{
|
||||||
menu_alias *node = NULL;
|
menu_alias *node = NULL;
|
||||||
int len = (int)grub_strlen(isopath);
|
int len = (int)grub_strlen(isopath);
|
||||||
|
|
||||||
for (node = g_menu_alias_head; node; node = node->next)
|
for (node = g_menu_alias_head; node; node = node->next)
|
||||||
{
|
{
|
||||||
if (node->pathlen == len && grub_strcmp(node->isopath, isopath) == 0)
|
if (node->type == type && node->pathlen &&
|
||||||
|
node->pathlen == len && grub_strcmp(node->isopath, isopath) == 0)
|
||||||
{
|
{
|
||||||
return node->alias;
|
return node->alias;
|
||||||
}
|
}
|
||||||
@ -1066,23 +1290,35 @@ const char * ventoy_plugin_get_menu_alias(const char *isopath)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * ventoy_plugin_get_menu_class(const char *isoname)
|
const char * ventoy_plugin_get_menu_class(int type, const char *name)
|
||||||
{
|
{
|
||||||
menu_class *node = NULL;
|
menu_class *node = NULL;
|
||||||
int len = (int)grub_strlen(isoname);
|
int len = (int)grub_strlen(name);
|
||||||
|
|
||||||
for (node = g_menu_class_head; node; node = node->next)
|
if (vtoy_class_image_file == type)
|
||||||
{
|
{
|
||||||
if (node->patlen <= len && grub_strstr(isoname, node->pattern))
|
for (node = g_menu_class_head; node; node = node->next)
|
||||||
{
|
{
|
||||||
return node->class;
|
if (node->type == type && node->patlen <= len && grub_strstr(name, node->pattern))
|
||||||
|
{
|
||||||
|
return node->class;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (node = g_menu_class_head; node; node = node->next)
|
||||||
|
{
|
||||||
|
if (node->type == type && node->patlen == len && grub_strncmp(name, node->pattern, len) == 0)
|
||||||
|
{
|
||||||
|
return node->class;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, char **args)
|
grub_err_t ventoy_cmd_plugin_check_json(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -51,6 +51,7 @@ static grub_uint32_t g_suppress_wincd_override_data = 0;
|
|||||||
grub_uint8_t g_temp_buf[512];
|
grub_uint8_t g_temp_buf[512];
|
||||||
|
|
||||||
grub_ssize_t lzx_decompress ( const void *data, grub_size_t len, void *buf );
|
grub_ssize_t lzx_decompress ( const void *data, grub_size_t len, void *buf );
|
||||||
|
grub_ssize_t xca_decompress ( const void *data, grub_size_t len, void *buf );
|
||||||
|
|
||||||
static wim_patch *ventoy_find_wim_patch(const char *path)
|
static wim_patch *ventoy_find_wim_patch(const char *path)
|
||||||
{
|
{
|
||||||
@ -332,7 +333,7 @@ grub_err_t ventoy_cmd_wimdows_reset(grub_extcmd_context_t ctxt, int argc, char *
|
|||||||
g_wim_patch_head = NULL;
|
g_wim_patch_head = NULL;
|
||||||
g_wim_total_patch_count = 0;
|
g_wim_total_patch_count = 0;
|
||||||
g_wim_valid_patch_count = 0;
|
g_wim_valid_patch_count = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -427,7 +428,7 @@ static int ventoy_get_override_info(grub_file_t file, wim_tail *wim_data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ventoy_read_resource(grub_file_t fp, wim_resource_header *head, void **buffer)
|
static int ventoy_read_resource(grub_file_t fp, wim_header *wimhdr, wim_resource_header *head, void **buffer)
|
||||||
{
|
{
|
||||||
int decompress_len = 0;
|
int decompress_len = 0;
|
||||||
int total_decompress = 0;
|
int total_decompress = 0;
|
||||||
@ -477,7 +478,14 @@ static int ventoy_read_resource(grub_file_t fp, wim_resource_header *head, void
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
decompress_len = (int)lzx_decompress(buffer_compress + cur_offset, chunk_size, cur_dst);
|
if (wimhdr->flags & FLAG_HEADER_COMPRESS_XPRESS)
|
||||||
|
{
|
||||||
|
decompress_len = (int)xca_decompress(buffer_compress + cur_offset, chunk_size, cur_dst);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
decompress_len = (int)lzx_decompress(buffer_compress + cur_offset, chunk_size, cur_dst);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//debug("chunk_size:%u decompresslen:%d\n", chunk_size, decompress_len);
|
//debug("chunk_size:%u decompresslen:%d\n", chunk_size, decompress_len);
|
||||||
@ -499,7 +507,14 @@ static int ventoy_read_resource(grub_file_t fp, wim_resource_header *head, void
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
decompress_len = (int)lzx_decompress(buffer_compress + cur_offset, head->size_in_wim - cur_offset, cur_dst);
|
if (wimhdr->flags & FLAG_HEADER_COMPRESS_XPRESS)
|
||||||
|
{
|
||||||
|
decompress_len = (int)xca_decompress(buffer_compress + cur_offset, head->size_in_wim - cur_offset, cur_dst);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
decompress_len = (int)lzx_decompress(buffer_compress + cur_offset, head->size_in_wim - cur_offset, cur_dst);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_dst += decompress_len;
|
cur_dst += decompress_len;
|
||||||
@ -549,13 +564,9 @@ static wim_directory_entry * search_full_wim_dirent
|
|||||||
{
|
{
|
||||||
subdir = (wim_directory_entry *)((char *)meta_data + search->subdir);
|
subdir = (wim_directory_entry *)((char *)meta_data + search->subdir);
|
||||||
search = search_wim_dirent(subdir, *path);
|
search = search_wim_dirent(subdir, *path);
|
||||||
if (!search)
|
|
||||||
{
|
|
||||||
debug("%s search failed\n", *path);
|
|
||||||
}
|
|
||||||
|
|
||||||
path++;
|
path++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return search;
|
return search;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -563,16 +574,18 @@ static wim_directory_entry * search_replace_wim_dirent(void *meta_data, wim_dire
|
|||||||
{
|
{
|
||||||
wim_directory_entry *wim_dirent = NULL;
|
wim_directory_entry *wim_dirent = NULL;
|
||||||
const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL };
|
const char *winpeshl_path[] = { "Windows", "System32", "winpeshl.exe", NULL };
|
||||||
//const char *pecmd_path[] = { "Windows", "System32", "PECMD.exe", NULL };
|
//const char *native_path[] = { "Windows", "System32", "native.exe", NULL };
|
||||||
|
|
||||||
wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path);
|
wim_dirent = search_full_wim_dirent(meta_data, dir, winpeshl_path);
|
||||||
|
debug("search winpeshl.exe %p\n", wim_dirent);
|
||||||
if (wim_dirent)
|
if (wim_dirent)
|
||||||
{
|
{
|
||||||
return wim_dirent;
|
return wim_dirent;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
wim_dirent = search_full_wim_dirent(meta_data, dir, pecmd_path);
|
wim_dirent = search_full_wim_dirent(meta_data, dir, native_path);
|
||||||
|
debug("search native.exe %p\n", wim_dirent);
|
||||||
if (wim_dirent)
|
if (wim_dirent)
|
||||||
{
|
{
|
||||||
return wim_dirent;
|
return wim_dirent;
|
||||||
@ -709,6 +722,24 @@ int ventoy_fill_windows_rtdata(void *buf, char *isopath)
|
|||||||
{
|
{
|
||||||
debug("auto install script skipped or not configed %s\n", pos);
|
debug("auto install script skipped or not configed %s\n", pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
script = (char *)ventoy_plugin_get_injection(pos);
|
||||||
|
if (script)
|
||||||
|
{
|
||||||
|
if (ventoy_check_file_exist("%s%s", ventoy_get_env("vtoy_iso_part"), script))
|
||||||
|
{
|
||||||
|
debug("injection archive <%s> OK\n", script);
|
||||||
|
grub_snprintf(data->injection_archive, sizeof(data->injection_archive) - 1, "%s", script);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("injection archive <%s> NOT exist\n", script);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
debug("injection archive not configed %s\n", pos);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -813,14 +844,14 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (head->flags & FLAG_HEADER_COMPRESS_XPRESS)
|
if (head->flags & FLAG_HEADER_COMPRESS_LZMS)
|
||||||
{
|
{
|
||||||
debug("Xpress compress is not supported 0x%x\n", head->flags);
|
debug("LZMS compress is not supported 0x%x\n", head->flags);
|
||||||
grub_file_close(file);
|
grub_file_close(file);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ventoy_read_resource(file, &head->metadata, (void **)&decompress_data);
|
rc = ventoy_read_resource(file, head, &head->metadata, (void **)&decompress_data);
|
||||||
if (rc)
|
if (rc)
|
||||||
{
|
{
|
||||||
grub_printf("failed to read meta data %d\n", rc);
|
grub_printf("failed to read meta data %d\n", rc);
|
||||||
@ -857,7 +888,7 @@ static int ventoy_wimdows_locate_wim(const char *disk, wim_patch *patch)
|
|||||||
debug("find replace lookup entry_id:%ld raw_size:%u\n",
|
debug("find replace lookup entry_id:%ld raw_size:%u\n",
|
||||||
((long)patch->replace_look - (long)lookup) / sizeof(wim_lookup_entry), exe_len);
|
((long)patch->replace_look - (long)lookup) / sizeof(wim_lookup_entry), exe_len);
|
||||||
|
|
||||||
if (0 == ventoy_read_resource(file, &(patch->replace_look->resource), (void **)&(exe_data)))
|
if (0 == ventoy_read_resource(file, head, &(patch->replace_look->resource), (void **)&(exe_data)))
|
||||||
{
|
{
|
||||||
ventoy_cat_exe_file_data(wim_data, exe_len, exe_data);
|
ventoy_cat_exe_file_data(wim_data, exe_len, exe_data);
|
||||||
grub_free(exe_data);
|
grub_free(exe_data);
|
||||||
@ -1385,7 +1416,7 @@ grub_err_t ventoy_cmd_windows_chain_data(grub_extcmd_context_t ctxt, int argc, c
|
|||||||
grub_memset(chain, 0, sizeof(ventoy_chain_head));
|
grub_memset(chain, 0, sizeof(ventoy_chain_head));
|
||||||
|
|
||||||
/* part 1: os parameter */
|
/* part 1: os parameter */
|
||||||
g_ventoy_chain_type = 1;
|
g_ventoy_chain_type = ventoy_chain_windows;
|
||||||
ventoy_fill_os_param(file, &(chain->os_param));
|
ventoy_fill_os_param(file, &(chain->os_param));
|
||||||
|
|
||||||
if (0 == unknown_image)
|
if (0 == unknown_image)
|
||||||
@ -1597,7 +1628,7 @@ grub_err_t ventoy_cmd_wim_chain_data(grub_extcmd_context_t ctxt, int argc, char
|
|||||||
grub_memset(chain, 0, sizeof(ventoy_chain_head));
|
grub_memset(chain, 0, sizeof(ventoy_chain_head));
|
||||||
|
|
||||||
/* part 1: os parameter */
|
/* part 1: os parameter */
|
||||||
g_ventoy_chain_type = 0;
|
g_ventoy_chain_type = ventoy_chain_wim;
|
||||||
ventoy_fill_os_param(file, &(chain->os_param));
|
ventoy_fill_os_param(file, &(chain->os_param));
|
||||||
|
|
||||||
/* part 2: chain head */
|
/* part 2: chain head */
|
||||||
|
157
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/xpress.c
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
* 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
*
|
||||||
|
* Xpress Compression Algorithm (MS-XCA) decompression
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "wimboot.h"
|
||||||
|
#include "huffman.h"
|
||||||
|
#include "xpress.h"
|
||||||
|
|
||||||
|
#pragma GCC diagnostic ignored "-Wcast-align"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decompress XCA-compressed data
|
||||||
|
*
|
||||||
|
* @v data Compressed data
|
||||||
|
* @v len Length of compressed data
|
||||||
|
* @v buf Decompression buffer, or NULL
|
||||||
|
* @ret out_len Length of decompressed data, or negative error
|
||||||
|
*/
|
||||||
|
ssize_t xca_decompress ( const void *data, size_t len, void *buf ) {
|
||||||
|
const void *src = data;
|
||||||
|
const void *end = ( uint8_t * ) src + len;
|
||||||
|
uint8_t *out = buf;
|
||||||
|
size_t out_len = 0;
|
||||||
|
size_t out_len_threshold = 0;
|
||||||
|
const struct xca_huf_len *lengths;
|
||||||
|
struct xca xca;
|
||||||
|
uint32_t accum = 0;
|
||||||
|
int extra_bits = 0;
|
||||||
|
unsigned int huf;
|
||||||
|
struct huffman_symbols *sym;
|
||||||
|
unsigned int raw;
|
||||||
|
unsigned int match_len;
|
||||||
|
unsigned int match_offset_bits;
|
||||||
|
unsigned int match_offset;
|
||||||
|
const uint8_t *copy;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
/* Process data stream */
|
||||||
|
while ( src < end ) {
|
||||||
|
|
||||||
|
/* (Re)initialise decompressor if applicable */
|
||||||
|
if ( out_len >= out_len_threshold ) {
|
||||||
|
|
||||||
|
/* Construct symbol lengths */
|
||||||
|
lengths = src;
|
||||||
|
src = ( uint8_t * ) src + sizeof ( *lengths );
|
||||||
|
if ( src > end ) {
|
||||||
|
DBG ( "XCA too short to hold Huffman lengths table.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for ( raw = 0 ; raw < XCA_CODES ; raw++ )
|
||||||
|
xca.lengths[raw] = xca_huf_len ( lengths, raw );
|
||||||
|
|
||||||
|
/* Construct Huffman alphabet */
|
||||||
|
if ( ( rc = huffman_alphabet ( &xca.alphabet,
|
||||||
|
xca.lengths,
|
||||||
|
XCA_CODES ) ) != 0 )
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
/* Initialise state */
|
||||||
|
accum = XCA_GET16 ( src );
|
||||||
|
accum <<= 16;
|
||||||
|
accum |= XCA_GET16 ( src );
|
||||||
|
extra_bits = 16;
|
||||||
|
|
||||||
|
/* Determine next threshold */
|
||||||
|
out_len_threshold = ( out_len + XCA_BLOCK_SIZE );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Determine symbol */
|
||||||
|
huf = ( accum >> ( 32 - HUFFMAN_BITS ) );
|
||||||
|
sym = huffman_sym ( &xca.alphabet, huf );
|
||||||
|
raw = huffman_raw ( sym, huf );
|
||||||
|
accum <<= huffman_len ( sym );
|
||||||
|
extra_bits -= huffman_len ( sym );
|
||||||
|
if ( extra_bits < 0 ) {
|
||||||
|
accum |= ( XCA_GET16 ( src ) << ( -extra_bits ) );
|
||||||
|
extra_bits += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process symbol */
|
||||||
|
if ( raw < XCA_END_MARKER ) {
|
||||||
|
|
||||||
|
/* Literal symbol - add to output stream */
|
||||||
|
if ( buf )
|
||||||
|
*(out++) = raw;
|
||||||
|
out_len++;
|
||||||
|
|
||||||
|
} else if ( ( raw == XCA_END_MARKER ) &&
|
||||||
|
( (uint8_t *) src >= ( ( uint8_t * ) end - 1 ) ) ) {
|
||||||
|
|
||||||
|
/* End marker symbol */
|
||||||
|
return out_len;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* LZ77 match symbol */
|
||||||
|
raw -= XCA_END_MARKER;
|
||||||
|
match_offset_bits = ( raw >> 4 );
|
||||||
|
match_len = ( raw & 0x0f );
|
||||||
|
if ( match_len == 0x0f ) {
|
||||||
|
match_len = XCA_GET8 ( src );
|
||||||
|
if ( match_len == 0xff ) {
|
||||||
|
match_len = XCA_GET16 ( src );
|
||||||
|
} else {
|
||||||
|
match_len += 0x0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match_len += 3;
|
||||||
|
if ( match_offset_bits ) {
|
||||||
|
match_offset =
|
||||||
|
( ( accum >> ( 32 - match_offset_bits ))
|
||||||
|
+ ( 1 << match_offset_bits ) );
|
||||||
|
} else {
|
||||||
|
match_offset = 1;
|
||||||
|
}
|
||||||
|
accum <<= match_offset_bits;
|
||||||
|
extra_bits -= match_offset_bits;
|
||||||
|
if ( extra_bits < 0 ) {
|
||||||
|
accum |= ( XCA_GET16 ( src ) << (-extra_bits) );
|
||||||
|
extra_bits += 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy data */
|
||||||
|
out_len += match_len;
|
||||||
|
if ( buf ) {
|
||||||
|
copy = ( out - match_offset );
|
||||||
|
while ( match_len-- )
|
||||||
|
*(out++) = *(copy++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return out_len;
|
||||||
|
}
|
87
GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/xpress.h
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#ifndef _XCA_H
|
||||||
|
#define _XCA_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
|
||||||
|
*
|
||||||
|
* 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 2 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
* 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
*
|
||||||
|
* Xpress Compression Algorithm (MS-XCA) decompression
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "huffman.h"
|
||||||
|
|
||||||
|
/** Number of XCA codes */
|
||||||
|
#define XCA_CODES 512
|
||||||
|
|
||||||
|
/** XCA decompressor */
|
||||||
|
struct xca {
|
||||||
|
/** Huffman alphabet */
|
||||||
|
struct huffman_alphabet alphabet;
|
||||||
|
/** Raw symbols
|
||||||
|
*
|
||||||
|
* Must immediately follow the Huffman alphabet.
|
||||||
|
*/
|
||||||
|
huffman_raw_symbol_t raw[XCA_CODES];
|
||||||
|
/** Code lengths */
|
||||||
|
uint8_t lengths[XCA_CODES];
|
||||||
|
};
|
||||||
|
|
||||||
|
/** XCA symbol Huffman lengths table */
|
||||||
|
struct xca_huf_len {
|
||||||
|
/** Lengths of each symbol */
|
||||||
|
uint8_t nibbles[ XCA_CODES / 2 ];
|
||||||
|
} __attribute__ (( packed ));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract Huffman-coded length of a raw symbol
|
||||||
|
*
|
||||||
|
* @v lengths Huffman lengths table
|
||||||
|
* @v symbol Raw symbol
|
||||||
|
* @ret len Huffman-coded length
|
||||||
|
*/
|
||||||
|
static inline unsigned int xca_huf_len ( const struct xca_huf_len *lengths,
|
||||||
|
unsigned int symbol ) {
|
||||||
|
return ( ( ( lengths->nibbles[ symbol / 2 ] ) >>
|
||||||
|
( 4 * ( symbol % 2 ) ) ) & 0x0f );
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get word from source data stream */
|
||||||
|
#define XCA_GET16( src ) ( { \
|
||||||
|
const uint16_t *src16 = src; \
|
||||||
|
src = ( uint8_t * ) src + sizeof ( *src16 ); \
|
||||||
|
*src16; } )
|
||||||
|
|
||||||
|
/** Get byte from source data stream */
|
||||||
|
#define XCA_GET8( src ) ( { \
|
||||||
|
const uint8_t *src8 = src; \
|
||||||
|
src = ( uint8_t * ) src + sizeof ( *src8 ); \
|
||||||
|
*src8; } )
|
||||||
|
|
||||||
|
/** XCA source data stream end marker */
|
||||||
|
#define XCA_END_MARKER 256
|
||||||
|
|
||||||
|
/** XCA block size */
|
||||||
|
#define XCA_BLOCK_SIZE ( 64 * 1024 )
|
||||||
|
|
||||||
|
extern ssize_t xca_decompress ( const void *data, size_t len, void *buf );
|
||||||
|
|
||||||
|
#endif /* _XCA_H */
|
@ -40,6 +40,15 @@ typedef enum ventoy_fs_type
|
|||||||
ventoy_fs_max
|
ventoy_fs_max
|
||||||
}ventoy_fs_type;
|
}ventoy_fs_type;
|
||||||
|
|
||||||
|
typedef enum ventoy_chain_type
|
||||||
|
{
|
||||||
|
ventoy_chain_linux = 0, /* 0: linux */
|
||||||
|
ventoy_chain_windows, /* 1: windows */
|
||||||
|
ventoy_chain_wim, /* 2: wim */
|
||||||
|
|
||||||
|
ventoy_chain_max
|
||||||
|
}ventoy_chain_type;
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
typedef struct ventoy_guid
|
typedef struct ventoy_guid
|
||||||
@ -109,7 +118,7 @@ typedef struct ventoy_os_param
|
|||||||
*
|
*
|
||||||
* vtoy_reserved[0]: vtoy_break_level
|
* vtoy_reserved[0]: vtoy_break_level
|
||||||
* vtoy_reserved[1]: vtoy_debug_level
|
* vtoy_reserved[1]: vtoy_debug_level
|
||||||
* vtoy_reserved[2]: vtoy_chain_type 0:Linux 1:Windows
|
* vtoy_reserved[2]: vtoy_chain_type 0:Linux 1:Windows 2:wimfile
|
||||||
* vtoy_reserved[3]: vtoy_iso_format 0:iso9660 1:udf
|
* vtoy_reserved[3]: vtoy_iso_format 0:iso9660 1:udf
|
||||||
* vtoy_reserved[4]: vtoy_windows_cd_prompt
|
* vtoy_reserved[4]: vtoy_windows_cd_prompt
|
||||||
*
|
*
|
||||||
@ -123,7 +132,8 @@ typedef struct ventoy_os_param
|
|||||||
typedef struct ventoy_windows_data
|
typedef struct ventoy_windows_data
|
||||||
{
|
{
|
||||||
char auto_install_script[384];
|
char auto_install_script[384];
|
||||||
grub_uint8_t reserved[128];
|
char injection_archive[384];
|
||||||
|
grub_uint8_t reserved[256];
|
||||||
}ventoy_windows_data;
|
}ventoy_windows_data;
|
||||||
|
|
||||||
|
|
||||||
@ -204,12 +214,13 @@ typedef struct ventoy_img_chunk_list
|
|||||||
|
|
||||||
#define ventoy_filt_register grub_file_filter_register
|
#define ventoy_filt_register grub_file_filter_register
|
||||||
|
|
||||||
typedef const char * (*grub_env_get_pf)(const char *name);
|
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
#define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF
|
#define GRUB_FILE_REPLACE_MAGIC 0x1258BEEF
|
||||||
|
|
||||||
|
typedef const char * (*grub_env_get_pf)(const char *name);
|
||||||
|
typedef int (*grub_env_printf_pf)(const char *fmt, ...);
|
||||||
|
|
||||||
typedef struct ventoy_grub_param_file_replace
|
typedef struct ventoy_grub_param_file_replace
|
||||||
{
|
{
|
||||||
grub_uint32_t magic;
|
grub_uint32_t magic;
|
||||||
@ -221,8 +232,8 @@ typedef struct ventoy_grub_param_file_replace
|
|||||||
typedef struct ventoy_grub_param
|
typedef struct ventoy_grub_param
|
||||||
{
|
{
|
||||||
grub_env_get_pf grub_env_get;
|
grub_env_get_pf grub_env_get;
|
||||||
|
|
||||||
ventoy_grub_param_file_replace file_replace;
|
ventoy_grub_param_file_replace file_replace;
|
||||||
|
grub_env_printf_pf grub_env_printf;
|
||||||
}ventoy_grub_param;
|
}ventoy_grub_param;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
@ -12,19 +12,17 @@ make install
|
|||||||
PATH=$PATH:$VT_DIR/GRUB2/INSTALL/bin/:$VT_DIR/GRUB2/INSTALL/sbin/
|
PATH=$PATH:$VT_DIR/GRUB2/INSTALL/bin/:$VT_DIR/GRUB2/INSTALL/sbin/
|
||||||
|
|
||||||
net_modules_legacy="net tftp http"
|
net_modules_legacy="net tftp http"
|
||||||
all_modules_legacy="date drivemap blocklist ntldr search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio lspci pci ext2 xfs ventoy chain read halt iso9660 linux16 test true sleep reboot echo videotest videoinfo videotest_checksum video_colors video_cirrus video_bochs vga vbe video_fb font video gettext extcmd terminal linux minicmd help configfile tr trig boot biosdisk disk ls tar squash4 password_pbkdf2 all_video png jpeg part_gpt part_msdos fat exfat ntfs loopback gzio normal udf gfxmenu gfxterm gfxterm_background gfxterm_menu"
|
all_modules_legacy="date drivemap blocklist vga_text ntldr search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio lspci pci ext2 xfs ventoy chain read halt iso9660 linux16 test true sleep reboot echo videotest videoinfo videotest_checksum video_colors video_cirrus video_bochs vga vbe video_fb font video gettext extcmd terminal linux minicmd help configfile tr trig boot biosdisk disk ls tar squash4 password_pbkdf2 all_video png jpeg part_gpt part_msdos fat exfat ntfs loopback gzio normal udf gfxmenu gfxterm gfxterm_background gfxterm_menu"
|
||||||
|
|
||||||
net_modules_uefi="efinet net tftp http"
|
net_modules_uefi="efinet net tftp http"
|
||||||
all_modules_uefi="blocklist ventoy test search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio ext2 xfs read halt sleep serial terminfo png password_pbkdf2 gcry_sha512 pbkdf2 part_gpt part_msdos ls tar squash4 loopback part_apple minicmd diskfilter linux relocator jpeg iso9660 udf hfsplus halt acpi mmap gfxmenu video_colors trig bitmap_scale gfxterm bitmap font fat exfat ntfs fshelp efifwsetup reboot echo configfile normal terminal gettext chain priority_queue bufio datetime cat extcmd crypto gzio boot all_video efi_gop efi_uga video_bochs video_cirrus video video_fb gfxterm_background gfxterm_menu"
|
all_modules_uefi="blocklist ventoy test search at_keyboard usb_keyboard gcry_md5 hashsum gzio xzio lzopio ext2 xfs read halt sleep serial terminfo png password_pbkdf2 gcry_sha512 pbkdf2 part_gpt part_msdos ls tar squash4 loopback part_apple minicmd diskfilter linux relocator jpeg iso9660 udf hfsplus halt acpi mmap gfxmenu video_colors trig bitmap_scale gfxterm bitmap font fat exfat ntfs fshelp efifwsetup reboot echo configfile normal terminal gettext chain priority_queue bufio datetime cat extcmd crypto gzio boot all_video efi_gop efi_uga video_bochs video_cirrus video video_fb gfxterm_background gfxterm_menu"
|
||||||
|
|
||||||
all_extra_modules="elf macho offsetio regexp file"
|
|
||||||
|
|
||||||
if [ "$1" = "uefi" ]; then
|
if [ "$1" = "uefi" ]; then
|
||||||
all_modules="$net_modules_uefi $all_modules_uefi $all_extra_modules"
|
all_modules="$net_modules_uefi $all_modules_uefi "
|
||||||
grub-mkimage -v --directory "$VT_DIR/GRUB2/INSTALL/lib/grub/x86_64-efi" --prefix '(,msdos2)/grub' --output "$VT_DIR/INSTALL/EFI/BOOT/grubx64_real.efi" --format 'x86_64-efi' --compression 'auto' $all_modules_uefi 'fat' 'part_msdos'
|
grub-mkimage -v --directory "$VT_DIR/GRUB2/INSTALL/lib/grub/x86_64-efi" --prefix '(,2)/grub' --output "$VT_DIR/INSTALL/EFI/BOOT/grubx64_real.efi" --format 'x86_64-efi' --compression 'auto' $all_modules_uefi 'fat' 'part_msdos'
|
||||||
else
|
else
|
||||||
all_modules="$net_modules_legacy $all_modules_legacy"
|
all_modules="$net_modules_legacy $all_modules_legacy "
|
||||||
grub-mkimage -v --directory "$VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc" --prefix '(,msdos2)/grub' --output "$VT_DIR/INSTALL/grub/i386-pc/core.img" --format 'i386-pc' --compression 'auto' $all_modules_legacy 'fat' 'part_msdos' 'biosdisk'
|
grub-mkimage -v --directory "$VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc" --prefix '(,2)/grub' --output "$VT_DIR/INSTALL/grub/i386-pc/core.img" --format 'i386-pc' --compression 'auto' $all_modules_legacy 'fat' 'part_msdos' 'biosdisk'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
grub-mknetdir --modules="$all_modules" --net-directory=$VT_DIR/GRUB2/PXE --subdir=grub2 --locales=en@quot || exit 1
|
grub-mknetdir --modules="$all_modules" --net-directory=$VT_DIR/GRUB2/PXE --subdir=grub2 --locales=en@quot || exit 1
|
||||||
@ -34,16 +32,29 @@ if [ "$1" = "uefi" ]; then
|
|||||||
cp -a $VT_DIR/GRUB2/PXE/grub2/x86_64-efi/core.efi $VT_DIR/GRUB2/NBP/core.efi || exit 1
|
cp -a $VT_DIR/GRUB2/PXE/grub2/x86_64-efi/core.efi $VT_DIR/GRUB2/NBP/core.efi || exit 1
|
||||||
|
|
||||||
rm -f $VT_DIR/INSTALL/grub/x86_64-efi/normal.mod
|
rm -f $VT_DIR/INSTALL/grub/x86_64-efi/normal.mod
|
||||||
cp -a $VT_DIR/GRUB2/PXE/grub2/x86_64-efi/normal.mod $VT_DIR/INSTALL/grub/x86_64-efi/normal.mod || exit 1
|
cp -a $VT_DIR/GRUB2/PXE/grub2/x86_64-efi/normal.mod $VT_DIR/INSTALL/grub/x86_64-efi/normal.mod || exit 1
|
||||||
|
|
||||||
|
#copy other modules
|
||||||
|
ls -1 $VT_DIR/GRUB2/INSTALL/lib/grub/x86_64-efi/ | egrep '\.(lst|mod)$' | while read line; do
|
||||||
|
if ! echo $all_modules | grep -q " ${line%.mod} "; then
|
||||||
|
echo "Copy $line ..."
|
||||||
|
rm -f $VT_DIR/INSTALL/grub/x86_64-efi/$line
|
||||||
|
cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/x86_64-efi/$line $VT_DIR/INSTALL/grub/x86_64-efi/
|
||||||
|
fi
|
||||||
|
done
|
||||||
else
|
else
|
||||||
rm -f $VT_DIR/GRUB2/NBP/core.0
|
rm -f $VT_DIR/GRUB2/NBP/core.0
|
||||||
cp -a $VT_DIR/GRUB2/PXE/grub2/i386-pc/core.0 $VT_DIR/GRUB2/NBP/core.0 || exit 1
|
cp -a $VT_DIR/GRUB2/PXE/grub2/i386-pc/core.0 $VT_DIR/GRUB2/NBP/core.0 || exit 1
|
||||||
|
|
||||||
for md in $all_extra_modules; do
|
|
||||||
rm -f $VT_DIR/INSTALL/grub/i386-pc/${md}.mod
|
|
||||||
cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc/${md}.mod $VT_DIR/INSTALL/grub/i386-pc/
|
|
||||||
done
|
|
||||||
|
|
||||||
rm -f $VT_DIR/INSTALL/grub/i386-pc/boot.img
|
rm -f $VT_DIR/INSTALL/grub/i386-pc/boot.img
|
||||||
cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc/boot.img $VT_DIR/INSTALL/grub/i386-pc/boot.img || exit 1
|
cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc/boot.img $VT_DIR/INSTALL/grub/i386-pc/boot.img || exit 1
|
||||||
|
|
||||||
|
#copy other modules
|
||||||
|
ls -1 $VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc/ | egrep '\.(lst|mod)$' | while read line; do
|
||||||
|
if ! echo $all_modules | grep -q " ${line%.mod} "; then
|
||||||
|
echo "Copy $line ..."
|
||||||
|
rm -f $VT_DIR/INSTALL/grub/i386-pc/$line
|
||||||
|
cp -a $VT_DIR/GRUB2/INSTALL/lib/grub/i386-pc/$line $VT_DIR/INSTALL/grub/i386-pc/
|
||||||
|
fi
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
|
BIN
ICON/forums.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
ICON/logo_128.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
ICON/logo_16.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
ICON/logo_256.png
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
ICON/logo_32.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
ICON/logo_48.png
Normal file
After Width: | Height: | Size: 5.3 KiB |
BIN
ICON/logo_512.png
Normal file
After Width: | Height: | Size: 223 KiB |
BIN
ICON/logo_64.png
Normal file
After Width: | Height: | Size: 7.7 KiB |
BIN
ICON/logo_72.png
Normal file
After Width: | Height: | Size: 9.0 KiB |
47
IMG/cpio/ventoy/hook/cdlinux/disk-hook.sh
Normal file
@ -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
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
|
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
|
43
IMG/cpio/ventoy/hook/cdlinux/ventoy-hook.sh
Normal file
@ -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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
. $VTOY_PATH/hook/ventoy-os-lib.sh
|
||||||
|
|
||||||
|
echo "CDlinux process..." >> $VTLOG
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/mknod -m 0660 /ventoy/ram0 b 1 0
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/mkdir /vtmnt /ventoy_rdroot
|
||||||
|
$BUSYBOX_PATH/mount -t squashfs /ventoy/ram0 /vtmnt
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/mount -nt tmpfs -o mode=755 tmpfs /ventoy_rdroot
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/cp -a /vtmnt/* /ventoy_rdroot
|
||||||
|
$BUSYBOX_PATH/ls -1a /vtmnt/ | $GREP '^\.[^.]' | while read vtLine; do
|
||||||
|
$BUSYBOX_PATH/cp -a /vtmnt/$vtLine /ventoy_rdroot
|
||||||
|
done
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/umount /vtmnt && $BUSYBOX_PATH/rm -rf /vtmnt
|
||||||
|
$BUSYBOX_PATH/cp -a /ventoy /ventoy_rdroot
|
||||||
|
|
||||||
|
echo 'echo "CDL_DEV=/dev/mapper/ventoy" >>"$VAR_FILE"' >> /ventoy_rdroot/etc/rc.d/rc.var
|
||||||
|
|
||||||
|
ventoy_set_rule_dir_prefix /ventoy_rdroot
|
||||||
|
ventoy_systemd_udevd_work_around
|
||||||
|
ventoy_add_udev_rule "$VTOY_PATH/hook/default/udev_disk_hook.sh %k noreplace"
|
52
IMG/cpio/ventoy/hook/cucumber/disk-hook.sh
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#!/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"
|
||||||
|
|
||||||
|
blkdev_num=$(dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/')
|
||||||
|
vtDM=$(ventoy_find_dm_id ${blkdev_num})
|
||||||
|
|
||||||
|
vtlog "mount media /dev/$vtDM ..."
|
||||||
|
if ! [ -e /media/install ]; then
|
||||||
|
mkdir -p /media/install
|
||||||
|
fi
|
||||||
|
mount /dev/$vtDM /media/install
|
||||||
|
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
|
||||||
|
set_ventoy_hook_finish
|
26
IMG/cpio/ventoy/hook/cucumber/ventoy-hook.sh
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
if [ -e /sbin/mount_installer ]; then
|
||||||
|
echo "hook at mount_installer ..." >> $VTLOG
|
||||||
|
$SED "1 a $BUSYBOX_PATH/sh $VTOY_PATH/hook/cucumber/disk-hook.sh" -i /sbin/mount_installer
|
||||||
|
fi
|
||||||
|
|
@ -17,6 +17,8 @@
|
|||||||
#
|
#
|
||||||
#************************************************************************************
|
#************************************************************************************
|
||||||
|
|
||||||
|
CD_DETECT="/var/lib/dpkg/info/cdrom-detect.postinst"
|
||||||
|
|
||||||
if [ -e /init ] && $GREP -q '^mountroot$' /init; then
|
if [ -e /init ] && $GREP -q '^mountroot$' /init; then
|
||||||
echo "Here before mountroot ..." >> $VTLOG
|
echo "Here before mountroot ..." >> $VTLOG
|
||||||
|
|
||||||
@ -29,7 +31,15 @@ if [ -e /init ] && $GREP -q '^mountroot$' /init; then
|
|||||||
$SED "s#^ *LIVEMEDIA=.*#LIVEMEDIA=/dev/mapper/ventoy#" -i /scripts/casper
|
$SED "s#^ *LIVEMEDIA=.*#LIVEMEDIA=/dev/mapper/ventoy#" -i /scripts/casper
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
elif [ -e "$CD_DETECT" ]; then
|
||||||
|
echo "$CD_DETECT exist, now add hook in it..." >> $VTLOG
|
||||||
|
|
||||||
|
$SED "1 a $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/disk_mount_hook.sh" -i "$CD_DETECT"
|
||||||
|
TITLE_LINE=$($GREP -m1 '^hw-detect.*detect_progress_title' "$CD_DETECT")
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "add $TITLE_LINE for hook" >> $VTLOG
|
||||||
|
$SED "1 a$TITLE_LINE" -i "$CD_DETECT"
|
||||||
|
fi
|
||||||
elif [ -e /init ] && $GREP -q '/start-udev$' /init; then
|
elif [ -e /init ] && $GREP -q '/start-udev$' /init; then
|
||||||
echo "Here use notify ..." >> $VTLOG
|
echo "Here use notify ..." >> $VTLOG
|
||||||
|
|
||||||
|
71
IMG/cpio/ventoy/hook/debian/linuxconsole-disk.sh
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
|
||||||
|
vtoydm -i -f $VTOY_PATH/ventoy_image_map -d $vtdiskname > $VTOY_PATH/iso_file_list
|
||||||
|
|
||||||
|
vtline=$(grep '[-][-] drivers-.*\.squashfs' $VTOY_PATH/iso_file_list)
|
||||||
|
sector=$(echo $vtline | awk '{print $(NF-1)}')
|
||||||
|
length=$(echo $vtline | awk '{print $NF}')
|
||||||
|
|
||||||
|
vtoydm -e -f $VTOY_PATH/ventoy_image_map -d $vtdiskname -s $sector -l $length -o $VTOY_PATH/driver.squashfs
|
||||||
|
mount -t squashfs $VTOY_PATH/driver.squashfs /lib/modules
|
||||||
|
modprobe dm-mod
|
||||||
|
|
||||||
|
umount /lib/modules
|
||||||
|
rm -f $VTOY_PATH/driver.squashfs
|
||||||
|
|
||||||
|
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/')
|
||||||
|
blkdev_dev=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1 \2/')
|
||||||
|
vtDM=$(ventoy_find_dm_id ${blkdev_num})
|
||||||
|
|
||||||
|
if ! [ -b /dev/$vtDM ]; then
|
||||||
|
mknod -m 0660 /dev/$vtDM b $blkdev_dev
|
||||||
|
fi
|
||||||
|
|
||||||
|
if mount /dev/$vtDM /media/ydfs; then
|
||||||
|
vtlog "mount success"
|
||||||
|
else
|
||||||
|
vtlog "mount failed"
|
||||||
|
fi
|
||||||
|
|
||||||
|
PATH=$VTPATH_OLD
|
||||||
|
|
||||||
|
set_ventoy_hook_finish
|
23
IMG/cpio/ventoy/hook/debian/linuxconsole-hook.sh
Normal file
@ -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 "s#/busybox/bin/sleep 2#/busybox/bin/sleep 10#" -i /etc/init.d/tty1
|
||||||
|
$SED "/install *-d *.media.ydfs/a return" -i /ydfs/detect/media
|
||||||
|
$SED "/install *-d *.media.ydfs/a $BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/linuxconsole-disk.sh" -i /ydfs/detect/media
|
||||||
|
|
@ -20,5 +20,11 @@
|
|||||||
$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/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
|
$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
|
if [ -e /init ] && $GREP -q '^mountroot$' /init; then
|
||||||
ventoy_add_udev_rule "$VTOY_PATH/hook/debian/udev_disk_hook.sh %k"
|
echo "Here before mountroot ..." >> $VTLOG
|
||||||
|
$SED "/^mountroot$/i\\$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/disk_mount_hook.sh" -i /init
|
||||||
|
else
|
||||||
|
echo "Use default hook ..." >> $VTLOG
|
||||||
|
ventoy_systemd_udevd_work_around
|
||||||
|
ventoy_add_udev_rule "$VTOY_PATH/hook/debian/udev_disk_hook.sh %k"
|
||||||
|
fi
|
||||||
|
@ -50,7 +50,7 @@ ventoy_os_install_dmsetup() {
|
|||||||
if $GREP -q 'device-mapper' /proc/devices; then
|
if $GREP -q 'device-mapper' /proc/devices; then
|
||||||
vtlog "device mapper module is loaded"
|
vtlog "device mapper module is loaded"
|
||||||
else
|
else
|
||||||
vtlog"device mapper module is NOT loaded, now load it..."
|
vtlog "device mapper module is NOT loaded, now load it..."
|
||||||
|
|
||||||
VER=$($BUSYBOX_PATH/uname -r)
|
VER=$($BUSYBOX_PATH/uname -r)
|
||||||
KO=$($FIND /lib/modules/$VER/kernel/drivers/md -name "dm-mod*")
|
KO=$($FIND /lib/modules/$VER/kernel/drivers/md -name "dm-mod*")
|
||||||
@ -99,7 +99,18 @@ ventoy_udev_disk_common_hook $*
|
|||||||
# So if ventoy is installed on a non-USB device, we just mount /cdrom here except
|
# So if ventoy is installed on a non-USB device, we just mount /cdrom here except
|
||||||
# for these has boot=live or boot=casper parameter in cmdline
|
# for these has boot=live or boot=casper parameter in cmdline
|
||||||
#
|
#
|
||||||
if echo $ID_BUS | $GREP -q -i usb; then
|
VT_BUS_USB=""
|
||||||
|
if [ -n "$ID_BUS" ]; then
|
||||||
|
if echo $ID_BUS | $GREP -q -i usb; then
|
||||||
|
VT_BUS_USB="YES"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if $BUSYBOX_PATH/ls -l /sys/class/block/${1:0:-1} | $GREP -q -i usb; then
|
||||||
|
VT_BUS_USB="YES"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$VT_BUS_USB" ]; then
|
||||||
vtlog "$1 is USB device"
|
vtlog "$1 is USB device"
|
||||||
else
|
else
|
||||||
vtlog "$1 is NOT USB device (bus $ID_BUS)"
|
vtlog "$1 is NOT USB device (bus $ID_BUS)"
|
||||||
|
@ -60,6 +60,10 @@ ventoy_get_debian_distro() {
|
|||||||
echo 'porteus'; return
|
echo 'porteus'; return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if $GREP -q 'linuxconsole' /proc/version; then
|
||||||
|
echo 'linuxconsole'; return
|
||||||
|
fi
|
||||||
|
|
||||||
echo 'default'
|
echo 'default'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,13 +23,15 @@ if is_ventoy_hook_finished; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
vtlog "##### INOTIFYD: $2/$3 is created ..."
|
|
||||||
|
|
||||||
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||||
|
|
||||||
if is_inotify_ventoy_part $3; then
|
if is_inotify_ventoy_part $3; then
|
||||||
|
vtlog "##### INOTIFYD: $2/$3 is created (YES) ..."
|
||||||
vtlog "find ventoy partition $3 ..."
|
vtlog "find ventoy partition $3 ..."
|
||||||
$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/udev_disk_hook.sh "$3"
|
$BUSYBOX_PATH/sh $VTOY_PATH/hook/debian/udev_disk_hook.sh "$3"
|
||||||
|
else
|
||||||
|
vtlog "##### INOTIFYD: $2/$3 is created (NO)..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PATH=$VTPATH_OLD
|
PATH=$VTPATH_OLD
|
||||||
|
43
IMG/cpio/ventoy/hook/fatdog/disk-hook.sh
Normal file
@ -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
|
23
IMG/cpio/ventoy/hook/fatdog/ventoy-hook.sh
Normal file
@ -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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
. $VTOY_PATH/hook/ventoy-os-lib.sh
|
||||||
|
|
||||||
|
$SED "/find_local_device *(/a $BUSYBOX_PATH/sh $VTOY_PATH/hook/fatdog/disk-hook.sh" -i /init
|
||||||
|
$SED "/find_and_choose_local_device *(/a $BUSYBOX_PATH/sh $VTOY_PATH/hook/fatdog/disk-hook.sh" -i /init
|
@ -23,11 +23,11 @@ if is_ventoy_hook_finished; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
vtlog "##### INOTIFYD: $2/$3 is created ..."
|
|
||||||
|
|
||||||
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||||
|
|
||||||
if is_inotify_ventoy_part $3; then
|
if is_inotify_ventoy_part $3; then
|
||||||
|
vtlog "##### INOTIFYD: $2/$3 is created (YES)..."
|
||||||
|
|
||||||
vtlog "find ventoy partition $3 ..."
|
vtlog "find ventoy partition $3 ..."
|
||||||
$BUSYBOX_PATH/sh $VTOY_PATH/hook/default/udev_disk_hook.sh $3 noreplace
|
$BUSYBOX_PATH/sh $VTOY_PATH/hook/default/udev_disk_hook.sh $3 noreplace
|
||||||
|
|
||||||
@ -42,6 +42,8 @@ if is_inotify_ventoy_part $3; then
|
|||||||
# fi
|
# fi
|
||||||
|
|
||||||
set_ventoy_hook_finish
|
set_ventoy_hook_finish
|
||||||
|
else
|
||||||
|
vtlog "##### INOTIFYD: $2/$3 is created (NO)..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PATH=$VTPATH_OLD
|
PATH=$VTPATH_OLD
|
||||||
|
43
IMG/cpio/ventoy/hook/kwort/disk-hook.sh
Normal file
@ -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
|
22
IMG/cpio/ventoy/hook/kwort/ventoy-hook.sh
Normal file
@ -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 "1 a $BUSYBOX_PATH/sh $VTOY_PATH/hook/kwort/disk-hook.sh" -i /etc/rc.d/init/media
|
@ -23,12 +23,11 @@ if is_ventoy_hook_finished; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
vtlog "##### INOTIFYD: $2/$3 is created ..."
|
|
||||||
|
|
||||||
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||||
|
|
||||||
if is_inotify_ventoy_part $3; then
|
if is_inotify_ventoy_part $3; then
|
||||||
|
vtlog "##### INOTIFYD: $2/$3 is created (YES) ..."
|
||||||
|
|
||||||
vtlog "find ventoy partition ..."
|
vtlog "find ventoy partition ..."
|
||||||
$BUSYBOX_PATH/sh $VTOY_PATH/hook/default/udev_disk_hook.sh $3 noreplace
|
$BUSYBOX_PATH/sh $VTOY_PATH/hook/default/udev_disk_hook.sh $3 noreplace
|
||||||
|
|
||||||
@ -64,6 +63,8 @@ if is_inotify_ventoy_part $3; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
set_ventoy_hook_finish
|
set_ventoy_hook_finish
|
||||||
|
else
|
||||||
|
vtlog "##### INOTIFYD: $2/$3 is created (NO) ..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PATH=$VTPATH_OLD
|
PATH=$VTPATH_OLD
|
||||||
|
@ -23,11 +23,10 @@ if is_ventoy_hook_finished; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
vtlog "##### INOTIFYD: $2/$3 is created ..."
|
|
||||||
|
|
||||||
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||||
|
|
||||||
if is_inotify_ventoy_part $3; then
|
if is_inotify_ventoy_part $3; then
|
||||||
|
vtlog "##### INOTIFYD: $2/$3 is created (YES) ..."
|
||||||
vtlog "find ventoy partition $3 ..."
|
vtlog "find ventoy partition $3 ..."
|
||||||
$BUSYBOX_PATH/sh $VTOY_PATH/hook/default/udev_disk_hook.sh "$3"
|
$BUSYBOX_PATH/sh $VTOY_PATH/hook/default/udev_disk_hook.sh "$3"
|
||||||
|
|
||||||
@ -41,6 +40,8 @@ if is_inotify_ventoy_part $3; then
|
|||||||
mkdir -p /dev/disk/by-label
|
mkdir -p /dev/disk/by-label
|
||||||
fi
|
fi
|
||||||
$BUSYBOX_PATH/cp -a /dev/$vtDM /dev/disk/by-label/$vtLABEL
|
$BUSYBOX_PATH/cp -a /dev/$vtDM /dev/disk/by-label/$vtLABEL
|
||||||
|
else
|
||||||
|
vtlog "##### INOTIFYD: $2/$3 is created (NO) ..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PATH=$VTPATH_OLD
|
PATH=$VTPATH_OLD
|
||||||
|
48
IMG/cpio/ventoy/hook/parabola/ventoy-disk.sh
Normal file
@ -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
|
||||||
|
|
||||||
|
vtlog "######### $0 $* ############"
|
||||||
|
|
||||||
|
if is_ventoy_hook_finished; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
wait_for_usb_disk_ready
|
||||||
|
|
||||||
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
|
if [ "$vtdiskname" = "unknown" ]; then
|
||||||
|
vtlog "ventoy disk not found"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook "${vtdiskname#/dev/}2" "noreplace"
|
||||||
|
|
||||||
|
if [ -n "$1" ]; then
|
||||||
|
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/')
|
||||||
|
vtDM=$(ventoy_find_dm_id ${blkdev_num})
|
||||||
|
|
||||||
|
vtlog "ln -s /dev/$vtDM $1"
|
||||||
|
ln -s /dev/$vtDM "$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# OK finish
|
||||||
|
set_ventoy_hook_finish
|
||||||
|
|
44
IMG/cpio/ventoy/hook/parabola/ventoy-hook.sh
Normal file
@ -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/>.
|
||||||
|
#
|
||||||
|
#************************************************************************************
|
||||||
|
|
||||||
|
. $VTOY_PATH/hook/ventoy-os-lib.sh
|
||||||
|
|
||||||
|
if $GREP -q '^"$mount_handler"' /init; then
|
||||||
|
echo 'use mount_handler ...' >> $VTLOG
|
||||||
|
$SED "/^\"\$mount_handler\"/i\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/parabola/ventoy-disk.sh \"\$parabolaisodevice\"" -i /init
|
||||||
|
|
||||||
|
if [ -f /hooks/parabolaiso ]; then
|
||||||
|
$SED '/while ! poll_device "${dev}"/a\ if /ventoy/busybox/sh /ventoy/hook/parabola/ventoy-timeout.sh ${dev}; then break; fi' -i /hooks/parabolaiso
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
# some archlinux initramfs doesn't contain device-mapper udev rules file
|
||||||
|
ARCH_UDEV_DIR=$(ventoy_get_udev_conf_dir)
|
||||||
|
if [ -s "$ARCH_UDEV_DIR/13-dm-disk.rules" ]; then
|
||||||
|
echo 'dm-disk rule exist' >> $VTLOG
|
||||||
|
else
|
||||||
|
echo 'Copy dm-disk rule file' >> $VTLOG
|
||||||
|
$CAT $VTOY_PATH/hook/default/13-dm-disk.rules > "$ARCH_UDEV_DIR/13-dm-disk.rules"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# use default proc
|
||||||
|
ventoy_systemd_udevd_work_around
|
||||||
|
|
||||||
|
ventoy_add_udev_rule "$VTOY_PATH/hook/default/udev_disk_hook.sh %k"
|
||||||
|
fi
|
36
IMG/cpio/ventoy/hook/parabola/ventoy-timeout.sh
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#!/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 $* ############"
|
||||||
|
|
||||||
|
blkdev_num=$($VTOY_PATH/tool/dmsetup ls | grep ventoy | sed 's/.*(\([0-9][0-9]*\),.*\([0-9][0-9]*\).*/\1:\2/')
|
||||||
|
vtDM=$(ventoy_find_dm_id ${blkdev_num})
|
||||||
|
|
||||||
|
if [ -b /dev/$vtDM ]; then
|
||||||
|
vtlog "ln -s /dev/$vtDM $1"
|
||||||
|
ln -s /dev/$vtDM "$1"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
vtlog "Device-mapper not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
47
IMG/cpio/ventoy/hook/pmagic/disk-hook.sh
Normal file
@ -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
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
|
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
|
32
IMG/cpio/ventoy/hook/pmagic/udev_disk_hook.sh
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#!/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"
|
||||||
|
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
|
||||||
|
|
||||||
|
# OK finish
|
||||||
|
set_ventoy_hook_finish
|
||||||
|
|
31
IMG/cpio/ventoy/hook/pmagic/ventoy-hook.sh
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
if $GREP -q 'Searching *for *PMAGIC' /init; then
|
||||||
|
echo "Find Searching PMAGIC" >> $VTLOG
|
||||||
|
$SED "/Searching *for *PMAGIC/a\ root=/dev/ventoy" -i /init
|
||||||
|
$SED "/Searching *for *PMAGIC/a\ $BUSYBOX_PATH/sh $VTOY_PATH/hook/pmagic/disk-hook.sh" -i /init
|
||||||
|
else
|
||||||
|
echo "Use default..." >> $VTLOG
|
||||||
|
$SED "s#^root=.*cmdline.*#root=/dev/ventoy#g'" -i /init
|
||||||
|
ventoy_systemd_udevd_work_around
|
||||||
|
ventoy_add_udev_rule "$VTOY_PATH/hook/pmagic/udev_disk_hook.sh %k"
|
||||||
|
fi
|
@ -60,6 +60,11 @@ fi
|
|||||||
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-inotifyd-start.sh /lib/dracut/hooks/pre-udev/${vtPriority}-ventoy-inotifyd-start.sh
|
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-inotifyd-start.sh /lib/dracut/hooks/pre-udev/${vtPriority}-ventoy-inotifyd-start.sh
|
||||||
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-timeout.sh /lib/dracut/hooks/initqueue/timeout/${vtPriority}-ventoy-timeout.sh
|
$BUSYBOX_PATH/cp -a $VTOY_PATH/hook/rhel7/ventoy-timeout.sh /lib/dracut/hooks/initqueue/timeout/${vtPriority}-ventoy-timeout.sh
|
||||||
|
|
||||||
|
if [ -e /sbin/dmsquash-live-root ]; then
|
||||||
|
echo "patch /sbin/dmsquash-live-root ..." >> $VTLOG
|
||||||
|
$SED "1 a $BUSYBOX_PATH/sh $VTOY_PATH/hook/rhel7/ventoy-make-link.sh" -i /sbin/dmsquash-live-root
|
||||||
|
fi
|
||||||
|
|
||||||
# suppress write protected mount warning
|
# suppress write protected mount warning
|
||||||
if [ -e /usr/sbin/anaconda-diskroot ]; then
|
if [ -e /usr/sbin/anaconda-diskroot ]; then
|
||||||
$SED 's/^mount $dev $repodir/mount -oro $dev $repodir/' -i /usr/sbin/anaconda-diskroot
|
$SED 's/^mount $dev $repodir/mount -oro $dev $repodir/' -i /usr/sbin/anaconda-diskroot
|
||||||
|
@ -23,12 +23,12 @@ if is_ventoy_hook_finished; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
vtlog "##### INOTIFYD: $2/$3 is created ..."
|
|
||||||
|
|
||||||
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
VTPATH_OLD=$PATH; PATH=$BUSYBOX_PATH:$VTOY_PATH/tool:$PATH
|
||||||
|
|
||||||
if is_inotify_ventoy_part $3; then
|
if is_inotify_ventoy_part $3; then
|
||||||
|
|
||||||
|
vtlog "##### INOTIFYD: $2/$3 is created (YES) ..."
|
||||||
|
|
||||||
vtGenRulFile='/etc/udev/rules.d/99-live-squash.rules'
|
vtGenRulFile='/etc/udev/rules.d/99-live-squash.rules'
|
||||||
if [ -e $vtGenRulFile ] && $GREP -q dmsquash $vtGenRulFile; then
|
if [ -e $vtGenRulFile ] && $GREP -q dmsquash $vtGenRulFile; then
|
||||||
vtScript=$($GREP -m1 'RUN.=' $vtGenRulFile | $AWK -F'RUN.=' '{print $2}' | $SED 's/"\(.*\)".*/\1/')
|
vtScript=$($GREP -m1 'RUN.=' $vtGenRulFile | $AWK -F'RUN.=' '{print $2}' | $SED 's/"\(.*\)".*/\1/')
|
||||||
@ -57,6 +57,8 @@ if is_inotify_ventoy_part $3; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
set_ventoy_hook_finish
|
set_ventoy_hook_finish
|
||||||
|
else
|
||||||
|
vtlog "##### INOTIFYD: $2/$3 is created (NO) ..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PATH=$VTPATH_OLD
|
PATH=$VTPATH_OLD
|
||||||
|
35
IMG/cpio/ventoy/hook/rhel7/ventoy-make-link.sh
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#!/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 ! [ -e /dev/mapper/ventoy ]; then
|
||||||
|
vtlog "link to /dev/mapper/ventoy"
|
||||||
|
ln -s /dev/dm-0 /dev/mapper/ventoy
|
||||||
|
fi
|
||||||
|
|
||||||
|
VTLABEL=$($BUSYBOX_PATH/blkid /dev/dm-0 | $SED 's/.*LABEL="\([^"]*\)".*/\1/')
|
||||||
|
vtlog "VTLABEL=$VTLABEL"
|
||||||
|
|
||||||
|
if [ -n "$VTLABEL" ]; then
|
||||||
|
if ! [ -e "/dev/disk/by-label/$VTLABEL" ]; then
|
||||||
|
vtlog "link to /dev/disk/by-label/$VTLABEL"
|
||||||
|
ln -s /dev/dm-0 "/dev/disk/by-label/$VTLABEL"
|
||||||
|
fi
|
||||||
|
fi
|
63
IMG/cpio/ventoy/hook/vine/dev-listen.sh
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
while [ -n "1" ]; do
|
||||||
|
if [ -e /dev/null ]; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
$SLEEP 0.5
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
while [ -n "1" ]; do
|
||||||
|
if [ -e /sys/block ]; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
$SLEEP 0.5
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
while [ -n "Y" ]; do
|
||||||
|
vtdiskname=$(get_ventoy_disk_name)
|
||||||
|
if [ "$vtdiskname" != "unknown" ]; then
|
||||||
|
break
|
||||||
|
else
|
||||||
|
$SLEEP 0.5
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
vtshortdev=${vtdiskname#/dev/}
|
||||||
|
|
||||||
|
if ! [ -b $vtdiskname ]; then
|
||||||
|
blkdev=$($CAT /sys/class/block/$vtshortdev/dev | $SED 's/:/ /g')
|
||||||
|
$BUSYBOX_PATH/mknod -m 0660 $vtdiskname b $blkdev
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [ -b "${vtdiskname}2" ]; then
|
||||||
|
blkdev=$($CAT /sys/class/block/${vtshortdev}2/dev | $SED 's/:/ /g')
|
||||||
|
$BUSYBOX_PATH/mknod -m 0660 "${vtdiskname}2" b $blkdev
|
||||||
|
fi
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/ls /dev/ > /dev/console
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/sh $VTOY_PATH/hook/vine/udev_disk_hook.sh "${vtdiskname#/dev/}2"
|
||||||
|
|
||||||
|
|
79
IMG/cpio/ventoy/hook/vine/udev_disk_hook.sh
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
vtCheatLoop=loop6
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup() {
|
||||||
|
vtlog "ventoy_os_install_dmsetup $1"
|
||||||
|
|
||||||
|
vt_usb_disk=$1
|
||||||
|
|
||||||
|
# dump iso file location
|
||||||
|
$VTOY_PATH/tool/vtoydm -i -f $VTOY_PATH/ventoy_image_map -d ${vt_usb_disk} > $VTOY_PATH/iso_file_list
|
||||||
|
|
||||||
|
# install dmsetup
|
||||||
|
LINE=$($GREP 'kernel-[0-9].*\.rpm' $VTOY_PATH/iso_file_list)
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
install_rpm_from_line "$LINE" ${vt_usb_disk}
|
||||||
|
fi
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/modprobe dm-mod
|
||||||
|
|
||||||
|
vtlog "dmsetup install finish, now check it..."
|
||||||
|
|
||||||
|
dmsetup_path=/ventoy/tool/dmsetup
|
||||||
|
if [ -z "$dmsetup_path" ]; then
|
||||||
|
vterr "dmsetup still not found after install"
|
||||||
|
elif $dmsetup_path info >> $VTLOG 2>&1; then
|
||||||
|
vtlog "$dmsetup_path work ok"
|
||||||
|
else
|
||||||
|
vterr "$dmsetup_path not work"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if is_ventoy_hook_finished || not_ventoy_disk "${1:0:-1}"; then
|
||||||
|
# /dev/vtCheatLoop come first
|
||||||
|
if [ "$1" = "$vtCheatLoop" ] && [ -b $VTOY_DM_PATH ]; then
|
||||||
|
ventoy_copy_device_mapper /dev/$vtCheatLoop
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
ventoy_os_install_dmsetup "/dev/${1:0:-1}"
|
||||||
|
|
||||||
|
ventoy_udev_disk_common_hook $* "noreplace"
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/mount $VTOY_DM_PATH /mnt/ventoy
|
||||||
|
|
||||||
|
#
|
||||||
|
# We do a trick for rhel6 series here.
|
||||||
|
# Use /dev/$vtCheatLoop and wapper it as a removable cdrom with bind mount.
|
||||||
|
# Then the anaconda installer will accept /dev/$vtCheatLoop as the install medium.
|
||||||
|
#
|
||||||
|
ventoy_copy_device_mapper /dev/$vtCheatLoop
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/cp -a /sys/devices/virtual/block/$vtCheatLoop /tmp/ >> $VTLOG 2>&1
|
||||||
|
echo 19 > /tmp/$vtCheatLoop/capability
|
||||||
|
$BUSYBOX_PATH/mount --bind /tmp/$vtCheatLoop /sys/block/$vtCheatLoop >> $VTLOG 2>&1
|
||||||
|
|
||||||
|
# OK finish
|
||||||
|
set_ventoy_hook_finish
|
28
IMG/cpio/ventoy/hook/vine/ventoy-hook.sh
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#!/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
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/mkdir -p /etc/anaconda.repos.d /mnt/ventoy
|
||||||
|
ventoy_print_yum_repo "ventoy" "file:///mnt/ventoy" > /etc/anaconda.repos.d/ventoy.repo
|
||||||
|
|
||||||
|
|
||||||
|
$BUSYBOX_PATH/mknod -m 0660 /dev/null c 1 3
|
||||||
|
$VTOY_PATH/hook/vine/dev-listen.sh &
|
||||||
|
|
@ -72,6 +72,13 @@ ventoy_is_initrd_ramdisk() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ventoy_mount_squashfs() {
|
||||||
|
mkdir /dev
|
||||||
|
mount -t devtmpfs devtmpfs /dev
|
||||||
|
dd if=$1 of=/dev/ram0 status=none
|
||||||
|
umount /dev && rm -rf /dev
|
||||||
|
}
|
||||||
|
|
||||||
# param: file skip magic tmp
|
# param: file skip magic tmp
|
||||||
ventoy_unpack_initramfs() {
|
ventoy_unpack_initramfs() {
|
||||||
vtfile=$1; vtskip=$2; vtmagic=$3; vttmp=$4
|
vtfile=$1; vtskip=$2; vtmagic=$3; vttmp=$4
|
||||||
@ -83,6 +90,11 @@ ventoy_unpack_initramfs() {
|
|||||||
# vtmagic='1F8B'
|
# vtmagic='1F8B'
|
||||||
#fi
|
#fi
|
||||||
|
|
||||||
|
if [ "${vtmagic:0:4}" = '6873' ]; then
|
||||||
|
ventoy_mount_squashfs $vtfile
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
for vtx in '1F8B zcat' '1F9E zcat' '425A bzcat' '5D00 lzcat' 'FD37 xzcat' '894C lzopcat' '0221 lz4cat' '28B5 zstdcat' '3037 cat'; do
|
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
|
if [ "${vtx:0:4}" = "${vtmagic:0:4}" ]; then
|
||||||
echo "vtx=$vtx" >> $VTLOG
|
echo "vtx=$vtx" >> $VTLOG
|
||||||
@ -171,7 +183,40 @@ fi
|
|||||||
|
|
||||||
####################################################################
|
####################################################################
|
||||||
# #
|
# #
|
||||||
# Step 3 : Hand over to ventoy.sh #
|
# Step 3 : Extract injection archive #
|
||||||
|
# #
|
||||||
|
####################################################################
|
||||||
|
ventoy_unpack_injection() {
|
||||||
|
vtmagic=$(hexdump -n 2 -e '2/1 "%02X"' $VTOY_PATH/ventoy_injection)
|
||||||
|
echo "ventoy_unpack_injection vtmagic=$vtmagic ..."
|
||||||
|
|
||||||
|
if [ "1F8B" = "$vtmagic" ] || [ "1F9E" = "$vtmagic" ]; then
|
||||||
|
echo "tar.gz tar -xzvf"
|
||||||
|
tar -xzvf $VTOY_PATH/ventoy_injection -C /
|
||||||
|
elif [ "425A" = "$vtmagic" ]; then
|
||||||
|
echo "tar.bz2 tar -xjvf"
|
||||||
|
tar -xjvf $VTOY_PATH/ventoy_injection -C /
|
||||||
|
elif [ "FD37" = "$vtmagic" ]; then
|
||||||
|
echo "tar.xz tar -xJvf"
|
||||||
|
tar -xJvf $VTOY_PATH/ventoy_injection -C /
|
||||||
|
elif [ "5D00" = "$vtmagic" ]; then
|
||||||
|
echo "tar.lzma tar -xavf"
|
||||||
|
tar -xavf $VTOY_PATH/ventoy_injection -C /
|
||||||
|
else
|
||||||
|
echo "unzip -o"
|
||||||
|
unzip -o $VTOY_PATH/ventoy_injection -d /
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ -e $VTOY_PATH/ventoy_injection ]; then
|
||||||
|
echo "### decompress injection ... ###" >>$VTLOG
|
||||||
|
ventoy_unpack_injection > $VTOY_PATH/injection.log 2>&1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
####################################################################
|
||||||
|
# #
|
||||||
|
# Step 4 : Hand over to ventoy.sh #
|
||||||
# #
|
# #
|
||||||
####################################################################
|
####################################################################
|
||||||
echo "Now hand over to ventoy.sh" >>$VTLOG
|
echo "Now hand over to ventoy.sh" >>$VTLOG
|
||||||
|
@ -133,8 +133,9 @@ ventoy_get_os_type() {
|
|||||||
if $GREP -q 'XenServer' /etc/os-release; then
|
if $GREP -q 'XenServer' /etc/os-release; then
|
||||||
echo 'xen'; return
|
echo 'xen'; return
|
||||||
elif $GREP -q 'SUSE ' /etc/os-release; then
|
elif $GREP -q 'SUSE ' /etc/os-release; then
|
||||||
echo 'suse'; return
|
echo 'suse'; return
|
||||||
|
elif $GREP -q 'uruk' /etc/os-release; then
|
||||||
|
echo 'debian'; return
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -196,6 +197,34 @@ ventoy_get_os_type() {
|
|||||||
echo 'adelie'; return
|
echo 'adelie'; return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if $GREP -q 'pmagic' /proc/version; then
|
||||||
|
echo 'pmagic'; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $GREP -q 'CDlinux' /proc/cmdline; then
|
||||||
|
echo 'cdlinux'; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $GREP -q 'parabola' /proc/version; then
|
||||||
|
echo 'parabola'; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $GREP -q 'cucumber' /proc/version; then
|
||||||
|
echo 'cucumber'; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $GREP -q 'fatdog' /proc/version; then
|
||||||
|
echo 'fatdog'; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $GREP -q 'KWORT' /proc/version; then
|
||||||
|
echo 'kwort'; return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if $GREP -q 'iwamoto' /proc/version; then
|
||||||
|
echo 'vine'; return
|
||||||
|
fi
|
||||||
|
|
||||||
echo "default"
|
echo "default"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,6 +251,7 @@ if [ "$VTOY_BREAK_LEVEL" = "03" ] || [ "$VTOY_BREAK_LEVEL" = "13" ]; then
|
|||||||
exec $BUSYBOX_PATH/sh
|
exec $BUSYBOX_PATH/sh
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
####################################################################
|
####################################################################
|
||||||
# #
|
# #
|
||||||
# Step 4 : Hand over to real init #
|
# Step 4 : Hand over to real init #
|
||||||
|
28
INSTALL/README
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
========== Ventoy2Disk.sh ===============
|
||||||
|
|
||||||
|
sudo sh Ventoy2Disk.sh { -i | -I | -u } /dev/XXX XXX is the USB device, for example /dev/sdb.
|
||||||
|
|
||||||
|
Ventoy2Disk.sh CMD [ OPTION ] /dev/sdX
|
||||||
|
CMD:
|
||||||
|
-i install ventoy to sdX (fail if disk already installed with ventoy)
|
||||||
|
-I force install ventoy to sdX (no matter installed or not)
|
||||||
|
-u update ventoy in sdX
|
||||||
|
|
||||||
|
OPTION: (optional)
|
||||||
|
-r SIZE_MB preserve some space at the bottom of the disk (only for install)
|
||||||
|
-s enable secure boot support (default is disabled)
|
||||||
|
-g use GPT partition style, default is MBR style (only for install)
|
||||||
|
|
||||||
|
|
||||||
|
========== CreatePersistentImg.sh ===============
|
||||||
|
|
||||||
|
sudo sh CreatePersistentImg.sh
|
||||||
|
|
||||||
|
sh CreatePersistentImg.sh [ -s SIZE_IN_MB ] [ -t FSTYPE ] [ -l LABEL ] for example:
|
||||||
|
|
||||||
|
sh CreatePersistentImg.sh ----> persistence.img in 1GB size and ext4 filesystem and casper-rw label
|
||||||
|
sh CreatePersistentImg.sh -l MX-Persist ----> persistence.img in 1GB size and ext4 filesystem and MX-Persist label
|
||||||
|
sh CreatePersistentImg.sh -s 2048 ----> persistence.img in 2GB size and ext4 filesystem and casper-rw label
|
||||||
|
sh CreatePersistentImg.sh -s 4096 -t xfs ----> persistence.img in 4GB size and xfs filesystem (ext2/3/4 xfs are supported) and casper-rw label
|
||||||
|
|
@ -39,12 +39,17 @@ if ! [ -f ./tool/ash ]; then
|
|||||||
|
|
||||||
if ! [ -f ./tool/ash ]; then
|
if ! [ -f ./tool/ash ]; then
|
||||||
echo 'Failed to decompress tools ...'
|
echo 'Failed to decompress tools ...'
|
||||||
cd $OLDDIR
|
if [ -n "$OLDDIR" ]; then
|
||||||
|
cd $OLDDIR
|
||||||
|
fi
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
./tool/ash ./tool/VentoyWorker.sh $*
|
./tool/ash ./tool/VentoyWorker.sh $*
|
||||||
|
|
||||||
cd $OLDDIR
|
if [ -n "$OLDDIR" ]; then
|
||||||
|
cd $OLDDIR
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,6 +23,8 @@ sh buildlib.sh
|
|||||||
cd $VTOY_PATH/vtoyfat
|
cd $VTOY_PATH/vtoyfat
|
||||||
sh build.sh || exit 1
|
sh build.sh || exit 1
|
||||||
|
|
||||||
|
cd $VTOY_PATH/vtoygpt
|
||||||
|
sh build.sh || exit 1
|
||||||
|
|
||||||
cd $VTOY_PATH/ExFAT
|
cd $VTOY_PATH/ExFAT
|
||||||
sh buidlibfuse.sh || exit 1
|
sh buidlibfuse.sh || exit 1
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
|
submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
|
||||||
menuentry 'Check global control plugin configuration' {
|
menuentry 'Check global control plugin configuration' --class=debug_control {
|
||||||
set pager=1
|
set pager=1
|
||||||
vt_check_plugin_json $vt_plugin_path control $iso_path
|
vt_check_plugin_json $vt_plugin_path control $vtoy_iso_part
|
||||||
|
|
||||||
echo -e "\npress ENTER to exit ..."
|
echo -e "\npress ENTER to exit ..."
|
||||||
read vtInputKey
|
read vtInputKey
|
||||||
@ -10,7 +10,7 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
|
|||||||
|
|
||||||
menuentry 'Check theme plugin configuration' --class=debug_theme {
|
menuentry 'Check theme plugin configuration' --class=debug_theme {
|
||||||
set pager=1
|
set pager=1
|
||||||
vt_check_plugin_json $vt_plugin_path theme $iso_path
|
vt_check_plugin_json $vt_plugin_path theme $vtoy_iso_part
|
||||||
|
|
||||||
echo -e "\npress ENTER to exit ..."
|
echo -e "\npress ENTER to exit ..."
|
||||||
read vtInputKey
|
read vtInputKey
|
||||||
@ -19,7 +19,7 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
|
|||||||
|
|
||||||
menuentry 'Check auto install plugin configuration' --class=debug_autoinstall {
|
menuentry 'Check auto install plugin configuration' --class=debug_autoinstall {
|
||||||
set pager=1
|
set pager=1
|
||||||
vt_check_plugin_json $vt_plugin_path auto_install $iso_path
|
vt_check_plugin_json $vt_plugin_path auto_install $vtoy_iso_part
|
||||||
|
|
||||||
echo -e "\npress ENTER to exit ..."
|
echo -e "\npress ENTER to exit ..."
|
||||||
read vtInputKey
|
read vtInputKey
|
||||||
@ -28,7 +28,7 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
|
|||||||
|
|
||||||
menuentry 'Check persistence plugin configuration' --class=debug_persistence {
|
menuentry 'Check persistence plugin configuration' --class=debug_persistence {
|
||||||
set pager=1
|
set pager=1
|
||||||
vt_check_plugin_json $vt_plugin_path persistence $iso_path
|
vt_check_plugin_json $vt_plugin_path persistence $vtoy_iso_part
|
||||||
|
|
||||||
echo -e "\n############### dump persistence ###############"
|
echo -e "\n############### dump persistence ###############"
|
||||||
vt_dump_persistence
|
vt_dump_persistence
|
||||||
@ -40,7 +40,7 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
|
|||||||
|
|
||||||
menuentry 'Check menu alias plugin configuration' --class=debug_menualias {
|
menuentry 'Check menu alias plugin configuration' --class=debug_menualias {
|
||||||
set pager=1
|
set pager=1
|
||||||
vt_check_plugin_json $vt_plugin_path menu_alias $iso_path
|
vt_check_plugin_json $vt_plugin_path menu_alias $vtoy_iso_part
|
||||||
|
|
||||||
echo -e "\npress ENTER to exit ..."
|
echo -e "\npress ENTER to exit ..."
|
||||||
read vtInputKey
|
read vtInputKey
|
||||||
@ -49,18 +49,43 @@ submenu 'Check plugin json configuration (ventoy.json)' --class=debug_json {
|
|||||||
|
|
||||||
menuentry 'Check menu class plugin configuration' --class=debug_menuclass {
|
menuentry 'Check menu class plugin configuration' --class=debug_menuclass {
|
||||||
set pager=1
|
set pager=1
|
||||||
vt_check_plugin_json $vt_plugin_path menu_class $iso_path
|
vt_check_plugin_json $vt_plugin_path menu_class $vtoy_iso_part
|
||||||
|
|
||||||
echo -e "\npress ENTER to exit ..."
|
echo -e "\npress ENTER to exit ..."
|
||||||
read vtInputKey
|
read vtInputKey
|
||||||
unset pager
|
unset pager
|
||||||
}
|
}
|
||||||
|
|
||||||
|
menuentry 'Check injection plugin configuration' --class=debug_injection {
|
||||||
|
set pager=1
|
||||||
|
vt_check_plugin_json $vt_plugin_path injection $vtoy_iso_part
|
||||||
|
|
||||||
|
echo -e "\npress ENTER to exit ..."
|
||||||
|
read vtInputKey
|
||||||
|
unset pager
|
||||||
|
}
|
||||||
|
|
||||||
menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
|
menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
|
||||||
echo 'Return ...'
|
echo 'Return ...'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$grub_platform" != "pc" ]; then
|
||||||
|
submenu 'Ventoy UEFI Utilities' --class=debug_util {
|
||||||
|
menuentry 'Fixup Windows BlinitializeLibrary Failure' {
|
||||||
|
chainloader ${vtoy_path}/vtoyutil_x64.efi env_param=${env_param} ${vtdebug_flag} feature=fix_windows_mmap
|
||||||
|
boot
|
||||||
|
echo -e "\npress ENTER to exit ..."
|
||||||
|
read vtInputKey
|
||||||
|
}
|
||||||
|
|
||||||
|
menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
|
||||||
|
echo 'Return ...'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
|
||||||
menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
|
menuentry 'Return to previous menu [Esc]' --class=vtoyret VTOY_RET {
|
||||||
echo 'Return ...'
|
echo 'Return ...'
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,30 @@ function ventoy_debug_pause {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ventoy_cli_console {
|
||||||
|
if [ "$grub_platform" = "pc" ]; then
|
||||||
|
#terminal_output vga_text
|
||||||
|
terminal_output console
|
||||||
|
else
|
||||||
|
if [ "$vtoy_display_mode" != "CLI" ]; then
|
||||||
|
terminal_output console
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function ventoy_gui_console {
|
||||||
|
if [ "$grub_platform" = "pc" ]; then
|
||||||
|
if [ "$vtoy_display_mode" = "CLI" ]; then
|
||||||
|
terminal_output console
|
||||||
|
else
|
||||||
|
terminal_output gfxterm
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ "$vtoy_display_mode" != "CLI" ]; then
|
||||||
|
terminal_output gfxterm
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
function ventoy_power {
|
function ventoy_power {
|
||||||
configfile $prefix/power.cfg
|
configfile $prefix/power.cfg
|
||||||
@ -43,6 +67,18 @@ function ventoy_localboot {
|
|||||||
configfile $prefix/localboot.cfg
|
configfile $prefix/localboot.cfg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ventoy_ext_menu {
|
||||||
|
if [ -e $vt_plugin_path/ventoy/ventoy_grub.cfg ]; then
|
||||||
|
set ventoy_new_context=1
|
||||||
|
configfile $vt_plugin_path/ventoy/ventoy_grub.cfg
|
||||||
|
unset ventoy_new_context
|
||||||
|
else
|
||||||
|
echo "ventoy_grub.cfg NOT exist."
|
||||||
|
echo -e "\npress ENTER to exit ..."
|
||||||
|
read vtInputKey
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
function get_os_type {
|
function get_os_type {
|
||||||
set vtoy_os=Linux
|
set vtoy_os=Linux
|
||||||
|
|
||||||
@ -53,6 +89,26 @@ function get_os_type {
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [ "$vtoy_os" = "Linux" ]; then
|
||||||
|
if vt_strstr "$vt_system_id" "FreeBSD"; then
|
||||||
|
set vtoy_os=Unix
|
||||||
|
set vt_unix_type=FreeBSD
|
||||||
|
elif [ -e (loop)/bin/freebsd-version ]; then
|
||||||
|
set vtoy_os=Unix
|
||||||
|
set vt_unix_type=FreeBSD
|
||||||
|
|
||||||
|
|
||||||
|
elif [ -e (loop)/boot/kernel/kernel ]; then
|
||||||
|
if file --is-x86-kfreebsd (loop)/boot/kernel/kernel; then
|
||||||
|
set vtoy_os=Unix
|
||||||
|
set vt_unix_type=FreeBSD
|
||||||
|
elif file --is-x86-knetbsd (loop)/boot/kernel/kernel; then
|
||||||
|
set vtoy_os=Unix
|
||||||
|
set vt_unix_type=NetBSD
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -n "${vtdebug_flag}" ]; then
|
if [ -n "${vtdebug_flag}" ]; then
|
||||||
echo ISO is $vtoy_os
|
echo ISO is $vtoy_os
|
||||||
fi
|
fi
|
||||||
@ -154,10 +210,150 @@ function distro_specify_initrd_file_phase2 {
|
|||||||
vt_linux_specify_initrd_file /initrd.img
|
vt_linux_specify_initrd_file /initrd.img
|
||||||
elif [ -f (loop)/sysresccd/boot/x86_64/sysresccd.img ]; then
|
elif [ -f (loop)/sysresccd/boot/x86_64/sysresccd.img ]; then
|
||||||
vt_linux_specify_initrd_file /sysresccd/boot/x86_64/sysresccd.img
|
vt_linux_specify_initrd_file /sysresccd/boot/x86_64/sysresccd.img
|
||||||
|
elif [ -f (loop)/CDlinux/initrd ]; then
|
||||||
|
vt_linux_specify_initrd_file /CDlinux/initrd
|
||||||
|
elif [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then
|
||||||
|
vt_linux_specify_initrd_file /parabola/boot/x86_64/parabolaiso.img
|
||||||
|
if [ -f (loop)/parabola/boot/i686/parabolaiso.img ]; then
|
||||||
|
vt_linux_specify_initrd_file /parabola/boot/i686/parabolaiso.img
|
||||||
|
fi
|
||||||
|
elif [ -f (loop)/EFI/BOOT/initrd.img ]; then
|
||||||
|
#Qubes
|
||||||
|
vt_linux_specify_initrd_file /EFI/BOOT/initrd.img
|
||||||
|
if [ "$grub_platform" != "pc" ]; then
|
||||||
|
vt_add_replace_file 0 "initrd.img"
|
||||||
|
fi
|
||||||
|
elif [ -f (loop)/initrd ]; then
|
||||||
|
vt_linux_specify_initrd_file /initrd
|
||||||
|
elif [ -f (loop)/live/initrd1 ]; then
|
||||||
|
vt_linux_specify_initrd_file /live/initrd1
|
||||||
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ventoy_get_ghostbsd_ver {
|
||||||
|
|
||||||
|
# vt_parse_iso_create_date $1/${chosen_path} vt_create_date
|
||||||
|
# if regexp "^202005" "$vt_create_date"; then
|
||||||
|
# set vt_freebsd_ver=12.x
|
||||||
|
# fi
|
||||||
|
|
||||||
|
set vt_freebsd_ver=12.x
|
||||||
|
}
|
||||||
|
|
||||||
|
function ventoy_get_freenas_ver {
|
||||||
|
set vt_freebsd_ver=11.x
|
||||||
|
|
||||||
|
if [ -e (loop)/FreeNAS-MANIFEST ]; then
|
||||||
|
vt_parse_freenas_ver (loop)/FreeNAS-MANIFEST vt_freenas_ver
|
||||||
|
if regexp "^13\.[0-9]" "$vt_freenas_ver"; then
|
||||||
|
set vt_freebsd_ver=13.x
|
||||||
|
elif regexp "^12\.[0-9]" "$vt_freenas_ver"; then
|
||||||
|
set vt_freebsd_ver=12.x
|
||||||
|
elif regexp "^11\.[0-9]" "$vt_freenas_ver"; then
|
||||||
|
set vt_freebsd_ver=11.x
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function ventoy_freebsd_proc {
|
||||||
|
if vt_strstr "$vt_volume_id" "GHOSTBSD"; then
|
||||||
|
ventoy_get_ghostbsd_ver $1 ${chosen_path}
|
||||||
|
elif vt_strstr "$vt_volume_id" "FREENAS"; then
|
||||||
|
ventoy_get_freenas_ver $1 ${chosen_path}
|
||||||
|
elif regexp "^13_[0-9]" "$vt_volume_id"; then
|
||||||
|
set vt_freebsd_ver=13.x
|
||||||
|
elif regexp "^12_[0-9]" "$vt_volume_id"; then
|
||||||
|
set vt_freebsd_ver=12.x
|
||||||
|
elif regexp "^11_[0-9]" "$vt_volume_id"; then
|
||||||
|
set vt_freebsd_ver=11.x
|
||||||
|
elif regexp "^10_[0-9]" "$vt_volume_id"; then
|
||||||
|
set vt_freebsd_ver=10.x
|
||||||
|
elif regexp "^9_[0-9]" "$vt_volume_id"; then
|
||||||
|
set vt_freebsd_ver=9.x
|
||||||
|
elif [ -e (loop)/bin/freebsd-version ]; then
|
||||||
|
vt_unix_parse_freebsd_ver (loop)/bin/freebsd-version vt_userland_ver
|
||||||
|
if regexp "\"13\.[0-9]-" "$vt_userland_ver"; then
|
||||||
|
set vt_freebsd_ver=13.x
|
||||||
|
elif regexp "\"12\.[0-9]-" "$vt_userland_ver"; then
|
||||||
|
set vt_freebsd_ver=12.x
|
||||||
|
elif regexp "\"11\.[0-9]-" "$vt_userland_ver"; then
|
||||||
|
set vt_freebsd_ver=11.x
|
||||||
|
elif regexp "\"10\.[0-9]-" "$vt_userland_ver"; then
|
||||||
|
set vt_freebsd_ver=10.x
|
||||||
|
elif regexp "\"9\.[0-9]-" "$vt_userland_ver"; then
|
||||||
|
set vt_freebsd_ver=9.x
|
||||||
|
fi
|
||||||
|
elif [ -e (loop)/README.TXT ]; then
|
||||||
|
vt_1st_line (loop)/README.TXT vt_freebsd_line1
|
||||||
|
if regexp "FreeBSD 13\.[0-9]-" "$vt_freebsd_line1"; then
|
||||||
|
set vt_freebsd_ver=13.x
|
||||||
|
elif regexp "FreeBSD 12\.[0-9]-" "$vt_freebsd_line1"; then
|
||||||
|
set vt_freebsd_ver=12.x
|
||||||
|
elif regexp "FreeBSD 11\.[0-9]-" "$vt_freebsd_line1"; then
|
||||||
|
set vt_freebsd_ver=11.x
|
||||||
|
elif regexp "FreeBSD 10\.[0-9]-" "$vt_freebsd_line1"; then
|
||||||
|
set vt_freebsd_ver=10.x
|
||||||
|
elif regexp "FreeBSD 9\.[0-9]-" "$vt_freebsd_line1"; then
|
||||||
|
set vt_freebsd_ver=9.x
|
||||||
|
fi
|
||||||
|
elif vt_strstr "${chosen_path}" "MidnightBSD"; then
|
||||||
|
set vt_freebsd_ver=9.x
|
||||||
|
else
|
||||||
|
set vt_freebsd_ver=12.x
|
||||||
|
fi
|
||||||
|
|
||||||
|
set vt_freebsd_bit=64
|
||||||
|
for file in "/boot/kernel/kernel" "/boot/kernel/kernel.gz"; do
|
||||||
|
if [ -e (loop)/$file ]; then
|
||||||
|
if file --is-i386-kfreebsd (loop)/$file; then
|
||||||
|
set vt_freebsd_bit=32
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -n "${vtdebug_flag}" ]; then
|
||||||
|
echo "This is FreeBSD $vt_freebsd_ver ${vt_freebsd_bit}bit"
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset vt_unix_mod_path
|
||||||
|
for file in "/COPYRIGHT" "/FreeNAS-MANIFEST" "/version"; do
|
||||||
|
if [ -e (loop)${file} ]; then
|
||||||
|
set vt_unix_mod_path=${file}
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
vt_unix_replace_ko $vt_unix_mod_path (vtunix)/ventoy_unix/FreeBSD/geom_ventoy_ko/$vt_freebsd_ver/$vt_freebsd_bit/geom_ventoy.ko.xz
|
||||||
|
vt_unix_replace_conf FreeBSD ${1}${chosen_path}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ventoy_unix_comm_proc {
|
||||||
|
vt_unix_reset
|
||||||
|
|
||||||
|
if [ "$ventoy_compatible" = "NO" ]; then
|
||||||
|
loopback vtunix $vtoy_efi_part/ventoy/ventoy_unix.cpio
|
||||||
|
|
||||||
|
if [ "$vt_unix_type" = "FreeBSD" ]; then
|
||||||
|
ventoy_freebsd_proc $1 ${chosen_path}
|
||||||
|
elif [ "$vt_unix_type" = "NetBSD" ]; then
|
||||||
|
echo "NetBSD not supported"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
else
|
||||||
|
if [ -n "${vtdebug_flag}" ]; then
|
||||||
|
echo "Unknown unix type"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
vt_unix_chain_data ${1}${chosen_path}
|
||||||
|
ventoy_debug_pause
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function uefi_windows_menu_func {
|
function uefi_windows_menu_func {
|
||||||
vt_windows_reset
|
vt_windows_reset
|
||||||
|
|
||||||
@ -186,7 +382,7 @@ function uefi_windows_menu_func {
|
|||||||
ventoy_debug_pause
|
ventoy_debug_pause
|
||||||
|
|
||||||
if [ -n "$vtoy_chain_mem_addr" ]; then
|
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||||
terminal_output console
|
ventoy_cli_console
|
||||||
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||||
boot
|
boot
|
||||||
else
|
else
|
||||||
@ -251,6 +447,12 @@ function uefi_linux_menu_func {
|
|||||||
fi
|
fi
|
||||||
elif [ -f (loop)/EFI/BOOT/initrd.gz ]; then
|
elif [ -f (loop)/EFI/BOOT/initrd.gz ]; then
|
||||||
vt_add_replace_file $vtindex "EFI\\BOOT\\initrd.gz"
|
vt_add_replace_file $vtindex "EFI\\BOOT\\initrd.gz"
|
||||||
|
elif [ -f (loop)/loader/entries/thinstation.conf ]; then
|
||||||
|
vt_add_replace_file $vtindex "boot\\initrd"
|
||||||
|
fi
|
||||||
|
elif [ -d (loop)/EFI/boot/entries ]; then
|
||||||
|
if [ -f (loop)/parabola/boot/x86_64/parabolaiso.img ]; then
|
||||||
|
vt_add_replace_file 0 "EFI\\parabolaiso\\parabolaiso.img"
|
||||||
fi
|
fi
|
||||||
elif [ -e (loop)/syslinux/alt0/full.cz ]; then
|
elif [ -e (loop)/syslinux/alt0/full.cz ]; then
|
||||||
vt_add_replace_file 0 "EFI\\BOOT\\full.cz"
|
vt_add_replace_file 0 "EFI\\BOOT\\full.cz"
|
||||||
@ -262,7 +464,7 @@ function uefi_linux_menu_func {
|
|||||||
vt_linux_chain_data ${1}${chosen_path}
|
vt_linux_chain_data ${1}${chosen_path}
|
||||||
|
|
||||||
if [ -n "$vtoy_chain_mem_addr" ]; then
|
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||||
terminal_output console
|
ventoy_cli_console
|
||||||
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} FirstTry=${FirstTryBootFile} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} FirstTry=${FirstTryBootFile} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||||
boot
|
boot
|
||||||
else
|
else
|
||||||
@ -271,6 +473,18 @@ function uefi_linux_menu_func {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function uefi_unix_menu_func {
|
||||||
|
ventoy_unix_comm_proc $1 ${chosen_path}
|
||||||
|
|
||||||
|
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||||
|
ventoy_cli_console
|
||||||
|
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} FirstTry=${FirstTryBootFile} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||||
|
boot
|
||||||
|
else
|
||||||
|
echo "chain empty failed"
|
||||||
|
ventoy_pause
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
function uefi_iso_menu_func {
|
function uefi_iso_menu_func {
|
||||||
|
|
||||||
@ -299,6 +513,7 @@ function uefi_iso_menu_func {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
loopback loop ${1}${chosen_path}
|
loopback loop ${1}${chosen_path}
|
||||||
|
vt_parse_iso_volume ${1}${chosen_path} vt_system_id vt_volume_id
|
||||||
get_os_type (loop)
|
get_os_type (loop)
|
||||||
|
|
||||||
if [ -d (loop)/EFI ]; then
|
if [ -d (loop)/EFI ]; then
|
||||||
@ -323,11 +538,13 @@ function uefi_iso_menu_func {
|
|||||||
if [ "$vtoy_os" = "Windows" ]; then
|
if [ "$vtoy_os" = "Windows" ]; then
|
||||||
vt_check_compatible_pe (loop)
|
vt_check_compatible_pe (loop)
|
||||||
uefi_windows_menu_func $1 ${chosen_path}
|
uefi_windows_menu_func $1 ${chosen_path}
|
||||||
|
elif [ "$vtoy_os" = "Unix" ]; then
|
||||||
|
uefi_unix_menu_func $1 ${chosen_path}
|
||||||
else
|
else
|
||||||
uefi_linux_menu_func $1 ${chosen_path}
|
uefi_linux_menu_func $1 ${chosen_path}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
terminal_output gfxterm
|
ventoy_gui_console
|
||||||
}
|
}
|
||||||
|
|
||||||
function uefi_iso_memdisk {
|
function uefi_iso_memdisk {
|
||||||
@ -336,11 +553,11 @@ function uefi_iso_memdisk {
|
|||||||
echo 'Loading ISO file to memory ...'
|
echo 'Loading ISO file to memory ...'
|
||||||
vt_load_iso_to_mem ${1}${chosen_path} vtoy_iso_buf
|
vt_load_iso_to_mem ${1}${chosen_path} vtoy_iso_buf
|
||||||
|
|
||||||
terminal_output console
|
ventoy_cli_console
|
||||||
chainloader ${vtoy_path}/ventoy_x64.efi memdisk env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_iso_buf_addr}:size:${vtoy_iso_buf_size}
|
chainloader ${vtoy_path}/ventoy_x64.efi memdisk env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_iso_buf_addr}:size:${vtoy_iso_buf_size}
|
||||||
boot
|
boot
|
||||||
|
|
||||||
terminal_output gfxterm
|
ventoy_gui_console
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -442,6 +659,20 @@ function legacy_linux_menu_func {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function legacy_unix_menu_func {
|
||||||
|
ventoy_unix_comm_proc $1 ${chosen_path}
|
||||||
|
|
||||||
|
if [ -n "$vtoy_chain_mem_addr" ]; then
|
||||||
|
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||||
|
boot
|
||||||
|
else
|
||||||
|
echo "chain empty failed"
|
||||||
|
ventoy_pause
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function legacy_iso_menu_func {
|
function legacy_iso_menu_func {
|
||||||
|
|
||||||
if [ -d (loop)/ ]; then
|
if [ -d (loop)/ ]; then
|
||||||
@ -460,6 +691,7 @@ function legacy_iso_menu_func {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
loopback loop ${1}${chosen_path}
|
loopback loop ${1}${chosen_path}
|
||||||
|
vt_parse_iso_volume ${1}${chosen_path} vt_system_id vt_volume_id
|
||||||
get_os_type (loop)
|
get_os_type (loop)
|
||||||
|
|
||||||
if [ -n "$vtcompat" ]; then
|
if [ -n "$vtcompat" ]; then
|
||||||
@ -476,6 +708,8 @@ function legacy_iso_menu_func {
|
|||||||
if [ "$vtoy_os" = "Windows" ]; then
|
if [ "$vtoy_os" = "Windows" ]; then
|
||||||
vt_check_compatible_pe (loop)
|
vt_check_compatible_pe (loop)
|
||||||
legacy_windows_menu_func $1 ${chosen_path}
|
legacy_windows_menu_func $1 ${chosen_path}
|
||||||
|
elif [ "$vtoy_os" = "Unix" ]; then
|
||||||
|
legacy_unix_menu_func $1 ${chosen_path}
|
||||||
else
|
else
|
||||||
legacy_linux_menu_func $1 ${chosen_path}
|
legacy_linux_menu_func $1 ${chosen_path}
|
||||||
fi
|
fi
|
||||||
@ -491,26 +725,29 @@ function legacy_iso_memdisk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function iso_common_menuentry {
|
function iso_common_menuentry {
|
||||||
|
unset vt_system_id
|
||||||
|
unset vt_volume_id
|
||||||
|
|
||||||
if [ "$grub_platform" = "pc" ]; then
|
if [ "$grub_platform" = "pc" ]; then
|
||||||
if vt_check_mode 0; then
|
if vt_check_mode 0; then
|
||||||
legacy_iso_memdisk $iso_path
|
legacy_iso_memdisk $vtoy_iso_part
|
||||||
else
|
else
|
||||||
legacy_iso_menu_func $iso_path
|
legacy_iso_menu_func $vtoy_iso_part
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
if vt_check_mode 0; then
|
if vt_check_mode 0; then
|
||||||
uefi_iso_memdisk $iso_path
|
uefi_iso_memdisk $vtoy_iso_part
|
||||||
else
|
else
|
||||||
uefi_iso_menu_func $iso_path
|
uefi_iso_menu_func $vtoy_iso_part
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function common_unsupport_menuentry {
|
function common_unsupport_menuentry {
|
||||||
echo -e "\n The name of the iso file could NOT contain space or non-ascii characters. \n"
|
echo -e "\n The name of the iso file could NOT contain space or non-ascii characters. \n"
|
||||||
echo -e " 文件名中不能有中文或空格 \n"
|
echo -e " 文件名中不能有中文或空格 \n"
|
||||||
echo -e "\n Will return to main menu after 10 seconds ...\n"
|
echo -e "\npress ENTER to exit (请按 回车 键返回) ..."
|
||||||
sleep 10
|
read vtInputKey
|
||||||
}
|
}
|
||||||
|
|
||||||
function iso_unsupport_menuentry {
|
function iso_unsupport_menuentry {
|
||||||
@ -519,7 +756,7 @@ function iso_unsupport_menuentry {
|
|||||||
|
|
||||||
function wim_common_menuentry {
|
function wim_common_menuentry {
|
||||||
vt_chosen_img_path chosen_path
|
vt_chosen_img_path chosen_path
|
||||||
vt_wim_chain_data ${iso_path}${chosen_path}
|
vt_wim_chain_data ${vtoy_iso_part}${chosen_path}
|
||||||
|
|
||||||
ventoy_debug_pause
|
ventoy_debug_pause
|
||||||
|
|
||||||
@ -527,9 +764,9 @@ function wim_common_menuentry {
|
|||||||
if [ "$grub_platform" = "pc" ]; then
|
if [ "$grub_platform" = "pc" ]; then
|
||||||
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
linux16 $vtoy_path/ipxe.krn ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||||
else
|
else
|
||||||
terminal_output console
|
ventoy_cli_console
|
||||||
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
chainloader ${vtoy_path}/ventoy_x64.efi env_param=${env_param} isoefi=${LoadIsoEfiDriver} ${vtdebug_flag} mem:${vtoy_chain_mem_addr}:size:${vtoy_chain_mem_size}
|
||||||
terminal_output gfxterm
|
ventoy_gui_console
|
||||||
fi
|
fi
|
||||||
boot
|
boot
|
||||||
else
|
else
|
||||||
@ -545,16 +782,18 @@ function wim_unsupport_menuentry {
|
|||||||
function efi_common_menuentry {
|
function efi_common_menuentry {
|
||||||
vt_chosen_img_path chosen_path
|
vt_chosen_img_path chosen_path
|
||||||
|
|
||||||
terminal_output console
|
ventoy_cli_console
|
||||||
chainloader ${iso_path}${chosen_path}
|
chainloader ${vtoy_iso_part}${chosen_path}
|
||||||
boot
|
boot
|
||||||
terminal_output gfxterm
|
ventoy_gui_console
|
||||||
}
|
}
|
||||||
|
|
||||||
function efi_unsupport_menuentry {
|
function efi_unsupport_menuentry {
|
||||||
common_unsupport_menuentry
|
common_unsupport_menuentry
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#############################################################
|
#############################################################
|
||||||
#############################################################
|
#############################################################
|
||||||
#############################################################
|
#############################################################
|
||||||
@ -563,7 +802,7 @@ function efi_unsupport_menuentry {
|
|||||||
#############################################################
|
#############################################################
|
||||||
#############################################################
|
#############################################################
|
||||||
|
|
||||||
set VENTOY_VERSION="1.0.14"
|
set VENTOY_VERSION="1.0.18"
|
||||||
|
|
||||||
# Default menu display mode, you can change it as you want.
|
# Default menu display mode, you can change it as you want.
|
||||||
# 0: List mode
|
# 0: List mode
|
||||||
@ -577,6 +816,7 @@ set VTOY_ISO_UEFI_DRV_STR="UEFI FS"
|
|||||||
set VTOY_F2_CMD="ventoy_power"
|
set VTOY_F2_CMD="ventoy_power"
|
||||||
set VTOY_F4_CMD="ventoy_localboot"
|
set VTOY_F4_CMD="ventoy_localboot"
|
||||||
set VTOY_F5_CMD="ventoy_diagnosis"
|
set VTOY_F5_CMD="ventoy_diagnosis"
|
||||||
|
set VTOY_F6_CMD="ventoy_ext_menu"
|
||||||
|
|
||||||
if [ "$grub_platform" = "pc" ]; then
|
if [ "$grub_platform" = "pc" ]; then
|
||||||
set VTOY_TEXT_MENU_VER="Ventoy $VENTOY_VERSION BIOS www.ventoy.net"
|
set VTOY_TEXT_MENU_VER="Ventoy $VENTOY_VERSION BIOS www.ventoy.net"
|
||||||
@ -590,15 +830,15 @@ if [ "$vtoy_dev" = "tftp" ]; then
|
|||||||
set vtoy_path=($root)
|
set vtoy_path=($root)
|
||||||
for vtid in 0 1 2 3; do
|
for vtid in 0 1 2 3; do
|
||||||
if [ -d (hd$vtid,2)/ventoy ]; then
|
if [ -d (hd$vtid,2)/ventoy ]; then
|
||||||
set iso_path=(hd$vtid,1)
|
set vtoy_iso_part=(hd$vtid,1)
|
||||||
set vtoy_efi_part=(hd$vtid,2)
|
set vtoy_efi_part=(hd$vtid,2)
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
loadfont ascii
|
loadfont ascii
|
||||||
|
|
||||||
if [ -f $iso_path/ventoy/ventoy.json ]; then
|
if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then
|
||||||
set vt_plugin_path=$iso_path
|
set vt_plugin_path=$vtoy_iso_part
|
||||||
else
|
else
|
||||||
set vt_plugin_path=$prefix
|
set vt_plugin_path=$prefix
|
||||||
vt_load_plugin $vt_plugin_path
|
vt_load_plugin $vt_plugin_path
|
||||||
@ -610,16 +850,16 @@ else
|
|||||||
set vtoy_path=($root)/ventoy
|
set vtoy_path=($root)/ventoy
|
||||||
fi
|
fi
|
||||||
|
|
||||||
set iso_path=($vtoy_dev,1)
|
set vtoy_iso_part=($vtoy_dev,1)
|
||||||
set vtoy_efi_part=($vtoy_dev,2)
|
set vtoy_efi_part=($vtoy_dev,2)
|
||||||
loadfont unicode
|
loadfont unicode
|
||||||
set vt_plugin_path=$iso_path
|
set vt_plugin_path=$vtoy_iso_part
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
#Load Plugin
|
#Load Plugin
|
||||||
if [ -f $iso_path/ventoy/ventoy.json ]; then
|
if [ -f $vtoy_iso_part/ventoy/ventoy.json ]; then
|
||||||
vt_load_plugin $iso_path
|
vt_load_plugin $vtoy_iso_part
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$VTOY_MENU_TIMEOUT" ]; then
|
if [ -n "$VTOY_MENU_TIMEOUT" ]; then
|
||||||
@ -628,8 +868,8 @@ else
|
|||||||
unset timeout
|
unset timeout
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -f $iso_path/ventoy/ventoy_wimboot.img ]; then
|
if [ -f $vtoy_iso_part/ventoy/ventoy_wimboot.img ]; then
|
||||||
vt_load_wimboot $iso_path/ventoy/ventoy_wimboot.img
|
vt_load_wimboot $vtoy_iso_part/ventoy/ventoy_wimboot.img
|
||||||
elif [ -f $vtoy_efi_part/ventoy/ventoy_wimboot.img ]; then
|
elif [ -f $vtoy_efi_part/ventoy/ventoy_wimboot.img ]; then
|
||||||
vt_load_wimboot $vtoy_efi_part/ventoy/ventoy_wimboot.img
|
vt_load_wimboot $vtoy_efi_part/ventoy/ventoy_wimboot.img
|
||||||
fi
|
fi
|
||||||
@ -637,10 +877,10 @@ fi
|
|||||||
|
|
||||||
if [ $VTOY_DEFAULT_MENU_MODE -eq 0 ]; then
|
if [ $VTOY_DEFAULT_MENU_MODE -eq 0 ]; then
|
||||||
set VTOY_F3_CMD="vt_dynamic_menu 1 1"
|
set VTOY_F3_CMD="vt_dynamic_menu 1 1"
|
||||||
set VTOY_HOTKEY_TIP="F1:Memdisk F2:Power F3:TreeView F4:Localboot F5:Debug"
|
set VTOY_HOTKEY_TIP="F1:Memdisk F2:Power F3:TreeView F4:Localboot F5:Debug F6:ExMenu"
|
||||||
else
|
else
|
||||||
set VTOY_F3_CMD="vt_dynamic_menu 1 0"
|
set VTOY_F3_CMD="vt_dynamic_menu 1 0"
|
||||||
set VTOY_HOTKEY_TIP="F1:Memdisk F2:Power F3:ListView F4:Localboot F5:Debug"
|
set VTOY_HOTKEY_TIP="F1:Memdisk F2:Power F3:ListView F4:Localboot F5:Debug F6:ExMenu"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
@ -650,21 +890,31 @@ else
|
|||||||
set gfxmode=1920x1080,1366x768,1024x768
|
set gfxmode=1920x1080,1366x768,1024x768
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$vtoy_theme" ]; then
|
|
||||||
set theme=$vtoy_theme
|
|
||||||
else
|
|
||||||
set theme=$prefix/themes/ventoy/theme.txt
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$vtoy_display_mode" = "CLI" ]; then
|
if [ "$vtoy_display_mode" = "CLI" ]; then
|
||||||
terminal_output console
|
terminal_output console
|
||||||
else
|
else
|
||||||
|
if [ -n "$vtoy_theme" ]; then
|
||||||
|
set theme=$vtoy_theme
|
||||||
|
else
|
||||||
|
set theme=$prefix/themes/ventoy/theme.txt
|
||||||
|
fi
|
||||||
terminal_output gfxterm
|
terminal_output gfxterm
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
#export necessary variable
|
||||||
|
export theme
|
||||||
|
export gfxmode
|
||||||
|
export vtoy_dev
|
||||||
|
export vtoy_iso_part
|
||||||
|
export vtoy_efi_part
|
||||||
|
export VENTOY_VERSION
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#colect all image files (iso files)
|
#colect all image files (iso files)
|
||||||
set ventoy_img_count=0
|
set ventoy_img_count=0
|
||||||
vt_list_img $iso_path ventoy_img_count
|
vt_list_img $vtoy_iso_part ventoy_img_count
|
||||||
|
|
||||||
#Main menu
|
#Main menu
|
||||||
if [ $ventoy_img_count -gt 0 ]; then
|
if [ $ventoy_img_count -gt 0 ]; then
|
||||||
|
BIN
INSTALL/grub/i386-pc/acpi.mod
Normal file
BIN
INSTALL/grub/i386-pc/adler32.mod
Normal file
BIN
INSTALL/grub/i386-pc/affs.mod
Normal file
BIN
INSTALL/grub/i386-pc/afs.mod
Normal file
BIN
INSTALL/grub/i386-pc/ahci.mod
Normal file
BIN
INSTALL/grub/i386-pc/aout.mod
Normal file
BIN
INSTALL/grub/i386-pc/archelp.mod
Normal file
BIN
INSTALL/grub/i386-pc/ata.mod
Normal file
BIN
INSTALL/grub/i386-pc/backtrace.mod
Normal file
BIN
INSTALL/grub/i386-pc/bfs.mod
Normal file
BIN
INSTALL/grub/i386-pc/bitmap.mod
Normal file
BIN
INSTALL/grub/i386-pc/bitmap_scale.mod
Normal file
BIN
INSTALL/grub/i386-pc/bsd.mod
Normal file
BIN
INSTALL/grub/i386-pc/bswap_test.mod
Normal file
BIN
INSTALL/grub/i386-pc/btrfs.mod
Normal file
BIN
INSTALL/grub/i386-pc/bufio.mod
Normal file
BIN
INSTALL/grub/i386-pc/cat.mod
Normal file
BIN
INSTALL/grub/i386-pc/cbfs.mod
Normal file
BIN
INSTALL/grub/i386-pc/cbls.mod
Normal file
BIN
INSTALL/grub/i386-pc/cbmemc.mod
Normal file
BIN
INSTALL/grub/i386-pc/cbtable.mod
Normal file
BIN
INSTALL/grub/i386-pc/cbtime.mod
Normal file
BIN
INSTALL/grub/i386-pc/cmdline_cat_test.mod
Normal file
BIN
INSTALL/grub/i386-pc/cmosdump.mod
Normal file
BIN
INSTALL/grub/i386-pc/cmostest.mod
Normal file
BIN
INSTALL/grub/i386-pc/cmp.mod
Normal file
BIN
INSTALL/grub/i386-pc/cmp_test.mod
Normal file
201
INSTALL/grub/i386-pc/command.lst
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
*acpi: acpi
|
||||||
|
*all_functional_test: functional_test
|
||||||
|
*background_image: gfxterm_background
|
||||||
|
*cat: cat
|
||||||
|
*cpuid: cpuid
|
||||||
|
*crc: hashsum
|
||||||
|
*cryptomount: cryptodisk
|
||||||
|
*drivemap: drivemap
|
||||||
|
*echo: echo
|
||||||
|
*extract_syslinux_entries_configfile: syslinuxcfg
|
||||||
|
*extract_syslinux_entries_source: syslinuxcfg
|
||||||
|
*file: file
|
||||||
|
*functional_test: functional_test
|
||||||
|
*gettext: gettext
|
||||||
|
*halt: halt
|
||||||
|
*hashsum: hashsum
|
||||||
|
*hdparm: hdparm
|
||||||
|
*hello: hello
|
||||||
|
*help: help
|
||||||
|
*hexdump: hexdump
|
||||||
|
*inb: iorw
|
||||||
|
*inl: iorw
|
||||||
|
*inw: iorw
|
||||||
|
*keystatus: keystatus
|
||||||
|
*kfreebsd: bsd
|
||||||
|
*knetbsd: bsd
|
||||||
|
*kopenbsd: bsd
|
||||||
|
*list_env: loadenv
|
||||||
|
*load_env: loadenv
|
||||||
|
*loopback: loopback
|
||||||
|
*ls: ls
|
||||||
|
*lsacpi: lsacpi
|
||||||
|
*lspci: lspci
|
||||||
|
*md5sum: hashsum
|
||||||
|
*menuentry: normal
|
||||||
|
*pcidump: pcidump
|
||||||
|
*plan9: plan9
|
||||||
|
*probe: probe
|
||||||
|
*rdmsr: rdmsr
|
||||||
|
*read_byte: memrw
|
||||||
|
*read_dword: memrw
|
||||||
|
*read_word: memrw
|
||||||
|
*regexp: regexp
|
||||||
|
*save_env: loadenv
|
||||||
|
*search: search
|
||||||
|
*sendkey: sendkey
|
||||||
|
*serial: serial
|
||||||
|
*setpci: setpci
|
||||||
|
*sha1sum: hashsum
|
||||||
|
*sha256sum: hashsum
|
||||||
|
*sha512sum: hashsum
|
||||||
|
*sleep: sleep
|
||||||
|
*submenu: normal
|
||||||
|
*syslinux_configfile: syslinuxcfg
|
||||||
|
*syslinux_source: syslinuxcfg
|
||||||
|
*terminfo: terminfo
|
||||||
|
*test_blockarg: test_blockarg
|
||||||
|
*testspeed: testspeed
|
||||||
|
*tr: tr
|
||||||
|
*trust: pgp
|
||||||
|
*verify_detached: pgp
|
||||||
|
*xnu_splash: xnu
|
||||||
|
*zfskey: zfscrypt
|
||||||
|
.: configfile
|
||||||
|
[: test
|
||||||
|
authenticate: normal
|
||||||
|
background_color: gfxterm_background
|
||||||
|
backtrace: backtrace
|
||||||
|
badram: mmap
|
||||||
|
blocklist: blocklist
|
||||||
|
boot: boot
|
||||||
|
break: normal
|
||||||
|
cat: minicmd
|
||||||
|
cbmemc: cbmemc
|
||||||
|
chainloader: chain
|
||||||
|
clear: normal
|
||||||
|
cmosclean: cmostest
|
||||||
|
cmosdump: cmosdump
|
||||||
|
cmosset: cmostest
|
||||||
|
cmostest: cmostest
|
||||||
|
cmp: cmp
|
||||||
|
configfile: configfile
|
||||||
|
continue: normal
|
||||||
|
coreboot_boottime: cbtime
|
||||||
|
cutmem: mmap
|
||||||
|
date: date
|
||||||
|
distrust: pgp
|
||||||
|
dump: minicmd
|
||||||
|
efiemu_loadcore: efiemu
|
||||||
|
efiemu_prepare: efiemu
|
||||||
|
efiemu_unload: efiemu
|
||||||
|
eval: eval
|
||||||
|
exit: minicmd
|
||||||
|
export: normal
|
||||||
|
extract_entries_configfile: configfile
|
||||||
|
extract_entries_source: configfile
|
||||||
|
extract_legacy_entries_configfile: legacycfg
|
||||||
|
extract_legacy_entries_source: legacycfg
|
||||||
|
false: true
|
||||||
|
freedos: freedos
|
||||||
|
gdbstub: gdb
|
||||||
|
gdbstub_break: gdb
|
||||||
|
gdbstub_stop: gdb
|
||||||
|
gptsync: gptsync
|
||||||
|
help: minicmd
|
||||||
|
hexdump_random: random
|
||||||
|
initrd16: linux16
|
||||||
|
initrd: linux
|
||||||
|
keymap: keylayouts
|
||||||
|
kfreebsd_loadenv: bsd
|
||||||
|
kfreebsd_module: bsd
|
||||||
|
kfreebsd_module_elf: bsd
|
||||||
|
knetbsd_module: bsd
|
||||||
|
knetbsd_module_elf: bsd
|
||||||
|
kopenbsd_ramdisk: bsd
|
||||||
|
legacy_check_password: legacycfg
|
||||||
|
legacy_configfile: legacycfg
|
||||||
|
legacy_initrd: legacycfg
|
||||||
|
legacy_initrd_nounzip: legacycfg
|
||||||
|
legacy_kernel: legacycfg
|
||||||
|
legacy_password: legacycfg
|
||||||
|
legacy_source: legacycfg
|
||||||
|
linux16: linux16
|
||||||
|
linux: linux
|
||||||
|
list_trusted: pgp
|
||||||
|
loadfont: font
|
||||||
|
lsapm: lsapm
|
||||||
|
lscoreboot: cbls
|
||||||
|
lsfonts: font
|
||||||
|
lsmmap: lsmmap
|
||||||
|
lsmod: minicmd
|
||||||
|
macppcbless: macbless
|
||||||
|
mactelbless: macbless
|
||||||
|
module2: multiboot2
|
||||||
|
module: multiboot
|
||||||
|
multiboot2: multiboot2
|
||||||
|
multiboot: multiboot
|
||||||
|
nativedisk: nativedisk
|
||||||
|
net_add_addr: net
|
||||||
|
net_add_dns: net
|
||||||
|
net_add_route: net
|
||||||
|
net_bootp: net
|
||||||
|
net_del_addr: net
|
||||||
|
net_del_dns: net
|
||||||
|
net_del_route: net
|
||||||
|
net_dhcp: net
|
||||||
|
net_get_dhcp_option: net
|
||||||
|
net_ipv6_autoconf: net
|
||||||
|
net_ls_addr: net
|
||||||
|
net_ls_cards: net
|
||||||
|
net_ls_dns: net
|
||||||
|
net_ls_routes: net
|
||||||
|
net_nslookup: net
|
||||||
|
normal: normal
|
||||||
|
normal_exit: normal
|
||||||
|
ntldr: ntldr
|
||||||
|
outb: iorw
|
||||||
|
outl: iorw
|
||||||
|
outw: iorw
|
||||||
|
parttool: parttool
|
||||||
|
password: password
|
||||||
|
password_pbkdf2: password_pbkdf2
|
||||||
|
play: play
|
||||||
|
pxechainloader: pxechain
|
||||||
|
read: read
|
||||||
|
reboot: reboot
|
||||||
|
return: normal
|
||||||
|
rmmod: minicmd
|
||||||
|
search.file: search_fs_file
|
||||||
|
search.fs_label: search_label
|
||||||
|
search.fs_uuid: search_fs_uuid
|
||||||
|
setparams: normal
|
||||||
|
shift: normal
|
||||||
|
source: configfile
|
||||||
|
terminal_input: terminal
|
||||||
|
terminal_output: terminal
|
||||||
|
test: test
|
||||||
|
testload: testload
|
||||||
|
time: time
|
||||||
|
true: true
|
||||||
|
truecrypt: truecrypt
|
||||||
|
usb: usbtest
|
||||||
|
vbeinfo: videoinfo
|
||||||
|
vbetest: videotest
|
||||||
|
videoinfo: videoinfo
|
||||||
|
videotest: videotest
|
||||||
|
write_byte: memrw
|
||||||
|
write_dword: memrw
|
||||||
|
write_word: memrw
|
||||||
|
wrmsr: wrmsr
|
||||||
|
xnu_devprop_load: xnu
|
||||||
|
xnu_kernel64: xnu
|
||||||
|
xnu_kernel: xnu
|
||||||
|
xnu_kext: xnu
|
||||||
|
xnu_kextdir: xnu
|
||||||
|
xnu_mkext: xnu
|
||||||
|
xnu_ramdisk: xnu
|
||||||
|
xnu_resume: xnu
|
||||||
|
xnu_uuid: xnu_uuid
|
||||||
|
zfs-bootfs: zfsinfo
|
||||||
|
zfsinfo: zfsinfo
|