mirror of
https://github.com/AxioDL/nod.git
synced 2025-12-09 05:28:00 +00:00
Fixed WBFS reads with 64-bit addresses
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include "NOD/DiscGCN.hpp"
|
||||
#define BUFFER_SZ 0x8000
|
||||
|
||||
namespace NOD
|
||||
{
|
||||
@@ -33,15 +34,66 @@ public:
|
||||
const PartitionGCN& m_parent;
|
||||
std::unique_ptr<IDiscIO::IReadStream> m_dio;
|
||||
|
||||
uint64_t m_offset;
|
||||
size_t m_curBlock = SIZE_MAX;
|
||||
uint8_t m_buf[BUFFER_SZ];
|
||||
|
||||
public:
|
||||
PartReadStream(const PartitionGCN& parent, uint64_t offset)
|
||||
: m_parent(parent)
|
||||
{m_dio = m_parent.m_parent.getDiscIO().beginReadStream(offset);}
|
||||
: m_parent(parent), m_offset(offset)
|
||||
{
|
||||
size_t block = m_offset / BUFFER_SZ;
|
||||
m_dio = m_parent.m_parent.getDiscIO().beginReadStream(block * BUFFER_SZ);
|
||||
m_dio->read(m_buf, BUFFER_SZ);
|
||||
m_curBlock = block;
|
||||
}
|
||||
void seek(int64_t offset, int whence)
|
||||
{m_dio->seek(offset, whence);}
|
||||
uint64_t position() const {return m_dio->position();}
|
||||
{
|
||||
if (whence == SEEK_SET)
|
||||
m_offset = offset;
|
||||
else if (whence == SEEK_CUR)
|
||||
m_offset += offset;
|
||||
else
|
||||
return;
|
||||
size_t block = m_offset / BUFFER_SZ;
|
||||
if (block != m_curBlock)
|
||||
{
|
||||
m_dio->seek(block * BUFFER_SZ);
|
||||
m_dio->read(m_buf, BUFFER_SZ);
|
||||
m_curBlock = block;
|
||||
}
|
||||
}
|
||||
uint64_t position() const {return m_offset;}
|
||||
uint64_t read(void* buf, uint64_t length)
|
||||
{return m_dio->read(buf, length);}
|
||||
{
|
||||
size_t block = m_offset / BUFFER_SZ;
|
||||
size_t cacheOffset = m_offset % BUFFER_SZ;
|
||||
uint64_t cacheSize;
|
||||
uint64_t rem = length;
|
||||
uint8_t* dst = (uint8_t*)buf;
|
||||
|
||||
while (rem)
|
||||
{
|
||||
if (block != m_curBlock)
|
||||
{
|
||||
m_dio->read(m_buf, BUFFER_SZ);
|
||||
m_curBlock = block;
|
||||
}
|
||||
|
||||
cacheSize = rem;
|
||||
if (cacheSize + cacheOffset > BUFFER_SZ)
|
||||
cacheSize = BUFFER_SZ - cacheOffset;
|
||||
|
||||
memcpy(dst, m_buf + cacheOffset, cacheSize);
|
||||
dst += cacheSize;
|
||||
rem -= cacheSize;
|
||||
cacheOffset = 0;
|
||||
++block;
|
||||
}
|
||||
|
||||
m_offset += length;
|
||||
return dst - (uint8_t*)buf;
|
||||
}
|
||||
};
|
||||
|
||||
std::unique_ptr<IPartReadStream> beginReadStream(uint64_t offset) const
|
||||
|
||||
Reference in New Issue
Block a user