From 2ac5519cc7001fa6349cc07bd2da696d68ef94a8 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 13 Feb 2011 20:23:03 +0000 Subject: [PATCH] [NTOSKRNL] Improved * WC handling for both FsRtlIsNameInExpression & FsRtlIsDbcsInExpression This fixes all failing tests in kmtest svn path=/trunk/; revision=50685 --- reactos/ntoskrnl/fsrtl/dbcsname.c | 50 ++++++++++++++++++++++++----- reactos/ntoskrnl/fsrtl/name.c | 53 ++++++++++++++++++++++++++----- 2 files changed, 87 insertions(+), 16 deletions(-) diff --git a/reactos/ntoskrnl/fsrtl/dbcsname.c b/reactos/ntoskrnl/fsrtl/dbcsname.c index 67454955316..9311caef9f5 100644 --- a/reactos/ntoskrnl/fsrtl/dbcsname.c +++ b/reactos/ntoskrnl/fsrtl/dbcsname.c @@ -174,6 +174,45 @@ FsRtlIsDbcsInExpression(IN PANSI_STRING Expression, NamePosition++; ExpressionPosition++; } + else if (StarFound != MAXUSHORT && (Expression->Buffer[StarFound + 1] == '*' || + Expression->Buffer[StarFound + 1] == '?' || Expression->Buffer[StarFound + 1] == ANSI_DOS_DOT)) + { + ExpressionPosition = StarFound + 1; + switch (Expression->Buffer[ExpressionPosition]) + { + case '*': + StarFound = ExpressionPosition++; + break; + + case '?': + ExpressionPosition++; + MatchingChars = NamePosition; + while (Name->Buffer[NamePosition] != Expression->Buffer[ExpressionPosition] && + NamePosition < Name->Length) + { + NamePosition++; + } + + if (NamePosition - MatchingChars > 0) + { + StarFound = MAXUSHORT; + } + break; + + case ANSI_DOS_DOT: + while (Name->Buffer[NamePosition] != '.' && NamePosition < Name->Length) + { + NamePosition++; + } + ExpressionPosition++; + StarFound = MAXUSHORT; + break; + + default: + /* Should never happen */ + ASSERT(FALSE); + } + } else if ((Expression->Buffer[ExpressionPosition] == '?') || (Expression->Buffer[ExpressionPosition] == ANSI_DOS_QM) || (Expression->Buffer[ExpressionPosition] == ANSI_DOS_DOT && Name->Buffer[NamePosition] == '.')) { @@ -206,15 +245,10 @@ FsRtlIsDbcsInExpression(IN PANSI_STRING Expression, else if (StarFound != MAXUSHORT) { ExpressionPosition = StarFound + 1; - if (Expression->Buffer[ExpressionPosition] != '*' && Expression->Buffer[ExpressionPosition] != '?' && - Expression->Buffer[ExpressionPosition] != ANSI_DOS_DOT && Expression->Buffer[ExpressionPosition] != ANSI_DOS_QM && - Expression->Buffer[ExpressionPosition] != ANSI_DOS_STAR) + while (Name->Buffer[NamePosition] != Expression->Buffer[ExpressionPosition] && + NamePosition < Name->Length) { - while (Name->Buffer[NamePosition] != Expression->Buffer[ExpressionPosition] && - NamePosition < Name->Length) - { - NamePosition++; - } + NamePosition++; } } else diff --git a/reactos/ntoskrnl/fsrtl/name.c b/reactos/ntoskrnl/fsrtl/name.c index 88f60c0d30f..8868ecc714d 100644 --- a/reactos/ntoskrnl/fsrtl/name.c +++ b/reactos/ntoskrnl/fsrtl/name.c @@ -34,6 +34,47 @@ FsRtlIsNameInExpressionPrivate(IN PUNICODE_STRING Expression, NamePosition++; ExpressionPosition++; } + else if (StarFound != MAXUSHORT && (Expression->Buffer[StarFound + 1] == L'*' || + Expression->Buffer[StarFound + 1] == L'?' || Expression->Buffer[StarFound + 1] == DOS_DOT)) + { + ExpressionPosition = StarFound + 1; + switch (Expression->Buffer[ExpressionPosition]) + { + case L'*': + StarFound = ExpressionPosition++; + break; + + case L'?': + ExpressionPosition++; + MatchingChars = NamePosition; + while ((IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] : + Name->Buffer[NamePosition]) != Expression->Buffer[ExpressionPosition] && + NamePosition < Name->Length / sizeof(WCHAR)) + { + NamePosition++; + } + + if (NamePosition - MatchingChars > 0) + { + StarFound = MAXUSHORT; + } + break; + + case DOS_DOT: + while (Name->Buffer[NamePosition] != L'.' && + NamePosition < Name->Length / sizeof(WCHAR)) + { + NamePosition++; + } + ExpressionPosition++; + StarFound = MAXUSHORT; + break; + + default: + /* Should never happen */ + ASSERT(FALSE); + } + } else if (Expression->Buffer[ExpressionPosition] == L'?' || (Expression->Buffer[ExpressionPosition] == DOS_QM) || (Expression->Buffer[ExpressionPosition] == DOS_DOT && Name->Buffer[NamePosition] == L'.')) { @@ -66,15 +107,11 @@ FsRtlIsNameInExpressionPrivate(IN PUNICODE_STRING Expression, else if (StarFound != MAXUSHORT) { ExpressionPosition = StarFound + 1; - if (Expression->Buffer[ExpressionPosition] != L'*' && Expression->Buffer[ExpressionPosition] != L'?' && - Expression->Buffer[ExpressionPosition] != DOS_DOT && Expression->Buffer[ExpressionPosition] != DOS_QM && - Expression->Buffer[ExpressionPosition] != DOS_STAR) + while ((IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] : + Name->Buffer[NamePosition]) != Expression->Buffer[ExpressionPosition] && + NamePosition < Name->Length / sizeof(WCHAR)) { - while ((IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] : Name->Buffer[NamePosition]) != Expression->Buffer[ExpressionPosition] && - NamePosition < Name->Length / sizeof(WCHAR)) - { - NamePosition++; - } + NamePosition++; } } else