RomFs support
This commit is contained in:
parent
416e5280a6
commit
270033b3f9
8 changed files with 36 additions and 15 deletions
|
@ -45,6 +45,6 @@ JRE/JDK 8u60 or higher.
|
|||
* [ ] CERT support
|
||||
* [ ] CNMT support
|
||||
* [ ] NSO support
|
||||
* [ ] RomFS deep-dive
|
||||
* [x] RomFS
|
||||
* [ ] LogPrinter to singleton implementation.
|
||||
* [x] 'Save to folder' option
|
|
@ -110,7 +110,7 @@ public class MainController implements Initializable {
|
|||
fileChooser.setInitialDirectory(new File(System.getProperty("user.home")));
|
||||
|
||||
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("NS files",
|
||||
"*.nsp", "*.nsz", "*.xci", "*.nca", "*.tik", "*.xml", "*.npdm", "*.romfs"));
|
||||
"*.nsp", "*.nsz", "*.xci", "*.nca", "*.tik", "*.xml", "*.npdm", "*.bin"));
|
||||
|
||||
this.selectedFile = fileChooser.showOpenDialog(analyzeBtn.getScene().getWindow());
|
||||
|
||||
|
@ -156,7 +156,7 @@ public class MainController implements Initializable {
|
|||
case "npdm":
|
||||
tabPane.getSelectionModel().select(5);
|
||||
break;
|
||||
case "romfs":
|
||||
case "bin":
|
||||
tabPane.getSelectionModel().select(6);
|
||||
}
|
||||
}
|
||||
|
@ -185,7 +185,7 @@ public class MainController implements Initializable {
|
|||
case "npdm":
|
||||
NPDMTabController.analyze(selectedFile);
|
||||
break;
|
||||
case "romfs":
|
||||
case "bin":
|
||||
RFSTabController.analyze(selectedFile);
|
||||
}
|
||||
}
|
||||
|
@ -198,7 +198,7 @@ public class MainController implements Initializable {
|
|||
case "tik":
|
||||
case "xml":
|
||||
case "npdm":
|
||||
case "romfs":
|
||||
case "bin":
|
||||
return false;
|
||||
default:
|
||||
return true;
|
||||
|
|
|
@ -147,7 +147,15 @@ public class RomFsController implements ITabController {
|
|||
|
||||
@Override
|
||||
public void analyze(File file) {
|
||||
Task<RomFsDecryptedProvider> analyzer = Analyzer.analyzeRomFS(file);
|
||||
long lv6offset = -1;
|
||||
try{
|
||||
System.out.println(file.getName().replaceAll("(^.*lv6\\s)|(]\\.bin)", ""));
|
||||
lv6offset = Long.parseLong(file.getName().replaceAll("(^.*lv6\\s)|(]\\.bin)", ""));
|
||||
}
|
||||
catch (Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
Task<RomFsDecryptedProvider> analyzer = Analyzer.analyzeRomFS(file, lv6offset);
|
||||
analyzer.setOnSucceeded(e->{
|
||||
RomFsDecryptedProvider provider = analyzer.getValue();
|
||||
this.setData(provider);
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.io.File;
|
|||
import java.io.PipedInputStream;
|
||||
|
||||
public interface IRomFsProvider {
|
||||
long getLevel6Offset();
|
||||
Level6Header getHeader();
|
||||
FileSystemEntry getRootEntry();
|
||||
PipedInputStream getContent(FileSystemEntry entry) throws Exception;
|
||||
|
|
|
@ -23,20 +23,24 @@ import java.io.*;
|
|||
|
||||
public class RomFsDecryptedProvider implements IRomFsProvider{
|
||||
|
||||
private static final long LEVEL_6_DEFAULT_OFFSET = 0x14000; // TODO: FIX incorrect
|
||||
private long level6Offset;
|
||||
|
||||
private File file;
|
||||
private Level6Header header;
|
||||
|
||||
private FileSystemEntry rootEntry;
|
||||
// TODO: FIX. LEVEL 6 OFFSET MUST be provided
|
||||
|
||||
public RomFsDecryptedProvider(File decryptedFsImageFile) throws Exception{ // TODO: add default setup AND using meta-data headers from NCA RomFs section (?)
|
||||
public RomFsDecryptedProvider(File decryptedFsImageFile, long level6Offset) throws Exception{
|
||||
if (level6Offset < 0)
|
||||
throw new Exception("Incorrect Level 6 Offset");
|
||||
|
||||
this.file = decryptedFsImageFile;
|
||||
|
||||
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(decryptedFsImageFile));
|
||||
|
||||
skipBytes(bis, LEVEL_6_DEFAULT_OFFSET);
|
||||
this.level6Offset = level6Offset;
|
||||
|
||||
skipBytes(bis, level6Offset);
|
||||
|
||||
byte[] rawDataChunk = new byte[0x50];
|
||||
|
||||
|
@ -98,6 +102,8 @@ public class RomFsDecryptedProvider implements IRomFsProvider{
|
|||
}
|
||||
}
|
||||
@Override
|
||||
public long getLevel6Offset() { return level6Offset; }
|
||||
@Override
|
||||
public Level6Header getHeader() { return header; }
|
||||
@Override
|
||||
public FileSystemEntry getRootEntry() { return rootEntry; }
|
||||
|
@ -114,7 +120,7 @@ public class RomFsDecryptedProvider implements IRomFsProvider{
|
|||
workerThread = new Thread(() -> {
|
||||
System.out.println("RomFsDecryptedProvider -> getContent(): Executing thread");
|
||||
try {
|
||||
long subFileRealPosition = LEVEL_6_DEFAULT_OFFSET + header.getFileDataOffset() + entry.getFileOffset();
|
||||
long subFileRealPosition = level6Offset + header.getFileDataOffset() + entry.getFileOffset();
|
||||
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
|
||||
skipBytes(bis, subFileRealPosition);
|
||||
|
||||
|
|
|
@ -176,6 +176,8 @@ public class RomFsEncryptedProvider implements IRomFsProvider{
|
|||
return metadataTable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLevel6Offset() { return level6Offset; }
|
||||
@Override
|
||||
public Level6Header getHeader() { return header; }
|
||||
@Override
|
||||
|
|
|
@ -161,14 +161,14 @@ public class Analyzer {
|
|||
};
|
||||
}
|
||||
|
||||
public static Task<RomFsDecryptedProvider> analyzeRomFS(File file){
|
||||
public static Task<RomFsDecryptedProvider> analyzeRomFS(File file, long lv6offset){
|
||||
LogPrinter logPrinter = new LogPrinter();
|
||||
return new Task<RomFsDecryptedProvider>() {
|
||||
@Override
|
||||
protected RomFsDecryptedProvider call() {
|
||||
logPrinter.print("\tStart chain: RomFS", EMsgType.INFO);
|
||||
try {
|
||||
return new RomFsDecryptedProvider(file);
|
||||
return new RomFsDecryptedProvider(file, lv6offset);
|
||||
} catch (Exception e) {
|
||||
logPrinter.print(e.getMessage(), EMsgType.FAIL);
|
||||
return null;
|
||||
|
|
|
@ -26,8 +26,12 @@ public class DumbNCA3ContentExtractor extends Task<Void> {
|
|||
|
||||
@Override
|
||||
protected Void call() {
|
||||
logPrinter.print("\tStart dummy extracting: \n"+filesDestPath+"NCAContent_"+ncaNumberInFile+".bin", EMsgType.INFO);
|
||||
File contentFile = new File(filesDestPath + "NCAContent_"+ncaNumberInFile+".bin");
|
||||
String lv6mark = "";
|
||||
if (ncaContent.getRomfs() != null){
|
||||
lv6mark = " [lv6 "+ncaContent.getRomfs().getLevel6Offset()+"]";
|
||||
}
|
||||
logPrinter.print("\tStart dummy extracting: \n"+filesDestPath+"NCAContent_"+ncaNumberInFile+lv6mark+".bin", EMsgType.INFO);
|
||||
File contentFile = new File(filesDestPath + "NCAContent_"+ncaNumberInFile+lv6mark+".bin");
|
||||
try {
|
||||
BufferedOutputStream extractedFileBOS = new BufferedOutputStream(new FileOutputStream(contentFile));
|
||||
PipedInputStream pis = ncaContent.getRawDataContentPipedInpStream();
|
||||
|
|
Loading…
Reference in a new issue