From 53db72e99036f9d630f2d687645f755e97d1090a Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 21 Apr 2013 15:53:59 +0000 Subject: [PATCH] [NTOSKRNL] 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 | 36 ++++++++++++++++++++++++++++ reactos/ntoskrnl/fsrtl/name.c | 39 +++++++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/fsrtl/dbcsname.c b/reactos/ntoskrnl/fsrtl/dbcsname.c index 2aef01ebf72..736c82bf185 100644 --- a/reactos/ntoskrnl/fsrtl/dbcsname.c +++ b/reactos/ntoskrnl/fsrtl/dbcsname.c @@ -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) { diff --git a/reactos/ntoskrnl/fsrtl/name.c b/reactos/ntoskrnl/fsrtl/name.c index cdd46757450..4dd965a2d96 100644 --- a/reactos/ntoskrnl/fsrtl/name.c +++ b/reactos/ntoskrnl/fsrtl/name.c @@ -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) {