mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2024-12-29 11:06:07 +00:00
started work on elf class
This commit is contained in:
parent
1290756b3d
commit
9c3e9b3bef
90
emulator/Core/FsFile.cpp
Normal file
90
emulator/Core/FsFile.cpp
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
#include "FsFile.h"
|
||||||
|
|
||||||
|
FsFile::FsFile()
|
||||||
|
{
|
||||||
|
m_file = nullptr;
|
||||||
|
}
|
||||||
|
FsFile::FsFile(const std::string& path, fsOpenMode mode)
|
||||||
|
{
|
||||||
|
Open(path, mode);
|
||||||
|
}
|
||||||
|
bool FsFile::Open(const std::string& path, fsOpenMode mode)
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
fopen_s(&m_file, path.c_str(), getOpenMode(mode));
|
||||||
|
return IsOpen();
|
||||||
|
}
|
||||||
|
bool FsFile::Close()
|
||||||
|
{
|
||||||
|
if (!IsOpen() || std::fclose(m_file) != 0) {
|
||||||
|
m_file = nullptr;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_file = nullptr;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
FsFile::~FsFile()
|
||||||
|
{
|
||||||
|
Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FsFile::Write(const void* src, u64 size)
|
||||||
|
{
|
||||||
|
if (!IsOpen() || std::fwrite(src, 1, size, m_file) != size) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FsFile::Read(void* dst, u64 size)
|
||||||
|
{
|
||||||
|
if (!IsOpen() || std::fread(dst, 1, size, m_file) != size) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 FsFile::ReadBytes(void* dst, u64 size)
|
||||||
|
{
|
||||||
|
return std::fread(dst, 1, size, m_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FsFile::Seek(s64 offset, fsSeekMode mode)
|
||||||
|
{
|
||||||
|
if (!IsOpen() || _fseeki64(m_file, offset, getSeekMode(mode)) != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 FsFile::Tell() const
|
||||||
|
{
|
||||||
|
if (IsOpen()) {
|
||||||
|
return _ftelli64(m_file);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
u64 FsFile::getFileSize()
|
||||||
|
{
|
||||||
|
u64 pos = _ftelli64(m_file);
|
||||||
|
if (_fseeki64(m_file, 0, SEEK_END) != 0) {
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
u64 size = _ftelli64(m_file);
|
||||||
|
if (_fseeki64(m_file, pos, SEEK_SET) != 0) {
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FsFile::IsOpen() const
|
||||||
|
{
|
||||||
|
return m_file != nullptr;
|
||||||
|
}
|
||||||
|
|
63
emulator/Core/FsFile.h
Normal file
63
emulator/Core/FsFile.h
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
#pragma once
|
||||||
|
#include <cstdio>
|
||||||
|
#include <string>
|
||||||
|
#include "../Types.h"
|
||||||
|
|
||||||
|
enum fsOpenMode
|
||||||
|
{
|
||||||
|
fsRead = 0x1,
|
||||||
|
fsWrite = 0x2,
|
||||||
|
fsReadWrite = fsRead | fsWrite
|
||||||
|
};
|
||||||
|
|
||||||
|
enum fsSeekMode
|
||||||
|
{
|
||||||
|
fsSeekSet,
|
||||||
|
fsSeekCur,
|
||||||
|
fsSeekEnd,
|
||||||
|
};
|
||||||
|
|
||||||
|
class FsFile
|
||||||
|
{
|
||||||
|
std::FILE* m_file;
|
||||||
|
public:
|
||||||
|
FsFile();
|
||||||
|
FsFile(const std::string& path, fsOpenMode mode = fsRead);
|
||||||
|
bool Open(const std::string& path, fsOpenMode mode = fsRead);
|
||||||
|
bool IsOpen() const;
|
||||||
|
bool Close();
|
||||||
|
bool Read(void* dst, u64 size);
|
||||||
|
u32 ReadBytes(void* dst, u64 size);
|
||||||
|
bool Write(const void* src, u64 size);
|
||||||
|
bool Seek(s64 offset, fsSeekMode mode);
|
||||||
|
u64 getFileSize();
|
||||||
|
u64 Tell() const;
|
||||||
|
~FsFile();
|
||||||
|
|
||||||
|
const char* getOpenMode(fsOpenMode mode)
|
||||||
|
{
|
||||||
|
switch (mode) {
|
||||||
|
case fsRead: return "rb";
|
||||||
|
case fsWrite: return "wb";
|
||||||
|
case fsReadWrite: return "r+b";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "r";
|
||||||
|
}
|
||||||
|
|
||||||
|
const int getSeekMode(fsSeekMode mode)
|
||||||
|
{
|
||||||
|
switch (mode) {
|
||||||
|
case fsSeekSet: return SEEK_SET;
|
||||||
|
case fsSeekCur: return SEEK_CUR;
|
||||||
|
case fsSeekEnd: return SEEK_END;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SEEK_SET;
|
||||||
|
}
|
||||||
|
std::FILE* fileDescr()
|
||||||
|
{
|
||||||
|
return m_file;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
19
emulator/Loader/Elf.cpp
Normal file
19
emulator/Loader/Elf.cpp
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#include "Elf.h"
|
||||||
|
|
||||||
|
|
||||||
|
static self_header* load_self(FsFile& f)
|
||||||
|
{
|
||||||
|
//read self header
|
||||||
|
auto* self = new self_header;
|
||||||
|
f.Read(self, sizeof(self_header));
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Elf::Open(const std::string& file_name)
|
||||||
|
{
|
||||||
|
m_f = new FsFile;
|
||||||
|
m_f->Open(file_name, fsOpenMode::fsRead);
|
||||||
|
|
||||||
|
m_self = load_self(*m_f);
|
||||||
|
|
||||||
|
}
|
44
emulator/Loader/Elf.h
Normal file
44
emulator/Loader/Elf.h
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#pragma once
|
||||||
|
#include <string>
|
||||||
|
#include "../types.h"
|
||||||
|
#include "../Core/FsFile.h"
|
||||||
|
|
||||||
|
struct self_header
|
||||||
|
{
|
||||||
|
static const u32 signature = 0x1D3D154Fu;
|
||||||
|
|
||||||
|
u32 magic;
|
||||||
|
u08 version;
|
||||||
|
u08 mode;
|
||||||
|
u08 endian;// 1 is little endian
|
||||||
|
u08 attributes;
|
||||||
|
u08 category;
|
||||||
|
u08 program_type;
|
||||||
|
u16 padding1;
|
||||||
|
u16 header_size;
|
||||||
|
u16 meta_size;
|
||||||
|
u32 file_size;
|
||||||
|
u32 padding2;
|
||||||
|
u16 segment_count;
|
||||||
|
u16 unknown1A; //always 0x22
|
||||||
|
u32 padding3;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct self_segment_header
|
||||||
|
{
|
||||||
|
u64 flags;
|
||||||
|
u64 offset;
|
||||||
|
u64 encrypted_compressed_size;
|
||||||
|
u64 decrypted_decompressed_size;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Elf
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void Open(const std::string & file_name);
|
||||||
|
|
||||||
|
private:
|
||||||
|
FsFile* m_f = nullptr;
|
||||||
|
self_header* m_self = nullptr;
|
||||||
|
};
|
||||||
|
|
|
@ -133,9 +133,13 @@
|
||||||
</Link>
|
</Link>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClCompile Include="Core\FsFile.cpp" />
|
||||||
|
<ClCompile Include="Loader\Elf.cpp" />
|
||||||
<ClCompile Include="main.cpp" />
|
<ClCompile Include="main.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ClInclude Include="Core\FsFile.h" />
|
||||||
|
<ClInclude Include="Loader\Elf.h" />
|
||||||
<ClInclude Include="types.h" />
|
<ClInclude Include="types.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
|
|
@ -13,15 +13,33 @@
|
||||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="FileFormat">
|
||||||
|
<UniqueIdentifier>{6c59bbae-9b2e-454e-bfcf-44d9344c23cd}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Core">
|
||||||
|
<UniqueIdentifier>{9c8991bf-e512-441a-97d7-04da356ec70e}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="main.cpp">
|
<ClCompile Include="main.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="Loader\Elf.cpp">
|
||||||
|
<Filter>FileFormat</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Core\FsFile.cpp">
|
||||||
|
<Filter>Core</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="types.h">
|
<ClInclude Include="types.h">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="Loader\Elf.h">
|
||||||
|
<Filter>FileFormat</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Core\FsFile.h">
|
||||||
|
<Filter>Core</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
|
@ -1,43 +1,17 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <corecrt_malloc.h>
|
#include <corecrt_malloc.h>
|
||||||
|
#include "Loader/Elf.h"
|
||||||
|
|
||||||
#pragma warning(disable:4996)
|
#pragma warning(disable:4996)
|
||||||
|
|
||||||
struct self_header
|
|
||||||
{
|
|
||||||
static const u32 signature = 0x1D3D154Fu;
|
|
||||||
|
|
||||||
u32 magic;
|
|
||||||
u08 version;
|
|
||||||
u08 mode;
|
|
||||||
u08 endian;// 1 is little endian
|
|
||||||
u08 attributes;
|
|
||||||
u08 category;
|
|
||||||
u08 program_type;
|
|
||||||
u16 padding1;
|
|
||||||
u16 header_size;
|
|
||||||
u16 meta_size;
|
|
||||||
u32 file_size;
|
|
||||||
u32 padding2;
|
|
||||||
u16 segment_count;
|
|
||||||
u16 unknown1A; //always 0x22
|
|
||||||
u32 padding3;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct self_segment_header
|
|
||||||
{
|
|
||||||
u64 flags;
|
|
||||||
u64 offset;
|
|
||||||
u64 encrypted_compressed_size;
|
|
||||||
u64 decrypted_decompressed_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
const char* const path = argv[1]; //argument 1 is the path of self file to boot
|
const char* const path = "eboot.bin";//argv[1]; //argument 1 is the path of self file to boot
|
||||||
|
|
||||||
auto handle = fopen(path, "rb");
|
auto handle = fopen(path, "rb");
|
||||||
if (handle == nullptr)
|
if (handle == nullptr)
|
||||||
|
@ -61,6 +35,9 @@ int main(int argc, char* argv[])
|
||||||
return 4;
|
return 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Elf* elf = new Elf;
|
||||||
|
elf->Open(path);
|
||||||
|
|
||||||
printf("SELF header:\n");
|
printf("SELF header:\n");
|
||||||
printf(" magic ..............: 0x%08X\n", header.magic);
|
printf(" magic ..............: 0x%08X\n", header.magic);
|
||||||
printf(" version .........: %d\n", header.version);
|
printf(" version .........: %d\n", header.version);
|
||||||
|
|
Loading…
Reference in a new issue