diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c index d5f2f70273b..9e7782c1ee0 100644 --- a/dlls/ntdll/actctx.c +++ b/dlls/ntdll/actctx.c @@ -2834,20 +2834,15 @@ static NTSTATUS parse_manifest( struct actctx_loader* acl, struct assembly_ident } else { - /* let's assume utf-8 for now */ - int len = wine_utf8_mbstowcs( 0, buffer, size, NULL, 0 ); + DWORD len; WCHAR *new_buff; - if (len == -1) - { - FIXME( "utf-8 conversion failed\n" ); - return STATUS_SXS_CANT_GEN_ACTCTX; - } - if (!(new_buff = RtlAllocateHeap( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) - return STATUS_NO_MEMORY; - wine_utf8_mbstowcs( 0, buffer, size, new_buff, len ); + /* let's assume utf-8 for now */ + RtlUTF8ToUnicodeN( NULL, 0, &len, buffer, size ); + if (!(new_buff = RtlAllocateHeap( GetProcessHeap(), 0, len ))) return STATUS_NO_MEMORY; + RtlUTF8ToUnicodeN( new_buff, len, &len, buffer, size ); xmlbuf.ptr = new_buff; - xmlbuf.end = xmlbuf.ptr + len; + xmlbuf.end = xmlbuf.ptr + len / sizeof(WCHAR); status = parse_manifest_buffer( acl, assembly, ai, &xmlbuf ); RtlFreeHeap( GetProcessHeap(), 0, new_buff ); } diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c index d7a64015601..f5faada578f 100644 --- a/dlls/ntdll/locale.c +++ b/dlls/ntdll/locale.c @@ -636,13 +636,19 @@ void init_locale( HMODULE module ) */ int ntdll_umbstowcs( DWORD flags, const char *src, int srclen, WCHAR *dst, int dstlen ) { -#ifdef __APPLE__ - /* work around broken Mac OS X filesystem that enforces decomposed Unicode */ - flags |= MB_COMPOSITE; + DWORD reslen; + NTSTATUS status; + + if (unix_table) return wine_cp_mbstowcs( unix_table, flags, src, srclen, dst, dstlen ); + + if (!dstlen) dst = NULL; + status = RtlUTF8ToUnicodeN( dst, dstlen * sizeof(WCHAR), &reslen, src, srclen ); + if (status && status != STATUS_SOME_NOT_MAPPED) return 0; + reslen /= sizeof(WCHAR); +#ifdef __APPLE__ /* work around broken Mac OS X filesystem that enforces decomposed Unicode */ + if (reslen && dst) RtlNormalizeString( NormalizationC, dst, reslen, dst, (int *)&reslen ); #endif - return unix_table ? - wine_cp_mbstowcs( unix_table, flags, src, srclen, dst, dstlen ) : - wine_utf8_mbstowcs( flags, src, srclen, dst, dstlen ); + return reslen; } @@ -652,10 +658,16 @@ int ntdll_umbstowcs( DWORD flags, const char *src, int srclen, WCHAR *dst, int d int ntdll_wcstoumbs( DWORD flags, const WCHAR *src, int srclen, char *dst, int dstlen, const char *defchar, int *used ) { - if (unix_table) - return wine_cp_wcstombs( unix_table, flags, src, srclen, dst, dstlen, defchar, used ); + DWORD reslen; + NTSTATUS status; + + if (unix_table) return wine_cp_wcstombs( unix_table, flags, src, srclen, dst, dstlen, defchar, used ); + if (used) *used = 0; /* all chars are valid for UTF-8 */ - return wine_utf8_wcstombs( flags, src, srclen, dst, dstlen ); + if (!dstlen) dst = NULL; + status = RtlUnicodeToUTF8N( dst, dstlen, &reslen, src, srclen * sizeof(WCHAR) ); + if (status && status != STATUS_SOME_NOT_MAPPED) return 0; + return reslen; }