Module: wine Branch: master Commit: 9ae5717ba6d10126c4a274240ec1e72fa241a6db URL: https://source.winehq.org/git/wine.git/?a=commit;h=9ae5717ba6d10126c4a274240...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Nov 26 17:29:41 2019 +0100
ntdll: Implement RtlInitCodePageTable().
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/locale.c | 58 +++++++++++++++++++++++++++++++++++++ dlls/ntdll/ntdll.spec | 2 +- dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- include/winternl.h | 24 +++++++++++++++ 4 files changed, 84 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c index 1c80bf80bb..6da6f5ead3 100644 --- a/dlls/ntdll/locale.c +++ b/dlls/ntdll/locale.c @@ -40,6 +40,30 @@
WINE_DEFAULT_DEBUG_CHANNEL(nls);
+/* NLS file format: + * + * header: + * WORD offset to cp2uni table in words + * WORD CodePage + * WORD MaximumCharacterSize + * BYTE[2] DefaultChar + * WORD UniDefaultChar + * WORD TransDefaultChar + * WORD TransUniDefaultChar + * BYTE[12] LeadByte + * cp2uni table: + * WORD offset to uni2cp table in words + * WORD[256] cp2uni table + * WORD glyph table size + * WORD[glyph_table_size] glyph table + * WORD number of lead byte ranges + * WORD[256] lead byte offsets in words + * WORD[leadbytes][256] cp2uni table for lead bytes + * uni2cp table: + * WORD 0 / 4 + * BYTE[65536] / WORD[65536] uni2cp table + */ + enum nls_section_type { NLS_SECTION_CASEMAP = 10, @@ -594,6 +618,40 @@ done: }
+/****************************************************************** + * RtlInitCodePageTable (NTDLL.@) + */ +void WINAPI RtlInitCodePageTable( USHORT *ptr, CPTABLEINFO *info ) +{ + USHORT hdr_size = ptr[0]; + + info->CodePage = ptr[1]; + info->MaximumCharacterSize = ptr[2]; + info->DefaultChar = ptr[3]; + info->UniDefaultChar = ptr[4]; + info->TransDefaultChar = ptr[5]; + info->TransUniDefaultChar = ptr[6]; + memcpy( info->LeadByte, ptr + 7, sizeof(info->LeadByte) ); + ptr += hdr_size; + + info->WideCharTable = ptr + ptr[0] + 1; + info->MultiByteTable = ++ptr; + ptr += 256; + if (*ptr++) ptr += 256; /* glyph table */ + info->DBCSRanges = ptr; + if (*ptr) /* dbcs ranges */ + { + info->DBCSCodePage = 1; + info->DBCSOffsets = ptr + 1; + } + else + { + info->DBCSCodePage = 0; + info->DBCSOffsets = NULL; + } +} + + /****************************************************************** * RtlLocaleNameToLcid (NTDLL.@) */ diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 3e1aa2fe49..d713e80a16 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -729,7 +729,7 @@ @ stdcall RtlImpersonateSelf(long) @ stdcall RtlInitAnsiString(ptr str) @ stdcall RtlInitAnsiStringEx(ptr str) -@ stub RtlInitCodePageTable +@ stdcall RtlInitCodePageTable(ptr ptr) # @ stub RtlInitMemoryStream @ stub RtlInitNlsTables # @ stub RtlInitOutOfProcessMemoryStream diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 297487fa25..d59e500187 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -1079,7 +1079,7 @@ @ stdcall RtlImageDirectoryEntryToData(long long long ptr) @ stdcall RtlImageNtHeader(long) @ stdcall RtlInitAnsiString(ptr str) -@ stub RtlInitCodePageTable +@ stdcall RtlInitCodePageTable(ptr ptr) ntdll.RtlInitCodePageTable @ stdcall RtlInitString(ptr str) @ stdcall RtlInitUnicodeString(ptr wstr) @ stdcall RtlInitializeBitMap(ptr ptr long) diff --git a/include/winternl.h b/include/winternl.h index 635c230ded..a2fb7e94e3 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -2203,6 +2203,29 @@ typedef enum _SYSDBG_COMMAND { SysDbgWriteBusData } SYSDBG_COMMAND, *PSYSDBG_COMMAND;
+typedef struct _CPTABLEINFO +{ + USHORT CodePage; + USHORT MaximumCharacterSize; + USHORT DefaultChar; + USHORT UniDefaultChar; + USHORT TransDefaultChar; + USHORT TransUniDefaultChar; + USHORT DBCSCodePage; + UCHAR LeadByte[12]; + USHORT *MultiByteTable; + void *WideCharTable; + USHORT *DBCSRanges; + USHORT *DBCSOffsets; +} CPTABLEINFO, *PCPTABLEINFO; + +typedef struct _NLSTABLEINFO +{ + CPTABLEINFO OemTableInfo; + CPTABLEINFO AnsiTableInfo; + USHORT *UpperCaseTable; + USHORT *LowerCaseTable; +} NLSTABLEINFO, *PNLSTABLEINFO;
/************************************************************************* * Loader structures @@ -2758,6 +2781,7 @@ NTSYSAPI NTSTATUS WINAPI RtlImpersonateSelf(SECURITY_IMPERSONATION_LEVEL); NTSYSAPI void WINAPI RtlInitString(PSTRING,PCSZ); NTSYSAPI void WINAPI RtlInitAnsiString(PANSI_STRING,PCSZ); NTSYSAPI NTSTATUS WINAPI RtlInitAnsiStringEx(PANSI_STRING,PCSZ); +NTSYSAPI void WINAPI RtlInitCodePageTable(USHORT*,CPTABLEINFO*); NTSYSAPI void WINAPI RtlInitUnicodeString(PUNICODE_STRING,PCWSTR); NTSYSAPI NTSTATUS WINAPI RtlInitUnicodeStringEx(PUNICODE_STRING,PCWSTR); NTSYSAPI void WINAPI RtlInitializeBitMap(PRTL_BITMAP,PULONG,ULONG);