X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/3c46432d6f4ae95d144373511b6887f6c0f3be90..a29bdfbc3cb8967f182882bceec22d96dbf83fca:/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 004c83f..cdc75ab 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 @@ -36,8 +36,10 @@ #include #include +UINT8 *g_iso_data_buf = NULL; UINTN g_iso_buf_size = 0; BOOLEAN gMemdiskMode = FALSE; +BOOLEAN gSector512Mode = FALSE; ventoy_sector_flag *g_sector_flag = NULL; UINT32 g_sector_flag_num = 0; @@ -67,6 +69,9 @@ STATIC EFI_INPUT_READ_KEY g_org_read_key = NULL; STATIC EFI_LOCATE_HANDLE g_org_locate_handle = NULL; +STATIC UINT8 g_sector_buf[2048]; +STATIC EFI_BLOCK_READ g_sector_2048_read = NULL; + BOOLEAN ventoy_is_cdrom_dp_exist(VOID) { UINTN i = 0; @@ -254,7 +259,7 @@ EFI_STATUS EFIAPI ventoy_block_io_ramdisk_read (VOID)This; (VOID)MediaId; - CopyMem(Buffer, (char *)g_chain + (Lba * 2048), BufferSize); + CopyMem(Buffer, g_iso_data_buf + (Lba * 2048), BufferSize); if (g_blockio_start_record_bcd && FALSE == g_blockio_bcd_read_done) { @@ -570,6 +575,64 @@ end: return Status; } +EFI_STATUS EFIAPI ventoy_block_io_read_512 +( + IN EFI_BLOCK_IO_PROTOCOL *This, + IN UINT32 MediaId, + IN EFI_LBA Lba, + IN UINTN BufferSize, + OUT VOID *Buffer +) +{ + EFI_LBA Mod; + UINTN ReadSize; + UINT8 *CurBuf = NULL; + EFI_STATUS Status = EFI_SUCCESS; + + debug("ventoy_block_io_read_512 %lu %lu\n", Lba, BufferSize / 512); + + CurBuf = (UINT8 *)Buffer; + + Mod = Lba % 4; + if (Mod > 0) + { + Status |= g_sector_2048_read(This, MediaId, Lba / 4, 2048, g_sector_buf); + + if (BufferSize <= (4 - Mod) * 512) + { + CopyMem(CurBuf, g_sector_buf + Mod * 512, BufferSize); + return EFI_SUCCESS; + } + else + { + ReadSize = (4 - Mod) * 512; + CopyMem(CurBuf, g_sector_buf + Mod * 512, ReadSize); + CurBuf += ReadSize; + Lba += (4 - Mod); + BufferSize -= ReadSize; + } + } + + if (BufferSize >= 2048) + { + ReadSize = BufferSize / 2048 * 2048; + + Status |= g_sector_2048_read(This, MediaId, Lba / 4, ReadSize, CurBuf); + CurBuf += ReadSize; + + Lba += ReadSize / 512; + BufferSize -= ReadSize; + } + + if (BufferSize > 0) + { + Status |= g_sector_2048_read(This, MediaId, Lba / 4, 2048, g_sector_buf); + CopyMem(CurBuf, g_sector_buf, BufferSize); + } + + return Status; +} + EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 ImgSize) { EFI_STATUS Status = EFI_SUCCESS; @@ -579,9 +642,18 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im debug("install block io protocol %p", ImageHandle); ventoy_debug_pause(); + + if (gSector512Mode) + { + gBlockData.Media.BlockSize = 512; + gBlockData.Media.LastBlock = ImgSize / 512 - 1; + } + else + { + gBlockData.Media.BlockSize = 2048; + gBlockData.Media.LastBlock = ImgSize / 2048 - 1; + } - gBlockData.Media.BlockSize = 2048; - gBlockData.Media.LastBlock = ImgSize / 2048 - 1; gBlockData.Media.ReadOnly = TRUE; gBlockData.Media.MediaPresent = 1; gBlockData.Media.LogicalBlocksPerPhysicalBlock = 1; @@ -589,7 +661,17 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im pBlockIo->Revision = EFI_BLOCK_IO_PROTOCOL_REVISION3; pBlockIo->Media = &(gBlockData.Media); pBlockIo->Reset = ventoy_block_io_reset; - pBlockIo->ReadBlocks = gMemdiskMode ? ventoy_block_io_ramdisk_read : ventoy_block_io_read; + + if (gSector512Mode) + { + g_sector_2048_read = gMemdiskMode ? ventoy_block_io_ramdisk_read : ventoy_block_io_read; + pBlockIo->ReadBlocks = ventoy_block_io_read_512; + } + else + { + pBlockIo->ReadBlocks = gMemdiskMode ? ventoy_block_io_ramdisk_read : ventoy_block_io_read; + } + pBlockIo->WriteBlocks = ventoy_block_io_write; pBlockIo->FlushBlocks = ventoy_block_io_flush; @@ -602,10 +684,10 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im { return Status; } - + Status = ventoy_connect_driver(gBlockData.Handle, L"Disk I/O Driver"); debug("Connect disk IO driver %r", Status); - + Status = ventoy_connect_driver(gBlockData.Handle, L"Partition Driver"); debug("Connect partition driver %r", Status); if (EFI_ERROR(Status))