+EFI_STATUS EFIAPI ventoy_block_io_read
+(
+ IN EFI_BLOCK_IO_PROTOCOL *This,
+ IN UINT32 MediaId,
+ IN EFI_LBA Lba,
+ IN UINTN BufferSize,
+ OUT VOID *Buffer
+)
+{
+ UINT32 IoAlign = 0;
+ VOID *NewBuf = NULL;
+ EFI_STATUS Status = EFI_OUT_OF_RESOURCES;
+
+ if (gBlockData.pRawBlockIo && gBlockData.pRawBlockIo->Media)
+ {
+ IoAlign = gBlockData.pRawBlockIo->Media->IoAlign;
+ }
+
+ if ((IoAlign == 0) || (((UINTN) Buffer & (IoAlign - 1)) == 0))
+ {
+ Status = ventoy_block_io_read_real(This, MediaId, Lba, BufferSize, Buffer);
+ }
+ else
+ {
+ NewBuf = AllocatePages(EFI_SIZE_TO_PAGES(BufferSize + IoAlign));
+ if (NewBuf)
+ {
+ Status = ventoy_block_io_read_real(This, MediaId, Lba, BufferSize, NewBuf);
+ CopyMem(Buffer, NewBuf, BufferSize);
+ FreePages(NewBuf, EFI_SIZE_TO_PAGES(BufferSize + IoAlign));
+ }
+ }
+
+ return Status;
+}
+