rpcsx/rpcs3/Loader/SELF.h

93 lines
2.1 KiB
C++

#pragma once
#include "Loader.h"
struct SceHeader
{
u32 se_magic;
u32 se_hver;
u16 se_flags;
u16 se_type;
u32 se_meta;
u64 se_hsize;
u64 se_esize;
void Load(vfsStream& f)
{
se_magic = Read32(f);
se_hver = Read32(f);
se_flags = Read16(f);
se_type = Read16(f);
se_meta = Read32(f);
se_hsize = Read64(f);
se_esize = Read64(f);
}
void Show()
{
LOG_NOTICE(LOADER, "Magic: %08x", se_magic);
LOG_NOTICE(LOADER, "Class: %s", "SELF");
LOG_NOTICE(LOADER, "hver: 0x%08x", se_hver);
LOG_NOTICE(LOADER, "flags: 0x%04x", se_flags);
LOG_NOTICE(LOADER, "type: 0x%04x", se_type);
LOG_NOTICE(LOADER, "meta: 0x%08x", se_meta);
LOG_NOTICE(LOADER, "hsize: 0x%llx", se_hsize);
LOG_NOTICE(LOADER, "esize: 0x%llx", se_esize);
}
bool CheckMagic() const { return se_magic == 0x53434500; }
};
struct SelfHeader
{
u64 se_htype;
u64 se_appinfooff;
u64 se_elfoff;
u64 se_phdroff;
u64 se_shdroff;
u64 se_secinfoff;
u64 se_sceveroff;
u64 se_controloff;
u64 se_controlsize;
u64 pad;
void Load(vfsStream& f)
{
se_htype = Read64(f);
se_appinfooff = Read64(f);
se_elfoff = Read64(f);
se_phdroff = Read64(f);
se_shdroff = Read64(f);
se_secinfoff = Read64(f);
se_sceveroff = Read64(f);
se_controloff = Read64(f);
se_controlsize = Read64(f);
pad = Read64(f);
}
void Show()
{
LOG_NOTICE(LOADER, "header type: 0x%llx", se_htype);
LOG_NOTICE(LOADER, "app info offset: 0x%llx", se_appinfooff);
LOG_NOTICE(LOADER, "elf offset: 0x%llx", se_elfoff);
LOG_NOTICE(LOADER, "program header offset: 0x%llx", se_phdroff);
LOG_NOTICE(LOADER, "section header offset: 0x%llx", se_shdroff);
LOG_NOTICE(LOADER, "section info offset: 0x%llx", se_secinfoff);
LOG_NOTICE(LOADER, "sce version offset: 0x%llx", se_sceveroff);
LOG_NOTICE(LOADER, "control info offset: 0x%llx", se_controloff);
LOG_NOTICE(LOADER, "control info size: 0x%llx", se_controlsize);
}
};
class SELFLoader : public LoaderBase
{
vfsStream& self_f;
SceHeader sce_hdr;
SelfHeader self_hdr;
public:
SELFLoader(vfsStream& f);
virtual bool LoadInfo();
virtual bool LoadData(u64 offset = 0);
};