Author: fireball Date: Sat Oct 10 15:22:41 2009 New Revision: 43363
URL: http://svn.reactos.org/svn/reactos?rev=43363&view=rev Log: - Implement RtlpDidUnicodeToOemWork to check for unmapped characters. Based on a patch by Daniel Zimmerman. See issue #4548 for more details.
Modified: trunk/reactos/lib/rtl/nls.c trunk/reactos/lib/rtl/unicode.c
Modified: trunk/reactos/lib/rtl/nls.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/nls.c?rev=43363&... ============================================================================== --- trunk/reactos/lib/rtl/nls.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/nls.c [iso-8859-1] Sat Oct 10 15:22:41 2009 @@ -32,6 +32,10 @@ PCHAR NlsUnicodeToOemTable =NULL; PWCHAR NlsDbcsUnicodeToOemTable = NULL; PUSHORT _NlsOemLeadByteInfo = NULL; /* exported */ + +USHORT NlsOemDefaultChar = '\0'; +USHORT NlsUnicodeDefaultChar = 0; +
#define NlsOemLeadByteInfo _NlsOemLeadByteInfo #define INIT_FUNCTION @@ -435,6 +439,10 @@ /* Set Unicode case map data */ NlsUnicodeUpcaseTable = NlsTable->UpperCaseTable; NlsUnicodeLowercaseTable = NlsTable->LowerCaseTable; + + /* set the default characters for RtlpDidUnicodeToOemWork */ + NlsOemDefaultChar = NlsTable->OemTableInfo.DefaultChar; + NlsUnicodeDefaultChar = NlsTable->OemTableInfo.TransDefaultChar; }
Modified: trunk/reactos/lib/rtl/unicode.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rtl/unicode.c?rev=43363... ============================================================================== --- trunk/reactos/lib/rtl/unicode.c [iso-8859-1] (original) +++ trunk/reactos/lib/rtl/unicode.c [iso-8859-1] Sat Oct 10 15:22:41 2009 @@ -22,6 +22,9 @@ extern BOOLEAN NlsMbCodePageTag; extern BOOLEAN NlsMbOemCodePageTag; extern PUSHORT NlsLeadByteInfo; + +extern USHORT NlsOemDefaultChar; +extern USHORT NlsUnicodeDefaultChar;
/* FUNCTIONS *****************************************************************/
@@ -393,6 +396,45 @@ RtlpFreeStringMemory(UnicodeString->Buffer, TAG_USTR); RtlZeroMemory(UnicodeString, sizeof(UNICODE_STRING)); } +} + + +/* + * @implemented + * + * NOTES + * Check the oem-string to match the uincoded-string. + * + * Functions who convert unicode strings to oem strings will set a DefaultChar from + * the OemCodepage when the character are unknown. So check it against the unicode string + * and return false when the unicode string not contain an TransDefaultChar. + */ +BOOLEAN +NTAPI +RtlpDidUnicodeToOemWork(IN PCUNICODE_STRING UnicodeString, + IN POEM_STRING OemString) +{ + ULONG i = 0; + + /* Go through all characters of a string */ + while ((OemString->Buffer[i] != 0) && + (i < OemString->Length)) + { + /* Check if it got translated into '?', but source char + wasn't '?' equivalent */ + if ((OemString->Buffer[i] == NlsOemDefaultChar) && + (UnicodeString->Buffer[i] != NlsUnicodeDefaultChar)) + { + /* Yes, it means unmappable characters were found */ + return FALSE; + } + + /* Move to the next char */ + i++; + } + + /* All chars were translated successfuly */ + return TRUE; }
/* @@ -1534,8 +1576,9 @@ UniSource->Buffer, UniSource->Length);
- /* FIXME: Check if everything mapped correctly and - * return STATUS_UNMAPPABLE_CHARACTER */ + /* Check for unmapped character */ + if (NT_SUCCESS(Status) && !RtlpDidUnicodeToOemWork(UniSource, OemDest)) + Status = STATUS_UNMAPPABLE_CHARACTER;
if (!NT_SUCCESS(Status) && AllocateDestinationString) { @@ -1763,7 +1806,9 @@ UniSource->Buffer, UniSource->Length);
- /* FIXME: Special check needed and return STATUS_UNMAPPABLE_CHARACTER */ + /* Check for unmapped characters */ + if (NT_SUCCESS(Status) && !RtlpDidUnicodeToOemWork(UniSource, OemDest)) + Status = STATUS_UNMAPPABLE_CHARACTER;
if (!NT_SUCCESS(Status) && AllocateDestinationString) { @@ -1816,7 +1861,9 @@ UniSource->Buffer, UniSource->Length);
- /* FIXME: Special check needed and return STATUS_UNMAPPABLE_CHARACTER */ + /* Check for unmapped characters */ + if (NT_SUCCESS(Status) && !RtlpDidUnicodeToOemWork(UniSource, OemDest)) + Status = STATUS_UNMAPPABLE_CHARACTER;
if (!NT_SUCCESS(Status) && AllocateDestinationString) {