static int tsk_printf_conv(WCHAR * wbuf, int wlen, const char *msg, va_list * args) { char *cbuf; UTF8 *ptr8; UTF16 *ptr16; int retVal; size_t len, clen; wbuf[0] = '\0'; /* Allocate a UTF-8 buffer and process the printf args */ clen = wlen * 3; if (NULL == (cbuf = (char *) tsk_malloc(clen))) { return 1; } memset(cbuf, 0, clen); #ifdef _MSC_VER vsnprintf_s(cbuf, clen - 1, _TRUNCATE, msg, *args); #else vsnprintf(cbuf, clen - 1, msg, *args); #endif len = strlen(cbuf); //Convert to UTF-16 ptr8 = (UTF8 *) cbuf; ptr16 = (UTF16 *) wbuf; retVal = tsk_UTF8toUTF16((const UTF8 **) &ptr8, &ptr8[len + 1], &ptr16, &ptr16[wlen], TSKlenientConversion); if (retVal != TSKconversionOK) { *ptr16 = '\0'; if (tsk_verbose) tsk_fprintf(stderr, "tsk_printf_conv: error converting string to UTF-16\n"); } free(cbuf); return 0; }
static int tsk_printf_conv(WCHAR * wbuf, int wlen, char *msg, va_list * args) { char *cbuf; UTF8 *ptr8; UTF16 *ptr16; int retVal; size_t len, clen; wbuf[0] = '\0'; clen = wlen * 3; if (NULL == (cbuf = (char *) tsk_malloc(clen))) { return 1; } memset(cbuf, 0, clen); vsnprintf_s(cbuf, clen - 1, _TRUNCATE, msg, *args); len = strlen(cbuf); //Convert to UTF-16 ptr8 = (UTF8 *) cbuf; ptr16 = (UTF16 *) wbuf; retVal = tsk_UTF8toUTF16(&ptr8, &ptr8[len + 1], &ptr16, &ptr16[wlen], TSKlenientConversion); if (retVal != TSKconversionOK) { *ptr16 = '\0'; if (tsk_verbose) tsk_fprintf(stderr, "tsk_printf_conv: error converting string to UTF-16\n"); } free(cbuf); return 0; }
/** * \ingroup imglib * Opens one or more disk image files so that they can be read. This is a wrapper * around tsk_img_open() and this version always takes a UTF-8 encoding of the * image files. See its description for more details. * * @param num_img The number of images to open (will be > 1 for split images). * @param images The path to the UTF-8 encoded image files (the number of files must * be equal to num_img and they must be in a sorted order) * @param type The disk image type (can be autodetection) * @param a_ssize Size of device sector in bytes (or 0 for default) * * @return Pointer to TSK_IMG_INFO or NULL on error */ TSK_IMG_INFO * tsk_img_open_utf8(int num_img, const char *const images[], TSK_IMG_TYPE_ENUM type, unsigned int a_ssize) { #ifdef TSK_WIN32 { /* Note that there is an assumption in this code that wchar_t is 2-bytes. * this is a correct assumption for Windows, but not for all systems... */ TSK_IMG_INFO *retval = NULL; wchar_t **images16; int i; // allocate a buffer to store the UTF-16 version of the images. if ((images16 = (wchar_t **) tsk_malloc(sizeof(wchar_t *) * num_img)) == NULL) { return NULL; } for (i = 0; i < num_img; i++) { size_t ilen; UTF16 *utf16; UTF8 *utf8; TSKConversionResult retval2; // we allocate the buffer with the same number of chars as the UTF-8 length ilen = strlen(images[i]); if ((images16[i] = (wchar_t *) tsk_malloc((ilen + 1) * sizeof(wchar_t))) == NULL) { goto tsk_utf8_cleanup; } utf8 = (UTF8 *) images[i]; utf16 = (UTF16 *) images16[i]; retval2 = tsk_UTF8toUTF16((const UTF8 **) &utf8, &utf8[ilen], &utf16, &utf16[ilen], TSKlenientConversion); if (retval2 != TSKconversionOK) { tsk_errno = TSK_ERR_IMG_CONVERT; snprintf(tsk_errstr, TSK_ERRSTR_L, "tsk_img_open_utf8: Error converting image %s %d", images[i], retval2); goto tsk_utf8_cleanup; } *utf16 = '\0'; } retval = tsk_img_open(num_img, images16, type, a_ssize); // free up the memory tsk_utf8_cleanup: for (i = 0; i < num_img; i++) { if (images16[i]) free(images16[i]); } free(images16); return retval; } #else return tsk_img_open(num_img, images, type, a_ssize); #endif }