-static __inline
-NTSTATUS
-NTAPI
-RtlStringCbCatExW(IN OUT LPWSTR Destination,
- IN SIZE_T Length,
- IN LPCWSTR Source,
- OUT LPWSTR *DestinationEnd OPTIONAL,
- OUT PSIZE_T RemainingSize OPTIONAL,
- IN DWORD Flags)
-{
- NTSTATUS Status;
- SIZE_T CharLength = Length / sizeof(WCHAR);
- SIZE_T DestinationLength, Remaining, Copied = 0;
- PWCHAR LocalDestinationEnd;
- ASSERTMSG("We don't support Extended Flags yet!\n", Flags == 0);
-
- Status = RtlStringExValidateDestW(&Destination,
- &CharLength,
- &DestinationLength,
- NTSTRSAFE_MAX_CCH,
- Flags);
- if (NT_SUCCESS(Status))
- {
- LocalDestinationEnd = Destination + DestinationLength;
- Remaining = CharLength - DestinationLength;
-
- Status = RtlStringExValidateSrcW(&Source,
- NULL,
- NTSTRSAFE_MAX_CCH,
- Flags);
- if (NT_SUCCESS(Status))
- {
- if (Remaining <= 1)
- {
- if (*Source != UNICODE_NULL)
- {
- if (!Destination)
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- else
- {
- Status = STATUS_BUFFER_OVERFLOW;
- }
- }
- }
- else
- {
- Status = RtlStringCopyWorkerW(LocalDestinationEnd,
- Remaining,
- &Copied,
- Source,
- NTSTRSAFE_MAX_LENGTH);
-
- LocalDestinationEnd = LocalDestinationEnd + Copied;
- Remaining = Remaining - Copied;
- }
- }
-
- if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_OVERFLOW))
- {
- if (DestinationEnd) *DestinationEnd = LocalDestinationEnd;
-
- if (RemainingSize)
- {
- *RemainingSize = (Remaining * sizeof(WCHAR)) +
- (Length % sizeof(WCHAR));
- }
- }
- }
-
- return Status;
-}
-