aboutsummaryrefslogtreecommitdiff
path: root/core/streams.h
blob: bd2ef5e6a2a4a7e1f15b5f408a73178c6891f582 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/**
 * Stream implementation.
 */

#ifndef STREAMS_H
#define STREAMS_H

class AbstractStream
{
public:
	virtual ~AbstractStream() {}
	virtual size_t Read(void *buffer, size_t size) = 0;
	virtual size_t Write(const void *buffer, size_t size) = 0;
	virtual	uint64_t Seek(int64_t offset, SeekOrigin origin) = 0;
	virtual size_t CopyFrom(AbstractStream &source, size_t count);
	uint64_t Tell();
	uint64_t Size();
	virtual uint64_t Resize(uint64_t new_size) = 0;
	virtual void Flush() {}
};

class FileStream : public AbstractStream
{
public:
	explicit FileStream(size_t CACHE_ALLOC_SIZE = 0x10000);
	virtual ~FileStream();
	virtual bool Open(const char *filename, int mode);
	virtual void Close();
	virtual size_t Read(void *buffer, size_t size);
	virtual size_t Write(const void *buffer, size_t size);
	virtual	uint64_t Seek(int64_t offset, SeekOrigin origin);
	virtual uint64_t Resize(uint64_t new_size);
	virtual void Flush() { FlushCache(); }
	bool ReadLine(std::string &line);
	std::string ReadAll();
protected:
	uint8_t *Cache();
	void FlushCache(bool need_seek = false);

	HANDLE h_;
	enum CacheMode {
		cmNone,
		cmRead,
		cmWrite
	};
	CacheMode cache_mode_;
	const size_t CACHE_ALLOC_SIZE_;
	std::auto_ptr<uint8_t> cache_;
	size_t cache_pos_;
	size_t cache_size_;
	uint64_t cache_offset_;
};

class MemoryStream : public AbstractStream
{
public:
	explicit MemoryStream(size_t buf_size_increment = 1024);
	virtual size_t Read(void *buffer, size_t size);
	virtual size_t Write(const void *buffer, size_t size);
	virtual	uint64_t Seek(int64_t offset, SeekOrigin origin);
	virtual uint64_t Resize(uint64_t new_size);
	std::vector<uint8_t> data() const { return buf_; }
private:
	std::vector <uint8_t> buf_;
	size_t pos_;
};

class MemoryStreamEnc : public MemoryStream
{
public:
	explicit MemoryStreamEnc(const void *buffer, size_t size, uint32_t key);
	virtual size_t Read(void *buffer, size_t size);
	virtual size_t Write(const void *buffer, size_t size);
private:
	uint32_t key_;
};

class ModuleStream : public AbstractStream
{
public:
	ModuleStream();
	~ModuleStream();
	bool Open(uint32_t process_id, HMODULE module);
	void Close();
	virtual size_t Read(void *buffer, size_t size);
	virtual size_t Write(const void *buffer, size_t size);
	virtual	uint64_t Seek(int64_t offset, SeekOrigin origin);
	virtual uint64_t Resize(uint64_t /*new_size*/) { return size_; }
private:
	size_t pos_;
	size_t size_;
	void *base_address_;
	HANDLE process_;
};

class Buffer
{
public:
	Buffer(const uint8_t *memory);
	uint8_t ReadByte();
	uint16_t ReadWord();
	uint32_t ReadDWord();
	uint64_t ReadQWord();
private:
	void ReadBuff(void *buff, size_t size);
	const uint8_t *memory_;
	size_t position_;
};

#endif