sync trunk HEAD (r50626)
[reactos.git] / lib / rtl / unicode.c
index 4dd9d4f..e0b8a4f 100644 (file)
@@ -76,7 +76,14 @@ RtlAnsiStringToUnicodeString(
 
     PAGED_CODE_RTL();
 
-    Length = RtlAnsiStringToUnicodeSize(AnsiSource);
+    if (NlsMbCodePageTag == FALSE)
+    {
+        Length = AnsiSource->Length * 2 + sizeof(WCHAR);
+    }
+    else
+    {
+        Length = RtlxAnsiStringToUnicodeSize(AnsiSource);
+    }
     if (Length > MAXUSHORT) return STATUS_INVALID_PARAMETER_2;
     UniDest->Length = (USHORT)Length - sizeof(WCHAR);
 
@@ -91,6 +98,9 @@ RtlAnsiStringToUnicodeString(
         return STATUS_BUFFER_OVERFLOW;
     }
 
+    /* UniDest->MaximumLength must be even due to sizeof(WCHAR) being 2 */
+    ASSERT(!(UniDest->MaximumLength & 1) && UniDest->Length <= UniDest->MaximumLength);
+
     Status = RtlMultiByteToUnicodeN(UniDest->Buffer,
                                     UniDest->Length,
                                     &Index,
@@ -123,6 +133,8 @@ RtlxAnsiStringToUnicodeSize(IN PCANSI_STRING AnsiString)
 {
     ULONG Size;
 
+    PAGED_CODE_RTL();
+
     /* Convert from Mb String to Unicode Size */
     RtlMultiByteToUnicodeSize(&Size,
                               AnsiString->Buffer,
@@ -963,7 +975,16 @@ RtlUnicodeStringToAnsiString(
 
     PAGED_CODE_RTL();
 
-    Length = RtlUnicodeStringToAnsiSize(UniSource);
+    ASSERT(!(UniSource->Length & 1));
+
+    if (NlsMbCodePageTag == FALSE)
+    {
+        Length = (UniSource->Length + sizeof(WCHAR)) / sizeof(WCHAR);
+    }
+    else
+    {
+        Length = RtlxUnicodeStringToAnsiSize(UniSource);
+    }
     if (Length > MAXUSHORT) return STATUS_INVALID_PARAMETER_2;
 
     AnsiDest->Length = (USHORT)Length - sizeof(CHAR);
@@ -1953,6 +1974,10 @@ RtlxUnicodeStringToAnsiSize(IN PCUNICODE_STRING UnicodeString)
 {
     ULONG Size;
 
+    PAGED_CODE_RTL();
+
+    ASSERT(!(UnicodeString->Length & 1));
+
     /* Convert the Unicode String to Mb Size */
     RtlUnicodeToMultiByteSize(&Size,
                               UnicodeString->Buffer,