Author: silverblade
Date: Wed Feb 25 16:07:00 2009
New Revision: 39749
URL:
http://svn.reactos.org/svn/reactos?rev=39749&view=rev
Log:
Set svn:eol-style native on ntstrsafe.h
Modified:
trunk/reactos/include/ddk/ntstrsafe.h (contents, props changed)
Modified: trunk/reactos/include/ddk/ntstrsafe.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/include/ddk/ntstrsafe.h?re…
==============================================================================
--- trunk/reactos/include/ddk/ntstrsafe.h [iso-8859-1] (original)
+++ trunk/reactos/include/ddk/ntstrsafe.h [iso-8859-1] Wed Feb 25 16:07:00 2009
@@ -1,497 +1,497 @@
-/*
- * PROJECT: ReactOS Kernel
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: include/ddk/ntstrsafe.h
- * PURPOSE: Safe String Library for NT Code (Native/Kernel)
- * PROGRAMMERS: Alex Ionescu (alex.ionescu(a)reactos.org)
- */
-
-/* INCLUDES ******************************************************************/
-
-#ifndef _NTSTRSAFE_H_INCLUDED_
-#define _NTSTRSAFE_H_INCLUDED_
-
-//
-// Dependencies
-//
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-
-//
-// Maximum limits: allow overriding the maximum
-//
-#ifndef NTSTRSAFE_MAX_CCH
-#define NTSTRSAFE_MAX_CCH 2147483647
-#endif
-#define NTSTRSAFE_MAX_LENGTH (NTSTRSAFE_MAX_CCH - 1)
-
-//
-// Typedefs
-//
-typedef unsigned long DWORD;
-
-/* PRIVATE FUNCTIONS *********************************************************/
-
-FORCEINLINE
-NTSTATUS
-NTAPI
-RtlStringLengthWorkerA(IN PCHAR String,
- IN SIZE_T MaxLength,
- OUT PSIZE_T ReturnLength OPTIONAL)
-{
- NTSTATUS Status = STATUS_SUCCESS;
- SIZE_T LocalMax = MaxLength;
-
- while (MaxLength && (*String != ANSI_NULL))
- {
- String++;
- MaxLength--;
- }
-
- if (!MaxLength) Status = STATUS_INVALID_PARAMETER;
-
- if (ReturnLength)
- {
- if (NT_SUCCESS(Status))
- {
- *ReturnLength = LocalMax - MaxLength;
- }
- else
- {
- *ReturnLength = 0;
- }
- }
-
- return Status;
-}
-
-FORCEINLINE
-NTSTATUS
-NTAPI
-RtlStringValidateDestA(IN PCHAR Destination,
- IN SIZE_T Length,
- OUT PSIZE_T ReturnLength OPTIONAL,
- IN SIZE_T MaxLength)
-{
- NTSTATUS Status = STATUS_SUCCESS;
-
- if (!(Length) || (Length > MaxLength)) Status = STATUS_INVALID_PARAMETER;
-
- if (ReturnLength)
- {
- if (NT_SUCCESS(Status))
- {
- Status = RtlStringLengthWorkerA(Destination,
- Length,
- ReturnLength);
- }
- else
- {
- *ReturnLength = 0;
- }
- }
-
- return Status;
-}
-
-FORCEINLINE
-NTSTATUS
-NTAPI
-RtlStringExValidateDestA(IN OUT PCHAR *Destination,
- IN OUT PSIZE_T DestinationLength,
- OUT PSIZE_T ReturnLength OPTIONAL,
- IN SIZE_T MaxLength,
- IN DWORD Flags)
-{
- ASSERTMSG("We don't support Extended Flags yet!\n", Flags == 0);
- return RtlStringValidateDestA(*Destination,
- *DestinationLength,
- ReturnLength,
- MaxLength);
-}
-
-FORCEINLINE
-NTSTATUS
-NTAPI
-RtlStringExValidateSrcA(IN OUT PCCHAR *Source OPTIONAL,
- IN OUT PSIZE_T ReturnLength OPTIONAL,
- IN SIZE_T MaxLength,
- IN DWORD Flags)
-{
- NTSTATUS Status = STATUS_SUCCESS;
- ASSERTMSG("We don't support Extended Flags yet!\n", Flags == 0);
-
- if ((ReturnLength) && (*ReturnLength >= MaxLength))
- {
- Status = STATUS_INVALID_PARAMETER;
- }
-
- return Status;
-}
-
-FORCEINLINE
-NTSTATUS
-NTAPI
-RtlStringVPrintfWorkerA(OUT PCHAR Destination,
- IN SIZE_T Length,
- OUT PSIZE_T NewLength OPTIONAL,
- IN PCCHAR Format,
- IN va_list argList)
-{
- NTSTATUS Status = STATUS_SUCCESS;
- LONG Return;
- SIZE_T MaxLength, LocalNewLength = 0;
-
- MaxLength = Length - 1;
-
- Return = _vsnprintf(Destination, MaxLength, Format, argList);
- if ((Return < 0) || ((SIZE_T)Return > MaxLength))
- {
- Destination += MaxLength;
- *Destination = ANSI_NULL;
-
- LocalNewLength = MaxLength;
-
- Status = STATUS_BUFFER_OVERFLOW;
- }
- else if ((SIZE_T)Return == MaxLength)
- {
- Destination += MaxLength;
- *Destination = ANSI_NULL;
-
- LocalNewLength = MaxLength;
- }
- else
- {
- LocalNewLength = Return;
- }
-
- if (NewLength) *NewLength = LocalNewLength;
- return Status;
-}
-
-FORCEINLINE
-NTSTATUS
-NTAPI
-RtlStringCopyWorkerA(OUT PCHAR Destination,
- IN SIZE_T Length,
- OUT PSIZE_T NewLength OPTIONAL,
- IN PCCHAR Source,
- IN SIZE_T CopyLength)
-{
- NTSTATUS Status = STATUS_SUCCESS;
- SIZE_T LocalNewLength = 0;
-
- while ((Length) && (CopyLength) && (*Source != ANSI_NULL))
- {
- *Destination++ = *Source++;
- Length--;
- CopyLength--;
-
- LocalNewLength++;
- }
-
- if (!Length)
- {
- Destination--;
- LocalNewLength--;
-
- Status = STATUS_BUFFER_OVERFLOW;
- }
-
- *Destination = ANSI_NULL;
-
- if (NewLength) *NewLength = LocalNewLength;
- return Status;
-}
-
-/* PUBLIC FUNCTIONS **********************************************************/
-
-NTSTATUS
-NTAPI
-RtlStringCbPrintfA(OUT PCHAR Destination,
- IN SIZE_T Length,
- IN PCHAR Format,
- ...)
-{
- NTSTATUS Status;
- SIZE_T CharLength = Length / sizeof(CHAR);
- va_list argList;
-
- Status = RtlStringValidateDestA(Destination,
- CharLength,
- NULL,
- NTSTRSAFE_MAX_CCH);
- if (NT_SUCCESS(Status))
- {
- va_start(argList, Format);
- Status = RtlStringVPrintfWorkerA(Destination,
- CharLength,
- NULL,
- Format,
- argList);
- va_end(argList);
- }
-
- return Status;
-}
-
-NTSTATUS
-NTAPI
-RtlStringCbPrintfExA(OUT PCHAR Destination,
- IN SIZE_T Length,
- OUT PCHAR *DestinationEnd OPTIONAL,
- OUT PSIZE_T RemainingSize OPTIONAL,
- IN DWORD Flags,
- IN PCCHAR Format,
- ...)
-{
- NTSTATUS Status;
- SIZE_T CharLength = Length / sizeof(CHAR), Remaining, LocalNewLength = 0;
- PCHAR LocalDestinationEnd;
- va_list argList;
- ASSERTMSG("We don't support Extended Flags yet!\n", Flags == 0);
-
- Status = RtlStringExValidateDestA(&Destination,
- &CharLength,
- NULL,
- NTSTRSAFE_MAX_CCH,
- Flags);
- if (NT_SUCCESS(Status))
- {
- LocalDestinationEnd = Destination;
- Remaining = CharLength;
-
- Status = RtlStringExValidateSrcA(&Format,
- NULL,
- NTSTRSAFE_MAX_CCH,
- Flags);
- if (NT_SUCCESS(Status))
- {
- if (!Length)
- {
- if (*Format != ANSI_NULL)
- {
- if (!Destination)
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- else
- {
- Status = STATUS_BUFFER_OVERFLOW;
- }
- }
- }
- else
- {
- va_start(argList, Format);
- Status = RtlStringVPrintfWorkerA(Destination,
- CharLength,
- &LocalNewLength,
- Format,
- argList);
- va_end(argList);
-
- LocalDestinationEnd = Destination + LocalNewLength;
- Remaining = CharLength - LocalNewLength;
- }
- }
- else
- {
- if (Length) *Destination = ANSI_NULL;
- }
-
- if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_OVERFLOW))
- {
- if (DestinationEnd) *DestinationEnd = LocalDestinationEnd;
-
- if (RemainingSize)
- {
- *RemainingSize = (Remaining * sizeof(CHAR)) +
- (Length % sizeof(CHAR));
- }
- }
- }
-
- return Status;
-}
-
-FORCEINLINE
-NTSTATUS
-NTAPI
-RtlStringCbCopyExA(OUT PCHAR Destination,
- IN SIZE_T Length,
- IN PCCHAR Source,
- OUT PCHAR *DestinationEnd OPTIONAL,
- OUT PSIZE_T RemainingSize OPTIONAL,
- IN DWORD Flags)
-{
- NTSTATUS Status;
- SIZE_T CharLength = Length / sizeof(CHAR), Copied = 0, Remaining;
- PCHAR LocalDestinationEnd;
- ASSERTMSG("We don't support Extended Flags yet!\n", Flags == 0);
-
- Status = RtlStringExValidateDestA(&Destination,
- &Length,
- NULL,
- NTSTRSAFE_MAX_CCH,
- Flags);
- if (NT_SUCCESS(Status))
- {
- LocalDestinationEnd = Destination;
- Remaining = CharLength;
-
- Status = RtlStringExValidateSrcA(&Source,
- NULL,
- NTSTRSAFE_MAX_CCH,
- Flags);
- if (NT_SUCCESS(Status))
- {
- if (!CharLength)
- {
- if (*Source != ANSI_NULL)
- {
- if (!Destination)
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- else
- {
- Status = STATUS_BUFFER_OVERFLOW;
- }
- }
- }
- else
- {
- Status = RtlStringCopyWorkerA(Destination,
- CharLength,
- &Copied,
- Source,
- NTSTRSAFE_MAX_LENGTH);
-
- LocalDestinationEnd = Destination + Copied;
- Remaining = CharLength - Copied;
- }
- }
- else
- {
- if (CharLength) *Destination = ANSI_NULL;
- }
-
- if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_OVERFLOW))
- {
- if (DestinationEnd) *DestinationEnd = LocalDestinationEnd;
-
- if (RemainingSize)
- {
- *RemainingSize = (Remaining * sizeof(CHAR)) +
- (Length % sizeof(CHAR));
- }
- }
- }
-
- return Status;
-}
-
-FORCEINLINE
-NTSTATUS
-NTAPI
-RtlStringCbCatExA(IN OUT PCHAR Destination,
- IN SIZE_T Length,
- IN PCCHAR Source,
- OUT PCHAR *DestinationEnd OPTIONAL,
- OUT PSIZE_T RemainingSize OPTIONAL,
- IN DWORD Flags)
-{
- NTSTATUS Status;
- SIZE_T CharLength = Length / sizeof(CHAR);
- SIZE_T DestinationLength, Remaining, Copied = 0;
- PCHAR LocalDestinationEnd;
- ASSERTMSG("We don't support Extended Flags yet!\n", Flags == 0);
-
- Status = RtlStringExValidateDestA(&Destination,
- &CharLength,
- &DestinationLength,
- NTSTRSAFE_MAX_CCH,
- Flags);
- if (NT_SUCCESS(Status))
- {
- LocalDestinationEnd = Destination + DestinationLength;
- Remaining = CharLength - DestinationLength;
-
- Status = RtlStringExValidateSrcA(&Source,
- NULL,
- NTSTRSAFE_MAX_CCH,
- Flags);
- if (NT_SUCCESS(Status))
- {
- if (Remaining <= 1)
- {
- if (*Source != ANSI_NULL)
- {
- if (!Destination)
- {
- Status = STATUS_INVALID_PARAMETER;
- }
- else
- {
- Status = STATUS_BUFFER_OVERFLOW;
- }
- }
- }
- else
- {
- Status = RtlStringCopyWorkerA(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(CHAR)) +
- (Length % sizeof(CHAR));
- }
- }
- }
-
- return Status;
-}
-
-FORCEINLINE
-NTSTATUS
-NTAPI
-RtlStringCbCopyA(OUT PCHAR Destination,
- IN SIZE_T Length,
- IN PCCHAR Source)
-{
- NTSTATUS Status;
- SIZE_T CharLength = Length / sizeof(CHAR);
-
- Status = RtlStringValidateDestA(Destination,
- CharLength,
- NULL,
- NTSTRSAFE_MAX_CCH);
- if (NT_SUCCESS(Status))
- {
- Status = RtlStringCopyWorkerA(Destination,
- CharLength,
- NULL,
- Source,
- NTSTRSAFE_MAX_LENGTH);
- }
-
- return Status;
-}
-
-#endif
+/*
+ * PROJECT: ReactOS Kernel
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: include/ddk/ntstrsafe.h
+ * PURPOSE: Safe String Library for NT Code (Native/Kernel)
+ * PROGRAMMERS: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#ifndef _NTSTRSAFE_H_INCLUDED_
+#define _NTSTRSAFE_H_INCLUDED_
+
+//
+// Dependencies
+//
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+//
+// Maximum limits: allow overriding the maximum
+//
+#ifndef NTSTRSAFE_MAX_CCH
+#define NTSTRSAFE_MAX_CCH 2147483647
+#endif
+#define NTSTRSAFE_MAX_LENGTH (NTSTRSAFE_MAX_CCH - 1)
+
+//
+// Typedefs
+//
+typedef unsigned long DWORD;
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+FORCEINLINE
+NTSTATUS
+NTAPI
+RtlStringLengthWorkerA(IN PCHAR String,
+ IN SIZE_T MaxLength,
+ OUT PSIZE_T ReturnLength OPTIONAL)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ SIZE_T LocalMax = MaxLength;
+
+ while (MaxLength && (*String != ANSI_NULL))
+ {
+ String++;
+ MaxLength--;
+ }
+
+ if (!MaxLength) Status = STATUS_INVALID_PARAMETER;
+
+ if (ReturnLength)
+ {
+ if (NT_SUCCESS(Status))
+ {
+ *ReturnLength = LocalMax - MaxLength;
+ }
+ else
+ {
+ *ReturnLength = 0;
+ }
+ }
+
+ return Status;
+}
+
+FORCEINLINE
+NTSTATUS
+NTAPI
+RtlStringValidateDestA(IN PCHAR Destination,
+ IN SIZE_T Length,
+ OUT PSIZE_T ReturnLength OPTIONAL,
+ IN SIZE_T MaxLength)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ if (!(Length) || (Length > MaxLength)) Status = STATUS_INVALID_PARAMETER;
+
+ if (ReturnLength)
+ {
+ if (NT_SUCCESS(Status))
+ {
+ Status = RtlStringLengthWorkerA(Destination,
+ Length,
+ ReturnLength);
+ }
+ else
+ {
+ *ReturnLength = 0;
+ }
+ }
+
+ return Status;
+}
+
+FORCEINLINE
+NTSTATUS
+NTAPI
+RtlStringExValidateDestA(IN OUT PCHAR *Destination,
+ IN OUT PSIZE_T DestinationLength,
+ OUT PSIZE_T ReturnLength OPTIONAL,
+ IN SIZE_T MaxLength,
+ IN DWORD Flags)
+{
+ ASSERTMSG("We don't support Extended Flags yet!\n", Flags == 0);
+ return RtlStringValidateDestA(*Destination,
+ *DestinationLength,
+ ReturnLength,
+ MaxLength);
+}
+
+FORCEINLINE
+NTSTATUS
+NTAPI
+RtlStringExValidateSrcA(IN OUT PCCHAR *Source OPTIONAL,
+ IN OUT PSIZE_T ReturnLength OPTIONAL,
+ IN SIZE_T MaxLength,
+ IN DWORD Flags)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ ASSERTMSG("We don't support Extended Flags yet!\n", Flags == 0);
+
+ if ((ReturnLength) && (*ReturnLength >= MaxLength))
+ {
+ Status = STATUS_INVALID_PARAMETER;
+ }
+
+ return Status;
+}
+
+FORCEINLINE
+NTSTATUS
+NTAPI
+RtlStringVPrintfWorkerA(OUT PCHAR Destination,
+ IN SIZE_T Length,
+ OUT PSIZE_T NewLength OPTIONAL,
+ IN PCCHAR Format,
+ IN va_list argList)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ LONG Return;
+ SIZE_T MaxLength, LocalNewLength = 0;
+
+ MaxLength = Length - 1;
+
+ Return = _vsnprintf(Destination, MaxLength, Format, argList);
+ if ((Return < 0) || ((SIZE_T)Return > MaxLength))
+ {
+ Destination += MaxLength;
+ *Destination = ANSI_NULL;
+
+ LocalNewLength = MaxLength;
+
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+ else if ((SIZE_T)Return == MaxLength)
+ {
+ Destination += MaxLength;
+ *Destination = ANSI_NULL;
+
+ LocalNewLength = MaxLength;
+ }
+ else
+ {
+ LocalNewLength = Return;
+ }
+
+ if (NewLength) *NewLength = LocalNewLength;
+ return Status;
+}
+
+FORCEINLINE
+NTSTATUS
+NTAPI
+RtlStringCopyWorkerA(OUT PCHAR Destination,
+ IN SIZE_T Length,
+ OUT PSIZE_T NewLength OPTIONAL,
+ IN PCCHAR Source,
+ IN SIZE_T CopyLength)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ SIZE_T LocalNewLength = 0;
+
+ while ((Length) && (CopyLength) && (*Source != ANSI_NULL))
+ {
+ *Destination++ = *Source++;
+ Length--;
+ CopyLength--;
+
+ LocalNewLength++;
+ }
+
+ if (!Length)
+ {
+ Destination--;
+ LocalNewLength--;
+
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+
+ *Destination = ANSI_NULL;
+
+ if (NewLength) *NewLength = LocalNewLength;
+ return Status;
+}
+
+/* PUBLIC FUNCTIONS **********************************************************/
+
+NTSTATUS
+NTAPI
+RtlStringCbPrintfA(OUT PCHAR Destination,
+ IN SIZE_T Length,
+ IN PCHAR Format,
+ ...)
+{
+ NTSTATUS Status;
+ SIZE_T CharLength = Length / sizeof(CHAR);
+ va_list argList;
+
+ Status = RtlStringValidateDestA(Destination,
+ CharLength,
+ NULL,
+ NTSTRSAFE_MAX_CCH);
+ if (NT_SUCCESS(Status))
+ {
+ va_start(argList, Format);
+ Status = RtlStringVPrintfWorkerA(Destination,
+ CharLength,
+ NULL,
+ Format,
+ argList);
+ va_end(argList);
+ }
+
+ return Status;
+}
+
+NTSTATUS
+NTAPI
+RtlStringCbPrintfExA(OUT PCHAR Destination,
+ IN SIZE_T Length,
+ OUT PCHAR *DestinationEnd OPTIONAL,
+ OUT PSIZE_T RemainingSize OPTIONAL,
+ IN DWORD Flags,
+ IN PCCHAR Format,
+ ...)
+{
+ NTSTATUS Status;
+ SIZE_T CharLength = Length / sizeof(CHAR), Remaining, LocalNewLength = 0;
+ PCHAR LocalDestinationEnd;
+ va_list argList;
+ ASSERTMSG("We don't support Extended Flags yet!\n", Flags == 0);
+
+ Status = RtlStringExValidateDestA(&Destination,
+ &CharLength,
+ NULL,
+ NTSTRSAFE_MAX_CCH,
+ Flags);
+ if (NT_SUCCESS(Status))
+ {
+ LocalDestinationEnd = Destination;
+ Remaining = CharLength;
+
+ Status = RtlStringExValidateSrcA(&Format,
+ NULL,
+ NTSTRSAFE_MAX_CCH,
+ Flags);
+ if (NT_SUCCESS(Status))
+ {
+ if (!Length)
+ {
+ if (*Format != ANSI_NULL)
+ {
+ if (!Destination)
+ {
+ Status = STATUS_INVALID_PARAMETER;
+ }
+ else
+ {
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+ }
+ }
+ else
+ {
+ va_start(argList, Format);
+ Status = RtlStringVPrintfWorkerA(Destination,
+ CharLength,
+ &LocalNewLength,
+ Format,
+ argList);
+ va_end(argList);
+
+ LocalDestinationEnd = Destination + LocalNewLength;
+ Remaining = CharLength - LocalNewLength;
+ }
+ }
+ else
+ {
+ if (Length) *Destination = ANSI_NULL;
+ }
+
+ if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_OVERFLOW))
+ {
+ if (DestinationEnd) *DestinationEnd = LocalDestinationEnd;
+
+ if (RemainingSize)
+ {
+ *RemainingSize = (Remaining * sizeof(CHAR)) +
+ (Length % sizeof(CHAR));
+ }
+ }
+ }
+
+ return Status;
+}
+
+FORCEINLINE
+NTSTATUS
+NTAPI
+RtlStringCbCopyExA(OUT PCHAR Destination,
+ IN SIZE_T Length,
+ IN PCCHAR Source,
+ OUT PCHAR *DestinationEnd OPTIONAL,
+ OUT PSIZE_T RemainingSize OPTIONAL,
+ IN DWORD Flags)
+{
+ NTSTATUS Status;
+ SIZE_T CharLength = Length / sizeof(CHAR), Copied = 0, Remaining;
+ PCHAR LocalDestinationEnd;
+ ASSERTMSG("We don't support Extended Flags yet!\n", Flags == 0);
+
+ Status = RtlStringExValidateDestA(&Destination,
+ &Length,
+ NULL,
+ NTSTRSAFE_MAX_CCH,
+ Flags);
+ if (NT_SUCCESS(Status))
+ {
+ LocalDestinationEnd = Destination;
+ Remaining = CharLength;
+
+ Status = RtlStringExValidateSrcA(&Source,
+ NULL,
+ NTSTRSAFE_MAX_CCH,
+ Flags);
+ if (NT_SUCCESS(Status))
+ {
+ if (!CharLength)
+ {
+ if (*Source != ANSI_NULL)
+ {
+ if (!Destination)
+ {
+ Status = STATUS_INVALID_PARAMETER;
+ }
+ else
+ {
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+ }
+ }
+ else
+ {
+ Status = RtlStringCopyWorkerA(Destination,
+ CharLength,
+ &Copied,
+ Source,
+ NTSTRSAFE_MAX_LENGTH);
+
+ LocalDestinationEnd = Destination + Copied;
+ Remaining = CharLength - Copied;
+ }
+ }
+ else
+ {
+ if (CharLength) *Destination = ANSI_NULL;
+ }
+
+ if ((NT_SUCCESS(Status)) || (Status == STATUS_BUFFER_OVERFLOW))
+ {
+ if (DestinationEnd) *DestinationEnd = LocalDestinationEnd;
+
+ if (RemainingSize)
+ {
+ *RemainingSize = (Remaining * sizeof(CHAR)) +
+ (Length % sizeof(CHAR));
+ }
+ }
+ }
+
+ return Status;
+}
+
+FORCEINLINE
+NTSTATUS
+NTAPI
+RtlStringCbCatExA(IN OUT PCHAR Destination,
+ IN SIZE_T Length,
+ IN PCCHAR Source,
+ OUT PCHAR *DestinationEnd OPTIONAL,
+ OUT PSIZE_T RemainingSize OPTIONAL,
+ IN DWORD Flags)
+{
+ NTSTATUS Status;
+ SIZE_T CharLength = Length / sizeof(CHAR);
+ SIZE_T DestinationLength, Remaining, Copied = 0;
+ PCHAR LocalDestinationEnd;
+ ASSERTMSG("We don't support Extended Flags yet!\n", Flags == 0);
+
+ Status = RtlStringExValidateDestA(&Destination,
+ &CharLength,
+ &DestinationLength,
+ NTSTRSAFE_MAX_CCH,
+ Flags);
+ if (NT_SUCCESS(Status))
+ {
+ LocalDestinationEnd = Destination + DestinationLength;
+ Remaining = CharLength - DestinationLength;
+
+ Status = RtlStringExValidateSrcA(&Source,
+ NULL,
+ NTSTRSAFE_MAX_CCH,
+ Flags);
+ if (NT_SUCCESS(Status))
+ {
+ if (Remaining <= 1)
+ {
+ if (*Source != ANSI_NULL)
+ {
+ if (!Destination)
+ {
+ Status = STATUS_INVALID_PARAMETER;
+ }
+ else
+ {
+ Status = STATUS_BUFFER_OVERFLOW;
+ }
+ }
+ }
+ else
+ {
+ Status = RtlStringCopyWorkerA(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(CHAR)) +
+ (Length % sizeof(CHAR));
+ }
+ }
+ }
+
+ return Status;
+}
+
+FORCEINLINE
+NTSTATUS
+NTAPI
+RtlStringCbCopyA(OUT PCHAR Destination,
+ IN SIZE_T Length,
+ IN PCCHAR Source)
+{
+ NTSTATUS Status;
+ SIZE_T CharLength = Length / sizeof(CHAR);
+
+ Status = RtlStringValidateDestA(Destination,
+ CharLength,
+ NULL,
+ NTSTRSAFE_MAX_CCH);
+ if (NT_SUCCESS(Status))
+ {
+ Status = RtlStringCopyWorkerA(Destination,
+ CharLength,
+ NULL,
+ Source,
+ NTSTRSAFE_MAX_LENGTH);
+ }
+
+ return Status;
+}
+
+#endif
Propchange: trunk/reactos/include/ddk/ntstrsafe.h
------------------------------------------------------------------------------
svn:eol-style = native