[NTOSKRNL]

Reimplement (& fix) handling of DOS_DOT in FsRtlIs*InExpression().
This fixes lots of failing tests

svn path=/trunk/; revision=58810
This commit is contained in:
Pierre Schweitzer 2013-04-21 15:53:59 +00:00
parent 9870b21c66
commit 53db72e990
2 changed files with 73 additions and 2 deletions

View file

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

View file

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