mirror of
https://github.com/DarkStore-3DS/Project_CTR.git
synced 2026-07-03 08:49:03 +00:00
Add source code for ctrtool
This commit is contained in:
@@ -0,0 +1,245 @@
|
||||
#include <tc.h>
|
||||
#include <tc/os/UnicodeMain.h>
|
||||
#include "Settings.h"
|
||||
|
||||
#include "ExeFsProcess.h"
|
||||
#include "RomFsProcess.h"
|
||||
#include "IvfcProcess.h"
|
||||
#include "NcchProcess.h"
|
||||
#include "ExHeaderProcess.h"
|
||||
#include "CciProcess.h"
|
||||
#include "CiaProcess.h"
|
||||
#include "LzssProcess.h"
|
||||
#include "CrrProcess.h"
|
||||
#include "FirmProcess.h"
|
||||
|
||||
#include <tc/io/SubStream.h>
|
||||
#include <ntd/n3ds/IvfcStream.h>
|
||||
|
||||
int umain(const std::vector<std::string>& args, const std::vector<std::string>& env)
|
||||
{
|
||||
try
|
||||
{
|
||||
ctrtool::Settings set = ctrtool::SettingsInitializer(args);
|
||||
|
||||
std::shared_ptr<tc::io::IStream> infile_stream = std::make_shared<tc::io::FileStream>(tc::io::FileStream(set.infile.path.get(), tc::io::FileMode::Open, tc::io::FileAccess::Read));
|
||||
|
||||
if (set.infile.filetype == ctrtool::Settings::FILE_TYPE_EXEFS)
|
||||
{
|
||||
ctrtool::ExeFsProcess proc;
|
||||
proc.setInputStream(infile_stream);
|
||||
proc.setCliOutputMode(true, set.exefs.list_fs);
|
||||
proc.setVerboseMode(set.opt.verbose);
|
||||
proc.setVerifyMode(set.opt.verify);
|
||||
proc.setRawMode(set.opt.raw);
|
||||
proc.setDecompressCode(set.exefs.decompress_code_partition);
|
||||
if (set.exefs.extract_path.isSet())
|
||||
{
|
||||
proc.setExtractPath(set.exefs.extract_path.get());
|
||||
}
|
||||
proc.process();
|
||||
}
|
||||
else if (set.infile.filetype == ctrtool::Settings::FILE_TYPE_ROMFS)
|
||||
{
|
||||
ctrtool::RomFsProcess proc;
|
||||
proc.setInputStream(infile_stream);
|
||||
proc.setKeyBag(set.opt.keybag);
|
||||
proc.setCliOutputMode(true, set.romfs.list_fs);
|
||||
proc.setVerboseMode(set.opt.verbose);
|
||||
proc.setVerifyMode(set.opt.verify);
|
||||
if (set.romfs.extract_path.isSet())
|
||||
{
|
||||
proc.setExtractPath(set.romfs.extract_path.get());
|
||||
}
|
||||
proc.process();
|
||||
}
|
||||
else if (set.infile.filetype == ctrtool::Settings::FILE_TYPE_IVFC)
|
||||
{
|
||||
ctrtool::IvfcProcess proc;
|
||||
proc.setInputStream(infile_stream);
|
||||
proc.setKeyBag(set.opt.keybag);
|
||||
proc.setCliOutputMode(true, set.romfs.list_fs);
|
||||
proc.setVerboseMode(set.opt.verbose);
|
||||
proc.setVerifyMode(set.opt.verify);
|
||||
if (set.romfs.extract_path.isSet())
|
||||
{
|
||||
proc.setExtractPath(set.romfs.extract_path.get());
|
||||
}
|
||||
proc.process();
|
||||
}
|
||||
else if (set.infile.filetype == ctrtool::Settings::FILE_TYPE_NCCH)
|
||||
{
|
||||
ctrtool::NcchProcess proc;
|
||||
proc.setInputStream(infile_stream);
|
||||
proc.setKeyBag(set.opt.keybag);
|
||||
proc.setVerboseMode(set.opt.verbose);
|
||||
proc.setVerifyMode(set.opt.verify);
|
||||
proc.setRawMode(set.opt.raw);
|
||||
proc.setPlainMode(set.opt.raw);
|
||||
proc.setShowSyscallName(set.exheader.show_syscalls_as_names);
|
||||
proc.setRegionProcessOutputMode(proc.NcchRegion_Header, true, false, tc::Optional<tc::io::Path>(), tc::Optional<tc::io::Path>());
|
||||
proc.setRegionProcessOutputMode(proc.NcchRegion_ExHeader, true, false, set.ncch.exheader_path, tc::Optional<tc::io::Path>());
|
||||
proc.setRegionProcessOutputMode(proc.NcchRegion_PlainRegion, false, false, set.ncch.plainregion_path, tc::Optional<tc::io::Path>());
|
||||
proc.setRegionProcessOutputMode(proc.NcchRegion_Logo, false, false, set.ncch.logo_path, tc::Optional<tc::io::Path>());
|
||||
proc.setRegionProcessOutputMode(proc.NcchRegion_ExeFs, true, set.exefs.list_fs, set.ncch.exefs_path, set.exefs.extract_path);
|
||||
proc.setRegionProcessOutputMode(proc.NcchRegion_RomFs, true, set.romfs.list_fs, set.ncch.romfs_path, set.romfs.extract_path);
|
||||
proc.process();
|
||||
}
|
||||
else if (set.infile.filetype == ctrtool::Settings::FILE_TYPE_EXHEADER)
|
||||
{
|
||||
ctrtool::ExHeaderProcess proc;
|
||||
proc.setInputStream(infile_stream);
|
||||
proc.setKeyBag(set.opt.keybag);
|
||||
proc.setCliOutputMode(true);
|
||||
proc.setVerboseMode(set.opt.verbose);
|
||||
proc.setVerifyMode(set.opt.verify);
|
||||
proc.setShowSyscallName(set.exheader.show_syscalls_as_names);
|
||||
|
||||
proc.process();
|
||||
}
|
||||
else if (set.infile.filetype == ctrtool::Settings::FILE_TYPE_NCSD)
|
||||
{
|
||||
ctrtool::CciProcess proc;
|
||||
proc.setInputStream(infile_stream);
|
||||
proc.setKeyBag(set.opt.keybag);
|
||||
proc.setCliOutputMode(true, false);
|
||||
proc.setVerboseMode(set.opt.verbose);
|
||||
proc.setVerifyMode(set.opt.verify);
|
||||
if (set.rom.content_extract_path.isSet())
|
||||
proc.setExtractPath(set.rom.content_extract_path.get());
|
||||
proc.setContentIndex(set.rom.content_process_index);
|
||||
proc.setRawMode(set.opt.raw);
|
||||
proc.setPlainMode(set.opt.plain);
|
||||
proc.setShowSyscallName(set.exheader.show_syscalls_as_names);
|
||||
proc.setNcchRegionProcessOutputMode(ctrtool::NcchProcess::NcchRegion_Header, true, false, tc::Optional<tc::io::Path>(), tc::Optional<tc::io::Path>());
|
||||
proc.setNcchRegionProcessOutputMode(ctrtool::NcchProcess::NcchRegion_ExHeader, true, false, set.ncch.exheader_path, tc::Optional<tc::io::Path>());
|
||||
proc.setNcchRegionProcessOutputMode(ctrtool::NcchProcess::NcchRegion_PlainRegion, false, false, set.ncch.plainregion_path, tc::Optional<tc::io::Path>());
|
||||
proc.setNcchRegionProcessOutputMode(ctrtool::NcchProcess::NcchRegion_Logo, false, false, set.ncch.logo_path, tc::Optional<tc::io::Path>());
|
||||
proc.setNcchRegionProcessOutputMode(ctrtool::NcchProcess::NcchRegion_ExeFs, true, set.exefs.list_fs, set.ncch.exefs_path, set.exefs.extract_path);
|
||||
proc.setNcchRegionProcessOutputMode(ctrtool::NcchProcess::NcchRegion_RomFs, true, set.romfs.list_fs, set.ncch.romfs_path, set.romfs.extract_path);
|
||||
proc.process();
|
||||
}
|
||||
else if (set.infile.filetype == ctrtool::Settings::FILE_TYPE_CIA)
|
||||
{
|
||||
ctrtool::CiaProcess proc;
|
||||
proc.setInputStream(infile_stream);
|
||||
proc.setKeyBag(set.opt.keybag);
|
||||
proc.setCliOutputMode(true, false);
|
||||
proc.setVerboseMode(set.opt.verbose);
|
||||
proc.setVerifyMode(set.opt.verify);
|
||||
if (set.rom.content_extract_path.isSet())
|
||||
proc.setContentExtractPath(set.rom.content_extract_path.get());
|
||||
proc.setContentIndex(set.rom.content_process_index);
|
||||
if (set.cia.certs_path.isSet())
|
||||
proc.setCertExtractPath(set.cia.certs_path.get());
|
||||
if (set.cia.tik_path.isSet())
|
||||
proc.setTikExtractPath(set.cia.tik_path.get());
|
||||
if (set.cia.tmd_path.isSet())
|
||||
proc.setTmdExtractPath(set.cia.tmd_path.get());
|
||||
if (set.cia.meta_path.isSet())
|
||||
proc.setFooterExtractPath(set.cia.meta_path.get());
|
||||
proc.setRawMode(set.opt.raw);
|
||||
proc.setPlainMode(set.opt.plain);
|
||||
proc.setShowSyscallName(set.exheader.show_syscalls_as_names);
|
||||
proc.setNcchRegionProcessOutputMode(ctrtool::NcchProcess::NcchRegion_Header, true, false, tc::Optional<tc::io::Path>(), tc::Optional<tc::io::Path>());
|
||||
proc.setNcchRegionProcessOutputMode(ctrtool::NcchProcess::NcchRegion_ExHeader, true, false, set.ncch.exheader_path, tc::Optional<tc::io::Path>());
|
||||
proc.setNcchRegionProcessOutputMode(ctrtool::NcchProcess::NcchRegion_PlainRegion, false, false, set.ncch.plainregion_path, tc::Optional<tc::io::Path>());
|
||||
proc.setNcchRegionProcessOutputMode(ctrtool::NcchProcess::NcchRegion_Logo, false, false, set.ncch.logo_path, tc::Optional<tc::io::Path>());
|
||||
proc.setNcchRegionProcessOutputMode(ctrtool::NcchProcess::NcchRegion_ExeFs, true, set.exefs.list_fs, set.ncch.exefs_path, set.exefs.extract_path);
|
||||
proc.setNcchRegionProcessOutputMode(ctrtool::NcchProcess::NcchRegion_RomFs, true, set.romfs.list_fs, set.ncch.romfs_path, set.romfs.extract_path);
|
||||
proc.process();
|
||||
}
|
||||
else if (set.infile.filetype == ctrtool::Settings::FILE_TYPE_LZSS)
|
||||
{
|
||||
ctrtool::LzssProcess proc;
|
||||
proc.setInputStream(infile_stream);
|
||||
if (set.lzss.extract_path.isSet())
|
||||
proc.setExtractPath(set.lzss.extract_path.get());
|
||||
proc.process();
|
||||
}
|
||||
else if (set.infile.filetype == ctrtool::Settings::FILE_TYPE_CRR)
|
||||
{
|
||||
ctrtool::CrrProcess proc;
|
||||
proc.setInputStream(infile_stream);
|
||||
proc.setKeyBag(set.opt.keybag);
|
||||
proc.setCliOutputMode(true);
|
||||
proc.setVerboseMode(set.opt.verbose);
|
||||
proc.setVerifyMode(set.opt.verify);
|
||||
proc.process();
|
||||
}
|
||||
else if (set.infile.filetype == ctrtool::Settings::FILE_TYPE_FIRM)
|
||||
{
|
||||
ctrtool::FirmProcess proc;
|
||||
proc.setInputStream(infile_stream);
|
||||
proc.setKeyBag(set.opt.keybag);
|
||||
proc.setCliOutputMode(true);
|
||||
proc.setVerboseMode(set.opt.verbose);
|
||||
proc.setVerifyMode(set.opt.verify);
|
||||
if (set.firm.extract_path.isSet())
|
||||
{
|
||||
proc.setExtractPath(set.firm.extract_path.get());
|
||||
}
|
||||
proc.setFirmwareType(set.firm.firm_type);
|
||||
proc.process();
|
||||
}
|
||||
|
||||
switch (set.infile.filetype)
|
||||
{
|
||||
case ctrtool::Settings::FILE_TYPE_NCSD :
|
||||
fmt::print("## FILE_TYPE_NCSD ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_CIA :
|
||||
fmt::print("## FILE_TYPE_CIA ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_NCCH :
|
||||
fmt::print("## FILE_TYPE_NCCH ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_EXHEADER :
|
||||
fmt::print("## FILE_TYPE_EXHEADER ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_EXEFS :
|
||||
fmt::print("## FILE_TYPE_EXEFS ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_ROMFS :
|
||||
fmt::print("## FILE_TYPE_ROMFS ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_FIRM :
|
||||
fmt::print("## FILE_TYPE_FIRM ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_CERT :
|
||||
fmt::print("## FILE_TYPE_CERT ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_TIK :
|
||||
fmt::print("## FILE_TYPE_TIK ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_TMD :
|
||||
fmt::print("## FILE_TYPE_TMD ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_LZSS :
|
||||
fmt::print("## FILE_TYPE_LZSS ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_CRR :
|
||||
fmt::print("## FILE_TYPE_CRR ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_CRO :
|
||||
fmt::print("## FILE_TYPE_CRO ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_IVFC :
|
||||
fmt::print("## FILE_TYPE_IVFC ##\n");
|
||||
break;
|
||||
case ctrtool::Settings::FILE_TYPE_SMDH :
|
||||
fmt::print("## FILE_TYPE_SMDH ##\n");
|
||||
break;
|
||||
default:
|
||||
fmt::print("## unknown({}) ##\n", (int)set.infile.filetype);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
catch (tc::Exception& e)
|
||||
{
|
||||
fmt::print("[{0}{1}ERROR] {2}\n", e.module(), (strlen(e.module()) != 0 ? " ": ""), e.error());
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user