- Implemented InterlockedBitTestAndReset, InterlockedBitTestAndSet, InterlockedExchan...
[reactos.git] / reactos / ntoskrnl / fs / name.c
index e6dd257..31f54d1 100644 (file)
-/* $Id$
- *
+/*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/fs/name.c
- * PURPOSE:         No purpose listed.
+ * PURPOSE:         Name and DBCS Name Validation and Dissection Functions.
  *
- * PROGRAMMERS:     No programmer listed.
+ * PROGRAMMERS:     Alex Ionescu (alex@relsoft.net)
+ *                  Eric Kohl
+ *                  Filip Navara
  */
 
+ /* INCLUDES ****************************************************************/
+
 #include <ntoskrnl.h>
+#define NDEBUG
+#include <internal/debug.h>
 
-/* FUNCTIONS ***************************************************************/
+/* GLOBALS *******************************************************************/
+
+static UCHAR LegalAnsiCharacterArray[] =
+{
+  0,                                                        /* CTRL+@, 0x00 */
+  0,                                                        /* CTRL+A, 0x01 */
+  0,                                                        /* CTRL+B, 0x02 */
+  0,                                                        /* CTRL+C, 0x03 */
+  0,                                                        /* CTRL+D, 0x04 */
+  0,                                                        /* CTRL+E, 0x05 */
+  0,                                                        /* CTRL+F, 0x06 */
+  0,                                                        /* CTRL+G, 0x07 */
+  0,                                                        /* CTRL+H, 0x08 */
+  0,                                                        /* CTRL+I, 0x09 */
+  0,                                                        /* CTRL+J, 0x0a */
+  0,                                                        /* CTRL+K, 0x0b */
+  0,                                                        /* CTRL+L, 0x0c */
+  0,                                                        /* CTRL+M, 0x0d */
+  0,                                                        /* CTRL+N, 0x0e */
+  0,                                                        /* CTRL+O, 0x0f */
+  0,                                                        /* CTRL+P, 0x10 */
+  0,                                                        /* CTRL+Q, 0x11 */
+  0,                                                        /* CTRL+R, 0x12 */
+  0,                                                        /* CTRL+S, 0x13 */
+  0,                                                        /* CTRL+T, 0x14 */
+  0,                                                        /* CTRL+U, 0x15 */
+  0,                                                        /* CTRL+V, 0x16 */
+  0,                                                        /* CTRL+W, 0x17 */
+  0,                                                        /* CTRL+X, 0x18 */
+  0,                                                        /* CTRL+Y, 0x19 */
+  0,                                                        /* CTRL+Z, 0x1a */
+  0,                                                        /* CTRL+[, 0x1b */
+  0,                                                        /* CTRL+\, 0x1c */
+  0,                                                        /* CTRL+], 0x1d */
+  0,                                                        /* CTRL+^, 0x1e */
+  0,                                                        /* CTRL+_, 0x1f */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* ` ',    0x20 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `!',    0x21 */
+  FSRTL_WILD_CHARACTER,                                     /* `"',    0x22 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `#',    0x23 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `$',    0x24 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `%',    0x25 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `&',    0x26 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `'',    0x27 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `(',    0x28 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `)',    0x29 */
+  FSRTL_WILD_CHARACTER,                                     /* `*',    0x2a */
+  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `+',    0x2b */
+  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `,',    0x2c */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `-',    0x2d */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `.',    0x2e */
+  0,                                                        /* `/',    0x2f */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `0',    0x30 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `1',    0x31 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `2',    0x32 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `3',    0x33 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `4',    0x34 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `5',    0x35 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `6',    0x36 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `7',    0x37 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `8',    0x38 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `9',    0x39 */
+  FSRTL_NTFS_LEGAL,                                         /* `:',    0x3a */
+  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `;',    0x3b */
+  FSRTL_WILD_CHARACTER,                                     /* `<',    0x3c */
+  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `=',    0x3d */
+  FSRTL_WILD_CHARACTER,                                     /* `>',    0x3e */
+  FSRTL_WILD_CHARACTER,                                     /* `?',    0x3f */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `@',    0x40 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `A',    0x41 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `B',    0x42 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `C',    0x43 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `D',    0x44 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `E',    0x45 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `F',    0x46 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `G',    0x47 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `H',    0x48 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `I',    0x49 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `J',    0x4a */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `K',    0x4b */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `L',    0x4c */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `M',    0x4d */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `N',    0x4e */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `O',    0x4f */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `P',    0x50 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `Q',    0x51 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `R',    0x52 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `S',    0x53 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `T',    0x54 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `U',    0x55 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `V',    0x56 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `W',    0x57 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `X',    0x58 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `Y',    0x59 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `Z',    0x5a */
+  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `[',    0x5b */
+  0,                                                        /* `\',    0x5c */
+  FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,                      /* `]',    0x5d */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `^',    0x5e */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `_',    0x5f */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* ``',    0x60 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `a',    0x61 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `b',    0x62 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `c',    0x63 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `d',    0x64 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `e',    0x65 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `f',    0x66 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `g',    0x67 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `h',    0x68 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `i',    0x69 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `j',    0x6a */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `k',    0x6b */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `l',    0x6c */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `m',    0x6d */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `n',    0x6e */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `o',    0x6f */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `p',    0x70 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `q',    0x71 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `r',    0x72 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `s',    0x73 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `t',    0x74 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `u',    0x75 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `v',    0x76 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `w',    0x77 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `x',    0x78 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `y',    0x79 */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `z',    0x7a */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `{',    0x7b */
+  0,                                                        /* `|',    0x7c */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `}',    0x7d */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL,    /* `~',    0x7e */
+  FSRTL_FAT_LEGAL | FSRTL_HPFS_LEGAL | FSRTL_NTFS_LEGAL     /*         0x7f */
+};
 
-/**********************************************************************
- * NAME                                                        EXPORTED
- *     FsRtlAreNamesEqual@16
+PUCHAR FsRtlLegalAnsiCharacterArray = LegalAnsiCharacterArray;
+
+/* FUNCTIONS *****************************************************************/
+
+/*
+ * NAME    EXPORTED
+ *  FsRtlAreNamesEqual@16
  *
  * DESCRIPTION
- *     
+ *
  * ARGUMENTS
  *
  * RETURN VALUE
  *
  * NOTE
- *     From Bo Branten's ntifs.h v25.
+ *  From Bo Branten's ntifs.h v25.
  *
  * @implemented
  */
-BOOLEAN STDCALL
-FsRtlAreNamesEqual (IN PUNICODE_STRING Name1,
-                   IN PUNICODE_STRING Name2,
-                   IN BOOLEAN IgnoreCase,
-                   IN PWCHAR UpcaseTable OPTIONAL)
+BOOLEAN
+STDCALL
+FsRtlAreNamesEqual(IN PUNICODE_STRING Name1,
+                   IN PUNICODE_STRING Name2,
+                   IN BOOLEAN IgnoreCase,
+                   IN PWCHAR UpcaseTable OPTIONAL)
 {
-
     UNICODE_STRING UpcaseName1;
     UNICODE_STRING UpcaseName2;
     BOOLEAN StringsAreEqual;
-    
+
     /* Well, first check their size */
     if (Name1->Length != Name2->Length) {
         /* Not equal! */
         return FALSE;
     }
-    
+
     /* Turn them into Upcase if we don't have a table */
     if (IgnoreCase && !UpcaseTable) {
         RtlUpcaseUnicodeString(&UpcaseName1, Name1, TRUE);
@@ -51,81 +192,153 @@ FsRtlAreNamesEqual (IN PUNICODE_STRING Name1,
         Name1 = &UpcaseName1;
         Name2 = &UpcaseName2;
 
-        goto ManualCase;       
+        goto ManualCase;
     }
-    
+
     /* Do a case-sensitive search */
     if (!IgnoreCase) {
-        
+
 ManualCase:
         /* Use a raw memory compare */
         StringsAreEqual = RtlEqualMemory(Name1->Buffer,
                                          Name2->Buffer,
                                          Name1->Length);
-        
+
         /* Clear the strings if we need to */
         if (IgnoreCase) {
             RtlFreeUnicodeString(&UpcaseName1);
             RtlFreeUnicodeString(&UpcaseName2);
         }
-        
+
         /* Return the equality */
         return StringsAreEqual;
-    
+
     } else {
-        
+
         /* Case in-sensitive search */
-        
+
         LONG i;
-        
+
         for (i = Name1->Length / sizeof(WCHAR) - 1; i >= 0; i--) {
-            
+
             if (UpcaseTable[Name1->Buffer[i]] != UpcaseTable[Name2->Buffer[i]]) {
-                
+
                 /* Non-match found! */
                 return FALSE;
             }
-        }   
-        
+        }
+
         /* We finished the loop so we are equal */
         return TRUE;
     }
 }
 
+/*
+ * NAME    EXPORTED
+ *  FsRtlDissectDbcs@16
+ *
+ * Dissects a given path name into first and remaining part.
+ *
+ * ARGUMENTS
+ * Name
+ *    ANSI string to dissect.
+ *
+ * FirstPart
+ *    Pointer to user supplied ANSI_STRING, that will
+ *    later point to the first part of the original name.
+ *
+ * RemainingPart
+ *    Pointer to user supplied ANSI_STRING, that will
+ *    later point to the remaining part of the original name.
+ *
+ * RETURN VALUE
+ *  None
+ *
+ * EXAMPLE
+ *  Name:           \test1\test2\test3
+ *  FirstPart:      test1
+ *  RemainingPart:  test2\test3
+ *
+ * @implemented
+ */
+VOID
+STDCALL
+FsRtlDissectDbcs(IN ANSI_STRING Name,
+                 OUT PANSI_STRING FirstPart,
+                 OUT PANSI_STRING RemainingPart)
+{
+    ULONG i;
+    ULONG FirstLoop;
+
+    /* Initialize the Outputs */
+    RtlZeroMemory(&FirstPart, sizeof(ANSI_STRING));
+    RtlZeroMemory(&RemainingPart, sizeof(ANSI_STRING));
+
+    /* Bail out if empty */
+    if (!Name.Length) return;
 
-/**********************************************************************
- * NAME                                                        EXPORTED
- *     FsRtlDissectName@16
+    /* Ignore backslash */
+    if (Name.Buffer[0] == '\\') {
+        i = 1;
+    } else {
+        i = 0;
+    }
+
+    /* Loop until we find a backslash */
+    for (FirstLoop = i;i < Name.Length;i++) {
+        if (Name.Buffer[i] != '\\') break;
+        if (FsRtlIsLeadDbcsCharacter(Name.Buffer[i])) i++;
+    }
+
+    /* Now we have the First Part */
+    FirstPart->Length = (i-FirstLoop);
+    FirstPart->MaximumLength = FirstPart->Length; /* +2?? */
+    FirstPart->Buffer = &Name.Buffer[FirstLoop];
+
+    /* Make the second part if something is still left */
+    if (i<Name.Length) {
+        RemainingPart->Length = (Name.Length - (i+1));
+        RemainingPart->MaximumLength = RemainingPart->Length; /* +2?? */
+        RemainingPart->Buffer = &Name.Buffer[i+1];
+    }
+
+    return;
+}
+
+/*
+ * NAME    EXPORTED
+ *  FsRtlDissectName@16
  *
  * DESCRIPTION
- *     Dissects a given path name into first and remaining part.
+ *  Dissects a given path name into first and remaining part.
  *
  * ARGUMENTS
- *     Name
- *             Unicode string to dissect.
+ *  Name
+ *    Unicode string to dissect.
  *
- *     FirstPart
- *             Pointer to user supplied UNICODE_STRING, that will
- *             later point to the first part of the original name.
+ *  FirstPart
+ *    Pointer to user supplied UNICODE_STRING, that will
+ *    later point to the first part of the original name.
  *
- *     RemainingPart
- *             Pointer to user supplied UNICODE_STRING, that will
- *             later point to the remaining part of the original name.
+ *  RemainingPart
+ *    Pointer to user supplied UNICODE_STRING, that will
+ *    later point to the remaining part of the original name.
  *
  * RETURN VALUE
- *     None
+ *  None
  *
  * EXAMPLE
- *     Name:           \test1\test2\test3
- *     FirstPart:      test1
- *     RemainingPart:  test2\test3
+ *  Name:          \test1\test2\test3
+ *  FirstPart:     test1
+ *  RemainingPart: test2\test3
  *
  * @implemented
  */
-VOID STDCALL
-FsRtlDissectName (IN UNICODE_STRING Name,
-                 OUT PUNICODE_STRING FirstPart,
-                 OUT PUNICODE_STRING RemainingPart)
+VOID
+STDCALL
+FsRtlDissectName(IN UNICODE_STRING Name,
+                 OUT PUNICODE_STRING FirstPart,
+                 OUT PUNICODE_STRING RemainingPart)
 {
   USHORT NameOffset = 0;
   USHORT NameLength = 0;
@@ -155,7 +368,7 @@ FsRtlDissectName (IN UNICODE_STRING Name,
     NameLength++;
   }
 
-  FirstPart->Length = 
+  FirstPart->Length =
   FirstPart->MaximumLength = NameLength * sizeof(WCHAR);
   FirstPart->Buffer = &Name.Buffer[NameOffset];
 
@@ -168,10 +381,43 @@ FsRtlDissectName (IN UNICODE_STRING Name,
   }
 }
 
+/*
+ * NAME    EXPORTED
+ *  FsRtlDoesDbcsContainWildCards@4
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * @implemented
+ */
+BOOLEAN
+STDCALL
+FsRtlDoesDbcsContainWildCards(IN PANSI_STRING Name)
+{
+    ULONG i;
+
+    /* Check every character */
+    for (i=0;i < Name->Length;i++) {
+
+        /* First make sure it's not the Lead DBCS */
+        if (FsRtlIsLeadDbcsCharacter(Name->Buffer[i])) {
+            i++;
+        } else if (FsRtlIsAnsiCharacterWild(Name->Buffer[i])) {
+            /* Now return if it has a Wilcard */
+            return TRUE;
+        }
+    }
 
-/**********************************************************************
- * NAME                                                        EXPORTED
- *     FsRtlDoesNameContainWildCards@4
+    /* We didn't return above...so none found */
+    return FALSE;
+}
+
+/*
+ * NAME    EXPORTED
+ *  FsRtlDoesNameContainWildCards@4
  *
  * DESCRIPTION
  *
@@ -180,12 +426,13 @@ FsRtlDissectName (IN UNICODE_STRING Name,
  * RETURN VALUE
  *
  * NOTE
- *     From Bo Branten's ntifs.h v12.
+ *  From Bo Branten's ntifs.h v12.
  *
  * @implemented
  */
-BOOLEAN STDCALL
-FsRtlDoesNameContainWildCards (IN PUNICODE_STRING Name)
+BOOLEAN
+STDCALL
+FsRtlDoesNameContainWildCards(IN PUNICODE_STRING Name)
 {
     PWCHAR Ptr;
 
@@ -205,10 +452,73 @@ FsRtlDoesNameContainWildCards (IN PUNICODE_STRING Name)
     return FALSE;
 }
 
+/*
+ * NAME    EXPORTED
+ * FsRtlIsDbcsInExpression@8
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * @unimplemented
+ */
+BOOLEAN
+STDCALL
+FsRtlIsDbcsInExpression(IN PANSI_STRING Expression,
+                        IN PANSI_STRING Name)
+{
+  return FALSE;
+}
+
+/*
+ * NAME    EXPORTED
+ *  FsRtlIsFatDbcsLegal@20
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * @unimplemented
+ */
+BOOLEAN
+STDCALL
+FsRtlIsFatDbcsLegal(IN ANSI_STRING DbcsName,
+                    IN BOOLEAN WildCardsPermissible,
+                    IN BOOLEAN PathNamePermissible,
+                    IN BOOLEAN LeadingBackslashPermissible)
+{
+  return FALSE;
+}
+
+/*
+ * NAME    EXPORTED
+ *  FsRtlIsHpfsDbcsLegal@20
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * @unimplemented
+ */
+BOOLEAN
+STDCALL
+FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName,
+                     IN BOOLEAN WildCardsPermissible,
+                     IN BOOLEAN PathNamePermissible,
+                     IN BOOLEAN LeadingBackslashPermissible)
+{
+  return FALSE;
+}
 
-/**********************************************************************
- * NAME                                                        EXPORTED
- *     FsRtlIsNameInExpression@16
+/*
+ * NAME    EXPORTED
+ *  FsRtlIsNameInExpression@16
  *
  * DESCRIPTION
  *
@@ -217,17 +527,18 @@ FsRtlDoesNameContainWildCards (IN PUNICODE_STRING Name)
  * RETURN VALUE
  *
  * NOTE
- *     From Bo Branten's ntifs.h v12. This function should be rewritten
+ *  From Bo Branten's ntifs.h v12. This function should be rewritten
  *      to avoid recursion and better wildcard handling should be
  *      implemented (see FsRtlDoesNameContainWildCards).
  *
  * @implemented
  */
-BOOLEAN STDCALL
-FsRtlIsNameInExpression (IN PUNICODE_STRING Expression,
-                        IN PUNICODE_STRING Name,
-                        IN BOOLEAN IgnoreCase,
-                        IN PWCHAR UpcaseTable OPTIONAL)
+BOOLEAN
+STDCALL
+FsRtlIsNameInExpression(IN PUNICODE_STRING Expression,
+                        IN PUNICODE_STRING Name,
+                        IN BOOLEAN IgnoreCase,
+                        IN PWCHAR UpcaseTable OPTIONAL)
 {
   USHORT ExpressionPosition, NamePosition;
   UNICODE_STRING TempExpression, TempName;