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&am…
==============================================================================
--- 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=4336…
==============================================================================
--- 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)
{