Author: pschweitzer
Date: Sun Apr 21 20:34:17 2013
New Revision: 58818

URL: http://svn.reactos.org/svn/reactos?rev=58818&view=rev
Log:
[NTOSKRNL]
Nearly properly reimplement DOT_STAR in FsRtlIs*InExpression.
Should fix tests broken by hackfix

Modified:
    trunk/reactos/ntoskrnl/fsrtl/dbcsname.c
    trunk/reactos/ntoskrnl/fsrtl/name.c

Modified: trunk/reactos/ntoskrnl/fsrtl/dbcsname.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/fsrtl/dbcsname.c?rev=58818&r1=58817&r2=58818&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/fsrtl/dbcsname.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/fsrtl/dbcsname.c [iso-8859-1] Sun Apr 21 20:34:17 
2013
@@ -218,14 +218,47 @@
         /* Check DOS_STAR */
         else if (Expression->Buffer[ExpressionPosition] == ANSI_DOS_STAR)
         {
-            MatchingChars = NamePosition;
-            while (MatchingChars < Name->Length)
-            {
-                if (Name->Buffer[MatchingChars] == '.')
+            /* We can only consume dot if that's not the last one
+             * Otherwise, we null match
+             */
+            if (Name->Buffer[NamePosition] == '.')
+            {
+                MatchingChars = NamePosition + 1;
+                while (MatchingChars < Name->Length)
                 {
-                    NamePosition = MatchingChars;
+                    if (Name->Buffer[MatchingChars] == '.')
+                    {
+                        NamePosition++;
+                        break;
+                    }
+                    MatchingChars++;
                 }
-                MatchingChars++;
+            }
+            else
+            {
+                /* XXX: Eat everything till the end */
+                if (ExpressionPosition + 1 == Expression->Length)
+                {
+                    NamePosition = Name->Length;
+                }
+
+                /* Try to eat till the next matching char or . */
+                MatchingChars = NamePosition;
+                while (MatchingChars < Name->Length)
+                {
+                    if (ExpressionPosition + 1 < Expression->Length &&
+                        Name->Buffer[MatchingChars] == 
Expression->Buffer[ExpressionPosition + 1])
+                    {
+                        NamePosition = MatchingChars;
+                        break;
+                    }
+                    else if (Name->Buffer[MatchingChars] == '.')
+                    {
+                        NamePosition = MatchingChars + 1;
+                        break;
+                    }
+                    MatchingChars++;
+                }
             }
             ExpressionPosition++;
         }

Modified: trunk/reactos/ntoskrnl/fsrtl/name.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/fsrtl/name.c?rev=58818&r1=58817&r2=58818&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/fsrtl/name.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/fsrtl/name.c [iso-8859-1] Sun Apr 21 20:34:17 2013
@@ -153,14 +153,47 @@
         /* Check DOS_STAR */
         else if (Expression->Buffer[ExpressionPosition] == DOS_STAR)
         {
-            MatchingChars = NamePosition;
-            while (MatchingChars < Name->Length / sizeof(WCHAR))
-            {
-                if (Name->Buffer[MatchingChars] == L'.')
+            /* We can only consume dot if that's not the last one
+             * Otherwise, we null match
+             */
+            if (Name->Buffer[NamePosition] == L'.')
+            {
+                MatchingChars = NamePosition + 1;
+                while (MatchingChars < Name->Length / sizeof(WCHAR))
                 {
-                    NamePosition = MatchingChars;
+                    if (Name->Buffer[MatchingChars] == L'.')
+                    {
+                        NamePosition++;
+                        break;
+                    }
+                    MatchingChars++;
                 }
-                MatchingChars++;
+            }
+            else
+            {
+                /* XXX: Eat everything till the end */
+                if (ExpressionPosition + 1 == Expression->Length / 
sizeof(WCHAR))
+                {
+                    NamePosition = Name->Length;
+                }
+
+                /* Try to eat till the next matching char or . */
+                MatchingChars = NamePosition;
+                while (MatchingChars < Name->Length / sizeof(WCHAR))
+                {
+                    if (ExpressionPosition + 1 < Expression->Length / 
sizeof(WCHAR) &&
+                        Name->Buffer[MatchingChars] == 
Expression->Buffer[ExpressionPosition + 1])
+                    {
+                        NamePosition = MatchingChars;
+                        break;
+                    }
+                    else if (Name->Buffer[MatchingChars] == L'.')
+                    {
+                        NamePosition = MatchingChars + 1;
+                        break;
+                    }
+                    MatchingChars++;
+                }
             }
             ExpressionPosition++;
         }


Reply via email to