diff options
Diffstat (limited to 'runtime/string_manager.h')
-rw-r--r-- | runtime/string_manager.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/runtime/string_manager.h b/runtime/string_manager.h new file mode 100644 index 0000000..a35c4a4 --- /dev/null +++ b/runtime/string_manager.h @@ -0,0 +1,60 @@ +#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
\ No newline at end of file |