164 USHORT BackTrackingBuffer[16], OldBackTrackingBuffer[16] = {0};
165 PUSHORT BackTrackingSwap, BackTracking = BackTrackingBuffer, OldBackTracking = OldBackTrackingBuffer;
168 USHORT ExpressionPosition, NamePosition = 0, MatchingChars = 1;
169 USHORT NameChar = 0, ExpressionChar;
217 NamePosition = (
Name->Length - IntExpression.
Length) /
sizeof(
CHAR);
224 while (MatchingChars < NamePosition)
231 if (MatchingChars > NamePosition)
237 (
Name->Buffer + NamePosition),
243 for (; !EndOfName; MatchingChars = BackTrackingPosition)
246 OldBackTrackingPosition = BackTrackingPosition = 0;
248 if (NamePosition >=
Name->Length)
251 if (MatchingChars && OldBackTracking[MatchingChars - 1] ==
Expression->Length * 2)
259 NameChar =
Name->Buffer[NamePosition] +
260 (0x100 *
Name->Buffer[NamePosition + 1]);
261 NamePosition +=
sizeof(
USHORT);
265 NameChar =
Name->Buffer[NamePosition];
266 NamePosition +=
sizeof(
UCHAR);
270 while (MatchingChars > OldBackTrackingPosition)
272 ExpressionPosition = (OldBackTracking[OldBackTrackingPosition++] + 1) / 2;
277 ExpressionPosition +=
Offset;
281 BackTracking[BackTrackingPosition++] =
Expression->Length * 2;
286 if (BackTrackingPosition > BackTrackingBufferSize - 3)
290 ASSERT((BackTracking == BackTrackingBuffer) || (BackTracking == OldBackTrackingBuffer));
291 ASSERT((OldBackTracking == BackTrackingBuffer) || (OldBackTracking == OldBackTrackingBuffer));
294 BackTrackingBufferSize =
Expression->Length * 2 + 1;
298 2 * BackTrackingBufferSize *
sizeof(
USHORT),
300 if (AllocatedBuffer ==
NULL)
302 DPRINT1(
"Failed to allocate BackTracking buffer. BackTrackingBufferSize = =x%lx\n",
303 BackTrackingBufferSize);
314 BackTracking = AllocatedBuffer;
322 OldBackTracking = &BackTracking[BackTrackingBufferSize];
328 ExpressionChar =
Expression->Buffer[ExpressionPosition] +
329 (0x100 *
Expression->Buffer[ExpressionPosition + 1]);
334 ExpressionChar =
Expression->Buffer[ExpressionPosition];
339 if (ExpressionChar == NameChar && !EndOfName)
341 BackTracking[BackTrackingPosition++] = (ExpressionPosition +
Offset) * 2;
344 else if (ExpressionChar ==
'?' && !EndOfName)
346 BackTracking[BackTrackingPosition++] = (ExpressionPosition +
Offset) * 2;
349 else if (ExpressionChar ==
'*')
351 BackTracking[BackTrackingPosition++] = ExpressionPosition * 2;
352 BackTracking[BackTrackingPosition++] = (ExpressionPosition * 2) + 1;
360 if (!EndOfName && NameChar ==
'.')
382 if (EndOfName || NameChar !=
'.' || !DontSkipDot)
383 BackTracking[BackTrackingPosition++] = ExpressionPosition * 2;
385 BackTracking[BackTrackingPosition++] = (ExpressionPosition * 2) + 1;
391 if (EndOfName)
continue;
394 BackTracking[BackTrackingPosition++] = (ExpressionPosition +
Offset) * 2;
399 if (EndOfName || NameChar ==
'.')
continue;
401 BackTracking[BackTrackingPosition++] = (ExpressionPosition +
Offset) * 2;
410 while (MatchingChars > OldBackTrackingPosition &&
411 BackTracking[
Position] > OldBackTracking[OldBackTrackingPosition])
413 ++OldBackTrackingPosition;
419 BackTrackingSwap = BackTracking;
420 BackTracking = OldBackTracking;
421 OldBackTracking = BackTrackingSwap;
425 Result = MatchingChars && (OldBackTracking[MatchingChars - 1] ==
Expression->Length * 2);
430 if (AllocatedBuffer !=
NULL)
BOOLEAN NTAPI FsRtlDoesDbcsContainWildCards(IN PANSI_STRING Name)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
NTSYSAPI ULONG NTAPI RtlEqualMemory(CONST VOID *Source1, CONST VOID *Source2, ULONG Length)
#define ExAllocatePoolWithTag(hernya, size, tag)
_In_ ULONG _In_ ULONG Offset
BOOLEAN NlsMbOemCodePageTag
#define RtlCopyMemory(Destination, Source, Length)
#define POOL_RAISE_IF_ALLOCATION_FAILURE
#define ExFreePoolWithTag(_P, _T)
#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR)