Author: rharabien Date: Wed Mar 23 20:36:25 2011 New Revision: 51130
URL: http://svn.reactos.org/svn/reactos?rev=51130&view=rev Log: [DDK] Add most of RtlString***W functions based on ANSI versions.
Modified: trunk/reactos/include/ddk/ntstrsafe.h
Modified: trunk/reactos/include/ddk/ntstrsafe.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/include/ddk/ntstrsafe.h?rev... ============================================================================== --- trunk/reactos/include/ddk/ntstrsafe.h [iso-8859-1] (original) +++ trunk/reactos/include/ddk/ntstrsafe.h [iso-8859-1] Wed Mar 23 20:36:25 2011 @@ -17,6 +17,7 @@ #include <stdio.h> #include <string.h> #include <stdarg.h> +#include <windef.h> /* we need DWORD */
// // Maximum limits: allow overriding the maximum @@ -26,11 +27,6 @@ #endif #define NTSTRSAFE_MAX_LENGTH (NTSTRSAFE_MAX_CCH - 1)
-// -// Typedefs -// -typedef unsigned long DWORD; - /* PRIVATE FUNCTIONS *********************************************************/
static __inline @@ -44,6 +40,39 @@ 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; +} + +static __inline +NTSTATUS +NTAPI +RtlStringLengthWorkerW(IN LPCWSTR String, + IN SIZE_T MaxLength, + OUT PSIZE_T ReturnLength OPTIONAL) +{ + NTSTATUS Status = STATUS_SUCCESS; + SIZE_T LocalMax = MaxLength; + + while (MaxLength && (*String != UNICODE_NULL)) { String++; MaxLength--; @@ -83,6 +112,35 @@ if (NT_SUCCESS(Status)) { Status = RtlStringLengthWorkerA(Destination, + Length, + ReturnLength); + } + else + { + *ReturnLength = 0; + } + } + + return Status; +} + +static __inline +NTSTATUS +NTAPI +RtlStringValidateDestW(IN LPWSTR 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 = RtlStringLengthWorkerW(Destination, Length, ReturnLength); } @@ -114,7 +172,42 @@ static __inline NTSTATUS NTAPI +RtlStringExValidateDestW(IN OUT LPWSTR *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 RtlStringValidateDestW(*Destination, + *DestinationLength, + ReturnLength, + MaxLength); +} + +static __inline +NTSTATUS +NTAPI RtlStringExValidateSrcA(IN OUT LPCSTR *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; +} + +static __inline +NTSTATUS +NTAPI +RtlStringExValidateSrcW(IN OUT LPCWSTR *Source OPTIONAL, IN OUT PSIZE_T ReturnLength OPTIONAL, IN SIZE_T MaxLength, IN DWORD Flags) @@ -206,6 +299,41 @@ return Status; }
+static __inline +NTSTATUS +NTAPI +RtlStringCopyWorkerW(OUT LPWSTR Destination, + IN SIZE_T Length, + OUT PSIZE_T NewLength OPTIONAL, + IN LPCWSTR Source, + IN SIZE_T CopyLength) +{ + NTSTATUS Status = STATUS_SUCCESS; + SIZE_T LocalNewLength = 0; + + while ((Length) && (CopyLength) && (*Source != UNICODE_NULL)) + { + *Destination++ = *Source++; + Length--; + CopyLength--; + + LocalNewLength++; + } + + if (!Length) + { + Destination--; + LocalNewLength--; + + Status = STATUS_BUFFER_OVERFLOW; + } + + *Destination = UNICODE_NULL; + + if (NewLength) *NewLength = LocalNewLength; + return Status; +} + /* PUBLIC FUNCTIONS **********************************************************/
static __inline @@ -214,6 +342,17 @@ RtlStringCchCopyA(IN LPSTR Destination, IN SIZE_T cchDest, IN LPCSTR pszSrc) +{ + ASSERTMSG("RtlStringCchCopyA is UNIMPLEMENTED!\n", FALSE); + return STATUS_NOT_IMPLEMENTED; +} + +static __inline +NTSTATUS +NTAPI +RtlStringCchCopyW(IN LPWSTR Destination, + IN SIZE_T cchDest, + IN LPCWSTR pszSrc) { ASSERTMSG("RtlStringCchCopyA is UNIMPLEMENTED!\n", FALSE); return STATUS_NOT_IMPLEMENTED; @@ -494,6 +633,80 @@ 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; +} + +static __inline +NTSTATUS +NTAPI RtlStringCbCopyA(OUT LPSTR Destination, IN SIZE_T Length, IN LPCSTR Source) @@ -517,4 +730,30 @@ return Status; }
+static __inline +NTSTATUS +NTAPI +RtlStringCbCopyW(OUT LPWSTR Destination, + IN SIZE_T Length, + IN LPCWSTR Source) +{ + NTSTATUS Status; + SIZE_T CharLength = Length / sizeof(WCHAR); + + Status = RtlStringValidateDestW(Destination, + CharLength, + NULL, + NTSTRSAFE_MAX_CCH); + if (NT_SUCCESS(Status)) + { + Status = RtlStringCopyWorkerW(Destination, + CharLength, + NULL, + Source, + NTSTRSAFE_MAX_LENGTH); + } + + return Status; +} + #endif /* _NTSTRSAFE_H_INCLUDED_ */