[RTL] Properly implement RtlUnicodeToOemN

CORE-17571
This commit is contained in:
Jérôme Gardou 2021-05-17 16:10:48 +02:00 committed by Jérôme Gardou
parent 4e0ce779d7
commit 1b08836338

View file

@ -634,9 +634,10 @@ RtlUnicodeToMultiByteSize(OUT PULONG MbSize,
} }
/* /*
* @unimplemented * @implemented
*/ */
NTSTATUS NTAPI NTSTATUS
NTAPI
RtlUnicodeToOemN(OUT PCHAR OemString, RtlUnicodeToOemN(OUT PCHAR OemString,
IN ULONG OemSize, IN ULONG OemSize,
OUT PULONG ResultSize OPTIONAL, OUT PULONG ResultSize OPTIONAL,
@ -644,68 +645,45 @@ RtlUnicodeToOemN(OUT PCHAR OemString,
IN ULONG UnicodeSize) IN ULONG UnicodeSize)
{ {
ULONG Size = 0; ULONG Size = 0;
ULONG i;
PAGED_CODE_RTL(); PAGED_CODE_RTL();
/* Bytes -> chars */
UnicodeSize /= sizeof(WCHAR);
if (!NlsMbOemCodePageTag) if (!NlsMbOemCodePageTag)
{ {
/* single-byte code page */ while (OemSize && UnicodeSize)
if (UnicodeSize > (OemSize * sizeof(WCHAR))) {
Size = OemSize; OemString[Size] = NlsUnicodeToOemTable[*UnicodeString++];
Size++;
OemSize--;
UnicodeSize--;
}
}
else else
Size = UnicodeSize / sizeof(WCHAR); {
while (OemSize && UnicodeSize)
{
USHORT OemChar = NlsUnicodeToMbOemTable[*UnicodeString++];
if (HIBYTE(OemChar))
{
if (OemSize < 2)
break;
OemString[Size++] = HIBYTE(OemChar);
OemSize--;
}
OemString[Size++] = LOBYTE(OemChar);
OemSize--;
UnicodeSize--;
}
}
if (ResultSize) if (ResultSize)
*ResultSize = Size; *ResultSize = Size;
for (i = 0; i < Size; i++) return UnicodeSize ? STATUS_BUFFER_OVERFLOW : STATUS_SUCCESS;
{
*OemString = NlsUnicodeToOemTable[*UnicodeString];
OemString++;
UnicodeString++;
}
}
else
{
/* multi-byte code page */
/* FIXME */
USHORT WideChar;
USHORT OemChar;
for (i = OemSize, Size = UnicodeSize / sizeof(WCHAR); i && Size; i--, Size--)
{
WideChar = *UnicodeString++;
if (WideChar < 0x80)
{
*OemString++ = LOBYTE(WideChar);
continue;
}
OemChar = NlsUnicodeToMbOemTable[WideChar];
if (!HIBYTE(OemChar))
{
*OemString++ = LOBYTE(OemChar);
continue;
}
if (i >= 2)
{
*OemString++ = HIBYTE(OemChar);
*OemString++ = LOBYTE(OemChar);
i--;
}
else break;
}
if (ResultSize)
*ResultSize = OemSize - i;
}
return STATUS_SUCCESS;
} }
/* /*