diff options
| author | JosJuice <josjuice@gmail.com> | 2017-06-13 15:52:02 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2017-08-01 11:36:40 +0200 |
| commit | 3fd0d39a853ddb677e8dccd045b8ccae38be1429 (patch) | |
| tree | b99c907d4627dbf552a8d02151247384263397a3 /Source/Core/DiscIO/DirectoryBlob.cpp | |
| parent | 09832caf41319c01592bd1d3817a879022032a35 (diff) | |
DirectoryBlob: Write partition headers properly
Diffstat (limited to 'Source/Core/DiscIO/DirectoryBlob.cpp')
| -rw-r--r-- | Source/Core/DiscIO/DirectoryBlob.cpp | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/Source/Core/DiscIO/DirectoryBlob.cpp b/Source/Core/DiscIO/DirectoryBlob.cpp index 5a92d6c88c..ab53bd3af7 100644 --- a/Source/Core/DiscIO/DirectoryBlob.cpp +++ b/Source/Core/DiscIO/DirectoryBlob.cpp @@ -491,7 +491,7 @@ void DirectoryBlobReader::SetPartitions(std::vector<PartitionWithType>&& partiti Write32(static_cast<u32>(partitions[i].type), offset_in_table, &m_partition_table); offset_in_table += 4; - SetTMDAndTicket(partitions[i].partition.GetRootDirectory(), partition_address); + SetPartitionHeader(partitions[i].partition, partition_address); const u64 partition_data_size = partitions[i].partition.GetDataSize(); m_partitions.emplace(partition_address, std::move(partitions[i].partition)); @@ -505,24 +505,49 @@ void DirectoryBlobReader::SetPartitions(std::vector<PartitionWithType>&& partiti m_partition_table.data()); } -void DirectoryBlobReader::SetTMDAndTicket(const std::string& partition_root, u64 partition_address) +// This function sets the header that's shortly before the start of the encrypted +// area, not the header that's right at the beginning of the encrypted area +void DirectoryBlobReader::SetPartitionHeader(const DirectoryBlobPartition& partition, + u64 partition_address) { constexpr u32 TICKET_OFFSET = 0x0; constexpr u32 TICKET_SIZE = 0x2a4; constexpr u32 TMD_OFFSET = 0x2c0; constexpr u32 MAX_TMD_SIZE = 0x49e4; + constexpr u32 H3_OFFSET = 0x4000; + constexpr u32 H3_SIZE = 0x18000; + + const std::string& partition_root = partition.GetRootDirectory(); + AddFileToContents(&m_nonpartition_contents, partition_root + "ticket.bin", partition_address + TICKET_OFFSET, TICKET_SIZE); + const DiscContent& tmd = AddFileToContents(&m_nonpartition_contents, partition_root + "tmd.bin", partition_address + TMD_OFFSET, MAX_TMD_SIZE); - constexpr u32 TMD_HEADER_SIZE = 8; - m_tmd_headers.emplace_back(TMD_HEADER_SIZE); - std::vector<u8>& tmd_header = m_tmd_headers.back(); - Write32(static_cast<u32>(tmd.GetSize()), 0x0, &tmd_header); - Write32(TMD_OFFSET >> 2, 0x4, &tmd_header); - m_nonpartition_contents.emplace(partition_address + TICKET_SIZE, TMD_HEADER_SIZE, - tmd_header.data()); + const u64 cert_offset = Common::AlignUp(TMD_OFFSET + tmd.GetSize(), 0x20ull); + const u64 max_cert_size = H3_OFFSET - cert_offset; + const DiscContent& cert = AddFileToContents(&m_nonpartition_contents, partition_root + "cert.bin", + partition_address + cert_offset, max_cert_size); + + AddFileToContents(&m_nonpartition_contents, partition_root + "h3.bin", + partition_address + H3_OFFSET, H3_SIZE); + + constexpr u32 PARTITION_HEADER_SIZE = 0x1c; + constexpr u32 DATA_OFFSET = 0x20000; + const u64 data_size = Common::AlignUp(partition.GetDataSize(), 0x7c00) / 0x7c00 * 0x8000; + m_partition_headers.emplace_back(PARTITION_HEADER_SIZE); + std::vector<u8>& partition_header = m_partition_headers.back(); + Write32(static_cast<u32>(tmd.GetSize()), 0x0, &partition_header); + Write32(TMD_OFFSET >> 2, 0x4, &partition_header); + Write32(static_cast<u32>(cert.GetSize()), 0x8, &partition_header); + Write32(static_cast<u32>(cert_offset >> 2), 0x0C, &partition_header); + Write32(H3_OFFSET >> 2, 0x10, &partition_header); + Write32(DATA_OFFSET >> 2, 0x14, &partition_header); + Write32(static_cast<u32>(data_size >> 2), 0x18, &partition_header); + + m_nonpartition_contents.emplace(partition_address + TICKET_SIZE, PARTITION_HEADER_SIZE, + partition_header.data()); } DirectoryBlobPartition::DirectoryBlobPartition(const std::string& root_directory, |
