[NTOSKRNL]
authorPierre Schweitzer <pierre@reactos.org>
Sun, 21 Apr 2013 15:53:59 +0000 (15:53 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Sun, 21 Apr 2013 15:53:59 +0000 (15:53 +0000)
Reimplement (& fix) handling of DOS_DOT in FsRtlIs*InExpression().
This fixes lots of failing tests

svn path=/trunk/; revision=58810

reactos/ntoskrnl/fsrtl/dbcsname.c
reactos/ntoskrnl/fsrtl/name.c

index 2aef01e..736c82b 100644 (file)
@@ -163,6 +163,7 @@ FsRtlIsDbcsInExpression(IN PANSI_STRING Expression,
     SHORT StarFound = -1;
     PUSHORT BackTracking = NULL;
     USHORT ExpressionPosition = 0, NamePosition = 0, MatchingChars;
+    BOOLEAN BeyondName;
     PAGED_CODE();
 
     ASSERT(Name->Length);
@@ -228,6 +229,41 @@ FsRtlIsDbcsInExpression(IN PANSI_STRING Expression,
             }
             ExpressionPosition++;
         }
+        /* Check DOS_DOT */
+        else if (Expression->Buffer[ExpressionPosition] == DOS_DOT)
+        {
+            /* First try to find whether we are beyond last dot (beyond name) */
+            BeyondName = TRUE;
+            MatchingChars = NamePosition + 1;
+            while (MatchingChars < Name->Length)
+            {
+                if (Name->Buffer[MatchingChars] == '.')
+                {
+                    BeyondName = FALSE;
+                    break;
+                }
+                MatchingChars++;
+            }
+
+            /* If we are beyond name, we null match */
+            if (BeyondName)
+            {
+                ExpressionPosition++;
+                continue;
+            }
+            /* If not, we only match a dot */
+            else if (Name->Buffer[NamePosition] == '.')
+            {
+                NamePosition++;
+                ExpressionPosition++;
+                continue;
+            }
+            /* Otherwise, fail */
+            else
+            {
+                break;
+            }
+        }
         /* If nothing match, try to backtrack */
         else if (StarFound >= 0)
         {
index cdd4675..4dd965a 100644 (file)
@@ -28,6 +28,7 @@ FsRtlIsNameInExpressionPrivate(IN PUNICODE_STRING Expression,
     UNICODE_STRING IntExpression;
     USHORT ExpressionPosition = 0, NamePosition = 0, MatchingChars;
     WCHAR CompareChar;
+    BOOLEAN BeyondName;
     PAGED_CODE();
 
     /* Check if we were given strings at all */
@@ -112,8 +113,7 @@ FsRtlIsNameInExpressionPrivate(IN PUNICODE_STRING Expression,
             ExpressionPosition++;
         }
         /* Check cases that eat one char */
-        else if (Expression->Buffer[ExpressionPosition] == L'?' || (Expression->Buffer[ExpressionPosition] == DOS_QM) ||
-                 (Expression->Buffer[ExpressionPosition] == DOS_DOT && Name->Buffer[NamePosition] == L'.'))
+        else if (Expression->Buffer[ExpressionPosition] == L'?' || (Expression->Buffer[ExpressionPosition] == DOS_QM))
         {
             NamePosition++;
             ExpressionPosition++;
@@ -164,6 +164,41 @@ FsRtlIsNameInExpressionPrivate(IN PUNICODE_STRING Expression,
             }
             ExpressionPosition++;
         }
+        /* Check DOS_DOT */
+        else if (Expression->Buffer[ExpressionPosition] == DOS_DOT)
+        {
+            /* First try to find whether we are beyond last dot (beyond name) */
+            BeyondName = TRUE;
+            MatchingChars = NamePosition + 1;
+            while (MatchingChars < Name->Length / sizeof(WCHAR))
+            {
+                if (Name->Buffer[MatchingChars] == L'.')
+                {
+                    BeyondName = FALSE;
+                    break;
+                }
+                MatchingChars++;
+            }
+
+            /* If we are beyond name, we null match */
+            if (BeyondName)
+            {
+                ExpressionPosition++;
+                continue;
+            }
+            /* If not, we only match a dot */
+            else if (Name->Buffer[NamePosition] == L'.')
+            {
+                NamePosition++;
+                ExpressionPosition++;
+                continue;
+            }
+            /* Otherwise, fail */
+            else
+            {
+                break;
+            }
+        }
         /* If nothing match, try to backtrack */
         else if (StarFound >= 0)
         {