[NTOSKRNL]

For both FsRtlIsNameInExpression & FsRtlIsDbcsInExpression:
- Remove useless checks
- Move redundant sum before loop, so it's done only once
- Fix handling of * wildcard

This fixes failing kmtest tests added in r50614

svn path=/trunk/; revision=50670
This commit is contained in:
Pierre Schweitzer 2011-02-12 18:39:17 +00:00
parent 334455fcf0
commit 641cb1f0f0
2 changed files with 48 additions and 23 deletions

View file

@ -160,7 +160,7 @@ NTAPI
FsRtlIsDbcsInExpression(IN PANSI_STRING Expression, FsRtlIsDbcsInExpression(IN PANSI_STRING Expression,
IN PANSI_STRING Name) IN PANSI_STRING Name)
{ {
USHORT ExpressionPosition = 0, NamePosition = 0, MatchingChars; USHORT ExpressionPosition = 0, NamePosition = 0, MatchingChars, StarFound = MAXUSHORT;
PAGED_CODE(); PAGED_CODE();
ASSERT(Name->Length); ASSERT(Name->Length);
@ -169,34 +169,37 @@ FsRtlIsDbcsInExpression(IN PANSI_STRING Expression,
while (NamePosition < Name->Length && ExpressionPosition < Expression->Length) while (NamePosition < Name->Length && ExpressionPosition < Expression->Length)
{ {
if ((Expression->Buffer[ExpressionPosition] == Name->Buffer[NamePosition]) || if ((Expression->Buffer[ExpressionPosition] == Name->Buffer[NamePosition]))
(Expression->Buffer[ExpressionPosition] == '?') || (Expression->Buffer[ExpressionPosition] == ANSI_DOS_QM) ||
(Expression->Buffer[ExpressionPosition] == ANSI_DOS_DOT && Name->Buffer[NamePosition] == '.'))
{ {
NamePosition++; NamePosition++;
ExpressionPosition++; ExpressionPosition++;
} }
else if ((Expression->Buffer[ExpressionPosition] == '?') || (Expression->Buffer[ExpressionPosition] == ANSI_DOS_QM) ||
(Expression->Buffer[ExpressionPosition] == ANSI_DOS_DOT && Name->Buffer[NamePosition] == '.'))
{
NamePosition++;
ExpressionPosition++;
StarFound = MAXUSHORT;
}
else if (Expression->Buffer[ExpressionPosition] == '*') else if (Expression->Buffer[ExpressionPosition] == '*')
{ {
if (ExpressionPosition < (Expression->Length - 1)) StarFound = ExpressionPosition++;
if (StarFound < (Expression->Length - 1))
{ {
if (Expression->Buffer[ExpressionPosition+1] != '*' && Expression->Buffer[ExpressionPosition+1] != '?' && while (Name->Buffer[NamePosition] != Expression->Buffer[ExpressionPosition] &&
Expression->Buffer[ExpressionPosition+1] != ANSI_DOS_DOT && NamePosition < Name->Length)
Expression->Buffer[ExpressionPosition+1] != ANSI_DOS_QM &&
Expression->Buffer[ExpressionPosition+1] != ANSI_DOS_STAR)
{ {
while (Name->Buffer[NamePosition] != Expression->Buffer[ExpressionPosition+1] && NamePosition++;
NamePosition < Name->Length) NamePosition++;
} }
} }
else else
{ {
NamePosition = Name->Length; NamePosition = Name->Length;
} }
ExpressionPosition++;
} }
else if (Expression->Buffer[ExpressionPosition] == ANSI_DOS_STAR) else if (Expression->Buffer[ExpressionPosition] == ANSI_DOS_STAR)
{ {
StarFound = MAXUSHORT;
MatchingChars = NamePosition; MatchingChars = NamePosition;
while (MatchingChars < Name->Length) while (MatchingChars < Name->Length)
{ {
@ -208,6 +211,15 @@ FsRtlIsDbcsInExpression(IN PANSI_STRING Expression,
} }
ExpressionPosition++; ExpressionPosition++;
} }
else if (StarFound != MAXUSHORT)
{
ExpressionPosition = StarFound + 1;
while (Name->Buffer[NamePosition] != Expression->Buffer[ExpressionPosition] &&
NamePosition < Name->Length)
{
NamePosition++;
}
}
else else
{ {
NamePosition = Name->Length; NamePosition = Name->Length;

View file

@ -22,40 +22,44 @@ FsRtlIsNameInExpressionPrivate(IN PUNICODE_STRING Expression,
IN BOOLEAN IgnoreCase, IN BOOLEAN IgnoreCase,
IN PWCHAR UpcaseTable OPTIONAL) IN PWCHAR UpcaseTable OPTIONAL)
{ {
USHORT ExpressionPosition = 0, NamePosition = 0, MatchingChars; USHORT ExpressionPosition = 0, NamePosition = 0, MatchingChars, StarFound = MAXUSHORT;
PAGED_CODE(); PAGED_CODE();
ASSERT(!IgnoreCase || UpcaseTable); ASSERT(!IgnoreCase || UpcaseTable);
while (NamePosition < Name->Length / sizeof(WCHAR) && ExpressionPosition < Expression->Length / sizeof(WCHAR)) while (NamePosition < Name->Length / sizeof(WCHAR) && ExpressionPosition < Expression->Length / sizeof(WCHAR))
{ {
if ((Expression->Buffer[ExpressionPosition] == (IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] : Name->Buffer[NamePosition])) || if ((Expression->Buffer[ExpressionPosition] == (IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] : Name->Buffer[NamePosition])))
(Expression->Buffer[ExpressionPosition] == L'?') || (Expression->Buffer[ExpressionPosition] == DOS_QM) ||
(Expression->Buffer[ExpressionPosition] == DOS_DOT && Name->Buffer[NamePosition] == L'.'))
{ {
NamePosition++; NamePosition++;
ExpressionPosition++; ExpressionPosition++;
} }
else if (Expression->Buffer[ExpressionPosition] == L'?' || (Expression->Buffer[ExpressionPosition] == DOS_QM) ||
(Expression->Buffer[ExpressionPosition] == DOS_DOT && Name->Buffer[NamePosition] == L'.'))
{
NamePosition++;
ExpressionPosition++;
StarFound = MAXUSHORT;
}
else if (Expression->Buffer[ExpressionPosition] == L'*') else if (Expression->Buffer[ExpressionPosition] == L'*')
{ {
if (ExpressionPosition < (Expression->Length / sizeof(WCHAR) - 1)) StarFound = ExpressionPosition++;
if (StarFound < (Expression->Length / sizeof(WCHAR) - 1))
{ {
if (Expression->Buffer[ExpressionPosition+1] != L'*' && Expression->Buffer[ExpressionPosition+1] != L'?' && while ((IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] : Name->Buffer[NamePosition]) != Expression->Buffer[ExpressionPosition] &&
Expression->Buffer[ExpressionPosition+1] != DOS_DOT && Expression->Buffer[ExpressionPosition+1] != DOS_QM && NamePosition < Name->Length / sizeof(WCHAR))
Expression->Buffer[ExpressionPosition+1] != DOS_STAR)
{ {
while ((IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] : Name->Buffer[NamePosition]) != Expression->Buffer[ExpressionPosition+1] && NamePosition++;
NamePosition < Name->Length / sizeof(WCHAR)) NamePosition++;
} }
} }
else else
{ {
NamePosition = Name->Length / sizeof(WCHAR); NamePosition = Name->Length / sizeof(WCHAR);
} }
ExpressionPosition++;
} }
else if (Expression->Buffer[ExpressionPosition] == DOS_STAR) else if (Expression->Buffer[ExpressionPosition] == DOS_STAR)
{ {
StarFound = MAXUSHORT;
MatchingChars = NamePosition; MatchingChars = NamePosition;
while (MatchingChars < Name->Length / sizeof(WCHAR)) while (MatchingChars < Name->Length / sizeof(WCHAR))
{ {
@ -67,6 +71,15 @@ FsRtlIsNameInExpressionPrivate(IN PUNICODE_STRING Expression,
} }
ExpressionPosition++; ExpressionPosition++;
} }
else if (StarFound != MAXUSHORT)
{
ExpressionPosition = StarFound + 1;
while ((IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] : Name->Buffer[NamePosition]) != Expression->Buffer[ExpressionPosition] &&
NamePosition < Name->Length / sizeof(WCHAR))
{
NamePosition++;
}
}
else else
{ {
NamePosition = Name->Length / sizeof(WCHAR); NamePosition = Name->Length / sizeof(WCHAR);