1634 lines
64 KiB
C
1634 lines
64 KiB
C
/**
|
|
* 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.
|
|
*/
|
|
#ifndef _NTSTRSAFE_H_INCLUDED_
|
|
#define _NTSTRSAFE_H_INCLUDED_
|
|
|
|
#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
|
|
|
|
#ifndef WINAPI
|
|
#if defined(_ARM_)
|
|
#define WINAPI
|
|
#else
|
|
#define WINAPI __stdcall
|
|
#endif
|
|
#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));
|
|
}
|
|
|
|
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 */
|
|
|
|
#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);
|
|
|
|
#define RtlStringCchCat __MINGW_NAME_AW(RtlStringCchCat)
|
|
|
|
#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);
|
|
}
|
|
|
|
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;
|
|
|
|
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;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
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;
|
|
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
|