IN BOOLEAN IgnoreCase,
IN PWCHAR UpcaseTable OPTIONAL)
{
- USHORT ExpressionPosition = 0, NamePosition = 0, MatchingChars;
+ USHORT ExpressionPosition = 0, NamePosition = 0, MatchingChars, StarFound = MAXUSHORT;
PAGED_CODE();
ASSERT(!IgnoreCase || UpcaseTable);
while (NamePosition < Name->Length / sizeof(WCHAR) && ExpressionPosition < Expression->Length / sizeof(WCHAR))
{
- 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'.'))
+ if ((Expression->Buffer[ExpressionPosition] == (IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] : Name->Buffer[NamePosition])))
{
NamePosition++;
ExpressionPosition++;
}
- else if (Expression->Buffer[ExpressionPosition] == L'*')
+ else if (StarFound != MAXUSHORT && (Expression->Buffer[StarFound + 1] == L'*' ||
+ Expression->Buffer[StarFound + 1] == L'?' || Expression->Buffer[StarFound + 1] == DOS_DOT))
{
- if (ExpressionPosition < (Expression->Length / sizeof(WCHAR) - 1))
+ ExpressionPosition = StarFound + 1;
+ switch (Expression->Buffer[ExpressionPosition])
{
- if (Expression->Buffer[ExpressionPosition+1] != L'*' && Expression->Buffer[ExpressionPosition+1] != L'?' &&
- Expression->Buffer[ExpressionPosition+1] != DOS_DOT && Expression->Buffer[ExpressionPosition+1] != DOS_QM &&
- Expression->Buffer[ExpressionPosition+1] != DOS_STAR)
- {
- while ((IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] : Name->Buffer[NamePosition]) != Expression->Buffer[ExpressionPosition+1] &&
- NamePosition < Name->Length / sizeof(WCHAR)) NamePosition++;
- }
+ case L'*':
+ StarFound = MAXUSHORT;
+ break;
+
+ case L'?':
+ if (++ExpressionPosition == Expression->Length / sizeof(WCHAR))
+ {
+ NamePosition = Name->Length / sizeof(WCHAR);
+ break;
+ }
+
+ MatchingChars = NamePosition;
+ while (NamePosition < Name->Length / sizeof(WCHAR) &&
+ (IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] :
+ Name->Buffer[NamePosition]) != Expression->Buffer[ExpressionPosition])
+ {
+ NamePosition++;
+ }
+
+ if (NamePosition - MatchingChars > 0)
+ {
+ StarFound = MAXUSHORT;
+ }
+ break;
+
+ case DOS_DOT:
+ while (NamePosition < Name->Length / sizeof(WCHAR) &&
+ Name->Buffer[NamePosition] != L'.')
+ {
+ NamePosition++;
+ }
+ ExpressionPosition++;
+ StarFound = MAXUSHORT;
+ break;
+
+ default:
+ /* Should never happen */
+ ASSERT(FALSE);
}
- else
+ }
+ 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'*')
+ {
+ StarFound = ExpressionPosition++;
+ if (ExpressionPosition == Expression->Length / sizeof(WCHAR))
{
NamePosition = Name->Length / sizeof(WCHAR);
+ break;
}
- ExpressionPosition++;
}
else if (Expression->Buffer[ExpressionPosition] == DOS_STAR)
{
+ StarFound = MAXUSHORT;
MatchingChars = NamePosition;
while (MatchingChars < Name->Length / sizeof(WCHAR))
{
}
ExpressionPosition++;
}
+ else if (StarFound != MAXUSHORT)
+ {
+ ExpressionPosition = StarFound + 1;
+ while (NamePosition < Name->Length / sizeof(WCHAR) &&
+ (IgnoreCase ? UpcaseTable[Name->Buffer[NamePosition]] :
+ Name->Buffer[NamePosition]) != Expression->Buffer[ExpressionPosition])
+ {
+ NamePosition++;
+ }
+ }
else
{
- NamePosition = Name->Length / sizeof(WCHAR);
+ break;
}
}
if (ExpressionPosition + 1 == Expression->Length / sizeof(WCHAR) && NamePosition == Name->Length / sizeof(WCHAR) &&
UNICODE_STRING UpcaseName1;
UNICODE_STRING UpcaseName2;
BOOLEAN StringsAreEqual, MemoryAllocated = FALSE;
- ULONG i;
+ USHORT i;
NTSTATUS Status;
PAGED_CODE();
OUT PUNICODE_STRING FirstPart,
OUT PUNICODE_STRING RemainingPart)
{
- ULONG FirstPosition, i;
- ULONG SkipFirstSlash = 0;
+ USHORT FirstPosition, i;
+ USHORT SkipFirstSlash = 0;
PAGED_CODE();
/* Zero the strings before continuing */