+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;
+}
+