---
lib/hivex-internal.h | 1 +
lib/utf16.c | 19 +++++++++++++++++++
2 files changed, 20 insertions(+)
diff --git a/lib/hivex-internal.h b/lib/hivex-internal.h
index 64fd49a..7a548c0 100644
--- a/lib/hivex-internal.h
+++ b/lib/hivex-internal.h
@@ -275,6 +275,7 @@ extern char* _hivex_recode (char *input_encoding,
_hivex_recode ("UTF-16LE", _input, _len, "UTF-8", NULL)
#define _hivex_windows_latin1_to_utf8(_input, _len) \
_hivex_recode ("LATIN1", _input, _len, "UTF-8", NULL)
+extern char* _hivex_encode_string(const char *str, size_t *size, int *utf16);
extern size_t _hivex_utf16_string_len_in_bytes_max (const char *str, size_t len);
/* util.c */
diff --git a/lib/utf16.c b/lib/utf16.c
index 6b8bf9a..437613b 100644
--- a/lib/utf16.c
+++ b/lib/utf16.c
@@ -24,6 +24,7 @@
#include <stdlib.h>
#include <stdint.h>
#include <iconv.h>
+#include <string.h>
#include "hivex.h"
#include "hivex-internal.h"
@@ -86,6 +87,24 @@ _hivex_recode (char *input_encoding, const char *input, size_t
input_len,
return out;
}
+/* Encode a given UTF-8 string to Latin1 (preferred) or UTF-16 for
+ * storing in the hive file, as needed.
+ */
+char*
+_hivex_encode_string(const char *str, size_t *size, int *utf16)
+{
+ char* outstr;
+ *utf16 = 0;
+ outstr = _hivex_recode ("UTF-8", str, strlen(str),
+ "LATIN1", size);
+ if (outstr != NULL)
+ return outstr;
+ *utf16 = 1;
+ outstr = _hivex_recode ("UTF-8", str, strlen(str),
+ "UTF-16LE", size);
+ return outstr;
+}
+
/* Get the length of a UTF-16 format string. Handle the string as
* pairs of bytes, looking for the first \0\0 pair. Only read up to
* 'len' maximum bytes.
--
1.8.4.4