Cleanup isn't necessary after calling the driver in NtQueryDirectoryFile.
[reactos.git] / reactos / ntoskrnl / rtl / nls.c
index a5a0556..15c63a5 100644 (file)
@@ -1,45 +1,27 @@
-/* $Id: nls.c,v 1.22 2003/10/12 17:05:50 hbirr Exp $
- *
+/*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/rtl/nls.c
- * PURPOSE:         National Language Support (NLS) functions
- * UPDATE HISTORY:
- *                  20/08/99 Created by Emanuele Aliberti
- *                  10/11/99 Added translation functions.
+ * PURPOSE:         Bitmap functions
  *
- * TODO:
- *   1) Add multi-byte translation code.
+ * PROGRAMMERS:     Eric Kohl
  */
 
-#include <ddk/ntddk.h>
-#include <internal/mm.h>
-#include <internal/nls.h>
-
+#include <ntoskrnl.h>
 #define NDEBUG
 #include <internal/debug.h>
 
-
-/* GLOBALS *******************************************************************/
-
-USHORT NlsAnsiCodePage = 0; /* exported */
-BOOLEAN NlsMbCodePageTag = FALSE; /* exported */
-PWCHAR NlsAnsiToUnicodeTable = NULL;
-PCHAR NlsUnicodeToAnsiTable = NULL;
-PWCHAR NlsDbcsUnicodeToAnsiTable = NULL;
-PUSHORT NlsLeadByteInfo = NULL; /* exported */
-
-
-USHORT NlsOemCodePage = 0;
-BOOLEAN NlsMbOemCodePageTag = FALSE; /* exported */
-PWCHAR NlsOemToUnicodeTable = NULL;
-PCHAR NlsUnicodeToOemTable =NULL;
-PWCHAR NlsDbcsUnicodeToOemTable = NULL;
-PUSHORT NlsOemLeadByteInfo = NULL; /* exported */
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, RtlpInitNls)
+#pragma alloc_text(INIT, RtlpImportAnsiCodePage)
+#pragma alloc_text(INIT, RtlpImportOemCodePage)
+#pragma alloc_text(INIT, RtlpImportUnicodeCasemap)
+#pragma alloc_text(INIT, RtlpCreateInitialNlsTables)
+#pragma alloc_text(INIT, RtlpCreateNlsSection)
+#endif
 
 
-PUSHORT NlsUnicodeUpcaseTable = NULL;
-PUSHORT NlsUnicodeLowercaseTable = NULL;
+/* GLOBALS *******************************************************************/
 
 
 static PUSHORT NlsAnsiCodePageTable = NULL;
@@ -51,7 +33,7 @@ static ULONG NlsOemCodePageTableSize = 0;
 static PUSHORT NlsUnicodeCasemapTable = NULL;
 static ULONG NlsUnicodeCasemapTableSize = 0;
 
-PVOID NlsSectionObject = NULL;
+PSECTION_OBJECT NlsSectionObject = NULL;
 static PVOID NlsSectionBase = NULL;
 static ULONG NlsSectionViewSize = 0;
 
@@ -62,34 +44,69 @@ ULONG NlsUnicodeTableOffset = 0;
 
 /* FUNCTIONS *****************************************************************/
 
-VOID INIT_FUNCTION
+VOID
+INIT_FUNCTION
+STDCALL
+RtlpInitNls(VOID)
+{
+    ULONG_PTR BaseAddress;
+
+    /* Import NLS Data */
+    BaseAddress = CachedModules[AnsiCodepage]->ModStart;
+    RtlpImportAnsiCodePage((PUSHORT)BaseAddress,
+                           CachedModules[AnsiCodepage]->ModEnd - BaseAddress);
+
+    BaseAddress = CachedModules[OemCodepage]->ModStart;
+    RtlpImportOemCodePage((PUSHORT)BaseAddress,
+                          CachedModules[OemCodepage]->ModEnd - BaseAddress);
+
+    BaseAddress = CachedModules[UnicodeCasemap]->ModStart;
+    RtlpImportUnicodeCasemap((PUSHORT)BaseAddress,
+                             CachedModules[UnicodeCasemap]->ModEnd - BaseAddress);
+
+    /* Create initial NLS tables */
+    RtlpCreateInitialNlsTables();
+
+    /* Create the NLS section */
+    RtlpCreateNlsSection();
+}
+
+VOID
+INIT_FUNCTION
+NTAPI
 RtlpImportAnsiCodePage(PUSHORT TableBase,
-                      ULONG Size)
+             ULONG Size)
 {
   NlsAnsiCodePageTable = TableBase;
   NlsAnsiCodePageTableSize = Size;
 }
 
 
-VOID INIT_FUNCTION
+VOID
+INIT_FUNCTION
+NTAPI
 RtlpImportOemCodePage(PUSHORT TableBase,
-                     ULONG Size)
+            ULONG Size)
 {
   NlsOemCodePageTable = TableBase;
   NlsOemCodePageTableSize = Size;
 }
 
 
-VOID INIT_FUNCTION
+VOID
+NTAPI
+INIT_FUNCTION
 RtlpImportUnicodeCasemap(PUSHORT TableBase,
-                        ULONG Size)
+          ULONG Size)
 {
   NlsUnicodeCasemapTable = TableBase;
   NlsUnicodeCasemapTableSize = Size;
 }
 
 
-VOID INIT_FUNCTION
+VOID
+NTAPI
+INIT_FUNCTION
 RtlpCreateInitialNlsTables(VOID)
 {
   NLSTABLEINFO NlsTable;
@@ -102,744 +119,86 @@ RtlpCreateInitialNlsTables(VOID)
     }
 
   RtlInitNlsTables (NlsAnsiCodePageTable,
-                   NlsOemCodePageTable,
-                   NlsUnicodeCasemapTable,
-                   &NlsTable);
+          NlsOemCodePageTable,
+          NlsUnicodeCasemapTable,
+          &NlsTable);
 
   RtlResetRtlTranslations (&NlsTable);
 }
 
-
-VOID INIT_FUNCTION
+VOID
+NTAPI
+INIT_FUNCTION
 RtlpCreateNlsSection(VOID)
 {
   NLSTABLEINFO NlsTable;
   LARGE_INTEGER SectionSize;
-  HANDLE SectionHandle;
   NTSTATUS Status;
 
   DPRINT("RtlpCreateNlsSection() called\n");
 
   NlsSectionViewSize = ROUND_UP(NlsAnsiCodePageTableSize, PAGE_SIZE) +
-                      ROUND_UP(NlsOemCodePageTableSize, PAGE_SIZE) +
-                      ROUND_UP(NlsUnicodeCasemapTableSize, PAGE_SIZE);
+             ROUND_UP(NlsOemCodePageTableSize, PAGE_SIZE) +
+             ROUND_UP(NlsUnicodeCasemapTableSize, PAGE_SIZE);
 
   DPRINT("NlsSectionViewSize %lx\n", NlsSectionViewSize);
 
   SectionSize.QuadPart = (LONGLONG)NlsSectionViewSize;
-  Status = NtCreateSection(&SectionHandle,
-                          SECTION_ALL_ACCESS,
-                          NULL,
-                          &SectionSize,
-                          PAGE_READWRITE,
-                          SEC_COMMIT,
-                          NULL);
+  Status = MmCreateSection(&NlsSectionObject,
+            SECTION_ALL_ACCESS,
+            NULL,
+            &SectionSize,
+            PAGE_READWRITE,
+            SEC_COMMIT,
+            NULL,
+            NULL);
   if (!NT_SUCCESS(Status))
     {
-      DPRINT1("NtCreateSection() failed\n");
+      DPRINT1("MmCreateSection() failed\n");
       KEBUGCHECKEX(0x32, Status, 1, 1, 0);
     }
-
-  Status = ObReferenceObjectByHandle(SectionHandle,
-                                    SECTION_ALL_ACCESS,
-                                    MmSectionObjectType,
-                                    KernelMode,
-                                    &NlsSectionObject,
-                                    NULL);
-  NtClose(SectionHandle);
-  if (!NT_SUCCESS(Status))
-    {
-      DPRINT1("ObReferenceObjectByHandle() failed\n");
-      KEBUGCHECKEX(0x32, Status, 1, 2, 0);
-    }
-
+   Status = ObInsertObject(NlsSectionObject,
+                           NULL,
+                           SECTION_ALL_ACCESS,
+                           0,
+                           NULL,
+                           NULL);
+   if (!NT_SUCCESS(Status))
+   {
+      ObDereferenceObject(NlsSectionObject);
+   }
   Status = MmMapViewInSystemSpace(NlsSectionObject,
-                                 &NlsSectionBase,
-                                 &NlsSectionViewSize);
+              &NlsSectionBase,
+              &NlsSectionViewSize);
   if (!NT_SUCCESS(Status))
     {
       DPRINT1("MmMapViewInSystemSpace() failed\n");
       KEBUGCHECKEX(0x32, Status, 1, 3, 0);
     }
 
-  DPRINT("NlsSection: Base %p  Size %lx\n", 
-        NlsSectionBase,
-        NlsSectionViewSize);
+  DPRINT("NlsSection: Base %p  Size %lx\n",
+    NlsSectionBase,
+    NlsSectionViewSize);
 
   NlsAnsiTableOffset = 0;
   RtlCopyMemory((PVOID)((ULONG)NlsSectionBase + NlsAnsiTableOffset),
-               NlsAnsiCodePageTable,
-               NlsAnsiCodePageTableSize);
+      NlsAnsiCodePageTable,
+      NlsAnsiCodePageTableSize);
 
   NlsOemTableOffset = NlsAnsiTableOffset + ROUND_UP(NlsAnsiCodePageTableSize, PAGE_SIZE);
   RtlCopyMemory((PVOID)((ULONG)NlsSectionBase + NlsOemTableOffset),
-               NlsOemCodePageTable,
-               NlsOemCodePageTableSize);
+      NlsOemCodePageTable,
+      NlsOemCodePageTableSize);
 
   NlsUnicodeTableOffset = NlsOemTableOffset + ROUND_UP(NlsOemCodePageTableSize, PAGE_SIZE);
   RtlCopyMemory((PVOID)((ULONG)NlsSectionBase + NlsUnicodeTableOffset),
-               NlsUnicodeCasemapTable,
-               NlsUnicodeCasemapTableSize);
+      NlsUnicodeCasemapTable,
+      NlsUnicodeCasemapTableSize);
 
   RtlInitNlsTables ((PVOID)((ULONG)NlsSectionBase + NlsAnsiTableOffset),
-                   (PVOID)((ULONG)NlsSectionBase + NlsOemTableOffset),
-                   (PVOID)((ULONG)NlsSectionBase + NlsUnicodeTableOffset),
-                   &NlsTable);
+          (PVOID)((ULONG)NlsSectionBase + NlsOemTableOffset),
+          (PVOID)((ULONG)NlsSectionBase + NlsUnicodeTableOffset),
+          &NlsTable);
 
   RtlResetRtlTranslations (&NlsTable);
 }
-
-
-/*
- * @unimplemented
- */
-NTSTATUS STDCALL
-RtlCustomCPToUnicodeN(IN PCPTABLEINFO CustomCP,
-                     PWCHAR UnicodeString,
-                     ULONG UnicodeSize,
-                     PULONG ResultSize,
-                     PCHAR CustomString,
-                     ULONG CustomSize)
-{
-  ULONG Size = 0;
-  ULONG i;
-
-  if (CustomCP->DBCSCodePage == 0)
-    {
-      /* single-byte code page */
-      if (CustomSize > (UnicodeSize / sizeof(WCHAR)))
-       Size = UnicodeSize / sizeof(WCHAR);
-      else
-       Size = CustomSize;
-
-      if (ResultSize != NULL)
-       *ResultSize = Size * sizeof(WCHAR);
-
-      for (i = 0; i < Size; i++)
-       {
-         *UnicodeString = CustomCP->MultiByteTable[(UCHAR)*CustomString];
-         UnicodeString++;
-         CustomString++;
-       }
-    }
-  else
-    {
-      /* multi-byte code page */
-      /* FIXME */
-    }
-
-  return(STATUS_SUCCESS);
-}
-
-
-WCHAR
-RtlDowncaseUnicodeChar (IN WCHAR Source)
-{
-  USHORT Offset;
-
-  if (Source < L'A')
-    return Source;
-
-  if (Source <= L'Z')
-    return Source + (L'a' - L'A');
-
-  if (Source < 0x80)
-    return Source;
-
-  Offset = ((USHORT)Source >> 8);
-  Offset = NlsUnicodeLowercaseTable[Offset];
-
-  Offset += (((USHORT)Source & 0x00F0) >> 4);
-  Offset = NlsUnicodeLowercaseTable[Offset];
-
-  Offset += ((USHORT)Source & 0x000F);
-  Offset = NlsUnicodeLowercaseTable[Offset];
-
-  return Source + (SHORT)Offset;
-}
-
-
-/*
- * @implemented
- */
-VOID STDCALL
-RtlGetDefaultCodePage(PUSHORT AnsiCodePage,
-                     PUSHORT OemCodePage)
-{
-  *AnsiCodePage = NlsAnsiCodePage;
-  *OemCodePage = NlsOemCodePage;
-}
-
-
-/*
- * @implemented
- */
-VOID STDCALL
-RtlInitCodePageTable(IN PUSHORT TableBase,
-                    OUT PCPTABLEINFO CodePageTable)
-{
-  PNLS_FILE_HEADER NlsFileHeader;
-  PUSHORT Ptr;
-  USHORT Offset;
-
-  DPRINT("RtlInitCodePageTable() called\n");
-
-  NlsFileHeader = (PNLS_FILE_HEADER)TableBase;
-
-  CodePageTable->CodePage = NlsFileHeader->CodePage;
-  CodePageTable->MaximumCharacterSize = NlsFileHeader->MaximumCharacterSize;
-  CodePageTable->DefaultChar = NlsFileHeader->DefaultChar;
-  CodePageTable->UniDefaultChar = NlsFileHeader->UniDefaultChar;
-  CodePageTable->TransDefaultChar = NlsFileHeader->TransDefaultChar;
-  CodePageTable->TransUniDefaultChar = NlsFileHeader->TransUniDefaultChar;
-
-  RtlCopyMemory(&CodePageTable->LeadByte,
-               &NlsFileHeader->LeadByte,
-               MAXIMUM_LEADBYTES);
-
-  /* Set Pointer to start of multi byte table */
-  Ptr = (PUSHORT)((ULONG_PTR)TableBase + 2 * NlsFileHeader->HeaderSize);
-
-  /* Get offset to the wide char table */
-  Offset = (USHORT)(*Ptr++) + NlsFileHeader->HeaderSize + 1;
-
-  /* Set pointer to the multi byte table */
-  CodePageTable->MultiByteTable = Ptr;
-
-  /* Skip ANSI and OEM table */
-  Ptr += 256;
-  if (*Ptr++)
-    Ptr += 256;
-
-  /* Set pointer to DBCS ranges */
-  CodePageTable->DBCSRanges = (PUSHORT)Ptr;
-
-  if (*Ptr > 0)
-    {
-      CodePageTable->DBCSCodePage = 1;
-      CodePageTable->DBCSOffsets = (PUSHORT)++Ptr;
-    }
-  else
-    {
-      CodePageTable->DBCSCodePage = 0;
-      CodePageTable->DBCSOffsets = 0;
-    }
-
-  CodePageTable->WideCharTable = (PVOID)((ULONG_PTR)TableBase + 2 * Offset);
-}
-
-
-VOID STDCALL
-RtlInitNlsTables(IN PUSHORT AnsiTableBase,
-                IN PUSHORT OemTableBase,
-                IN PUSHORT CaseTableBase,
-                OUT PNLSTABLEINFO NlsTable)
-{
-  DPRINT("RtlInitNlsTables()called\n");
-
-  RtlInitCodePageTable (AnsiTableBase,
-                       &NlsTable->AnsiTableInfo);
-
-  RtlInitCodePageTable (OemTableBase,
-                       &NlsTable->OemTableInfo);
-
-  NlsTable->UpperCaseTable = (PUSHORT)CaseTableBase + 2;
-  NlsTable->LowerCaseTable = (PUSHORT)CaseTableBase + *((PUSHORT)CaseTableBase + 1) + 2;
-}
-
-
-/*
- * @unimplemented
- */
-NTSTATUS STDCALL
-RtlMultiByteToUnicodeN(PWCHAR UnicodeString,
-                      ULONG UnicodeSize,
-                      PULONG ResultSize,
-                      const PCHAR MbString,
-                      ULONG MbSize)
-{
-  ULONG Size = 0;
-  ULONG i;
-
-  if (NlsMbCodePageTag == FALSE)
-    {
-      /* single-byte code page */
-      if (MbSize > (UnicodeSize / sizeof(WCHAR)))
-       Size = UnicodeSize / sizeof(WCHAR);
-      else
-       Size = MbSize;
-
-      if (ResultSize != NULL)
-       *ResultSize = Size * sizeof(WCHAR);
-
-      for (i = 0; i < Size; i++)
-       UnicodeString[i] = NlsAnsiToUnicodeTable[(UCHAR)MbString[i]];
-    }
-  else
-    {
-      /* multi-byte code page */
-      /* FIXME */
-    }
-
-  return(STATUS_SUCCESS);
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS STDCALL
-RtlMultiByteToUnicodeSize(PULONG UnicodeSize,
-                         PCHAR MbString,
-                         ULONG MbSize)
-{
-  ULONG Length;
-
-  if (NlsMbCodePageTag == FALSE)
-    {
-      /* single-byte code page */
-      *UnicodeSize = MbSize * sizeof (WCHAR);
-    }
-  else
-    {
-      /* multi-byte code page */
-      for (Length = 0; MbSize; MbSize--, MbString++, Length++)
-       {
-         if (NlsLeadByteInfo[(UCHAR)*MbString] != 0)
-           {
-             if (!--MbSize)
-               break;  /* partial char, ignore it */
-             MbString++;
-           }
-       }
-
-      *UnicodeSize = Length * sizeof(WCHAR);
-    }
-
-  return STATUS_SUCCESS;
-}
-
-
-/*
- * @unimplemented
- */
-NTSTATUS STDCALL
-RtlOemToUnicodeN(PWCHAR UnicodeString,
-                ULONG UnicodeSize,
-                PULONG ResultSize,
-                PCHAR OemString,
-                ULONG OemSize)
-{
-  ULONG Size = 0;
-  ULONG i;
-
-  if (NlsMbOemCodePageTag == FALSE)
-    {
-      /* single-byte code page */
-      if (OemSize > (UnicodeSize / sizeof(WCHAR)))
-       Size = UnicodeSize / sizeof(WCHAR);
-      else
-       Size = OemSize;
-
-      if (ResultSize != NULL)
-       *ResultSize = Size * sizeof(WCHAR);
-
-      for (i = 0; i < Size; i++)
-       {
-         *UnicodeString = NlsOemToUnicodeTable[(UCHAR)*OemString];
-         UnicodeString++;
-         OemString++;
-       }
-    }
-  else
-    {
-      /* multi-byte code page */
-      /* FIXME */
-    }
-
-  return(STATUS_SUCCESS);
-}
-
-
-VOID STDCALL
-RtlResetRtlTranslations(IN PNLSTABLEINFO NlsTable)
-{
-  DPRINT("RtlResetRtlTranslations() called\n");
-
-  /* Set ANSI data */
-  NlsAnsiToUnicodeTable = NlsTable->AnsiTableInfo.MultiByteTable;
-  NlsUnicodeToAnsiTable = NlsTable->AnsiTableInfo.WideCharTable;
-  NlsDbcsUnicodeToAnsiTable = (PWCHAR)NlsTable->AnsiTableInfo.WideCharTable;
-  NlsMbCodePageTag = (NlsTable->AnsiTableInfo.DBCSCodePage != 0);
-  NlsLeadByteInfo = NlsTable->AnsiTableInfo.DBCSOffsets;
-  NlsAnsiCodePage = NlsTable->AnsiTableInfo.CodePage;
-  DPRINT("Ansi codepage %hu\n", NlsAnsiCodePage);
-
-  /* Set OEM data */
-  NlsOemToUnicodeTable = NlsTable->OemTableInfo.MultiByteTable;
-  NlsUnicodeToOemTable = NlsTable->OemTableInfo.WideCharTable;
-  NlsDbcsUnicodeToOemTable = (PWCHAR)NlsTable->OemTableInfo.WideCharTable;
-  NlsMbOemCodePageTag = (NlsTable->OemTableInfo.DBCSCodePage != 0);
-  NlsOemLeadByteInfo = NlsTable->OemTableInfo.DBCSOffsets;
-  NlsOemCodePage = NlsTable->OemTableInfo.CodePage;
-  DPRINT("Oem codepage %hu\n", NlsOemCodePage);
-
-  /* Set Unicode case map data */
-  NlsUnicodeUpcaseTable = NlsTable->UpperCaseTable;
-  NlsUnicodeLowercaseTable = NlsTable->LowerCaseTable;
-}
-
-
-/*
- * @unimplemented
- */
-NTSTATUS STDCALL
-RtlUnicodeToCustomCPN(IN PCPTABLEINFO CustomCP,
-                     PCHAR CustomString,
-                     ULONG CustomSize,
-                     PULONG ResultSize,
-                     PWCHAR UnicodeString,
-                     ULONG UnicodeSize)
-{
-  ULONG Size = 0;
-  ULONG i;
-
-  if (CustomCP->DBCSCodePage == 0)
-    {
-      /* single-byte code page */
-      if (UnicodeSize > (CustomSize * sizeof(WCHAR)))
-       Size = CustomSize;
-      else
-       Size = UnicodeSize / sizeof(WCHAR);
-
-      if (ResultSize != NULL)
-       *ResultSize = Size;
-
-      for (i = 0; i < Size; i++)
-       {
-         *CustomString = ((PCHAR)CustomCP->WideCharTable)[(USHORT)*UnicodeString];
-         CustomString++;
-         UnicodeString++;
-       }
-    }
-  else
-    {
-      /* multi-byte code page */
-      /* FIXME */
-    }
-
-  return(STATUS_SUCCESS);
-}
-
-
-/*
- * @unimplemented
- */
-NTSTATUS
-STDCALL
-RtlUnicodeToMultiByteN(PCHAR MbString,
-                      ULONG MbSize,
-                      PULONG ResultSize,
-                      PWCHAR UnicodeString,
-                      ULONG UnicodeSize)
-{
-  ULONG Size = 0;
-  ULONG i;
-
-  if (NlsMbCodePageTag == FALSE)
-    {
-      /* single-byte code page */
-      if (UnicodeSize > (MbSize * sizeof(WCHAR)))
-       Size = MbSize;
-      else
-       Size = UnicodeSize / sizeof(WCHAR);
-
-      if (ResultSize != NULL)
-       *ResultSize = Size;
-
-      for (i = 0; i < Size; i++)
-       {
-         *MbString = NlsUnicodeToAnsiTable[(USHORT)*UnicodeString];
-         MbString++;
-         UnicodeString++;
-       }
-    }
-  else
-    {
-      /* multi-byte code page */
-      /* FIXME */
-    }
-
-  return(STATUS_SUCCESS);
-}
-
-
-/*
- * @implemented
- */
-NTSTATUS STDCALL
-RtlUnicodeToMultiByteSize(PULONG MbSize,
-                         PWCHAR UnicodeString,
-                         ULONG UnicodeSize)
-{
-  ULONG UnicodeLength;
-  ULONG MbLength;
-
-  if (NlsMbCodePageTag == FALSE)
-    {
-      /* single-byte code page */
-      *MbSize = UnicodeSize / sizeof (WCHAR);
-    }
-  else
-    {
-      /* multi-byte code page */
-      UnicodeLength = UnicodeSize / sizeof(WCHAR);
-      MbLength = 0;
-      while (UnicodeLength > 0)
-       {
-         if (NlsLeadByteInfo[(USHORT)*UnicodeString] & 0xff00)
-           MbLength++;
-
-         MbLength++;
-         UnicodeLength--;
-         UnicodeString++;
-       }
-
-      *MbSize = MbLength;
-    }
-
-  return(STATUS_SUCCESS);
-}
-
-
-/*
- * @unimplemented
- */
-NTSTATUS STDCALL
-RtlUnicodeToOemN(PCHAR OemString,
-                ULONG OemSize,
-                PULONG ResultSize,
-                PWCHAR UnicodeString,
-                ULONG UnicodeSize)
-{
-  ULONG Size = 0;
-  ULONG i;
-
-  if (NlsMbOemCodePageTag == FALSE)
-    {
-      /* single-byte code page */
-      if (UnicodeSize > (OemSize * sizeof(WCHAR)))
-       Size = OemSize;
-      else
-       Size = UnicodeSize / sizeof(WCHAR);
-
-      if (ResultSize != NULL)
-       *ResultSize = Size;
-
-      for (i = 0; i < Size; i++)
-       {
-         *OemString = NlsUnicodeToOemTable[(USHORT)*UnicodeString];
-         OemString++;
-         UnicodeString++;
-       }
-    }
-  else
-    {
-      /* multi-byte code page */
-      /* FIXME */
-    }
-
-  return(STATUS_SUCCESS);
-}
-
-
-/*
- * @implemented
- */
-WCHAR STDCALL
-RtlUpcaseUnicodeChar(IN WCHAR Source)
-{
-  USHORT Offset;
-
-  if (Source < L'a')
-    return Source;
-
-  if (Source <= L'z')
-    return (Source - (L'a' - L'A'));
-
-  Offset = ((USHORT)Source >> 8);
-  Offset = NlsUnicodeUpcaseTable[Offset];
-
-  Offset += (((USHORT)Source & 0x00F0) >> 4);
-  Offset = NlsUnicodeUpcaseTable[Offset];
-
-  Offset += ((USHORT)Source & 0x000F);
-  Offset = NlsUnicodeUpcaseTable[Offset];
-
-  return Source + (SHORT)Offset;
-}
-
-
-/*
- * @unimplemented
- */
-NTSTATUS STDCALL
-RtlUpcaseUnicodeToCustomCPN(IN PCPTABLEINFO CustomCP,
-                           PCHAR CustomString,
-                           ULONG CustomSize,
-                           PULONG ResultSize,
-                           PWCHAR UnicodeString,
-                           ULONG UnicodeSize)
-{
-  ULONG Size = 0;
-  ULONG i;
-  WCHAR wc;
-
-  if (CustomCP->DBCSCodePage == 0)
-    {
-      /* single-byte code page */
-      if (UnicodeSize > (CustomSize * sizeof(WCHAR)))
-       Size = CustomSize;
-      else
-       Size = UnicodeSize / sizeof(WCHAR);
-
-      if (ResultSize != NULL)
-       *ResultSize = Size;
-
-      for (i = 0; i < Size; i++)
-       {
-         wc = RtlUpcaseUnicodeChar(*UnicodeString);
-         *CustomString = ((PCHAR)CustomCP->WideCharTable)[(USHORT)wc];
-         CustomString++;
-         UnicodeString++;
-       }
-    }
-  else
-    {
-      /* multi-byte code page */
-      /* FIXME */
-    }
-
-  return(STATUS_SUCCESS);
-}
-
-
-/*
- * @unimplemented
- */
-NTSTATUS STDCALL
-RtlUpcaseUnicodeToMultiByteN(PCHAR MbString,
-                            ULONG MbSize,
-                            PULONG ResultSize,
-                            PWCHAR UnicodeString,
-                            ULONG UnicodeSize)
-{
-  ULONG Size = 0;
-  ULONG i;
-  WCHAR wc;
-
-  if (NlsMbCodePageTag == FALSE)
-    {
-      /* single-byte code page */
-      if (UnicodeSize > (MbSize * sizeof(WCHAR)))
-       Size = MbSize;
-      else
-       Size = UnicodeSize / sizeof(WCHAR);
-
-      if (ResultSize != NULL)
-       *ResultSize = Size;
-
-      for (i = 0; i < Size; i++)
-       {
-         wc = RtlUpcaseUnicodeChar(*UnicodeString);
-         *MbString = NlsUnicodeToAnsiTable[(USHORT)wc];
-         MbString++;
-         UnicodeString++;
-       }
-    }
-  else
-    {
-      /* multi-byte code page */
-      /* FIXME */
-    }
-
-  return(STATUS_SUCCESS);
-}
-
-
-/*
- * @unimplemented
- */
-NTSTATUS STDCALL
-RtlUpcaseUnicodeToOemN(PCHAR OemString,
-                      ULONG OemSize,
-                      PULONG ResultSize,
-                      PWCHAR UnicodeString,
-                      ULONG UnicodeSize)
-{
-  ULONG Size = 0;
-  ULONG i;
-  UCHAR wc;
-
-  if (NlsMbOemCodePageTag == FALSE)
-    {
-      /* single-byte code page */
-      if (UnicodeSize > (OemSize * sizeof(WCHAR)))
-       Size = OemSize;
-      else
-       Size = UnicodeSize / sizeof(WCHAR);
-
-      if (ResultSize != NULL)
-       *ResultSize = Size;
-
-      for (i = 0; i < Size; i++)
-       {
-         wc = RtlUpcaseUnicodeChar(*UnicodeString);
-         *OemString = NlsUnicodeToOemTable[(USHORT)wc];
-         OemString++;
-         UnicodeString++;
-       }
-    }
-  else
-    {
-      /* multi-byte code page */
-      /* FIXME */
-    }
-
-  return(STATUS_SUCCESS);
-}
-
-
-/*
- * @unimplemented
- */
-CHAR STDCALL
-RtlUpperChar (IN CHAR Source)
-{
-  WCHAR Unicode;
-  CHAR Destination;
-
-  if (NlsMbCodePageTag == FALSE)
-    {
-      /* single-byte code page */
-
-      /* ansi->unicode */
-      Unicode = NlsAnsiToUnicodeTable[(UCHAR)Source];
-
-      /* upcase conversion */
-      Unicode = RtlUpcaseUnicodeChar (Unicode);
-
-      /* unicode -> ansi */
-      Destination = NlsUnicodeToAnsiTable[(USHORT)Unicode];
-    }
-  else
-    {
-      /* multi-byte code page */
-      /* FIXME */
-      Destination = Source;
-    }
-
-  return Destination;
-}
-
-/* EOF */