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
13 #include <internal/debug.h>
16 /* GLOBALS *******************************************************************/
19 static PUSHORT NlsAnsiCodePageTable
= NULL
;
20 static ULONG NlsAnsiCodePageTableSize
= 0;
22 static PUSHORT NlsOemCodePageTable
= NULL
;
23 static ULONG NlsOemCodePageTableSize
= 0;
25 static PUSHORT NlsUnicodeCasemapTable
= NULL
;
26 static ULONG NlsUnicodeCasemapTableSize
= 0;
28 PSECTION_OBJECT NlsSectionObject
= NULL
;
29 static PVOID NlsSectionBase
= NULL
;
30 static ULONG NlsSectionViewSize
= 0;
32 ULONG NlsAnsiTableOffset
= 0;
33 ULONG NlsOemTableOffset
= 0;
34 ULONG NlsUnicodeTableOffset
= 0;
37 /* FUNCTIONS *****************************************************************/
42 RtlpImportAnsiCodePage(PUSHORT TableBase
,
45 NlsAnsiCodePageTable
= TableBase
;
46 NlsAnsiCodePageTableSize
= Size
;
51 RtlpImportOemCodePage(PUSHORT TableBase
,
54 NlsOemCodePageTable
= TableBase
;
55 NlsOemCodePageTableSize
= Size
;
60 RtlpImportUnicodeCasemap(PUSHORT TableBase
,
63 NlsUnicodeCasemapTable
= TableBase
;
64 NlsUnicodeCasemapTableSize
= Size
;
69 RtlpCreateInitialNlsTables(VOID
)
71 NLSTABLEINFO NlsTable
;
73 if (NlsAnsiCodePageTable
== NULL
|| NlsAnsiCodePageTableSize
== 0 ||
74 NlsOemCodePageTable
== NULL
|| NlsOemCodePageTableSize
== 0 ||
75 NlsUnicodeCasemapTable
== NULL
|| NlsUnicodeCasemapTableSize
== 0)
77 KEBUGCHECKEX (0x32, STATUS_UNSUCCESSFUL
, 1, 0, 0);
80 RtlInitNlsTables (NlsAnsiCodePageTable
,
82 NlsUnicodeCasemapTable
,
85 RtlResetRtlTranslations (&NlsTable
);
90 RtlpCreateNlsSection(VOID
)
92 NLSTABLEINFO NlsTable
;
93 LARGE_INTEGER SectionSize
;
96 DPRINT("RtlpCreateNlsSection() called\n");
98 NlsSectionViewSize
= ROUND_UP(NlsAnsiCodePageTableSize
, PAGE_SIZE
) +
99 ROUND_UP(NlsOemCodePageTableSize
, PAGE_SIZE
) +
100 ROUND_UP(NlsUnicodeCasemapTableSize
, PAGE_SIZE
);
102 DPRINT("NlsSectionViewSize %lx\n", NlsSectionViewSize
);
104 SectionSize
.QuadPart
= (LONGLONG
)NlsSectionViewSize
;
105 Status
= MmCreateSection(&NlsSectionObject
,
113 if (!NT_SUCCESS(Status
))
115 DPRINT1("MmCreateSection() failed\n");
116 KEBUGCHECKEX(0x32, Status
, 1, 1, 0);
119 Status
= MmMapViewInSystemSpace(NlsSectionObject
,
121 &NlsSectionViewSize
);
122 if (!NT_SUCCESS(Status
))
124 DPRINT1("MmMapViewInSystemSpace() failed\n");
125 KEBUGCHECKEX(0x32, Status
, 1, 3, 0);
128 DPRINT("NlsSection: Base %p Size %lx\n",
132 NlsAnsiTableOffset
= 0;
133 RtlCopyMemory((PVOID
)((ULONG
)NlsSectionBase
+ NlsAnsiTableOffset
),
134 NlsAnsiCodePageTable
,
135 NlsAnsiCodePageTableSize
);
137 NlsOemTableOffset
= NlsAnsiTableOffset
+ ROUND_UP(NlsAnsiCodePageTableSize
, PAGE_SIZE
);
138 RtlCopyMemory((PVOID
)((ULONG
)NlsSectionBase
+ NlsOemTableOffset
),
140 NlsOemCodePageTableSize
);
142 NlsUnicodeTableOffset
= NlsOemTableOffset
+ ROUND_UP(NlsOemCodePageTableSize
, PAGE_SIZE
);
143 RtlCopyMemory((PVOID
)((ULONG
)NlsSectionBase
+ NlsUnicodeTableOffset
),
144 NlsUnicodeCasemapTable
,
145 NlsUnicodeCasemapTableSize
);
147 RtlInitNlsTables ((PVOID
)((ULONG
)NlsSectionBase
+ NlsAnsiTableOffset
),
148 (PVOID
)((ULONG
)NlsSectionBase
+ NlsOemTableOffset
),
149 (PVOID
)((ULONG
)NlsSectionBase
+ NlsUnicodeTableOffset
),
152 RtlResetRtlTranslations (&NlsTable
);