[nx] Extract structures and consts from AciHeader.h to aci.h

This commit is contained in:
jakcron 2018-04-21 17:20:37 +08:00
parent 69c558923d
commit b81c742e18
3 changed files with 76 additions and 63 deletions

View file

@ -3,6 +3,7 @@
#include <fnd/types.h> #include <fnd/types.h>
#include <fnd/MemoryBlob.h> #include <fnd/MemoryBlob.h>
#include <fnd/ISerialiseableBinary.h> #include <fnd/ISerialiseableBinary.h>
#include <nx/aci.h>
namespace nx namespace nx
{ {
@ -86,61 +87,6 @@ namespace nx
private: private:
const std::string kModuleName = "ACI_HEADER"; const std::string kModuleName = "ACI_HEADER";
const std::string kAciStructSig = "ACI0";
const std::string kAciDescStructSig = "ACID";
static const size_t kAciAlignSize = 0x10;
#pragma pack(push, 1)
struct sAciHeader
{
private:
byte_t signature_[4];
uint32_t size_; // includes prefacing signature, set only in ACID made by SDK (it enables easy resigning)
byte_t reserved_0[4];
uint32_t flags_; // set in ACID only
uint64_t program_id_; // set only in ACI0 (since ACID is generic)
uint64_t program_id_max_;
struct sAciSection
{
private:
uint32_t offset_; // aligned by 0x10 from the last one
uint32_t size_;
public:
uint32_t offset() const { return le_word(offset_); }
void set_offset(uint32_t offset) { offset_ = le_word(offset); }
uint32_t size() const { return le_word(size_); }
void set_size(uint32_t size) { size_ = le_word(size); }
} fac_, sac_, kc_;
public:
const char* signature() const { return (const char*)signature_; }
void set_signature(const char* signature) { memcpy(signature_, signature, 4); }
uint32_t size() const { return le_word(size_); }
void set_size(uint32_t size) { size_ = le_word(size); }
uint32_t flags() const { return le_word(flags_); }
void set_flags(uint32_t flags) { flags_ = le_word(flags); }
uint64_t program_id() const { return le_dword(program_id_); }
void set_program_id(uint64_t program_id) { program_id_ = le_dword(program_id); }
uint64_t program_id_min() const { return program_id(); }
void set_program_id_min(uint64_t program_id) { set_program_id(program_id); }
uint64_t program_id_max() const { return le_dword(program_id_max_); }
void set_program_id_max(uint64_t program_id) { program_id_max_ = le_dword(program_id); }
const sAciSection& fac() const { return fac_; }
sAciSection& fac() { return fac_; }
const sAciSection& sac() const { return sac_; }
sAciSection& sac() { return sac_; }
const sAciSection& kc() const { return kc_; }
sAciSection& kc() { return kc_; }
};
#pragma pack(pop)
// raw data // raw data
fnd::MemoryBlob mBinaryBlob; fnd::MemoryBlob mBinaryBlob;

View file

@ -0,0 +1,67 @@
#pragma once
#include <string>
#include <fnd/types.h>
#include <crypto/aes.h>
#include <crypto/sha.h>
#include <fnd/ISerialiseableBinary.h>
namespace nx
{
namespace aci
{
const std::string kAciStructSig = "ACI0";
const std::string kAciDescStructSig = "ACID";
static const size_t kAciAlignSize = 0x10;
}
#pragma pack(push,1)
struct sAciHeader
{
private:
byte_t signature_[4];
uint32_t size_; // includes prefacing signature, set only in ACID made by SDK (it enables easy resigning)
byte_t reserved_0[4];
uint32_t flags_; // set in ACID only
uint64_t program_id_; // set only in ACI0 (since ACID is generic)
uint64_t program_id_max_;
struct sAciSection
{
private:
uint32_t offset_; // aligned by 0x10 from the last one
uint32_t size_;
public:
uint32_t offset() const { return le_word(offset_); }
void set_offset(uint32_t offset) { offset_ = le_word(offset); }
uint32_t size() const { return le_word(size_); }
void set_size(uint32_t size) { size_ = le_word(size); }
} fac_, sac_, kc_;
public:
const char* signature() const { return (const char*)signature_; }
void set_signature(const char* signature) { memcpy(signature_, signature, 4); }
uint32_t size() const { return le_word(size_); }
void set_size(uint32_t size) { size_ = le_word(size); }
uint32_t flags() const { return le_word(flags_); }
void set_flags(uint32_t flags) { flags_ = le_word(flags); }
uint64_t program_id() const { return le_dword(program_id_); }
void set_program_id(uint64_t program_id) { program_id_ = le_dword(program_id); }
uint64_t program_id_min() const { return program_id(); }
void set_program_id_min(uint64_t program_id) { set_program_id(program_id); }
uint64_t program_id_max() const { return le_dword(program_id_max_); }
void set_program_id_max(uint64_t program_id) { program_id_max_ = le_dword(program_id); }
const sAciSection& fac() const { return fac_; }
sAciSection& fac() { return fac_; }
const sAciSection& sac() const { return sac_; }
sAciSection& sac() { return sac_; }
const sAciSection& kc() const { return kc_; }
sAciSection& kc() { return kc_; }
};
#pragma pack(pop)
}

View file

@ -4,9 +4,9 @@ using namespace nx;
void AciHeader::calculateSectionOffsets() void AciHeader::calculateSectionOffsets()
{ {
mFac.offset = align(mHeaderOffset, kAciAlignSize) + align(sizeof(sAciHeader), kAciAlignSize); mFac.offset = align(mHeaderOffset, aci::kAciAlignSize) + align(sizeof(sAciHeader), aci::kAciAlignSize);
mSac.offset = mFac.offset + align(mFac.size, kAciAlignSize); mSac.offset = mFac.offset + align(mFac.size, aci::kAciAlignSize);
mKc.offset = mSac.offset + align(mSac.size, kAciAlignSize); mKc.offset = mSac.offset + align(mSac.size, aci::kAciAlignSize);
} }
bool AciHeader::isEqual(const AciHeader & other) const bool AciHeader::isEqual(const AciHeader & other) const
@ -87,10 +87,10 @@ void AciHeader::exportBinary()
switch (mType) switch (mType)
{ {
case (TYPE_ACI0): case (TYPE_ACI0):
hdr->set_signature(kAciStructSig.c_str()); hdr->set_signature(aci::kAciStructSig.c_str());
break; break;
case (TYPE_ACID): case (TYPE_ACID):
hdr->set_signature(kAciDescStructSig.c_str()); hdr->set_signature(aci::kAciDescStructSig.c_str());
break; break;
default: default:
throw fnd::Exception(kModuleName, "Unexpected ACI type"); throw fnd::Exception(kModuleName, "Unexpected ACI type");
@ -139,11 +139,11 @@ void AciHeader::importBinary(const byte_t * bytes, size_t len)
sAciHeader* hdr = (sAciHeader*)mBinaryBlob.getBytes(); sAciHeader* hdr = (sAciHeader*)mBinaryBlob.getBytes();
if (memcmp(hdr->signature(), kAciStructSig.c_str(), 4) == 0) if (memcmp(hdr->signature(), aci::kAciStructSig.c_str(), 4) == 0)
{ {
mType = TYPE_ACI0; mType = TYPE_ACI0;
} }
else if (memcmp(hdr->signature(), kAciDescStructSig.c_str(), 4) == 0) else if (memcmp(hdr->signature(), aci::kAciDescStructSig.c_str(), 4) == 0)
{ {
mType = TYPE_ACID; mType = TYPE_ACID;
} }
@ -171,7 +171,7 @@ void AciHeader::importBinary(const byte_t * bytes, size_t len)
} }
// the header offset is the MIN(sac.offset, fac.offset, kc.offset) - sizeof(sHeader) // the header offset is the MIN(sac.offset, fac.offset, kc.offset) - sizeof(sHeader)
mHeaderOffset = MAX(MIN(hdr->sac().offset(), MIN(hdr->fac().offset(), hdr->kc().offset())), align(sizeof(sAciHeader), kAciAlignSize)) - align(sizeof(sAciHeader), kAciAlignSize); mHeaderOffset = MAX(MIN(hdr->sac().offset(), MIN(hdr->fac().offset(), hdr->kc().offset())), align(sizeof(sAciHeader), aci::kAciAlignSize)) - align(sizeof(sAciHeader), aci::kAciAlignSize);
mFac.offset = hdr->fac().offset() - mHeaderOffset; mFac.offset = hdr->fac().offset() - mHeaderOffset;
mFac.size = hdr->fac().size(); mFac.size = hdr->fac().size();