From 75a280ece5617cb2013f717bd0870955743b3a81 Mon Sep 17 00:00:00 2001 From: Maschell Date: Sun, 20 Dec 2020 11:25:26 +0100 Subject: [PATCH] llow reading disc with an given offset from a bigger file (e.g from a disk dump) --- .../mas/wiiu/jnus/implementations/wud/WUDImage.java | 10 +++++++--- .../implementations/wud/reader/WUDDiscReader.java | 9 ++++++++- .../wud/reader/WUDDiscReaderCompressed.java | 8 ++++---- .../wud/reader/WUDDiscReaderSplitted.java | 11 ++++++----- .../wud/reader/WUDDiscReaderUncompressed.java | 11 +++++++---- 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/main/java/de/mas/wiiu/jnus/implementations/wud/WUDImage.java b/src/main/java/de/mas/wiiu/jnus/implementations/wud/WUDImage.java index 87d0c1d..fc5a872 100644 --- a/src/main/java/de/mas/wiiu/jnus/implementations/wud/WUDImage.java +++ b/src/main/java/de/mas/wiiu/jnus/implementations/wud/WUDImage.java @@ -46,6 +46,10 @@ public class WUDImage { @Getter private final WUDDiscReader WUDDiscReader; public WUDImage(File file) throws IOException { + this(file, 0); + } + + public WUDImage(File file, long readOffset) throws IOException { if (file == null || !file.exists()) { log.info("WUD file is null or does not exist"); System.exit(1); @@ -86,11 +90,11 @@ public class WUDImage { } if (isCompressed()) { - this.WUDDiscReader = new WUDDiscReaderCompressed(this); + this.WUDDiscReader = new WUDDiscReaderCompressed(this, readOffset); } else if (isSplitted()) { - this.WUDDiscReader = new WUDDiscReaderSplitted(this); + this.WUDDiscReader = new WUDDiscReaderSplitted(this, readOffset); } else { - this.WUDDiscReader = new WUDDiscReaderUncompressed(this); + this.WUDDiscReader = new WUDDiscReaderUncompressed(this, readOffset); } fileStream.close(); diff --git a/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReader.java b/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReader.java index 35b1587..3d69d93 100644 --- a/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReader.java +++ b/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReader.java @@ -36,9 +36,16 @@ import lombok.extern.java.Log; @Log public abstract class WUDDiscReader { @Getter private final WUDImage image; - + @Getter private long baseOffset; + public WUDDiscReader(WUDImage image) { + this(image, 0); + } + + public WUDDiscReader(WUDImage image, long baseOffset) { + this.baseOffset = 0; this.image = image; + this.baseOffset = baseOffset; } public byte[] readEncryptedToByteArray(long offset, long fileoffset, long size) throws IOException { diff --git a/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReaderCompressed.java b/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReaderCompressed.java index 381b8ac..036207f 100644 --- a/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReaderCompressed.java +++ b/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReaderCompressed.java @@ -27,8 +27,8 @@ import de.mas.wiiu.jnus.utils.StreamUtils; public class WUDDiscReaderCompressed extends WUDDiscReader { - public WUDDiscReaderCompressed(WUDImage image) { - super(image); + public WUDDiscReaderCompressed(WUDImage image, long baseOffset) { + super(image, baseOffset); } /** @@ -39,9 +39,9 @@ public class WUDDiscReaderCompressed extends WUDDiscReader { // make sure there is no out-of-bounds read WUDImageCompressedInfo info = getImage().getCompressedInfo(); - long fileBytesLeft = info.getUncompressedSize() - offset; + long fileBytesLeft = info.getUncompressedSize() - (offset + getBaseOffset()); - long usedOffset = offset; + long usedOffset = offset + getBaseOffset(); long usedSize = size; if (fileBytesLeft <= 0) { diff --git a/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReaderSplitted.java b/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReaderSplitted.java index 0973ba9..31bb5b6 100644 --- a/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReaderSplitted.java +++ b/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReaderSplitted.java @@ -32,20 +32,21 @@ public class WUDDiscReaderSplitted extends WUDDiscReader { public static long NUMBER_OF_FILES = 12; public static String WUD_SPLITTED_DEFAULT_FILEPATTERN = "game_part%d.wud"; - public WUDDiscReaderSplitted(WUDImage image) { - super(image); + public WUDDiscReaderSplitted(WUDImage image, long baseOffset) { + super(image, baseOffset); } @Override public long readEncryptedToStream(OutputStream outputStream, long offset, long size) throws IOException { - RandomAccessFile input = getFileByOffset(offset); + long newOffset = offset + + this.getBaseOffset(); + RandomAccessFile input = getFileByOffset(newOffset); int bufferSize = 0x8000; byte[] buffer = new byte[bufferSize]; long totalread = 0; - long curOffset = offset; + long curOffset = newOffset; - int part = getFilePartByOffset(offset); + int part = getFilePartByOffset(newOffset); long offsetInFile = getOffsetInFilePart(part, curOffset); do { diff --git a/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReaderUncompressed.java b/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReaderUncompressed.java index ab497b5..c23de7c 100644 --- a/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReaderUncompressed.java +++ b/src/main/java/de/mas/wiiu/jnus/implementations/wud/reader/WUDDiscReaderUncompressed.java @@ -26,8 +26,11 @@ import de.mas.wiiu.jnus.implementations.wud.WUDImage; import de.mas.wiiu.jnus.utils.StreamUtils; public class WUDDiscReaderUncompressed extends WUDDiscReader { - public WUDDiscReaderUncompressed(WUDImage image) { - super(image); + + + public WUDDiscReaderUncompressed(WUDImage image, long baseOffset) { + super(image, baseOffset); + } @Override @@ -35,7 +38,7 @@ public class WUDDiscReaderUncompressed extends WUDDiscReader { FileInputStream input = new FileInputStream(getImage().getFileHandle()); - StreamUtils.skipExactly(input, offset); + StreamUtils.skipExactly(input, offset + this.getBaseOffset()); int bufferSize = 0x8000; byte[] buffer = new byte[bufferSize]; @@ -68,7 +71,7 @@ public class WUDDiscReaderUncompressed extends WUDDiscReader { @Override public InputStream readEncryptedToStream(long offset, long size) throws IOException { FileInputStream input = new FileInputStream(getImage().getFileHandle()); - StreamUtils.skipExactly(input, offset); + StreamUtils.skipExactly(input, offset + this.getBaseOffset()); return input; }