1 /* $Id: nls.c,v 1.23 2004/05/31 19:40:49 gdalsnes Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/rtl/nls.c
6 * PURPOSE: Bitmap functions
8 * 20/08/99 Created by Eric Kohl
11 #include <ddk/ntddk.h>
13 #include <internal/mm.h>
14 #include <internal/nls.h>
17 #include <internal/debug.h>
20 /* GLOBALS *******************************************************************/
23 static PUSHORT NlsAnsiCodePageTable
= NULL
;
24 static ULONG NlsAnsiCodePageTableSize
= 0;
26 static PUSHORT NlsOemCodePageTable
= NULL
;
27 static ULONG NlsOemCodePageTableSize
= 0;
29 static PUSHORT NlsUnicodeCasemapTable
= NULL
;
30 static ULONG NlsUnicodeCasemapTableSize
= 0;
32 PVOID NlsSectionObject
= NULL
;
33 static PVOID NlsSectionBase
= NULL
;
34 static ULONG NlsSectionViewSize
= 0;
36 ULONG NlsAnsiTableOffset
= 0;
37 ULONG NlsOemTableOffset
= 0;
38 ULONG NlsUnicodeTableOffset
= 0;
41 /* FUNCTIONS *****************************************************************/
46 RtlpImportAnsiCodePage(PUSHORT TableBase
,
49 NlsAnsiCodePageTable
= TableBase
;
50 NlsAnsiCodePageTableSize
= Size
;
55 RtlpImportOemCodePage(PUSHORT TableBase
,
58 NlsOemCodePageTable
= TableBase
;
59 NlsOemCodePageTableSize
= Size
;
64 RtlpImportUnicodeCasemap(PUSHORT TableBase
,
67 NlsUnicodeCasemapTable
= TableBase
;
68 NlsUnicodeCasemapTableSize
= Size
;
73 RtlpCreateInitialNlsTables(VOID
)
75 NLSTABLEINFO NlsTable
;
77 if (NlsAnsiCodePageTable
== NULL
|| NlsAnsiCodePageTableSize
== 0 ||
78 NlsOemCodePageTable
== NULL
|| NlsOemCodePageTableSize
== 0 ||
79 NlsUnicodeCasemapTable
== NULL
|| NlsUnicodeCasemapTableSize
== 0)
81 KEBUGCHECKEX (0x32, STATUS_UNSUCCESSFUL
, 1, 0, 0);
84 RtlInitNlsTables (NlsAnsiCodePageTable
,
86 NlsUnicodeCasemapTable
,
89 RtlResetRtlTranslations (&NlsTable
);
94 RtlpCreateNlsSection(VOID
)
96 NLSTABLEINFO NlsTable
;
97 LARGE_INTEGER SectionSize
;
101 DPRINT("RtlpCreateNlsSection() called\n");
103 NlsSectionViewSize
= ROUND_UP(NlsAnsiCodePageTableSize
, PAGE_SIZE
) +
104 ROUND_UP(NlsOemCodePageTableSize
, PAGE_SIZE
) +
105 ROUND_UP(NlsUnicodeCasemapTableSize
, PAGE_SIZE
);
107 DPRINT("NlsSectionViewSize %lx\n", NlsSectionViewSize
);
109 SectionSize
.QuadPart
= (LONGLONG
)NlsSectionViewSize
;
110 Status
= NtCreateSection(&SectionHandle
,
117 if (!NT_SUCCESS(Status
))
119 DPRINT1("NtCreateSection() failed\n");
120 KEBUGCHECKEX(0x32, Status
, 1, 1, 0);
123 Status
= ObReferenceObjectByHandle(SectionHandle
,
129 NtClose(SectionHandle
);
130 if (!NT_SUCCESS(Status
))
132 DPRINT1("ObReferenceObjectByHandle() failed\n");
133 KEBUGCHECKEX(0x32, Status
, 1, 2, 0);
136 Status
= MmMapViewInSystemSpace(NlsSectionObject
,
138 &NlsSectionViewSize
);
139 if (!NT_SUCCESS(Status
))
141 DPRINT1("MmMapViewInSystemSpace() failed\n");
142 KEBUGCHECKEX(0x32, Status
, 1, 3, 0);
145 DPRINT("NlsSection: Base %p Size %lx\n",
149 NlsAnsiTableOffset
= 0;
150 RtlCopyMemory((PVOID
)((ULONG
)NlsSectionBase
+ NlsAnsiTableOffset
),
151 NlsAnsiCodePageTable
,
152 NlsAnsiCodePageTableSize
);
154 NlsOemTableOffset
= NlsAnsiTableOffset
+ ROUND_UP(NlsAnsiCodePageTableSize
, PAGE_SIZE
);
155 RtlCopyMemory((PVOID
)((ULONG
)NlsSectionBase
+ NlsOemTableOffset
),
157 NlsOemCodePageTableSize
);
159 NlsUnicodeTableOffset
= NlsOemTableOffset
+ ROUND_UP(NlsOemCodePageTableSize
, PAGE_SIZE
);
160 RtlCopyMemory((PVOID
)((ULONG
)NlsSectionBase
+ NlsUnicodeTableOffset
),
161 NlsUnicodeCasemapTable
,
162 NlsUnicodeCasemapTableSize
);
164 RtlInitNlsTables ((PVOID
)((ULONG
)NlsSectionBase
+ NlsAnsiTableOffset
),
165 (PVOID
)((ULONG
)NlsSectionBase
+ NlsOemTableOffset
),
166 (PVOID
)((ULONG
)NlsSectionBase
+ NlsUnicodeTableOffset
),
169 RtlResetRtlTranslations (&NlsTable
);