>From 205ded66096b1d69e332eba5129d327c294971d7 Mon Sep 17 00:00:00 2001 From: Zebediah Figura <z.figur...@gmail.com> Date: Sat, 15 Dec 2018 21:00:39 -0600 Subject: [PATCH] ntstrsafe.h: More fully implement.
Copied from strsafe.h, with HRESULT replaced with NTSTATUS, STRSAFEAPI with NTSTRSAFEDDI, etc. UNICODE_STRING functions are still missing. Signed-off-by: Zebediah Figura <z.figur...@gmail.com> --- mingw-w64-headers/ddk/include/ddk/ntstrsafe.h | 2108 +++++++++++++---- 1 file changed, 1610 insertions(+), 498 deletions(-) diff --git a/mingw-w64-headers/ddk/include/ddk/ntstrsafe.h b/mingw-w64-headers/ddk/include/ddk/ntstrsafe.h index 53dc8ab2..95f4dd4d 100644 --- a/mingw-w64-headers/ddk/include/ddk/ntstrsafe.h +++ b/mingw-w64-headers/ddk/include/ddk/ntstrsafe.h @@ -1,521 +1,1633 @@ -/* - * PROJECT: ReactOS Kernel - * LICENSE: This file is in the public domain. - * FILE: include/ddk/ntstrsafe.h - * PURPOSE: Safe String Library for NT Code (Native/Kernel) - * PROGRAMMERS: Alex Ionescu (alex.ione...@reactos.org) +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. */ - -/* INCLUDES ******************************************************************/ - #ifndef _NTSTRSAFE_H_INCLUDED_ #define _NTSTRSAFE_H_INCLUDED_ -// -// Dependencies -// +#include <_mingw_unicode.h> #include <stdio.h> #include <string.h> #include <stdarg.h> +#include <specstrings.h> + +#if defined(__CRT__NO_INLINE) && !defined(__CRT_STRSAFE_IMPL) +#define __STRSAFE__NO_INLINE +#endif + +#ifndef _SIZE_T_DEFINED +#define _SIZE_T_DEFINED +#undef size_t +#ifdef _WIN64 +__MINGW_EXTENSION typedef unsigned __int64 size_t; +#else +typedef unsigned int size_t; +#endif +#endif + +#ifndef _WCHAR_T_DEFINED +#define _WCHAR_T_DEFINED +typedef unsigned short wchar_t; +#endif + +#ifndef _NTSTATUS_DEFINED +#define _NTSTATUS_DEFINED +typedef __LONG32 NTSTATUS; +#endif + +#ifndef C_ASSERT +#ifdef _MSC_VER +# define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1] +#else +# define C_ASSERT(e) extern void __C_ASSERT__(int [(e)?1:-1]) +#endif +#endif /* C_ASSERT */ + +/* extern removed for C mode to avoid double extern qualifier from __CRT_INLINE */ +#ifdef __cplusplus +#define _STRSAFE_EXTERN_C extern "C" +#else +#define _STRSAFE_EXTERN_C extern +#endif -// -// Maximum limits: allow overriding the maximum -// -#ifndef NTSTRSAFE_MAX_CCH -#define NTSTRSAFE_MAX_CCH 2147483647 +#ifndef WINAPI +#if defined(_ARM_) +#define WINAPI +#else +#define WINAPI __stdcall #endif -#define NTSTRSAFE_MAX_LENGTH (NTSTRSAFE_MAX_CCH - 1) - -// -// Typedefs -// -typedef ULONG DWORD; - -/* PRIVATE FUNCTIONS *********************************************************/ - -static __inline -NTSTATUS -NTAPI -RtlStringLengthWorkerA(IN LPCSTR 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; -} - -static __inline -NTSTATUS -NTAPI -RtlStringValidateDestA(IN LPSTR 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; -} - -static __inline -NTSTATUS -NTAPI -RtlStringExValidateDestA(IN OUT LPSTR *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); +#endif + +#if !defined(__CRT__NO_INLINE) && !defined(__CRT_STRSAFE_IMPL) +#define NTSTRSAFEDDI _STRSAFE_EXTERN_C __inline NTSTATUS WINAPI +/* Variadic functions can't be __stdcall. */ +#define NTSTRSAFEDDIV _STRSAFE_EXTERN_C __inline NTSTATUS +#else +#define NTSTRSAFEDDI _STRSAFE_EXTERN_C NTSTATUS WINAPI +/* Variadic functions can't be __stdcall. */ +#define NTSTRSAFEDDIV _STRSAFE_EXTERN_C NTSTATUS +#endif + +#define NTSTRSAFE_MAX_CCH 2147483647 + +#define STRSAFE_IGNORE_NULLS 0x00000100 +#define STRSAFE_FILL_BEHIND_NULL 0x00000200 +#define STRSAFE_FILL_ON_FAILURE 0x00000400 +#define STRSAFE_NULL_ON_FAILURE 0x00000800 +#define STRSAFE_NO_TRUNCATION 0x00001000 +#define STRSAFE_IGNORE_NULL_UNICODE_STRINGS 0x00010000 +#define STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED 0x00020000 + +#define STRSAFE_VALID_FLAGS (0x000000FF | STRSAFE_IGNORE_NULLS | STRSAFE_FILL_BEHIND_NULL | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION) +#define STRSAFE_UNICODE_STRING_VALID_FLAGS (STRSAFE_VALID_FLAGS | STRSAFE_IGNORE_NULL_UNICODE_STRINGS | STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED) + +#define STRSAFE_FILL_BYTE(x) ((unsigned __LONG32)((x & 0x000000FF) | STRSAFE_FILL_BEHIND_NULL)) +#define STRSAFE_FAILURE_BYTE(x) ((unsigned __LONG32)((x & 0x000000FF) | STRSAFE_FILL_ON_FAILURE)) + +#define STRSAFE_GET_FILL_PATTERN(dwFlags) ((int)(dwFlags & 0x000000FF)) + +typedef char *NTSTRSAFE_PSTR; +typedef const char *NTSTRSAFE_PCSTR; +typedef wchar_t *NTSTRSAFE_PWSTR; +typedef const wchar_t *NTSTRSAFE_PCWSTR; + +NTSTRSAFEDDI RtlStringCopyWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc); +NTSTRSAFEDDI RtlStringCopyWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc); +NTSTRSAFEDDI RtlStringCopyExWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCopyExWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCopyNWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToCopy); +NTSTRSAFEDDI RtlStringCopyNWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToCopy); +NTSTRSAFEDDI RtlStringCopyNExWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToCopy,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCopyNExWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToCopy,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCatWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc); +NTSTRSAFEDDI RtlStringCatWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc); +NTSTRSAFEDDI RtlStringCatExWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCatExWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCatNWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToAppend); +NTSTRSAFEDDI RtlStringCatNWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToAppend); +NTSTRSAFEDDI RtlStringCatNExWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToAppend,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCatNExWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToAppend,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringVPrintfWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszFormat,va_list argList); +NTSTRSAFEDDI RtlStringVPrintfWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszFormat,va_list argList); +NTSTRSAFEDDI RtlStringVPrintfExWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCSTR pszFormat,va_list argList); +NTSTRSAFEDDI RtlStringVPrintfExWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCWSTR pszFormat,va_list argList); +NTSTRSAFEDDI RtlStringLengthWorkerA(NTSTRSAFE_PCSTR psz,size_t cchMax,size_t *pcchLength); +NTSTRSAFEDDI RtlStringLengthWorkerW(NTSTRSAFE_PCWSTR psz,size_t cchMax,size_t *pcchLength); + +#define RtlStringCchCopy __MINGW_NAME_AW(RtlStringCchCopy) + +NTSTRSAFEDDI RtlStringCchCopyA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc); +NTSTRSAFEDDI RtlStringCchCopyW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc); + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCchCopyA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc) { + return (cchDest > NTSTRSAFE_MAX_CCH ? STATUS_INVALID_PARAMETER : RtlStringCopyWorkerA(pszDest,cchDest,pszSrc)); } -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 -RtlStringVPrintfWorkerA(OUT LPSTR Destination, - IN SIZE_T Length, - OUT PSIZE_T NewLength OPTIONAL, - IN LPCSTR 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; -} - -static __inline -NTSTATUS -NTAPI -RtlStringCopyWorkerA(OUT LPSTR Destination, - IN SIZE_T Length, - OUT PSIZE_T NewLength OPTIONAL, - IN LPCSTR Source, - IN SIZE_T CopyLength) -{ - NTSTATUS Status = STATUS_SUCCESS; - SIZE_T LocalNewLength = 0; - - while ((Length) && (CopyLength) && (*Source != ANSI_NULL)) - { - *Destination++ = *Source++; - Length--; - CopyLength--; +NTSTRSAFEDDI RtlStringCchCopyW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCopyWorkerW(pszDest,cchDest,pszSrc); +} +#endif /* !__STRSAFE__NO_INLINE */ - LocalNewLength++; - } +#define RtlStringCbCopy __MINGW_NAME_AW(RtlStringCbCopy) + +NTSTRSAFEDDI RtlStringCbCopyA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc); +NTSTRSAFEDDI RtlStringCbCopyW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc); + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCbCopyA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc) { + if(cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCopyWorkerA(pszDest,cbDest,pszSrc); +} + +NTSTRSAFEDDI RtlStringCbCopyW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc) { + size_t cchDest = cbDest / sizeof(wchar_t); + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCopyWorkerW(pszDest,cchDest,pszSrc); +} +#endif /* !__STRSAFE__NO_INLINE */ + +#define RtlStringCchCopyEx __MINGW_NAME_AW(RtlStringCchCopyEx) + +NTSTRSAFEDDI RtlStringCchCopyExA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCchCopyExW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCchCopyExA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCopyExWorkerA(pszDest,cchDest,cchDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); +} + +NTSTRSAFEDDI RtlStringCchCopyExW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + size_t cbDest; + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + cbDest = cchDest * sizeof(wchar_t); + return RtlStringCopyExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); +} +#endif /* !__STRSAFE__NO_INLINE */ + +#define RtlStringCbCopyEx __MINGW_NAME_AW(RtlStringCbCopyEx) + +NTSTRSAFEDDI RtlStringCbCopyExA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCbCopyExW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags); + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCbCopyExA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr; + size_t cchRemaining = 0; + if(cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + hr = RtlStringCopyExWorkerA(pszDest,cbDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags); + if(NT_SUCCESS(hr) || hr == STATUS_BUFFER_OVERFLOW) { + if(pcbRemaining) + *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char)); + } + return hr; +} + +NTSTRSAFEDDI RtlStringCbCopyExW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr; + size_t cchDest = cbDest / sizeof(wchar_t); + size_t cchRemaining = 0; + + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + hr = RtlStringCopyExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags); + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(pcbRemaining) + *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); + } + return hr; +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCchCopyNA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToCopy); +NTSTRSAFEDDI RtlStringCchCopyNW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToCopy); +#define RtlStringCchCopyN __MINGW_NAME_AW(RtlStringCchCopyN) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCchCopyNA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToCopy) { + if(cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH) + return STATUS_INVALID_PARAMETER; + return RtlStringCopyNWorkerA(pszDest,cchDest,pszSrc,cchToCopy); +} + +NTSTRSAFEDDI RtlStringCchCopyNW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToCopy) { + if(cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH) + return STATUS_INVALID_PARAMETER; + return RtlStringCopyNWorkerW(pszDest,cchDest,pszSrc,cchToCopy); +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCbCopyNA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,size_t cbToCopy); +NTSTRSAFEDDI RtlStringCbCopyNW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,size_t cbToCopy); + +#define RtlStringCbCopyN __MINGW_NAME_AW(RtlStringCbCopyN) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCbCopyNA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,size_t cbToCopy) { + if(cbDest > NTSTRSAFE_MAX_CCH || cbToCopy > NTSTRSAFE_MAX_CCH) + return STATUS_INVALID_PARAMETER; + return RtlStringCopyNWorkerA(pszDest,cbDest,pszSrc,cbToCopy); +} + +NTSTRSAFEDDI RtlStringCbCopyNW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,size_t cbToCopy) { + size_t cchDest = cbDest / sizeof(wchar_t); + size_t cchToCopy = cbToCopy / sizeof(wchar_t); + if(cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH) + return STATUS_INVALID_PARAMETER; + return RtlStringCopyNWorkerW(pszDest,cchDest,pszSrc,cchToCopy); +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCchCopyNExA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToCopy,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCchCopyNExW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToCopy,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); + +#define RtlStringCchCopyNEx __MINGW_NAME_AW(RtlStringCchCopyNEx) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCchCopyNExA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToCopy,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCopyNExWorkerA(pszDest,cchDest,cchDest,pszSrc,cchToCopy,ppszDestEnd,pcchRemaining,dwFlags); +} + +NTSTRSAFEDDI RtlStringCchCopyNExW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToCopy,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCopyNExWorkerW(pszDest,cchDest,cchDest * sizeof(wchar_t),pszSrc,cchToCopy,ppszDestEnd,pcchRemaining,dwFlags); +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCbCopyNExA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,size_t cbToCopy,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCbCopyNExW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,size_t cbToCopy,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags); + +#define RtlStringCbCopyNEx __MINGW_NAME_AW(RtlStringCbCopyNEx) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCbCopyNExA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,size_t cbToCopy,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr; + size_t cchRemaining = 0; + if(cbDest > NTSTRSAFE_MAX_CCH) + hr = STATUS_INVALID_PARAMETER; + else + hr = RtlStringCopyNExWorkerA(pszDest,cbDest,cbDest,pszSrc,cbToCopy,ppszDestEnd,&cchRemaining,dwFlags); + if((NT_SUCCESS(hr) || hr == STATUS_BUFFER_OVERFLOW) && pcbRemaining) + *pcbRemaining = cchRemaining; + return hr; +} + +NTSTRSAFEDDI RtlStringCbCopyNExW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,size_t cbToCopy,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr; + size_t cchDest; + size_t cchToCopy; + size_t cchRemaining = 0; + cchDest = cbDest / sizeof(wchar_t); + cchToCopy = cbToCopy / sizeof(wchar_t); + if(cchDest > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else hr = RtlStringCopyNExWorkerW(pszDest,cchDest,cbDest,pszSrc,cchToCopy,ppszDestEnd,&cchRemaining,dwFlags); + if((NT_SUCCESS(hr) || hr == STATUS_BUFFER_OVERFLOW) && pcbRemaining) + *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); + return hr; +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCchCatA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc); +NTSTRSAFEDDI RtlStringCchCatW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc); - if (!Length) - { - Destination--; - LocalNewLength--; - - Status = STATUS_BUFFER_OVERFLOW; - } - - *Destination = ANSI_NULL; +#define RtlStringCchCat __MINGW_NAME_AW(RtlStringCchCat) - if (NewLength) *NewLength = LocalNewLength; - return Status; +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCchCatA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCatWorkerA(pszDest,cchDest,pszSrc); } -/* PUBLIC FUNCTIONS **********************************************************/ +NTSTRSAFEDDI RtlStringCchCatW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCatWorkerW(pszDest,cchDest,pszSrc); +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCbCatA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc); +NTSTRSAFEDDI RtlStringCbCatW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc); + +#define RtlStringCbCat __MINGW_NAME_AW(RtlStringCbCat) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCbCatA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc) { + if(cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCatWorkerA(pszDest,cbDest,pszSrc); +} + +NTSTRSAFEDDI RtlStringCbCatW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc) { + size_t cchDest = cbDest / sizeof(wchar_t); + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCatWorkerW(pszDest,cchDest,pszSrc); +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCchCatExA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCchCatExW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); + +#define RtlStringCchCatEx __MINGW_NAME_AW(RtlStringCchCatEx) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCchCatExA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCatExWorkerA(pszDest,cchDest,cchDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); +} + +NTSTRSAFEDDI RtlStringCchCatExW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + size_t cbDest = cchDest*sizeof(wchar_t); + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCatExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCbCatExA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCbCatExW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags); + +#define RtlStringCbCatEx __MINGW_NAME_AW(RtlStringCbCatEx) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCbCatExA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr; + size_t cchRemaining = 0; + if(cbDest > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else hr = RtlStringCatExWorkerA(pszDest,cbDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags); + if((NT_SUCCESS(hr) || hr == STATUS_BUFFER_OVERFLOW) && pcbRemaining) + *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char)); + return hr; +} + +NTSTRSAFEDDI RtlStringCbCatExW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr; + size_t cchDest = cbDest / sizeof(wchar_t); + size_t cchRemaining = 0; -static __inline -NTSTATUS -NTAPI -RtlStringCchCopyA(IN LPSTR Destination, - IN SIZE_T cchDest, - IN LPCSTR pszSrc) -{ - ASSERTMSG("RtlStringCchCopyA is UNIMPLEMENTED!\n", FALSE); - return STATUS_NOT_IMPLEMENTED; + if(cchDest > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else hr = RtlStringCatExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags); + if((NT_SUCCESS(hr) || hr == STATUS_BUFFER_OVERFLOW) && pcbRemaining) + *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); + return hr; +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCchCatNA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToAppend); +NTSTRSAFEDDI RtlStringCchCatNW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToAppend); + +#define RtlStringCchCatN __MINGW_NAME_AW(RtlStringCchCatN) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCchCatNA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToAppend) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCatNWorkerA(pszDest,cchDest,pszSrc,cchToAppend); +} + +NTSTRSAFEDDI RtlStringCchCatNW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToAppend) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCatNWorkerW(pszDest,cchDest,pszSrc,cchToAppend); +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCbCatNA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,size_t cbToAppend); +NTSTRSAFEDDI RtlStringCbCatNW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,size_t cbToAppend); + +#define RtlStringCbCatN __MINGW_NAME_AW(RtlStringCbCatN) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCbCatNA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,size_t cbToAppend) { + if(cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCatNWorkerA(pszDest,cbDest,pszSrc,cbToAppend); +} + +NTSTRSAFEDDI RtlStringCbCatNW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,size_t cbToAppend) { + size_t cchDest = cbDest / sizeof(wchar_t); + size_t cchToAppend = cbToAppend / sizeof(wchar_t); + + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCatNWorkerW(pszDest,cchDest,pszSrc,cchToAppend); +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCchCatNExA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToAppend,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCchCatNExW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToAppend,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags); + +#define RtlStringCchCatNEx __MINGW_NAME_AW(RtlStringCchCatNEx) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCchCatNExA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToAppend,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCatNExWorkerA(pszDest,cchDest,cchDest,pszSrc,cchToAppend,ppszDestEnd,pcchRemaining,dwFlags); +} + +NTSTRSAFEDDI RtlStringCchCatNExW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToAppend,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringCatNExWorkerW(pszDest,cchDest,(cchDest*sizeof(wchar_t)),pszSrc,cchToAppend,ppszDestEnd,pcchRemaining,dwFlags); +} +#endif + +NTSTRSAFEDDI RtlStringCbCatNExA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,size_t cbToAppend,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags); +NTSTRSAFEDDI RtlStringCbCatNExW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,size_t cbToAppend,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags); + +#define RtlStringCbCatNEx __MINGW_NAME_AW(RtlStringCbCatNEx) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCbCatNExA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,size_t cbToAppend,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr; + size_t cchRemaining = 0; + if(cbDest > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else hr = RtlStringCatNExWorkerA(pszDest,cbDest,cbDest,pszSrc,cbToAppend,ppszDestEnd,&cchRemaining,dwFlags); + if((NT_SUCCESS(hr) || hr == STATUS_BUFFER_OVERFLOW) && pcbRemaining) + *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char)); + return hr; +} + +NTSTRSAFEDDI RtlStringCbCatNExW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,size_t cbToAppend,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr; + size_t cchDest = cbDest / sizeof(wchar_t); + size_t cchToAppend = cbToAppend / sizeof(wchar_t); + size_t cchRemaining = 0; + if(cchDest > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else hr = RtlStringCatNExWorkerW(pszDest,cchDest,cbDest,pszSrc,cchToAppend,ppszDestEnd,&cchRemaining,dwFlags); + if((NT_SUCCESS(hr) || hr == STATUS_BUFFER_OVERFLOW) && pcbRemaining) + *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); + return hr; +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCchVPrintfA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszFormat,va_list argList); +NTSTRSAFEDDI RtlStringCchVPrintfW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszFormat,va_list argList); + +#define RtlStringCchVPrintf __MINGW_NAME_AW(RtlStringCchVPrintf) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCchVPrintfA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszFormat,va_list argList) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringVPrintfWorkerA(pszDest,cchDest,pszFormat,argList); +} + +NTSTRSAFEDDI RtlStringCchVPrintfW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszFormat,va_list argList) { + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList); +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCbVPrintfA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszFormat,va_list argList); +NTSTRSAFEDDI RtlStringCbVPrintfW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszFormat,va_list argList); + +#define RtlStringCbVPrintf __MINGW_NAME_AW(RtlStringCbVPrintf) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCbVPrintfA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszFormat,va_list argList) { + if(cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringVPrintfWorkerA(pszDest,cbDest,pszFormat,argList); +} + +NTSTRSAFEDDI RtlStringCbVPrintfW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszFormat,va_list argList) { + size_t cchDest = cbDest / sizeof(wchar_t); + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + return RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList); +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDIV RtlStringCchPrintfA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszFormat,...); +NTSTRSAFEDDIV RtlStringCchPrintfW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszFormat,...); + +#define RtlStringCchPrintf __MINGW_NAME_AW(RtlStringCchPrintf) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDIV RtlStringCchPrintfA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszFormat,...) { + NTSTATUS hr; + va_list argList; + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + va_start(argList,pszFormat); + hr = RtlStringVPrintfWorkerA(pszDest,cchDest,pszFormat,argList); + va_end(argList); + return hr; +} + +NTSTRSAFEDDIV RtlStringCchPrintfW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszFormat,...) { + NTSTATUS hr; + va_list argList; + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + va_start(argList,pszFormat); + hr = RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList); + va_end(argList); + return hr; +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDIV RtlStringCbPrintfA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszFormat,...); +NTSTRSAFEDDIV RtlStringCbPrintfW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszFormat,...); + +#define RtlStringCbPrintf __MINGW_NAME_AW(RtlStringCbPrintf) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDIV RtlStringCbPrintfA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PCSTR pszFormat,...) { + NTSTATUS hr; + va_list argList; + if(cbDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + va_start(argList,pszFormat); + hr = RtlStringVPrintfWorkerA(pszDest,cbDest,pszFormat,argList); + va_end(argList); + return hr; } -static __inline -NTSTATUS -RtlStringCbPrintfA(OUT LPSTR Destination, - IN SIZE_T Length, - IN LPCSTR Format, - ...) -{ - NTSTATUS Status; - SIZE_T CharLength = Length / sizeof(CHAR); +NTSTRSAFEDDIV RtlStringCbPrintfW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PCWSTR pszFormat,...) { + NTSTATUS hr; + va_list argList; + size_t cchDest = cbDest / sizeof(wchar_t); + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + va_start(argList,pszFormat); + hr = RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList); + va_end(argList); + return hr; +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDIV RtlStringCchPrintfExA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCSTR pszFormat,...); +NTSTRSAFEDDIV RtlStringCchPrintfExW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCWSTR pszFormat,...); + +#define RtlStringCchPrintfEx __MINGW_NAME_AW(RtlStringCchPrintfEx) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDIV RtlStringCchPrintfExA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCSTR pszFormat,...) { + NTSTATUS hr; + va_list argList; + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + va_start(argList,pszFormat); + hr = RtlStringVPrintfExWorkerA(pszDest,cchDest,cchDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList); + va_end(argList); + return hr; +} + +NTSTRSAFEDDIV RtlStringCchPrintfExW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCWSTR pszFormat,...) { + NTSTATUS hr; + size_t cbDest = cchDest * sizeof(wchar_t); + va_list argList; + if(cchDest > NTSTRSAFE_MAX_CCH) return STATUS_INVALID_PARAMETER; + va_start(argList,pszFormat); + hr = RtlStringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList); + va_end(argList); + return hr; +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDIV RtlStringCbPrintfExA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCSTR pszFormat,...); +NTSTRSAFEDDIV RtlStringCbPrintfExW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCWSTR pszFormat,...); + +#define RtlStringCbPrintfEx __MINGW_NAME_AW(RtlStringCbPrintfEx) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDIV RtlStringCbPrintfExA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCSTR pszFormat,...) { + NTSTATUS hr; + size_t cchDest; + size_t cchRemaining = 0; + cchDest = cbDest / sizeof(char); + if(cchDest > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else { va_list argList; + va_start(argList,pszFormat); + hr = RtlStringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList); + va_end(argList); + } + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(pcbRemaining) { + *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char)); + } + } + return hr; +} - 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; -} - -static __inline -NTSTATUS -RtlStringCbPrintfExA(OUT LPSTR Destination, - IN SIZE_T Length, - OUT LPSTR *DestinationEnd OPTIONAL, - OUT PSIZE_T RemainingSize OPTIONAL, - IN DWORD Flags, - IN LPCSTR Format, - ...) -{ - NTSTATUS Status; - SIZE_T CharLength = Length / sizeof(CHAR), Remaining, LocalNewLength = 0; - PCHAR LocalDestinationEnd; +NTSTRSAFEDDIV RtlStringCbPrintfExW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCWSTR pszFormat,...) { + NTSTATUS hr; + size_t cchDest; + size_t cchRemaining = 0; + cchDest = cbDest / sizeof(wchar_t); + if(cchDest > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else { 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; -} - -static __inline -NTSTATUS -NTAPI -RtlStringCbCopyExA(OUT LPSTR Destination, - IN SIZE_T Length, - IN LPCSTR Source, - OUT LPSTR *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; -} - -static __inline -NTSTATUS -RtlStringCbPrintfW( - LPWSTR pszDest, - IN size_t cbDest, - IN LPCWSTR pszFormat, - ...) -{ - ASSERTMSG("RtlStringCbPrintfW is UNIMPLEMENTED!\n", FALSE); - return STATUS_NOT_IMPLEMENTED; -} - -static __inline -NTSTATUS -NTAPI -RtlStringCbCatExA(IN OUT LPSTR Destination, - IN SIZE_T Length, - IN LPCSTR Source, - OUT LPSTR *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; -} - -static __inline -NTSTATUS -NTAPI -RtlStringCbCopyA(OUT LPSTR Destination, - IN SIZE_T Length, - IN LPCSTR 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 /* _NTSTRSAFE_H_INCLUDED_ */ + va_start(argList,pszFormat); + hr = RtlStringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList); + va_end(argList); + } + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(pcbRemaining) { + *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); + } + } + return hr; +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCchVPrintfExA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCSTR pszFormat,va_list argList); +NTSTRSAFEDDI RtlStringCchVPrintfExW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCWSTR pszFormat,va_list argList); + +#define RtlStringCchVPrintfEx __MINGW_NAME_AW(RtlStringCchVPrintfEx) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCchVPrintfExA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCSTR pszFormat,va_list argList) { + NTSTATUS hr; + if(cchDest > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else { + size_t cbDest; + cbDest = cchDest*sizeof(char); + hr = RtlStringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList); + } + return hr; +} +NTSTRSAFEDDI RtlStringCchVPrintfExW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCWSTR pszFormat,va_list argList) { + NTSTATUS hr; + if(cchDest > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else { + size_t cbDest; + cbDest = cchDest*sizeof(wchar_t); + hr = RtlStringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList); + } + return hr; +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCbVPrintfExA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCSTR pszFormat,va_list argList); +NTSTRSAFEDDI RtlStringCbVPrintfExW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCWSTR pszFormat,va_list argList); + +#define RtlStringCbVPrintfEx __MINGW_NAME_AW(RtlStringCbVPrintfEx) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCbVPrintfExA(NTSTRSAFE_PSTR pszDest,size_t cbDest,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCSTR pszFormat,va_list argList) { + NTSTATUS hr; + size_t cchDest; + size_t cchRemaining = 0; + cchDest = cbDest / sizeof(char); + if(cchDest > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else hr = RtlStringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList); + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(pcbRemaining) { + *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char)); + } + } + return hr; +} + +NTSTRSAFEDDI RtlStringCbVPrintfExW(NTSTRSAFE_PWSTR pszDest,size_t cbDest,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCWSTR pszFormat,va_list argList) { + NTSTATUS hr; + size_t cchDest; + size_t cchRemaining = 0; + cchDest = cbDest / sizeof(wchar_t); + if(cchDest > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else hr = RtlStringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList); + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(pcbRemaining) { + *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); + } + } + return hr; +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCchLengthA(NTSTRSAFE_PCSTR psz,size_t cchMax,size_t *pcchLength); +NTSTRSAFEDDI RtlStringCchLengthW(NTSTRSAFE_PCWSTR psz,size_t cchMax,size_t *pcchLength); + +#define RtlStringCchLength __MINGW_NAME_AW(RtlStringCchLength) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCchLengthA(NTSTRSAFE_PCSTR psz,size_t cchMax,size_t *pcchLength) { + NTSTATUS hr; + if(!psz || (cchMax > NTSTRSAFE_MAX_CCH)) hr = STATUS_INVALID_PARAMETER; + else hr = RtlStringLengthWorkerA(psz,cchMax,pcchLength); + if(!NT_SUCCESS(hr) && pcchLength) { + *pcchLength = 0; + } + return hr; +} + +NTSTRSAFEDDI RtlStringCchLengthW(NTSTRSAFE_PCWSTR psz,size_t cchMax,size_t *pcchLength) { + NTSTATUS hr; + if(!psz || (cchMax > NTSTRSAFE_MAX_CCH)) hr = STATUS_INVALID_PARAMETER; + else hr = RtlStringLengthWorkerW(psz,cchMax,pcchLength); + if(!NT_SUCCESS(hr) && pcchLength) { + *pcchLength = 0; + } + return hr; +} +#endif /* !__STRSAFE__NO_INLINE */ + +NTSTRSAFEDDI RtlStringCbLengthA(NTSTRSAFE_PCSTR psz,size_t cbMax,size_t *pcbLength); +NTSTRSAFEDDI RtlStringCbLengthW(NTSTRSAFE_PCWSTR psz,size_t cbMax,size_t *pcbLength); + +#define RtlStringCbLength __MINGW_NAME_AW(RtlStringCbLength) + +#ifndef __STRSAFE__NO_INLINE +NTSTRSAFEDDI RtlStringCbLengthA(NTSTRSAFE_PCSTR psz,size_t cbMax,size_t *pcbLength) { + NTSTATUS hr; + size_t cchMax; + size_t cchLength = 0; + cchMax = cbMax / sizeof(char); + if(!psz || (cchMax > NTSTRSAFE_MAX_CCH)) hr = STATUS_INVALID_PARAMETER; + else hr = RtlStringLengthWorkerA(psz,cchMax,&cchLength); + if(pcbLength) { + if(NT_SUCCESS(hr)) { + *pcbLength = cchLength*sizeof(char); + } else { + *pcbLength = 0; + } + } + return hr; +} + +NTSTRSAFEDDI RtlStringCbLengthW(NTSTRSAFE_PCWSTR psz,size_t cbMax,size_t *pcbLength) { + NTSTATUS hr; + size_t cchMax; + size_t cchLength = 0; + cchMax = cbMax / sizeof(wchar_t); + if(!psz || (cchMax > NTSTRSAFE_MAX_CCH)) hr = STATUS_INVALID_PARAMETER; + else hr = RtlStringLengthWorkerW(psz,cchMax,&cchLength); + if(pcbLength) { + if(NT_SUCCESS(hr)) { + *pcbLength = cchLength*sizeof(wchar_t); + } else { + *pcbLength = 0; + } + } + return hr; +} + +NTSTRSAFEDDI RtlStringCopyWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc) { + NTSTATUS hr = STATUS_SUCCESS; + if(cchDest==0) hr = STATUS_INVALID_PARAMETER; + else { + while(cchDest && (*pszSrc!='\0')) { + *pszDest++ = *pszSrc++; + cchDest--; + } + if(cchDest==0) { + pszDest--; + hr = STATUS_BUFFER_OVERFLOW; + } + *pszDest= '\0'; + } + return hr; +} + +NTSTRSAFEDDI RtlStringCopyWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc) { + NTSTATUS hr = STATUS_SUCCESS; + if(cchDest==0) hr = STATUS_INVALID_PARAMETER; + else { + while(cchDest && (*pszSrc!=L'\0')) { + *pszDest++ = *pszSrc++; + cchDest--; + } + if(cchDest==0) { + pszDest--; + hr = STATUS_BUFFER_OVERFLOW; + } + *pszDest= L'\0'; + } + return hr; +} + +NTSTRSAFEDDI RtlStringCopyExWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr = STATUS_SUCCESS; + NTSTRSAFE_PSTR pszDestEnd = pszDest; + size_t cchRemaining = 0; + if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STATUS_INVALID_PARAMETER; + else { + if(dwFlags & STRSAFE_IGNORE_NULLS) { + if(!pszDest) { + if((cchDest!=0) || (cbDest!=0)) hr = STATUS_INVALID_PARAMETER; + } + if(!pszSrc) pszSrc = ""; + } + if(NT_SUCCESS(hr)) { + if(cchDest==0) { + pszDestEnd = pszDest; + cchRemaining = 0; + if(*pszSrc!='\0') { + if(!pszDest) hr = STATUS_INVALID_PARAMETER; + else hr = STATUS_BUFFER_OVERFLOW; + } + } else { + pszDestEnd = pszDest; + cchRemaining = cchDest; + while(cchRemaining && (*pszSrc!='\0')) { + *pszDestEnd++ = *pszSrc++; + cchRemaining--; + } + if(cchRemaining > 0) { + if(dwFlags & STRSAFE_FILL_BEHIND_NULL) { + memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(char)) + (cbDest % sizeof(char))); + } + } else { + pszDestEnd--; + cchRemaining++; + hr = STATUS_BUFFER_OVERFLOW; + } + *pszDestEnd = '\0'; + } + } + } + if(!NT_SUCCESS(hr)) { + if(pszDest) { + if(dwFlags & STRSAFE_FILL_ON_FAILURE) { + memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest); + if(STRSAFE_GET_FILL_PATTERN(dwFlags)==0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + } else if(cchDest > 0) { + pszDestEnd = pszDest + cchDest - 1; + cchRemaining = 1; + *pszDestEnd = '\0'; + } + } + if(dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)) { + if(cchDest > 0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + *pszDestEnd = '\0'; + } + } + } + } + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(ppszDestEnd) *ppszDestEnd = pszDestEnd; + if(pcchRemaining) *pcchRemaining = cchRemaining; + } + return hr; +} + +NTSTRSAFEDDI RtlStringCopyExWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr = STATUS_SUCCESS; + NTSTRSAFE_PWSTR pszDestEnd = pszDest; + size_t cchRemaining = 0; + if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STATUS_INVALID_PARAMETER; + else { + if(dwFlags & STRSAFE_IGNORE_NULLS) { + if(!pszDest) { + if((cchDest!=0) || (cbDest!=0)) hr = STATUS_INVALID_PARAMETER; + } + if(!pszSrc) pszSrc = L""; + } + if(NT_SUCCESS(hr)) { + if(cchDest==0) { + pszDestEnd = pszDest; + cchRemaining = 0; + if(*pszSrc!=L'\0') { + if(!pszDest) hr = STATUS_INVALID_PARAMETER; + else hr = STATUS_BUFFER_OVERFLOW; + } + } else { + pszDestEnd = pszDest; + cchRemaining = cchDest; + while(cchRemaining && (*pszSrc!=L'\0')) { + *pszDestEnd++ = *pszSrc++; + cchRemaining--; + } + if(cchRemaining > 0) { + if(dwFlags & STRSAFE_FILL_BEHIND_NULL) { + memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t))); + } + } else { + pszDestEnd--; + cchRemaining++; + hr = STATUS_BUFFER_OVERFLOW; + } + *pszDestEnd = L'\0'; + } + } + } + if(!NT_SUCCESS(hr)) { + if(pszDest) { + if(dwFlags & STRSAFE_FILL_ON_FAILURE) { + memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest); + if(STRSAFE_GET_FILL_PATTERN(dwFlags)==0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + } else if(cchDest > 0) { + pszDestEnd = pszDest + cchDest - 1; + cchRemaining = 1; + *pszDestEnd = L'\0'; + } + } + if(dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)) { + if(cchDest > 0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + *pszDestEnd = L'\0'; + } + } + } + } + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(ppszDestEnd) *ppszDestEnd = pszDestEnd; + if(pcchRemaining) *pcchRemaining = cchRemaining; + } + return hr; +} + +NTSTRSAFEDDI RtlStringCopyNWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,size_t cchSrc) { + NTSTATUS hr = STATUS_SUCCESS; + if(cchDest==0) hr = STATUS_INVALID_PARAMETER; + else { + while(cchDest && cchSrc && (*pszSrc!='\0')) { + *pszDest++ = *pszSrc++; + cchDest--; + cchSrc--; + } + if(cchDest==0) { + pszDest--; + hr = STATUS_BUFFER_OVERFLOW; + } + *pszDest= '\0'; + } + return hr; +} + +NTSTRSAFEDDI RtlStringCopyNWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToCopy) { + NTSTATUS hr = STATUS_SUCCESS; + if(cchDest==0) hr = STATUS_INVALID_PARAMETER; + else { + while(cchDest && cchToCopy && (*pszSrc!=L'\0')) { + *pszDest++ = *pszSrc++; + cchDest--; + cchToCopy--; + } + if(cchDest==0) { + pszDest--; + hr = STATUS_BUFFER_OVERFLOW; + } + *pszDest= L'\0'; + } + return hr; +} + +NTSTRSAFEDDI RtlStringCopyNExWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToCopy,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr = STATUS_SUCCESS; + NTSTRSAFE_PSTR pszDestEnd = pszDest; + size_t cchRemaining = 0; + if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STATUS_INVALID_PARAMETER; + else if(cchToCopy > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else { + if(dwFlags & STRSAFE_IGNORE_NULLS) { + if(!pszDest) { + if((cchDest!=0) || (cbDest!=0)) hr = STATUS_INVALID_PARAMETER; + } + if(!pszSrc) pszSrc = ""; + } + if(NT_SUCCESS(hr)) { + if(cchDest==0) { + pszDestEnd = pszDest; + cchRemaining = 0; + if((cchToCopy!=0) && (*pszSrc!='\0')) { + if(!pszDest) hr = STATUS_INVALID_PARAMETER; + else hr = STATUS_BUFFER_OVERFLOW; + } + } else { + pszDestEnd = pszDest; + cchRemaining = cchDest; + while(cchRemaining && cchToCopy && (*pszSrc!='\0')) { + *pszDestEnd++ = *pszSrc++; + cchRemaining--; + cchToCopy--; + } + if(cchRemaining > 0) { + if(dwFlags & STRSAFE_FILL_BEHIND_NULL) { + memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(char)) + (cbDest % sizeof(char))); + } + } else { + pszDestEnd--; + cchRemaining++; + hr = STATUS_BUFFER_OVERFLOW; + } + *pszDestEnd = '\0'; + } + } + } + if(!NT_SUCCESS(hr)) { + if(pszDest) { + if(dwFlags & STRSAFE_FILL_ON_FAILURE) { + memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest); + if(STRSAFE_GET_FILL_PATTERN(dwFlags)==0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + } else if(cchDest > 0) { + pszDestEnd = pszDest + cchDest - 1; + cchRemaining = 1; + *pszDestEnd = '\0'; + } + } + if(dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)) { + if(cchDest > 0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + *pszDestEnd = '\0'; + } + } + } + } + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(ppszDestEnd) *ppszDestEnd = pszDestEnd; + if(pcchRemaining) *pcchRemaining = cchRemaining; + } + return hr; +} + +NTSTRSAFEDDI RtlStringCopyNExWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToCopy,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr = STATUS_SUCCESS; + NTSTRSAFE_PWSTR pszDestEnd = pszDest; + size_t cchRemaining = 0; + if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STATUS_INVALID_PARAMETER; + else if(cchToCopy > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else { + if(dwFlags & STRSAFE_IGNORE_NULLS) { + if(!pszDest) { + if((cchDest!=0) || (cbDest!=0)) hr = STATUS_INVALID_PARAMETER; + } + if(!pszSrc) pszSrc = L""; + } + if(NT_SUCCESS(hr)) { + if(cchDest==0) { + pszDestEnd = pszDest; + cchRemaining = 0; + if((cchToCopy!=0) && (*pszSrc!=L'\0')) { + if(!pszDest) hr = STATUS_INVALID_PARAMETER; + else hr = STATUS_BUFFER_OVERFLOW; + } + } else { + pszDestEnd = pszDest; + cchRemaining = cchDest; + while(cchRemaining && cchToCopy && (*pszSrc!=L'\0')) { + *pszDestEnd++ = *pszSrc++; + cchRemaining--; + cchToCopy--; + } + if(cchRemaining > 0) { + if(dwFlags & STRSAFE_FILL_BEHIND_NULL) { + memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t))); + } + } else { + pszDestEnd--; + cchRemaining++; + hr = STATUS_BUFFER_OVERFLOW; + } + *pszDestEnd = L'\0'; + } + } + } + if(!NT_SUCCESS(hr)) { + if(pszDest) { + if(dwFlags & STRSAFE_FILL_ON_FAILURE) { + memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest); + if(STRSAFE_GET_FILL_PATTERN(dwFlags)==0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + } else if(cchDest > 0) { + pszDestEnd = pszDest + cchDest - 1; + cchRemaining = 1; + *pszDestEnd = L'\0'; + } + } + if(dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)) { + if(cchDest > 0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + *pszDestEnd = L'\0'; + } + } + } + } + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(ppszDestEnd) *ppszDestEnd = pszDestEnd; + if(pcchRemaining) *pcchRemaining = cchRemaining; + } + return hr; +} + +NTSTRSAFEDDI RtlStringCatWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc) { + NTSTATUS hr; + size_t cchDestLength; + hr = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength); + if(NT_SUCCESS(hr)) hr = RtlStringCopyWorkerA(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc); + return hr; +} + +NTSTRSAFEDDI RtlStringCatWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc) { + NTSTATUS hr; + size_t cchDestLength; + hr = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength); + if(NT_SUCCESS(hr)) hr = RtlStringCopyWorkerW(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc); + return hr; +} + +NTSTRSAFEDDI RtlStringCatExWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr = STATUS_SUCCESS; + NTSTRSAFE_PSTR pszDestEnd = pszDest; + size_t cchRemaining = 0; + if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STATUS_INVALID_PARAMETER; + else { + size_t cchDestLength; + if(dwFlags & STRSAFE_IGNORE_NULLS) { + if(!pszDest) { + if((cchDest==0) && (cbDest==0)) cchDestLength = 0; + else hr = STATUS_INVALID_PARAMETER; + } else { + hr = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength); + if(NT_SUCCESS(hr)) { + pszDestEnd = pszDest + cchDestLength; + cchRemaining = cchDest - cchDestLength; + } + } + if(!pszSrc) pszSrc = ""; + } else { + hr = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength); + if(NT_SUCCESS(hr)) { + pszDestEnd = pszDest + cchDestLength; + cchRemaining = cchDest - cchDestLength; + } + } + if(NT_SUCCESS(hr)) { + if(cchDest==0) { + if(*pszSrc!='\0') { + if(!pszDest) hr = STATUS_INVALID_PARAMETER; + else hr = STATUS_BUFFER_OVERFLOW; + } + } else hr = RtlStringCopyExWorkerA(pszDestEnd,cchRemaining,(cchRemaining*sizeof(char)) + (cbDest % sizeof(char)),pszSrc,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE))); + } + } + if(!NT_SUCCESS(hr)) { + if(pszDest) { + if(dwFlags & STRSAFE_FILL_ON_FAILURE) { + memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest); + if(STRSAFE_GET_FILL_PATTERN(dwFlags)==0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + } else if(cchDest > 0) { + pszDestEnd = pszDest + cchDest - 1; + cchRemaining = 1; + *pszDestEnd = '\0'; + } + } + if(dwFlags & STRSAFE_NULL_ON_FAILURE) { + if(cchDest > 0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + *pszDestEnd = '\0'; + } + } + } + } + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(ppszDestEnd) *ppszDestEnd = pszDestEnd; + if(pcchRemaining) *pcchRemaining = cchRemaining; + } + return hr; +} + +NTSTRSAFEDDI RtlStringCatExWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr = STATUS_SUCCESS; + NTSTRSAFE_PWSTR pszDestEnd = pszDest; + size_t cchRemaining = 0; + if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STATUS_INVALID_PARAMETER; + else { + size_t cchDestLength; + if(dwFlags & STRSAFE_IGNORE_NULLS) { + if(!pszDest) { + if((cchDest==0) && (cbDest==0)) cchDestLength = 0; + else hr = STATUS_INVALID_PARAMETER; + } else { + hr = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength); + if(NT_SUCCESS(hr)) { + pszDestEnd = pszDest + cchDestLength; + cchRemaining = cchDest - cchDestLength; + } + } + if(!pszSrc) pszSrc = L""; + } else { + hr = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength); + if(NT_SUCCESS(hr)) { + pszDestEnd = pszDest + cchDestLength; + cchRemaining = cchDest - cchDestLength; + } + } + if(NT_SUCCESS(hr)) { + if(cchDest==0) { + if(*pszSrc!=L'\0') { + if(!pszDest) hr = STATUS_INVALID_PARAMETER; + else hr = STATUS_BUFFER_OVERFLOW; + } + } else hr = RtlStringCopyExWorkerW(pszDestEnd,cchRemaining,(cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)),pszSrc,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE))); + } + } + if(!NT_SUCCESS(hr)) { + if(pszDest) { + if(dwFlags & STRSAFE_FILL_ON_FAILURE) { + memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest); + if(STRSAFE_GET_FILL_PATTERN(dwFlags)==0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + } else if(cchDest > 0) { + pszDestEnd = pszDest + cchDest - 1; + cchRemaining = 1; + *pszDestEnd = L'\0'; + } + } + if(dwFlags & STRSAFE_NULL_ON_FAILURE) { + if(cchDest > 0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + *pszDestEnd = L'\0'; + } + } + } + } + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(ppszDestEnd) *ppszDestEnd = pszDestEnd; + if(pcchRemaining) *pcchRemaining = cchRemaining; + } + return hr; +} + +NTSTRSAFEDDI RtlStringCatNWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToAppend) { + NTSTATUS hr; + size_t cchDestLength; + hr = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength); + if(NT_SUCCESS(hr)) hr = RtlStringCopyNWorkerA(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc,cchToAppend); + return hr; +} + +NTSTRSAFEDDI RtlStringCatNWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToAppend) { + NTSTATUS hr; + size_t cchDestLength; + hr = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength); + if(NT_SUCCESS(hr)) hr = RtlStringCopyNWorkerW(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc,cchToAppend); + return hr; +} + +NTSTRSAFEDDI RtlStringCatNExWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCSTR pszSrc,size_t cchToAppend,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr = STATUS_SUCCESS; + NTSTRSAFE_PSTR pszDestEnd = pszDest; + size_t cchRemaining = 0; + size_t cchDestLength = 0; + if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STATUS_INVALID_PARAMETER; + else if(cchToAppend > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else { + if(dwFlags & STRSAFE_IGNORE_NULLS) { + if(!pszDest) { + if((cchDest==0) && (cbDest==0)) cchDestLength = 0; + else hr = STATUS_INVALID_PARAMETER; + } else { + hr = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength); + if(NT_SUCCESS(hr)) { + pszDestEnd = pszDest + cchDestLength; + cchRemaining = cchDest - cchDestLength; + } + } + if(!pszSrc) pszSrc = ""; + } else { + hr = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength); + if(NT_SUCCESS(hr)) { + pszDestEnd = pszDest + cchDestLength; + cchRemaining = cchDest - cchDestLength; + } + } + if(NT_SUCCESS(hr)) { + if(cchDest==0) { + if((cchToAppend!=0) && (*pszSrc!='\0')) { + if(!pszDest) hr = STATUS_INVALID_PARAMETER; + else hr = STATUS_BUFFER_OVERFLOW; + } + } else hr = RtlStringCopyNExWorkerA(pszDestEnd,cchRemaining,(cchRemaining*sizeof(char)) + (cbDest % sizeof(char)),pszSrc,cchToAppend,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE))); + } + } + if(!NT_SUCCESS(hr)) { + if(pszDest) { + if(dwFlags & STRSAFE_FILL_ON_FAILURE) { + memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest); + if(STRSAFE_GET_FILL_PATTERN(dwFlags)==0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + } else if(cchDest > 0) { + pszDestEnd = pszDest + cchDest - 1; + cchRemaining = 1; + *pszDestEnd = '\0'; + } + } + if(dwFlags & (STRSAFE_NULL_ON_FAILURE)) { + if(cchDest > 0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + *pszDestEnd = '\0'; + } + } + } + } + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(ppszDestEnd) *ppszDestEnd = pszDestEnd; + if(pcchRemaining) *pcchRemaining = cchRemaining; + } + return hr; +} + +NTSTRSAFEDDI RtlStringCatNExWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PCWSTR pszSrc,size_t cchToAppend,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags) { + NTSTATUS hr = STATUS_SUCCESS; + NTSTRSAFE_PWSTR pszDestEnd = pszDest; + size_t cchRemaining = 0; + size_t cchDestLength = 0; + if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STATUS_INVALID_PARAMETER; + else if(cchToAppend > NTSTRSAFE_MAX_CCH) hr = STATUS_INVALID_PARAMETER; + else { + if(dwFlags & STRSAFE_IGNORE_NULLS) { + if(!pszDest) { + if((cchDest==0) && (cbDest==0)) cchDestLength = 0; + else hr = STATUS_INVALID_PARAMETER; + } else { + hr = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength); + if(NT_SUCCESS(hr)) { + pszDestEnd = pszDest + cchDestLength; + cchRemaining = cchDest - cchDestLength; + } + } + if(!pszSrc) pszSrc = L""; + } else { + hr = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength); + if(NT_SUCCESS(hr)) { + pszDestEnd = pszDest + cchDestLength; + cchRemaining = cchDest - cchDestLength; + } + } + if(NT_SUCCESS(hr)) { + if(cchDest==0) { + if((cchToAppend!=0) && (*pszSrc!=L'\0')) { + if(!pszDest) hr = STATUS_INVALID_PARAMETER; + else hr = STATUS_BUFFER_OVERFLOW; + } + } else hr = RtlStringCopyNExWorkerW(pszDestEnd,cchRemaining,(cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)),pszSrc,cchToAppend,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE))); + } + } + if(!NT_SUCCESS(hr)) { + if(pszDest) { + if(dwFlags & STRSAFE_FILL_ON_FAILURE) { + memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest); + if(STRSAFE_GET_FILL_PATTERN(dwFlags)==0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + } else if(cchDest > 0) { + pszDestEnd = pszDest + cchDest - 1; + cchRemaining = 1; + *pszDestEnd = L'\0'; + } + } + if(dwFlags & (STRSAFE_NULL_ON_FAILURE)) { + if(cchDest > 0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + *pszDestEnd = L'\0'; + } + } + } + } + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(ppszDestEnd) *ppszDestEnd = pszDestEnd; + if(pcchRemaining) *pcchRemaining = cchRemaining; + } + return hr; +} + +NTSTRSAFEDDI RtlStringVPrintfWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,NTSTRSAFE_PCSTR pszFormat,va_list argList) { + NTSTATUS hr = STATUS_SUCCESS; + if(cchDest==0) hr = STATUS_INVALID_PARAMETER; + else { + int iRet; + size_t cchMax; + cchMax = cchDest - 1; + iRet = _vsnprintf(pszDest,cchMax,pszFormat,argList); + if((iRet < 0) || (((size_t)iRet) > cchMax)) { + pszDest += cchMax; + *pszDest = '\0'; + hr = STATUS_BUFFER_OVERFLOW; + } else if(((size_t)iRet)==cchMax) { + pszDest += cchMax; + *pszDest = '\0'; + } + } + return hr; +} + +NTSTRSAFEDDI RtlStringVPrintfWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,NTSTRSAFE_PCWSTR pszFormat,va_list argList) { + NTSTATUS hr = STATUS_SUCCESS; + if(cchDest==0) hr = STATUS_INVALID_PARAMETER; + else { + int iRet; + size_t cchMax; + cchMax = cchDest - 1; + iRet = _vsnwprintf(pszDest,cchMax,pszFormat,argList); + if((iRet < 0) || (((size_t)iRet) > cchMax)) { + pszDest += cchMax; + *pszDest = L'\0'; + hr = STATUS_BUFFER_OVERFLOW; + } else if(((size_t)iRet)==cchMax) { + pszDest += cchMax; + *pszDest = L'\0'; + } + } + return hr; +} + +NTSTRSAFEDDI RtlStringVPrintfExWorkerA(NTSTRSAFE_PSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCSTR pszFormat,va_list argList) { + NTSTATUS hr = STATUS_SUCCESS; + NTSTRSAFE_PSTR pszDestEnd = pszDest; + size_t cchRemaining = 0; + if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STATUS_INVALID_PARAMETER; + else { + if(dwFlags & STRSAFE_IGNORE_NULLS) { + if(!pszDest) { + if((cchDest!=0) || (cbDest!=0)) hr = STATUS_INVALID_PARAMETER; + } + if(!pszFormat) pszFormat = ""; + } + if(NT_SUCCESS(hr)) { + if(cchDest==0) { + pszDestEnd = pszDest; + cchRemaining = 0; + if(*pszFormat!='\0') { + if(!pszDest) hr = STATUS_INVALID_PARAMETER; + else hr = STATUS_BUFFER_OVERFLOW; + } + } else { + int iRet; + size_t cchMax; + cchMax = cchDest - 1; + iRet = _vsnprintf(pszDest,cchMax,pszFormat,argList); + if((iRet < 0) || (((size_t)iRet) > cchMax)) { + pszDestEnd = pszDest + cchMax; + cchRemaining = 1; + *pszDestEnd = '\0'; + hr = STATUS_BUFFER_OVERFLOW; + } else if(((size_t)iRet)==cchMax) { + pszDestEnd = pszDest + cchMax; + cchRemaining = 1; + *pszDestEnd = '\0'; + } else if(((size_t)iRet) < cchMax) { + pszDestEnd = pszDest + iRet; + cchRemaining = cchDest - iRet; + if(dwFlags & STRSAFE_FILL_BEHIND_NULL) { + memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(char)) + (cbDest % sizeof(char))); + } + } + } + } + } + if(!NT_SUCCESS(hr)) { + if(pszDest) { + if(dwFlags & STRSAFE_FILL_ON_FAILURE) { + memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest); + if(STRSAFE_GET_FILL_PATTERN(dwFlags)==0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + } else if(cchDest > 0) { + pszDestEnd = pszDest + cchDest - 1; + cchRemaining = 1; + *pszDestEnd = '\0'; + } + } + if(dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)) { + if(cchDest > 0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + *pszDestEnd = '\0'; + } + } + } + } + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(ppszDestEnd) *ppszDestEnd = pszDestEnd; + if(pcchRemaining) *pcchRemaining = cchRemaining; + } + return hr; +} + +NTSTRSAFEDDI RtlStringVPrintfExWorkerW(NTSTRSAFE_PWSTR pszDest,size_t cchDest,size_t cbDest,NTSTRSAFE_PWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned __LONG32 dwFlags,NTSTRSAFE_PCWSTR pszFormat,va_list argList) { + NTSTATUS hr = STATUS_SUCCESS; + NTSTRSAFE_PWSTR pszDestEnd = pszDest; + size_t cchRemaining = 0; + if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STATUS_INVALID_PARAMETER; + else { + if(dwFlags & STRSAFE_IGNORE_NULLS) { + if(!pszDest) { + if((cchDest!=0) || (cbDest!=0)) hr = STATUS_INVALID_PARAMETER; + } + if(!pszFormat) pszFormat = L""; + } + if(NT_SUCCESS(hr)) { + if(cchDest==0) { + pszDestEnd = pszDest; + cchRemaining = 0; + if(*pszFormat!=L'\0') { + if(!pszDest) hr = STATUS_INVALID_PARAMETER; + else hr = STATUS_BUFFER_OVERFLOW; + } + } else { + int iRet; + size_t cchMax; + cchMax = cchDest - 1; + iRet = _vsnwprintf(pszDest,cchMax,pszFormat,argList); + if((iRet < 0) || (((size_t)iRet) > cchMax)) { + pszDestEnd = pszDest + cchMax; + cchRemaining = 1; + *pszDestEnd = L'\0'; + hr = STATUS_BUFFER_OVERFLOW; + } else if(((size_t)iRet)==cchMax) { + pszDestEnd = pszDest + cchMax; + cchRemaining = 1; + *pszDestEnd = L'\0'; + } else if(((size_t)iRet) < cchMax) { + pszDestEnd = pszDest + iRet; + cchRemaining = cchDest - iRet; + if(dwFlags & STRSAFE_FILL_BEHIND_NULL) { + memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t))); + } + } + } + } + } + if(!NT_SUCCESS(hr)) { + if(pszDest) { + if(dwFlags & STRSAFE_FILL_ON_FAILURE) { + memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest); + if(STRSAFE_GET_FILL_PATTERN(dwFlags)==0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + } else if(cchDest > 0) { + pszDestEnd = pszDest + cchDest - 1; + cchRemaining = 1; + *pszDestEnd = L'\0'; + } + } + if(dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)) { + if(cchDest > 0) { + pszDestEnd = pszDest; + cchRemaining = cchDest; + *pszDestEnd = L'\0'; + } + } + } + } + if(NT_SUCCESS(hr) || (hr==STATUS_BUFFER_OVERFLOW)) { + if(ppszDestEnd) *ppszDestEnd = pszDestEnd; + if(pcchRemaining) *pcchRemaining = cchRemaining; + } + return hr; +} + +NTSTRSAFEDDI RtlStringLengthWorkerA(NTSTRSAFE_PCSTR psz,size_t cchMax,size_t *pcchLength) { + NTSTATUS hr = STATUS_SUCCESS; + size_t cchMaxPrev = cchMax; + while(cchMax && (*psz!='\0')) { + psz++; + cchMax--; + } + if(cchMax==0) hr = STATUS_INVALID_PARAMETER; + if(pcchLength) { + if(NT_SUCCESS(hr)) *pcchLength = cchMaxPrev - cchMax; + else *pcchLength = 0; + } + return hr; +} + +NTSTRSAFEDDI RtlStringLengthWorkerW(NTSTRSAFE_PCWSTR psz,size_t cchMax,size_t *pcchLength) { + NTSTATUS hr = STATUS_SUCCESS; + size_t cchMaxPrev = cchMax; + while(cchMax && (*psz!=L'\0')) { + psz++; + cchMax--; + } + if(cchMax==0) hr = STATUS_INVALID_PARAMETER; + if(pcchLength) { + if(NT_SUCCESS(hr)) *pcchLength = cchMaxPrev - cchMax; + else *pcchLength = 0; + } + return hr; +} + +#endif /* !__STRSAFE__NO_INLINE */ + +#define RtlStringCopyWorkerA RtlStringCopyWorkerA_instead_use_RtlStringCchCopyA_or_RtlStringCchCopyExA; +#define RtlStringCopyWorkerW RtlStringCopyWorkerW_instead_use_RtlStringCchCopyW_or_RtlStringCchCopyExW; +#define RtlStringCopyExWorkerA RtlStringCopyExWorkerA_instead_use_RtlStringCchCopyA_or_RtlStringCchCopyExA; +#define RtlStringCopyExWorkerW RtlStringCopyExWorkerW_instead_use_RtlStringCchCopyW_or_RtlStringCchCopyExW; +#define RtlStringCatWorkerA RtlStringCatWorkerA_instead_use_RtlStringCchCatA_or_RtlStringCchCatExA; +#define RtlStringCatWorkerW RtlStringCatWorkerW_instead_use_RtlStringCchCatW_or_RtlStringCchCatExW; +#define RtlStringCatExWorkerA RtlStringCatExWorkerA_instead_use_RtlStringCchCatA_or_RtlStringCchCatExA; +#define RtlStringCatExWorkerW RtlStringCatExWorkerW_instead_use_RtlStringCchCatW_or_RtlStringCchCatExW; +#define RtlStringCatNWorkerA RtlStringCatNWorkerA_instead_use_RtlStringCchCatNA_or_StrincCbCatNA; +#define RtlStringCatNWorkerW RtlStringCatNWorkerW_instead_use_RtlStringCchCatNW_or_RtlStringCbCatNW; +#define RtlStringCatNExWorkerA RtlStringCatNExWorkerA_instead_use_RtlStringCchCatNExA_or_RtlStringCbCatNExA; +#define RtlStringCatNExWorkerW RtlStringCatNExWorkerW_instead_use_RtlStringCchCatNExW_or_RtlStringCbCatNExW; +#define RtlStringVPrintfWorkerA RtlStringVPrintfWorkerA_instead_use_RtlStringCchVPrintfA_or_RtlStringCchVPrintfExA; +#define RtlStringVPrintfWorkerW RtlStringVPrintfWorkerW_instead_use_RtlStringCchVPrintfW_or_RtlStringCchVPrintfExW; +#define RtlStringVPrintfExWorkerA RtlStringVPrintfExWorkerA_instead_use_RtlStringCchVPrintfA_or_RtlStringCchVPrintfExA; +#define RtlStringVPrintfExWorkerW RtlStringVPrintfExWorkerW_instead_use_RtlStringCchVPrintfW_or_RtlStringCchVPrintfExW; +#define RtlStringLengthWorkerA RtlStringLengthWorkerA_instead_use_RtlStringCchLengthA_or_RtlStringCbLengthA; +#define RtlStringLengthWorkerW RtlStringLengthWorkerW_instead_use_RtlStringCchLengthW_or_RtlStringCbLengthW; + +#endif -- 2.20.1 _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public