+EFI_STATUS EFIAPI ventoy_wrapper_file_open
+(
+ EFI_FILE_HANDLE This,
+ EFI_FILE_HANDLE *New,
+ CHAR16 *Name,
+ UINT64 Mode,
+ UINT64 Attributes
+)
+{
+ UINT32 i = 0;
+ UINT32 j = 0;
+ UINT64 Sectors = 0;
+ EFI_STATUS Status = EFI_SUCCESS;
+ CHAR8 TmpName[256];
+ ventoy_virt_chunk *virt = NULL;
+
+ Status = g_original_fopen(This, New, Name, Mode, Attributes);
+ if (EFI_ERROR(Status))
+ {
+ return Status;
+ }
+
+ if (g_file_replace_list && g_file_replace_list->magic == GRUB_FILE_REPLACE_MAGIC &&
+ g_file_replace_list->new_file_virtual_id < g_virt_chunk_num)
+ {
+ AsciiSPrint(TmpName, sizeof(TmpName), "%s", Name);
+ for (j = 0; j < 4; j++)
+ {
+ if (0 == AsciiStrCmp(g_file_replace_list[i].old_file_name[j], TmpName))
+ {
+ g_original_fclose(*New);
+ *New = &g_efi_file_replace.WrapperHandle;
+ ventoy_wrapper_file_procotol(*New);
+
+ virt = g_virt_chunk + g_file_replace_list->new_file_virtual_id;
+
+ Sectors = (virt->mem_sector_end - virt->mem_sector_start) + (virt->remap_sector_end - virt->remap_sector_start);
+
+ g_efi_file_replace.BlockIoSectorStart = virt->mem_sector_start;
+ g_efi_file_replace.FileSizeBytes = Sectors * 2048;
+
+ if (gDebugPrint)
+ {
+ debug("## ventoy_wrapper_file_open <%s> BlockStart:%lu Sectors:%lu Bytes:%lu", Name,
+ g_efi_file_replace.BlockIoSectorStart, Sectors, Sectors * 2048);
+ sleep(3);
+ }
+
+ return Status;
+ }
+ }
+ }
+
+ return Status;
+}
+
+EFI_STATUS EFIAPI ventoy_wrapper_open_volume
+(
+ IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
+ OUT EFI_FILE_PROTOCOL **Root
+)
+{
+ EFI_STATUS Status = EFI_SUCCESS;
+
+ Status = g_original_open_volume(This, Root);
+ if (!EFI_ERROR(Status))
+ {
+ g_original_fopen = (*Root)->Open;
+ g_original_fclose = (*Root)->Close;
+ (*Root)->Open = ventoy_wrapper_file_open;
+ }
+
+ return Status;
+}
+
+