[NTOSKRNL]

Improved * WC handling for both FsRtlIsNameInExpression & FsRtlIsDbcsInExpression

This fixes all failing tests in kmtest

svn path=/trunk/; revision=50685
This commit is contained in:
Pierre Schweitzer 2011-02-13 20:23:03 +00:00
parent b607fcee93
commit 2ac5519cc7
2 changed files with 87 additions and 16 deletions

View file

@ -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

View file

@ -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