mirror of
https://github.com/hasherezade/bearparser
synced 2026-06-08 14:32:38 +00:00
99 lines
3.1 KiB
C++
99 lines
3.1 KiB
C++
#pragma once
|
|
|
|
#include "win_hdrs/win_types.h"
|
|
#include "CustomException.h"
|
|
#include "Util.h"
|
|
|
|
#include <QtCore>
|
|
|
|
#include <stdlib.h>
|
|
//------------------------------------------------
|
|
|
|
#define MAX_DWORD 0xffffffff
|
|
#define MAX_WORD 0xffff
|
|
#define MASK_TO_DWORD(val) ((val < MAX_DWORD) ? (val & MAX_DWORD) : MAX_DWORD)
|
|
#define MASK_TO_WORD(val) ((val < MAX_WORD) ? (val & MAX_WORD) : MAX_WORD)
|
|
|
|
typedef size_t bufsize_t;
|
|
const bufsize_t BUFSIZE_MAX = bufsize_t(-1);
|
|
|
|
typedef uint64_t offset_t;
|
|
const offset_t INVALID_ADDR = offset_t(-1);
|
|
const offset_t OFFSET_MAX = (INVALID_ADDR - 1);
|
|
|
|
|
|
class BufferException : public CustomException
|
|
{
|
|
public:
|
|
BufferException(const QString info) : CustomException(info) {}
|
|
};
|
|
|
|
namespace buf_util {
|
|
bufsize_t roundupToUnit(bufsize_t size, bufsize_t unit);
|
|
};
|
|
|
|
class AbstractByteBuffer
|
|
{
|
|
public:
|
|
static bool isValid(AbstractByteBuffer *buf);
|
|
|
|
AbstractByteBuffer() { }
|
|
virtual ~AbstractByteBuffer() { }
|
|
|
|
virtual bufsize_t getContentSize() = 0;
|
|
virtual BYTE* getContent() = 0;
|
|
virtual bool isTruncated() { return false; }
|
|
virtual bool isResized() { return false; }
|
|
|
|
BYTE operator[](size_t idx);
|
|
|
|
virtual offset_t getOffset(void *ptr, bool allowExceptions = false); // validates
|
|
virtual BYTE* getContentAt(offset_t offset, bufsize_t size, bool allowExceptions = false);
|
|
virtual BYTE* getContentAtPtr(BYTE *ptr, bufsize_t size, bool allowExceptions = false);
|
|
|
|
virtual bool setBufferedValue(BYTE *dstPtr, BYTE *srcPtr, bufsize_t srcSize, bufsize_t paddingSize, bool allowExceptions = false);
|
|
bool setStringValue(offset_t rawOffset, QString newText);
|
|
|
|
QString getStringValue(offset_t rawOffset, bufsize_t len = BUFSIZE_MAX, bool acceptNonTerminated = false);
|
|
QString getWStringValue(offset_t rawOffset, bufsize_t len);
|
|
QString getWAsciiStringValue(offset_t rawOffset, bufsize_t len, bool acceptNonTerminated = false);
|
|
|
|
bufsize_t getMaxSizeFromOffset(offset_t startOffset);
|
|
bufsize_t getMaxSizeFromPtr(BYTE *ptr) { return getMaxSizeFromOffset(getOffset(ptr)); }
|
|
|
|
bool isAreaEmpty(offset_t rawOffset, bufsize_t size);
|
|
bool fillContent(BYTE filling);
|
|
bool pasteBuffer(offset_t rawOffset, AbstractByteBuffer *buf, bool allowTrunc);
|
|
|
|
bool containsBlock(offset_t rawOffset, bufsize_t size);
|
|
bool intersectsBlock(offset_t rawOffset, bufsize_t size);
|
|
|
|
uint64_t getNumValue(offset_t offset, bufsize_t size, bool* isOk);
|
|
bool setNumValue(offset_t offset, bufsize_t size, uint64_t newVal);
|
|
bool setTextValue(char* textPtr, std::string newText, size_t fieldLimitLen = 0);
|
|
|
|
//TODO
|
|
virtual bool resize(bufsize_t newSize) { return false; }
|
|
offset_t substFragmentByFile(offset_t offset, bufsize_t contentSize, QFile &fIn);
|
|
};
|
|
|
|
//--------------------------------------------
|
|
|
|
class BufferView : public AbstractByteBuffer
|
|
{
|
|
public:
|
|
BufferView(AbstractByteBuffer *parent, offset_t offset, bufsize_t size);
|
|
virtual ~BufferView() { }
|
|
|
|
virtual bufsize_t getContentSize();
|
|
virtual BYTE* getContent();
|
|
|
|
bufsize_t getRequestedSize() const { return size; }
|
|
|
|
protected:
|
|
AbstractByteBuffer *parent;
|
|
offset_t offset;
|
|
bufsize_t size;
|
|
};
|
|
|