From 6b67a4985e160427e2a07d736937b2edbdaa5551 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Mon, 7 Feb 2011 23:23:33 +0000 Subject: [PATCH] [RTL] Minor code changes to RTL (one would call them "optimisation"). Added some missing paged code. Plus added useful asserts (used to catch r50615 bug!) svn path=/trunk/; revision=50616 --- reactos/lib/rtl/nls.c | 6 ++++++ reactos/lib/rtl/unicode.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/reactos/lib/rtl/nls.c b/reactos/lib/rtl/nls.c index b7192319df2..131587ddbc3 100644 --- a/reactos/lib/rtl/nls.c +++ b/reactos/lib/rtl/nls.c @@ -235,6 +235,8 @@ RtlMultiByteToUnicodeN( ULONG Size = 0; ULONG i; + PAGED_CODE_RTL(); + if (NlsMbCodePageTag == FALSE) { /* single-byte code page */ @@ -300,6 +302,8 @@ RtlMultiByteToUnicodeSize(PULONG UnicodeSize, { ULONG Length = 0; + PAGED_CODE_RTL(); + if (!NlsMbCodePageTag) { /* single-byte code page */ @@ -504,6 +508,8 @@ RtlUnicodeToMultiByteN (PCHAR MbString, ULONG Size = 0; ULONG i; + PAGED_CODE_RTL(); + if (NlsMbCodePageTag == FALSE) { /* single-byte code page */ diff --git a/reactos/lib/rtl/unicode.c b/reactos/lib/rtl/unicode.c index 4dd9d4fa5d6..e0b8a4f9741 100644 --- a/reactos/lib/rtl/unicode.c +++ b/reactos/lib/rtl/unicode.c @@ -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,