[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;
else
Size = UnicodeSize / sizeof(WCHAR);
if (ResultSize)
*ResultSize = Size;
for (i = 0; i < Size; i++)
{ {
*OemString = NlsUnicodeToOemTable[*UnicodeString]; OemString[Size] = NlsUnicodeToOemTable[*UnicodeString++];
OemString++; Size++;
UnicodeString++; OemSize--;
UnicodeSize--;
} }
} }
else else
{ {
/* multi-byte code page */ while (OemSize && UnicodeSize)
/* FIXME */
USHORT WideChar;
USHORT OemChar;
for (i = OemSize, Size = UnicodeSize / sizeof(WCHAR); i && Size; i--, Size--)
{ {
WideChar = *UnicodeString++; USHORT OemChar = NlsUnicodeToMbOemTable[*UnicodeString++];
if (WideChar < 0x80) if (HIBYTE(OemChar))
{ {
*OemString++ = LOBYTE(WideChar); if (OemSize < 2)
continue; break;
OemString[Size++] = HIBYTE(OemChar);
OemSize--;
} }
OemString[Size++] = LOBYTE(OemChar);
OemChar = NlsUnicodeToMbOemTable[WideChar]; OemSize--;
UnicodeSize--;
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; if (ResultSize)
*ResultSize = Size;
return UnicodeSize ? STATUS_BUFFER_OVERFLOW : STATUS_SUCCESS;
} }
/* /*