Don't forget to apply the changes (not reviewed, sorry, no time) to
FsRtlIsDbcsInExpression.
Le 28/09/2016 à 01:00, dchapys...@svn.reactos.org a écrit :
> Author: dchapyshev
> Date: Tue Sep 27 23:00:20 2016
> New Revision: 72835
>
> URL: http://svn.reactos.org/svn/reactos?rev=72835=rev
> Log:
> [NTOS:FSRTL] Rework FsRtlIsNameInExpressionPrivate for correct parsing some
> expressions
>
> * Fixes 1 test for kmtest:FsRtlExpression and 15 tests for kernel32:file
>
> Modified:
> trunk/reactos/ntoskrnl/fsrtl/name.c
>
> Modified: trunk/reactos/ntoskrnl/fsrtl/name.c
> URL:
> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/fsrtl/name.c?rev=72835=72834=72835=diff
> ==
> --- trunk/reactos/ntoskrnl/fsrtl/name.c [iso-8859-1] (original)
> +++ trunk/reactos/ntoskrnl/fsrtl/name.c [iso-8859-1] Tue Sep 27
> 23:00:20 2016
> @@ -23,13 +23,14 @@
> IN BOOLEAN IgnoreCase,
> IN PWCHAR UpcaseTable OPTIONAL)
> {
> -SHORT StarFound = -1, DosStarFound = -1;
> -USHORT BackTrackingBuffer[5], DosBackTrackingBuffer[5];
> -PUSHORT BackTracking = BackTrackingBuffer, DosBackTracking =
> DosBackTrackingBuffer;
> -SHORT BackTrackingSize = RTL_NUMBER_OF(BackTrackingBuffer);
> -SHORT DosBackTrackingSize = RTL_NUMBER_OF(DosBackTrackingBuffer);
> +USHORT Offset, Position, BackTrackingPosition, OldBackTrackingPosition;
> +USHORT BackTrackingBuffer[16], OldBackTrackingBuffer[16] = {0};
> +PUSHORT BackTrackingSwap, BackTracking = BackTrackingBuffer,
> OldBackTracking = OldBackTrackingBuffer;
> UNICODE_STRING IntExpression;
> -USHORT ExpressionPosition = 0, NamePosition = 0, MatchingChars, LastDot;
> +USHORT ExpressionPosition = 0, NamePosition = 0, MatchingChars = 1;
> +BOOLEAN EndOfName = FALSE;
> +BOOLEAN Result = FALSE;
> +BOOLEAN DontSkipDot;
> WCHAR CompareChar;
> PAGED_CODE();
>
> @@ -37,7 +38,7 @@
> if (!Name->Length || !Expression->Length)
> {
> /* Return TRUE if both strings are empty, otherwise FALSE */
> -if (Name->Length == 0 && Expression->Length == 0)
> +if (!Name->Length && !Expression->Length)
> return TRUE;
> else
> return FALSE;
> @@ -103,193 +104,144 @@
> }
> }
>
> -while ((NamePosition < Name->Length / sizeof(WCHAR)) &&
> - (ExpressionPosition < Expression->Length / sizeof(WCHAR)))
> -{
> -/* Basic check to test if chars are equal */
> -CompareChar = IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] :
> - Name->Buffer[NamePosition];
> -if (Expression->Buffer[ExpressionPosition] == CompareChar)
> -{
> -NamePosition++;
> -ExpressionPosition++;
> -}
> -/* Check cases that eat one char */
> -else if (Expression->Buffer[ExpressionPosition] == L'?')
> -{
> -NamePosition++;
> -ExpressionPosition++;
> -}
> -/* Test star */
> -else if (Expression->Buffer[ExpressionPosition] == L'*')
> -{
> -/* Skip contigous stars */
> -while ((ExpressionPosition + 1 < (USHORT)(Expression->Length /
> sizeof(WCHAR))) &&
> - (Expression->Buffer[ExpressionPosition + 1] == L'*'))
> -{
> -ExpressionPosition++;
> -}
> -
> -/* Save star position */
> -StarFound++;
> -if (StarFound >= BackTrackingSize)
> -{
> -ASSERT(BackTracking == BackTrackingBuffer);
> -
> -BackTrackingSize = Expression->Length / sizeof(WCHAR);
> -BackTracking = ExAllocatePoolWithTag(PagedPool |
> POOL_RAISE_IF_ALLOCATION_FAILURE,
> - BackTrackingSize *
> sizeof(USHORT),
> - 'nrSF');
> -RtlCopyMemory(BackTracking, BackTrackingBuffer,
> sizeof(BackTrackingBuffer));
> -
> -}
> -BackTracking[StarFound] = ExpressionPosition++;
> -
> -/* If star is at the end, then eat all rest and leave */
> -if (ExpressionPosition == Expression->Length / sizeof(WCHAR))
> -{
> -NamePosition = Name->Length / sizeof(WCHAR);
> +/* Name parsing loop */
> +for (; !EndOfName; MatchingChars = BackTrackingPosition, NamePosition++)
> +{
> +/* Reset positions */
> +OldBackTrackingPosition = BackTrackingPosition = 0;
> +
> +if (NamePosition >= Name->Length / sizeof(WCHAR))
> +{
> +EndOfName = TRUE;
> +if (OldBackTracking[MatchingChars - 1] == Expression->Length * 2)
> break;
> -}
> -
> -/* Allow null matching */
> -