Alexandre Julliard : ntdll: Implement RtlInitCodePageTable().
Alexandre Julliard
julliard at winehq.org
Tue Nov 26 16:21:24 CST 2019
Module: wine
Branch: master
Commit: 9ae5717ba6d10126c4a274240ec1e72fa241a6db
URL: https://source.winehq.org/git/wine.git/?a=commit;h=9ae5717ba6d10126c4a274240ec1e72fa241a6db
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Nov 26 17:29:41 2019 +0100
ntdll: Implement RtlInitCodePageTable().
Signed-off-by: Alexandre Julliard <julliard at 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);
More information about the wine-cvs
mailing list