blob: 95f4dd4d62385f61488c127ac63a9176cbad015f [file] [log] [blame]
/**
* 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