mirror of
				https://github.com/jakcron/nstool.git
				synced 2025-11-04 10:34:53 +00:00 
			
		
		
		
	Merge pull request #87 from jakcron/v1.6-development
Bug fixes for v1.6
This commit is contained in:
		
						commit
						21f8c884f6
					
				
							
								
								
									
										2
									
								
								deps/libpietendo
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
								
							
						
						
									
										2
									
								
								deps/libpietendo
									
									
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -1 +1 @@
 | 
			
		|||
Subproject commit 3c68ffeeb903d286647823ea1676d1cb7ede939b
 | 
			
		||||
Subproject commit 994e70282691fb8cdb9276906500fd873ac51270
 | 
			
		||||
| 
						 | 
				
			
			@ -120,7 +120,7 @@ void nstool::GameCardProcess::importHeader()
 | 
			
		|||
	memcpy(mHdrSignature.data(), hdr_ptr->signature.data(), mHdrSignature.size());
 | 
			
		||||
	
 | 
			
		||||
	// decrypt extended header
 | 
			
		||||
	byte_t xci_header_key_index = hdr_ptr->header.key_flag & 7;
 | 
			
		||||
	byte_t xci_header_key_index = hdr_ptr->header.key_flag & 0xf;
 | 
			
		||||
	if (mKeyCfg.xci_header_key.find(xci_header_key_index) != mKeyCfg.xci_header_key.end())
 | 
			
		||||
	{
 | 
			
		||||
		pie::hac::GameCardUtil::decryptXciHeader(&hdr_ptr->header, mKeyCfg.xci_header_key[xci_header_key_index].data());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ nstool::RomfsProcess::RomfsProcess() :
 | 
			
		|||
 | 
			
		||||
void nstool::RomfsProcess::process()
 | 
			
		||||
{
 | 
			
		||||
	// state checks
 | 
			
		||||
	if (mFile == nullptr)
 | 
			
		||||
	{
 | 
			
		||||
		throw tc::Exception(mModuleName, "No file reader set.");
 | 
			
		||||
| 
						 | 
				
			
			@ -29,8 +30,6 @@ void nstool::RomfsProcess::process()
 | 
			
		|||
		throw tc::NotSupportedException(mModuleName, "Input stream requires read/seek permissions.");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tc::ByteData scratch;
 | 
			
		||||
 | 
			
		||||
	// read base header to determine complete header size
 | 
			
		||||
	if (mFile->length() < tc::io::IOUtil::castSizeToInt64(sizeof(pie::hac::sRomfsHeader)))
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -46,16 +45,42 @@ void nstool::RomfsProcess::process()
 | 
			
		|||
		throw tc::ArgumentOutOfRangeException(mModuleName, "Corrupt RomFs: RomFsHeader is corrupted.");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	fmt::print("RomFsHeader:\n");
 | 
			
		||||
	fmt::print(" > header_size = 0x{:04x}\n", mRomfsHeader.header_size.unwrap());
 | 
			
		||||
	fmt::print(" > dir_hash_bucket\n");
 | 
			
		||||
	fmt::print("   > offset =    0x{:04x}\n", mRomfsHeader.dir_hash_bucket.offset.unwrap());
 | 
			
		||||
	fmt::print("   > size =      0x{:04x}\n", mRomfsHeader.dir_hash_bucket.size.unwrap());
 | 
			
		||||
	fmt::print(" > dir_entry\n");
 | 
			
		||||
	fmt::print("   > offset =    0x{:04x}\n", mRomfsHeader.dir_entry.offset.unwrap());
 | 
			
		||||
	fmt::print("   > size =      0x{:04x}\n", mRomfsHeader.dir_entry.size.unwrap());
 | 
			
		||||
	fmt::print(" > file_hash_bucket\n");
 | 
			
		||||
	fmt::print("   > offset =    0x{:04x}\n", mRomfsHeader.file_hash_bucket.offset.unwrap())
 | 
			
		||||
	fmt::print("   > size =      0x{:04x}\n", mRomfsHeader.file_hash_bucket.size.unwrap());
 | 
			
		||||
	fmt::print(" > file_entry\n");
 | 
			
		||||
	fmt::print("   > offset =    0x{:04x}\n", mRomfsHeader.file_entry.offset.unwrap());
 | 
			
		||||
	fmt::print("   > size =      0x{:04x}\n", mRomfsHeader.file_entry.size.unwrap());
 | 
			
		||||
	fmt::print(" > data_offset = 0x{:04x}\n", mRomfsHeader.data_offset.unwrap());
 | 
			
		||||
	*/
 | 
			
		||||
 | 
			
		||||
	// get dir entry ptr
 | 
			
		||||
	tc::ByteData dir_entry_table = tc::ByteData(tc::io::IOUtil::castInt64ToSize(mRomfsHeader.dir_entry.size.unwrap()));
 | 
			
		||||
	mFile->seek(mRomfsHeader.dir_entry.offset.unwrap(), tc::io::SeekOrigin::Begin);
 | 
			
		||||
	mFile->read(dir_entry_table.data(), dir_entry_table.size());
 | 
			
		||||
	tc::ByteData dir_entry_table = tc::ByteData();
 | 
			
		||||
	if (mRomfsHeader.dir_entry.size.unwrap() > 0)
 | 
			
		||||
	{
 | 
			
		||||
		dir_entry_table = tc::ByteData(tc::io::IOUtil::castInt64ToSize(mRomfsHeader.dir_entry.size.unwrap()));
 | 
			
		||||
		mFile->seek(mRomfsHeader.dir_entry.offset.unwrap(), tc::io::SeekOrigin::Begin);
 | 
			
		||||
		mFile->read(dir_entry_table.data(), dir_entry_table.size());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// get file entry ptr
 | 
			
		||||
	tc::ByteData file_entry_table = tc::ByteData(tc::io::IOUtil::castInt64ToSize(mRomfsHeader.file_entry.size.unwrap()));
 | 
			
		||||
	mFile->seek(mRomfsHeader.file_entry.offset.unwrap(), tc::io::SeekOrigin::Begin);
 | 
			
		||||
	mFile->read(file_entry_table.data(), file_entry_table.size());
 | 
			
		||||
	
 | 
			
		||||
	tc::ByteData file_entry_table = tc::ByteData();
 | 
			
		||||
	if (mRomfsHeader.file_entry.size.unwrap() > 0)
 | 
			
		||||
	{
 | 
			
		||||
		file_entry_table = tc::ByteData(tc::io::IOUtil::castInt64ToSize(mRomfsHeader.file_entry.size.unwrap()));
 | 
			
		||||
		mFile->seek(mRomfsHeader.file_entry.offset.unwrap(), tc::io::SeekOrigin::Begin);
 | 
			
		||||
		mFile->read(file_entry_table.data(), file_entry_table.size());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// count dir num
 | 
			
		||||
	mDirNum = 0;
 | 
			
		||||
	for (uint32_t v_addr = 0; size_t(v_addr) < dir_entry_table.size();)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue