[NTOS:FSRTL]
authorDmitry Chapyshev <dmitry@reactos.org>
Sat, 3 Sep 2016 10:47:21 +0000 (10:47 +0000)
committerDmitry Chapyshev <dmitry@reactos.org>
Sat, 3 Sep 2016 10:47:21 +0000 (10:47 +0000)
- Rework FsRtlIsHpfsDbcsLegal is similar FsRtlIsFatDbcsLegal

* Fixes 30 tests for kmtest FsRtlLegal

svn path=/trunk/; revision=72542

reactos/ntoskrnl/fsrtl/dbcsname.c

index 81f5e8c..8ecd3b4 100644 (file)
@@ -603,7 +603,7 @@ FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName,
                      IN BOOLEAN PathNamePermissible,
                      IN BOOLEAN LeadingBackslashPermissible)
 {
-    ANSI_STRING FirstPart, RemainingPart, Name;
+    ANSI_STRING FirstPart, RemainingPart;
     USHORT i;
     PAGED_CODE();
 
@@ -611,6 +611,20 @@ FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName,
     if (!DbcsName.Length)
         return FALSE;
 
+    /* Accept special filename if wildcards are allowed */
+    if (WildCardsPermissible && (DbcsName.Length == 1 || DbcsName.Length == 2) && DbcsName.Buffer[0] == '.')
+    {
+        if (DbcsName.Length == 2)
+        {
+            if (DbcsName.Buffer[1] == '.')
+                return TRUE;
+        }
+        else
+        {
+            return TRUE;
+        }
+    }
+
     /* DbcsName wasn't supposed to be started with \ */
     if (!LeadingBackslashPermissible && DbcsName.Buffer[0] == '\\')
         return FALSE;
@@ -622,64 +636,56 @@ FsRtlIsHpfsDbcsLegal(IN ANSI_STRING DbcsName,
         DbcsName.MaximumLength = DbcsName.MaximumLength - 1;
     }
 
-    /* Extract first part of the DbcsName to work on */
-    FsRtlDissectDbcs(DbcsName, &FirstPart, &RemainingPart);
-    while (FirstPart.Length > 0)
+    if (PathNamePermissible)
     {
-        /* Accept special filename if wildcards are allowed */
-        if (WildCardsPermissible && (FirstPart.Length == 1 || FirstPart.Length == 2) && FirstPart.Buffer[0] == '.')
+        /* We copy the buffer for FsRtlDissectDbcs call */
+        RemainingPart.Buffer = DbcsName.Buffer;
+        RemainingPart.Length = DbcsName.Length;
+        RemainingPart.MaximumLength = DbcsName.MaximumLength;
+
+        while (RemainingPart.Length > 0)
         {
-            if (FirstPart.Length == 2)
-            {
-                if (FirstPart.Buffer[1] == '.')
-                {
-                    goto EndLoop;
-                }
-            }
-            else
-            {
-                goto EndLoop;
-            }
-        }
+            if (RemainingPart.Buffer[0] == '\\')
+                return FALSE;
 
-        /* Filename must be 255 bytes maximum */
-        if (FirstPart.Length > 255)
-            return FALSE;
+            /* Call once again our dissect function */
+            FsRtlDissectDbcs(RemainingPart, &FirstPart, &RemainingPart);
 
-        /* Now, we will parse the filename to find everything bad in */
-        for (i = 0; i < FirstPart.Length; i++)
-        {
-            /* First make sure the character it's not the Lead DBCS */
-            if (FsRtlIsLeadDbcsCharacter(FirstPart.Buffer[i]))
-            {
-                if (i == (FirstPart.Length) - 1)
-                    return FALSE;
-                i++;
-            }
-            /* Then check for bad characters */
-            else if (!FsRtlIsAnsiCharacterLegalHpfs(FirstPart.Buffer[i], WildCardsPermissible))
+            if (!FsRtlIsHpfsDbcsLegal(FirstPart,
+                                      WildCardsPermissible,
+                                      FALSE,
+                                      FALSE))
             {
                 return FALSE;
             }
         }
 
-        /* Filename mustn't finish with a space or a dot */
-        if ((FirstPart.Buffer[FirstPart.Length - 1] == ' ') ||
-            (FirstPart.Buffer[FirstPart.Length - 1] == '.'))
-            return FALSE;
-
-        EndLoop:
-        /* Preparing next loop */
-        Name.Buffer = RemainingPart.Buffer;
-        Name.Length = RemainingPart.Length;
-        Name.MaximumLength = RemainingPart.MaximumLength;
+        return TRUE;
+    }
 
-        /* Call once again our dissect function */
-        FsRtlDissectDbcs(Name, &FirstPart, &RemainingPart);
+    if (DbcsName.Length > 255)
+        return FALSE;
 
-        /* We found a pathname, it wasn't allowed */
-        if (FirstPart.Length > 0 && !PathNamePermissible)
+    for (i = 0; i < DbcsName.Length; i++)
+    {
+        /* First make sure the character it's not the Lead DBCS */
+        if (FsRtlIsLeadDbcsCharacter(DbcsName.Buffer[i]))
+        {
+            if (i == (DbcsName.Length - 1))
+                return FALSE;
+            i++;
+        }
+        /* Then check for bad characters */
+        else if (!FsRtlIsAnsiCharacterLegalHpfs(DbcsName.Buffer[i], WildCardsPermissible))
+        {
+            return FALSE;
+        }
+        /* Filename mustn't finish with a space or a dot */
+        else if ((DbcsName.Buffer[i] == ' ' || DbcsName.Buffer[i] == '.') && i == (DbcsName.Length - 1))
+        {
             return FALSE;
+        }
     }
+
     return TRUE;
 }