@ -37,9 +37,6 @@
# include <Protocol/DriverBinding.h>
# include <Ventoy.h>
# 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,7 +1478,15 @@ 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 ;
}
@ -1419,6 +1507,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 ) ;
@ -1449,7 +1538,7 @@ STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open
{
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 +1564,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 +1583,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 ;