|
|
Definition at line 21 of file name.c.
Referenced by FsRtlIsNameInExpression().
{
SHORT StarFound = -1;
PUSHORT BackTracking = NULL;
UNICODE_STRING IntExpression;
USHORT ExpressionPosition = 0, NamePosition = 0, MatchingChars;
PAGED_CODE();
if (!Name->Length || !Expression->Length)
{
if (Name->Length == 0 && Expression->Length == 0)
return TRUE;
else
return FALSE;
}
if (Expression->Length == sizeof(WCHAR))
{
if (Expression->Buffer[0] == L'*')
return TRUE;
}
ASSERT(!IgnoreCase || UpcaseTable);
if (Expression->Buffer[0] == L'*')
{
IntExpression = *Expression;
IntExpression.Buffer++;
IntExpression.Length -= sizeof(WCHAR);
if (!FsRtlDoesNameContainWildCards(&IntExpression))
{
if (Name->Length < (Expression->Length - sizeof(WCHAR)))
return FALSE;
NamePosition = (Name->Length - IntExpression.Length) / sizeof(WCHAR);
if (!IgnoreCase)
{
return RtlEqualMemory(IntExpression.Buffer,
Name->Buffer + NamePosition,
IntExpression.Length);
}
else
{
for (ExpressionPosition = 0; ExpressionPosition < (IntExpression.Length / sizeof(WCHAR)); ExpressionPosition++)
{
ASSERT(IntExpression.Buffer[ExpressionPosition] == UpcaseTable[IntExpression.Buffer[ExpressionPosition]]);
if (UpcaseTable[Name->Buffer[NamePosition + ExpressionPosition]] !=
IntExpression.Buffer[ExpressionPosition])
{
return FALSE;
}
}
return TRUE;
}
}
}
while (NamePosition < Name->Length / sizeof(WCHAR) && ExpressionPosition < Expression->Length / sizeof(WCHAR))
{
if ((Expression->Buffer[ExpressionPosition] == (IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] : Name->Buffer[NamePosition])))
{
NamePosition++;
ExpressionPosition++;
}
else if (Expression->Buffer[ExpressionPosition] == L'?' || (Expression->Buffer[ExpressionPosition] == DOS_QM) ||
(Expression->Buffer[ExpressionPosition] == DOS_DOT && Name->Buffer[NamePosition] == L'.'))
{
NamePosition++;
ExpressionPosition++;
}
else if (Expression->Buffer[ExpressionPosition] == L'*')
{
while (ExpressionPosition + 1 < Expression->Length / sizeof(WCHAR) && Expression->Buffer[ExpressionPosition + 1] == L'*')
{
ExpressionPosition++;
}
if (!BackTracking)
{
BackTracking = ExAllocatePoolWithTag(PagedPool | POOL_RAISE_IF_ALLOCATION_FAILURE,
(Expression->Length / sizeof(WCHAR)) * sizeof(USHORT),
'nrSF');
}
BackTracking[++StarFound] = ExpressionPosition++;
if (ExpressionPosition == Expression->Length / sizeof(WCHAR))
{
NamePosition = Name->Length / sizeof(WCHAR);
break;
}
else if (Expression->Buffer[ExpressionPosition] != L'?')
{
NamePosition++;
}
}
else if (Expression->Buffer[ExpressionPosition] == DOS_STAR)
{
MatchingChars = NamePosition;
while (MatchingChars < Name->Length / sizeof(WCHAR))
{
if (Name->Buffer[MatchingChars] == L'.')
{
NamePosition = MatchingChars;
}
MatchingChars++;
}
ExpressionPosition++;
}
else if (StarFound >= 0)
{
ExpressionPosition = BackTracking[StarFound--];
}
else
{
break;
}
if (ExpressionPosition == Expression->Length / sizeof(WCHAR) &&
NamePosition != Name->Length / sizeof(WCHAR) &&
StarFound >= 0)
{
ExpressionPosition = BackTracking[StarFound--];
}
}
if (ExpressionPosition + 1 == Expression->Length / sizeof(WCHAR) && NamePosition == Name->Length / sizeof(WCHAR) &&
Expression->Buffer[ExpressionPosition] == DOS_DOT)
{
ExpressionPosition++;
}
if (BackTracking)
{
ExFreePoolWithTag(BackTracking, 'nrSF');
}
return (ExpressionPosition == Expression->Length / sizeof(WCHAR) && NamePosition == Name->Length / sizeof(WCHAR));
}
|