2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/rtl/nls.c
5 * PURPOSE: Bitmap functions
7 * PROGRAMMERS: Eric Kohl
12 #include <internal/debug.h>
15 /* GLOBALS *******************************************************************/
18 static PUSHORT NlsAnsiCodePageTable
= NULL
;
19 static ULONG NlsAnsiCodePageTableSize
= 0;
21 static PUSHORT NlsOemCodePageTable
= NULL
;
22 static ULONG NlsOemCodePageTableSize
= 0;
24 static PUSHORT NlsUnicodeCasemapTable
= NULL
;
25 static ULONG NlsUnicodeCasemapTableSize
= 0;
27 PSECTION_OBJECT NlsSectionObject
= NULL
;
28 static PVOID NlsSectionBase
= NULL
;
29 static ULONG NlsSectionViewSize
= 0;
31 ULONG NlsAnsiTableOffset
= 0;
32 ULONG NlsOemTableOffset
= 0;
33 ULONG NlsUnicodeTableOffset
= 0;
36 /* FUNCTIONS *****************************************************************/
43 ULONG_PTR BaseAddress
;
46 BaseAddress
= CachedModules
[AnsiCodepage
]->ModStart
;
47 RtlpImportAnsiCodePage((PUSHORT
)BaseAddress
,
48 CachedModules
[AnsiCodepage
]->ModEnd
- BaseAddress
);
50 BaseAddress
= CachedModules
[OemCodepage
]->ModStart
;
51 RtlpImportOemCodePage((PUSHORT
)BaseAddress
,
52 CachedModules
[OemCodepage
]->ModEnd
- BaseAddress
);
54 BaseAddress
= CachedModules
[UnicodeCasemap
]->ModStart
;
55 RtlpImportUnicodeCasemap((PUSHORT
)BaseAddress
,
56 CachedModules
[UnicodeCasemap
]->ModEnd
- BaseAddress
);
58 /* Create initial NLS tables */
59 RtlpCreateInitialNlsTables();
61 /* Create the NLS section */
62 RtlpCreateNlsSection();
66 RtlpImportAnsiCodePage(PUSHORT TableBase
,
69 NlsAnsiCodePageTable
= TableBase
;
70 NlsAnsiCodePageTableSize
= Size
;
75 RtlpImportOemCodePage(PUSHORT TableBase
,
78 NlsOemCodePageTable
= TableBase
;
79 NlsOemCodePageTableSize
= Size
;
84 RtlpImportUnicodeCasemap(PUSHORT TableBase
,
87 NlsUnicodeCasemapTable
= TableBase
;
88 NlsUnicodeCasemapTableSize
= Size
;
93 RtlpCreateInitialNlsTables(VOID
)
95 NLSTABLEINFO NlsTable
;
97 if (NlsAnsiCodePageTable
== NULL
|| NlsAnsiCodePageTableSize
== 0 ||
98 NlsOemCodePageTable
== NULL
|| NlsOemCodePageTableSize
== 0 ||
99 NlsUnicodeCasemapTable
== NULL
|| NlsUnicodeCasemapTableSize
== 0)
101 KEBUGCHECKEX (0x32, STATUS_UNSUCCESSFUL
, 1, 0, 0);
104 RtlInitNlsTables (NlsAnsiCodePageTable
,
106 NlsUnicodeCasemapTable
,
109 RtlResetRtlTranslations (&NlsTable
);
114 RtlpCreateNlsSection(VOID
)
116 NLSTABLEINFO NlsTable
;
117 LARGE_INTEGER SectionSize
;
120 DPRINT("RtlpCreateNlsSection() called\n");
122 NlsSectionViewSize
= ROUND_UP(NlsAnsiCodePageTableSize
, PAGE_SIZE
) +
123 ROUND_UP(NlsOemCodePageTableSize
, PAGE_SIZE
) +
124 ROUND_UP(NlsUnicodeCasemapTableSize
, PAGE_SIZE
);
126 DPRINT("NlsSectionViewSize %lx\n", NlsSectionViewSize
);
128 SectionSize
.QuadPart
= (LONGLONG
)NlsSectionViewSize
;
129 Status
= MmCreateSection(&NlsSectionObject
,
137 if (!NT_SUCCESS(Status
))
139 DPRINT1("MmCreateSection() failed\n");
140 KEBUGCHECKEX(0x32, Status
, 1, 1, 0);
143 Status
= MmMapViewInSystemSpace(NlsSectionObject
,
145 &NlsSectionViewSize
);
146 if (!NT_SUCCESS(Status
))
148 DPRINT1("MmMapViewInSystemSpace() failed\n");
149 KEBUGCHECKEX(0x32, Status
, 1, 3, 0);
152 DPRINT("NlsSection: Base %p Size %lx\n",
156 NlsAnsiTableOffset
= 0;
157 RtlCopyMemory((PVOID
)((ULONG
)NlsSectionBase
+ NlsAnsiTableOffset
),
158 NlsAnsiCodePageTable
,
159 NlsAnsiCodePageTableSize
);
161 NlsOemTableOffset
= NlsAnsiTableOffset
+ ROUND_UP(NlsAnsiCodePageTableSize
, PAGE_SIZE
);
162 RtlCopyMemory((PVOID
)((ULONG
)NlsSectionBase
+ NlsOemTableOffset
),
164 NlsOemCodePageTableSize
);
166 NlsUnicodeTableOffset
= NlsOemTableOffset
+ ROUND_UP(NlsOemCodePageTableSize
, PAGE_SIZE
);
167 RtlCopyMemory((PVOID
)((ULONG
)NlsSectionBase
+ NlsUnicodeTableOffset
),
168 NlsUnicodeCasemapTable
,
169 NlsUnicodeCasemapTableSize
);
171 RtlInitNlsTables ((PVOID
)((ULONG
)NlsSectionBase
+ NlsAnsiTableOffset
),
172 (PVOID
)((ULONG
)NlsSectionBase
+ NlsOemTableOffset
),
173 (PVOID
)((ULONG
)NlsSectionBase
+ NlsUnicodeTableOffset
),
176 RtlResetRtlTranslations (&NlsTable
);