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