60 lines
1.3 KiB
C
60 lines
1.3 KiB
C
|
#ifndef STRING_MANAGER_H
|
||
|
#define STRING_MANAGER_H
|
||
|
|
||
|
class CipherRC5;
|
||
|
|
||
|
struct STRING_DIRECTORY {
|
||
|
uint32_t NumberOfEntries;
|
||
|
// STRING_ENTRY Entries[];
|
||
|
};
|
||
|
|
||
|
struct STRING_ENTRY {
|
||
|
uint32_t Id;
|
||
|
uint32_t OffsetToData;
|
||
|
uint32_t Size;
|
||
|
};
|
||
|
|
||
|
class VirtualString
|
||
|
{
|
||
|
public:
|
||
|
VirtualString(const STRING_ENTRY *entry, HMODULE instance, uint32_t key);
|
||
|
~VirtualString();
|
||
|
uint8_t *AcquirePointer();
|
||
|
bool Release();
|
||
|
uint8_t *address() const { return address_; }
|
||
|
private:
|
||
|
void Clear();
|
||
|
size_t use_count_;
|
||
|
uint8_t *address_;
|
||
|
size_t size_;
|
||
|
|
||
|
// no copy ctr or assignment op
|
||
|
VirtualString(const VirtualString &);
|
||
|
VirtualString &operator =(const VirtualString &);
|
||
|
};
|
||
|
|
||
|
class StringManager
|
||
|
{
|
||
|
public:
|
||
|
StringManager(const uint8_t *data, HMODULE instance, const uint8_t *key);
|
||
|
~StringManager();
|
||
|
const void *DecryptString(const void *str);
|
||
|
bool FreeString(const void *str);
|
||
|
private:
|
||
|
STRING_DIRECTORY DecryptDirectory(const STRING_DIRECTORY *directory_enc) const;
|
||
|
STRING_ENTRY DecryptEntry(const STRING_ENTRY *entry_enc) const;
|
||
|
size_t IndexById(uint32_t id) const;
|
||
|
size_t IndexByAddress(const void *address) const;
|
||
|
const uint8_t *data_;
|
||
|
HMODULE instance_;
|
||
|
CRITICAL_SECTION critical_section_;
|
||
|
VirtualString **strings_;
|
||
|
uint32_t key_;
|
||
|
size_t size_;
|
||
|
|
||
|
// no copy ctr or assignment op
|
||
|
StringManager(const StringManager &);
|
||
|
StringManager &operator =(const StringManager &);
|
||
|
};
|
||
|
|
||
|
#endif
|