[RTL] Fix RtlIsValidOemCharacter implementation for Multibyte code pages

CORE-17571
This commit is contained in:
Jérôme Gardou 2021-05-17 16:14:26 +02:00 committed by Jérôme Gardou
parent 1b08836338
commit 49fcbe7cd8

View file

@ -519,16 +519,24 @@ RtlIsValidOemCharacter(IN PWCHAR Char)
/* If multi-byte code page present */ /* If multi-byte code page present */
if (NlsMbOemCodePageTag) if (NlsMbOemCodePageTag)
{ {
USHORT Offset = 0; USHORT Offset;
OemChar = NlsUnicodeToMbOemTable[*Char]; OemChar = NlsUnicodeToMbOemTable[*Char];
/* If character has Lead Byte */ /* If character has Lead Byte */
if (NlsOemLeadByteInfo[HIBYTE(OemChar)]) Offset = NlsOemLeadByteInfo[HIBYTE(OemChar)];
Offset = NlsOemLeadByteInfo[HIBYTE(OemChar)]; if (Offset)
{
/* Use DBCS table */
UnicodeChar = NlsOemLeadByteInfo[Offset + LOBYTE(OemChar)];
}
else
{
UnicodeChar = NlsOemToUnicodeTable[OemChar];
}
/* Receive Unicode character from the table */ /* Upcase */
UnicodeChar = RtlpUpcaseUnicodeChar(NlsOemToUnicodeTable[LOBYTE(OemChar) + Offset]); UnicodeChar = RtlpUpcaseUnicodeChar(UnicodeChar);
/* Receive OEM character from the table */ /* Receive OEM character from the table */
OemChar = NlsUnicodeToMbOemTable[UnicodeChar]; OemChar = NlsUnicodeToMbOemTable[UnicodeChar];
@ -544,7 +552,10 @@ RtlIsValidOemCharacter(IN PWCHAR Char)
/* Not valid character, failed */ /* Not valid character, failed */
if (OemChar == NlsOemDefaultChar) if (OemChar == NlsOemDefaultChar)
{
DPRINT1("\\u%04x is not valid for OEM\n", *Char);
return FALSE; return FALSE;
}
*Char = UnicodeChar; *Char = UnicodeChar;