X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/9b14b418b47f05daa951e134badb3f1a638741c7..2991f097fb98cfaf1a0ebd5048fc0e8bc08aa20d:/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c index 941575d..c0c1fc3 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c @@ -37,9 +37,6 @@ #include #include -#define ASSIGN_REPLACE(This, replace) \ - replace = (This->FlushEx == ventoy_wrapper_file_flush_ex) ? &g_efi_file_replace : &g_img_file_replace - UINT8 *g_iso_data_buf = NULL; UINTN g_iso_buf_size = 0; BOOLEAN gMemdiskMode = FALSE; @@ -1251,13 +1248,96 @@ ventoy_wrapper_file_flush_ex(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token) /* Ex version */ STATIC EFI_STATUS EFIAPI -ventoy_wrapper_file_flush_ex_img(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token) +ventoy_wrapper_file_flush_ex_img0(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token) +{ + (VOID)This; + (VOID)Token; + return EFI_SUCCESS; +} +/* Ex version */ +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_flush_ex_img1(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token) { (VOID)This; (VOID)Token; return EFI_SUCCESS; } +#define DEF_WRAP_FUNC(n) \ +STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_flush_ex_img#n(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token) \ +{\ + (VOID)This;\ + (VOID)Token;\ + return EFI_SUCCESS;\ +} + +#define ITEM_WRAP_FUNC(n) ventoy_wrapper_file_flush_ex_img#n + +#if (VTOY_MAX_CONF_REPLACE > 2) +DEF_WRAP_FUNC(2); +#endif +#if (VTOY_MAX_CONF_REPLACE > 3) +DEF_WRAP_FUNC(3); +#endif +#if (VTOY_MAX_CONF_REPLACE > 4) +DEF_WRAP_FUNC(4); +#endif +#if (VTOY_MAX_CONF_REPLACE > 5) +DEF_WRAP_FUNC(5); +#endif +#if (VTOY_MAX_CONF_REPLACE > 6) +DEF_WRAP_FUNC(6); +#endif +#if (VTOY_MAX_CONF_REPLACE > 7) +DEF_WRAP_FUNC(7); +#endif +#if (VTOY_MAX_CONF_REPLACE > 8) +#error "VTOY_MAX_CONF_REPLACE overflow" +#endif + +static EFI_FILE_FLUSH_EX g_img_flush_func[VTOY_MAX_CONF_REPLACE] = +{ + ventoy_wrapper_file_flush_ex_img0, + ventoy_wrapper_file_flush_ex_img1, +#if (VTOY_MAX_CONF_REPLACE > 2) + ITEM_WRAP_FUNC(2), +#endif +#if (VTOY_MAX_CONF_REPLACE > 3) + ITEM_WRAP_FUNC(3), +#endif +#if (VTOY_MAX_CONF_REPLACE > 4) + ITEM_WRAP_FUNC(4), +#endif +#if (VTOY_MAX_CONF_REPLACE > 5) + ITEM_WRAP_FUNC(5), +#endif +#if (VTOY_MAX_CONF_REPLACE > 6) + ITEM_WRAP_FUNC(6), +#endif +#if (VTOY_MAX_CONF_REPLACE > 7) + ITEM_WRAP_FUNC(7), +#endif +}; + +STATIC ventoy_efi_file_replace *ventoy_wrapper_get_replace(EFI_FILE_HANDLE This) +{ + UINTN i; + + if (This->FlushEx == ventoy_wrapper_file_flush_ex) + { + return &g_efi_file_replace; + } + + for (i = 0; i < VTOY_MAX_CONF_REPLACE; i++) + { + if (This->FlushEx == g_img_flush_func[i]) + { + return g_img_file_replace + i; + } + } + + return NULL; +} STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_write(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data) @@ -1288,7 +1368,7 @@ ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position) { ventoy_efi_file_replace *replace = NULL; - ASSIGN_REPLACE(This, replace); + replace = ventoy_wrapper_get_replace(This); if (Position <= replace->FileSizeBytes) { @@ -1307,7 +1387,7 @@ ventoy_wrapper_file_get_pos(EFI_FILE_HANDLE This, UINT64 *Position) { ventoy_efi_file_replace *replace = NULL; - ASSIGN_REPLACE(This, replace); + replace = ventoy_wrapper_get_replace(This); *Position = replace->CurPos; @@ -1321,7 +1401,7 @@ ventoy_wrapper_file_get_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN *Len, V EFI_FILE_INFO *Info = (EFI_FILE_INFO *) Data; ventoy_efi_file_replace *replace = NULL; - ASSIGN_REPLACE(This, replace); + replace = ventoy_wrapper_get_replace(This); debug("ventoy_wrapper_file_get_info ... %u", *Len); @@ -1356,7 +1436,7 @@ ventoy_wrapper_file_read(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data) UINTN ReadLen = *Len; ventoy_efi_file_replace *replace = NULL; - ASSIGN_REPLACE(This, replace); + replace = ventoy_wrapper_get_replace(This); debug("ventoy_wrapper_file_read ... %u", *Len); @@ -1382,7 +1462,7 @@ ventoy_wrapper_file_read_ex(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN return ventoy_wrapper_file_read(This, &(Token->BufferSize), Token->Buffer); } -STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File, BOOLEAN Img) +STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File, BOOLEAN Img, UINTN Index) { File->Revision = EFI_FILE_PROTOCOL_REVISION2; File->Open = ventoy_wrapper_fs_open; @@ -1398,11 +1478,47 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File, B File->OpenEx = ventoy_wrapper_file_open_ex; File->ReadEx = ventoy_wrapper_file_read_ex; File->WriteEx = ventoy_wrapper_file_write_ex; - File->FlushEx = Img ? ventoy_wrapper_file_flush_ex_img : ventoy_wrapper_file_flush_ex; + + if (Img) + { + File->FlushEx = g_img_flush_func[Index]; + } + else + { + File->FlushEx = ventoy_wrapper_file_flush_ex; + } return EFI_SUCCESS; } +STATIC BOOLEAN EFIAPI ventoy_replace_name_match(CHAR8 *pReplace, CHAR8 *pName) +{ + UINTN Len1, Len2; + + Len1 = AsciiStrLen(pReplace); + Len2 = AsciiStrLen(pName); + + if (Len1 == 0 || Len2 == 0) + { + return FALSE; + } + + if (0 == AsciiStriCmp(pReplace, pName)) + { + return TRUE; + } + + if (Len1 > 2 && Len2 > 2) + { + if ((pReplace[0] != '\\') && (pName[0] == '\\') && (0 == AsciiStriCmp(pReplace, pName + 1))) + { + return TRUE; + } + } + + return FALSE; +} + STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open ( EFI_FILE_HANDLE This, @@ -1419,6 +1535,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open CHAR8 TmpName[256]; CHAR8 OldName[256]; ventoy_virt_chunk *virt = NULL; + ventoy_grub_param_file_replace *replace = NULL; debug("## ventoy_wrapper_file_open <%s> ", Name); @@ -1445,11 +1562,11 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open AsciiSPrint(TmpName, sizeof(TmpName), "%s", Name); for (j = 0; j < 4; j++) { - if (0 == AsciiStriCmp(g_file_replace_list[i].old_file_name[j], TmpName)) + if (ventoy_replace_name_match(g_file_replace_list[i].old_file_name[j], TmpName)) { g_original_fclose(*New); *New = &g_efi_file_replace.WrapperHandle; - ventoy_wrapper_file_procotol(*New, FALSE); + ventoy_wrapper_file_procotol(*New, FALSE, 0); virt = g_virt_chunk + g_file_replace_list->new_file_virtual_id; @@ -1475,15 +1592,18 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open } } - - - if (g_img_replace_list && g_img_replace_list->magic == GRUB_IMG_REPLACE_MAGIC && - g_img_replace_list->new_file_virtual_id < g_virt_chunk_num) + for (i = 0; g_img_replace_list && i < VTOY_MAX_CONF_REPLACE; i++) { + replace = g_img_replace_list + i; + if (replace->magic != GRUB_IMG_REPLACE_MAGIC || replace->new_file_virtual_id >= g_virt_chunk_num) + { + continue; + } + AsciiSPrint(TmpName, sizeof(TmpName), "%s", Name); - for (j = 0; j < g_img_replace_list->old_file_cnt; j++) + for (j = 0; j < replace->old_file_cnt; j++) { - AsciiStrCpyS(OldName, sizeof(OldName), g_img_replace_list[i].old_file_name[j]); + AsciiStrCpyS(OldName, sizeof(OldName), replace->old_file_name[j]); if ((0 == AsciiStrCmp(OldName, TmpName)) || (AsciiStrnCmp(OldName, "\\loader\\entries\\", 16) == 0 && AsciiStrCmp(OldName + 16, TmpName) == 0 @@ -1491,31 +1611,31 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open ) { g_original_fclose(*New); - *New = &g_img_file_replace.WrapperHandle; - ventoy_wrapper_file_procotol(*New, TRUE); + *New = &(g_img_file_replace[i].WrapperHandle); + ventoy_wrapper_file_procotol(*New, TRUE, i); - virt = g_virt_chunk + g_img_replace_list->new_file_virtual_id; + virt = g_virt_chunk + replace->new_file_virtual_id; Sectors = (virt->mem_sector_end - virt->mem_sector_start) + (virt->remap_sector_end - virt->remap_sector_start); - g_img_file_replace.BlockIoSectorStart = virt->mem_sector_start; - g_img_file_replace.FileSizeBytes = Sectors * 2048; + g_img_file_replace[i].BlockIoSectorStart = virt->mem_sector_start; + g_img_file_replace[i].FileSizeBytes = Sectors * 2048; if (gDebugPrint) { debug("## ventoy_wrapper_file_open2 <%s> BlockStart:%lu Sectors:%lu Bytes:%lu", Name, - g_img_file_replace.BlockIoSectorStart, Sectors, Sectors * 2048); + g_img_file_replace[i].BlockIoSectorStart, Sectors, Sectors * 2048); sleep(3); } return Status; } } + } - if (StrCmp(Name, L"\\loader\\entries") == 0) - { - (*New)->Open = ventoy_wrapper_file_open; - } + if (g_img_replace_list && StrCmp(Name, L"\\loader\\entries") == 0) + { + (*New)->Open = ventoy_wrapper_file_open; } return Status;