2 * This file has no copyright assigned and is placed in the Public Domain.
3 * This file is part of the w64 mingw-runtime package.
4 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
6 #ifndef _NTSTRSAFE_H_INCLUDED_
7 #define _NTSTRSAFE_H_INCLUDED_
15 # define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
17 # define C_ASSERT(e) extern void __C_ASSERT__(int [(e)?1:-1])
22 #define _STRSAFE_EXTERN_C extern "C"
24 #define _STRSAFE_EXTERN_C extern
27 #define NTSTRSAFEAPI static __inline NTSTATUS NTAPI
28 #define NTSTRSAFE_INLINE_API static __inline NTSTATUS NTAPI
30 #ifndef NTSTRSAFE_MAX_CCH
31 #define NTSTRSAFE_MAX_CCH 2147483647
34 #ifndef _STRSAFE_H_INCLUDED_
35 #define STRSAFE_IGNORE_NULLS 0x00000100
36 #define STRSAFE_FILL_BEHIND_NULL 0x00000200
37 #define STRSAFE_FILL_ON_FAILURE 0x00000400
38 #define STRSAFE_NULL_ON_FAILURE 0x00000800
39 #define STRSAFE_NO_TRUNCATION 0x00001000
40 #define STRSAFE_IGNORE_NULL_UNICODE_STRINGS 0x00010000
41 #define STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED 0x00020000
43 #define STRSAFE_VALID_FLAGS (0x000000FF | STRSAFE_IGNORE_NULLS | STRSAFE_FILL_BEHIND_NULL | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)
44 #define STRSAFE_UNICODE_STRING_VALID_FLAGS (STRSAFE_VALID_FLAGS | STRSAFE_IGNORE_NULL_UNICODE_STRINGS | STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED)
46 #define STRSAFE_FILL_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_BEHIND_NULL))
47 #define STRSAFE_FAILURE_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_ON_FAILURE))
49 #define STRSAFE_GET_FILL_PATTERN(dwFlags) ((int)((dwFlags) & 0x000000FF))
52 typedef char *STRSAFE_LPSTR
;
53 typedef const char *STRSAFE_LPCSTR
;
54 typedef wchar_t *STRSAFE_LPWSTR
;
55 typedef const wchar_t *STRSAFE_LPCWSTR
;
57 typedef ULONG STRSAFE_DWORD
;
59 NTSTRSAFEAPI
RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
60 NTSTRSAFEAPI
RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
61 NTSTRSAFEAPI
RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
62 NTSTRSAFEAPI
RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
63 NTSTRSAFEAPI
RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
);
64 NTSTRSAFEAPI
RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
);
65 NTSTRSAFEAPI
RtlStringCopyNExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
66 NTSTRSAFEAPI
RtlStringCopyNExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
67 NTSTRSAFEAPI
RtlStringCatWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
68 NTSTRSAFEAPI
RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
69 NTSTRSAFEAPI
RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
70 NTSTRSAFEAPI
RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
71 NTSTRSAFEAPI
RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
);
72 NTSTRSAFEAPI
RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
);
73 NTSTRSAFEAPI
RtlStringCatNExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
74 NTSTRSAFEAPI
RtlStringCatNExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
75 NTSTRSAFEAPI
RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
76 NTSTRSAFEAPI
RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
77 NTSTRSAFEAPI
RtlStringVPrintfExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
78 NTSTRSAFEAPI
RtlStringVPrintfExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
79 NTSTRSAFEAPI
RtlStringLengthWorkerA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
);
80 NTSTRSAFEAPI
RtlStringLengthWorkerW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
);
82 NTSTRSAFEAPI
RtlStringCchCopyA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
83 NTSTRSAFEAPI
RtlStringCchCopyW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
86 NTSTRSAFEAPI
RtlStringCchCopyA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
)
88 return (cchDest
> NTSTRSAFE_MAX_CCH
? STATUS_INVALID_PARAMETER
: RtlStringCopyWorkerA(pszDest
,cchDest
,pszSrc
));
91 NTSTRSAFEAPI
RtlStringCchCopyW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
)
93 if (cchDest
> NTSTRSAFE_MAX_CCH
)
94 return STATUS_INVALID_PARAMETER
;
95 return RtlStringCopyWorkerW(pszDest
,cchDest
,pszSrc
);
99 NTSTRSAFEAPI
RtlStringCbCopyA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
);
100 NTSTRSAFEAPI
RtlStringCbCopyW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
);
103 NTSTRSAFEAPI
RtlStringCbCopyA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
)
105 if (cbDest
> NTSTRSAFE_MAX_CCH
)
106 return STATUS_INVALID_PARAMETER
;
107 return RtlStringCopyWorkerA(pszDest
,cbDest
,pszSrc
);
110 NTSTRSAFEAPI
RtlStringCbCopyW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
)
112 size_t cchDest
= cbDest
/ sizeof(wchar_t);
113 if (cchDest
> NTSTRSAFE_MAX_CCH
)
114 return STATUS_INVALID_PARAMETER
;
115 return RtlStringCopyWorkerW(pszDest
,cchDest
,pszSrc
);
119 NTSTRSAFEAPI
RtlStringCchCopyExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
120 NTSTRSAFEAPI
RtlStringCchCopyExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
123 NTSTRSAFEAPI
RtlStringCchCopyExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
125 if (cchDest
> NTSTRSAFE_MAX_CCH
)
126 return STATUS_INVALID_PARAMETER
;
127 return RtlStringCopyExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
130 NTSTRSAFEAPI
RtlStringCchCopyExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
133 if (cchDest
> NTSTRSAFE_MAX_CCH
)
134 return STATUS_INVALID_PARAMETER
;
135 cbDest
= cchDest
* sizeof(wchar_t);
136 return RtlStringCopyExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
140 NTSTRSAFEAPI
RtlStringCbCopyExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
141 NTSTRSAFEAPI
RtlStringCbCopyExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
144 NTSTRSAFEAPI
RtlStringCbCopyExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
147 size_t cchRemaining
= 0;
148 if (cbDest
> NTSTRSAFE_MAX_CCH
)
149 return STATUS_INVALID_PARAMETER
;
150 Status
= RtlStringCopyExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
151 if (NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
)
154 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
159 NTSTRSAFEAPI
RtlStringCbCopyExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
162 size_t cchDest
= cbDest
/ sizeof(wchar_t);
163 size_t cchRemaining
= 0;
165 if (cchDest
> NTSTRSAFE_MAX_CCH
)
166 return STATUS_INVALID_PARAMETER
;
167 Status
= RtlStringCopyExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
168 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
171 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
177 NTSTRSAFEAPI
RtlStringCchCopyNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
);
178 NTSTRSAFEAPI
RtlStringCchCopyNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
);
181 NTSTRSAFEAPI
RtlStringCchCopyNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
)
183 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
184 return STATUS_INVALID_PARAMETER
;
185 return RtlStringCopyNWorkerA(pszDest
,cchDest
,pszSrc
,cchToCopy
);
188 NTSTRSAFEAPI
RtlStringCchCopyNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
)
190 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
191 return STATUS_INVALID_PARAMETER
;
192 return RtlStringCopyNWorkerW(pszDest
,cchDest
,pszSrc
,cchToCopy
);
196 NTSTRSAFEAPI
RtlStringCbCopyNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
);
197 NTSTRSAFEAPI
RtlStringCbCopyNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
);
200 NTSTRSAFEAPI
RtlStringCbCopyNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
)
202 if (cbDest
> NTSTRSAFE_MAX_CCH
|| cbToCopy
> NTSTRSAFE_MAX_CCH
)
203 return STATUS_INVALID_PARAMETER
;
204 return RtlStringCopyNWorkerA(pszDest
,cbDest
,pszSrc
,cbToCopy
);
207 NTSTRSAFEAPI
RtlStringCbCopyNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
)
209 size_t cchDest
= cbDest
/ sizeof(wchar_t);
210 size_t cchToCopy
= cbToCopy
/ sizeof(wchar_t);
211 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
212 return STATUS_INVALID_PARAMETER
;
213 return RtlStringCopyNWorkerW(pszDest
,cchDest
,pszSrc
,cchToCopy
);
217 NTSTRSAFEAPI
RtlStringCchCopyNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
218 NTSTRSAFEAPI
RtlStringCchCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
221 NTSTRSAFEAPI
RtlStringCchCopyNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
223 if (cchDest
> NTSTRSAFE_MAX_CCH
)
224 return STATUS_INVALID_PARAMETER
;
225 return RtlStringCopyNExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,cchToCopy
,ppszDestEnd
,pcchRemaining
,dwFlags
);
228 NTSTRSAFEAPI
RtlStringCchCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
230 if (cchDest
> NTSTRSAFE_MAX_CCH
)
231 return STATUS_INVALID_PARAMETER
;
232 return RtlStringCopyNExWorkerW(pszDest
,cchDest
,cchDest
* sizeof(wchar_t),pszSrc
,cchToCopy
,ppszDestEnd
,pcchRemaining
,dwFlags
);
236 NTSTRSAFEAPI
RtlStringCbCopyNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
237 NTSTRSAFEAPI
RtlStringCbCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
240 NTSTRSAFEAPI
RtlStringCbCopyNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
243 size_t cchRemaining
= 0;
244 if (cbDest
> NTSTRSAFE_MAX_CCH
)
245 Status
= STATUS_INVALID_PARAMETER
;
247 Status
= RtlStringCopyNExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,cbToCopy
,ppszDestEnd
,&cchRemaining
,dwFlags
);
248 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
249 *pcbRemaining
= cchRemaining
;
253 NTSTRSAFEAPI
RtlStringCbCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
258 size_t cchRemaining
= 0;
259 cchDest
= cbDest
/ sizeof(wchar_t);
260 cchToCopy
= cbToCopy
/ sizeof(wchar_t);
261 if (cchDest
> NTSTRSAFE_MAX_CCH
)
262 Status
= STATUS_INVALID_PARAMETER
;
264 Status
= RtlStringCopyNExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,cchToCopy
,ppszDestEnd
,&cchRemaining
,dwFlags
);
265 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
266 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
271 NTSTRSAFEAPI
RtlStringCchCatA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
272 NTSTRSAFEAPI
RtlStringCchCatW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
275 NTSTRSAFEAPI
RtlStringCchCatA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
)
277 if (cchDest
> NTSTRSAFE_MAX_CCH
)
278 return STATUS_INVALID_PARAMETER
;
279 return RtlStringCatWorkerA(pszDest
,cchDest
,pszSrc
);
282 NTSTRSAFEAPI
RtlStringCchCatW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
)
284 if (cchDest
> NTSTRSAFE_MAX_CCH
)
285 return STATUS_INVALID_PARAMETER
;
286 return RtlStringCatWorkerW(pszDest
,cchDest
,pszSrc
);
290 NTSTRSAFEAPI
RtlStringCbCatA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
);
291 NTSTRSAFEAPI
RtlStringCbCatW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
);
294 NTSTRSAFEAPI
RtlStringCbCatA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
)
296 if (cbDest
> NTSTRSAFE_MAX_CCH
)
297 return STATUS_INVALID_PARAMETER
;
298 return RtlStringCatWorkerA(pszDest
,cbDest
,pszSrc
);
301 NTSTRSAFEAPI
RtlStringCbCatW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
)
303 size_t cchDest
= cbDest
/ sizeof(wchar_t);
304 if (cchDest
> NTSTRSAFE_MAX_CCH
)
305 return STATUS_INVALID_PARAMETER
;
306 return RtlStringCatWorkerW(pszDest
,cchDest
,pszSrc
);
310 NTSTRSAFEAPI
RtlStringCchCatExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
311 NTSTRSAFEAPI
RtlStringCchCatExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
314 NTSTRSAFEAPI
RtlStringCchCatExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
316 if (cchDest
> NTSTRSAFE_MAX_CCH
)
317 return STATUS_INVALID_PARAMETER
;
318 return RtlStringCatExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
321 NTSTRSAFEAPI
RtlStringCchCatExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
323 size_t cbDest
= cchDest
*sizeof(wchar_t);
324 if (cchDest
> NTSTRSAFE_MAX_CCH
)
325 return STATUS_INVALID_PARAMETER
;
326 return RtlStringCatExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
330 NTSTRSAFEAPI
RtlStringCbCatExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
331 NTSTRSAFEAPI
RtlStringCbCatExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
334 NTSTRSAFEAPI
RtlStringCbCatExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
337 size_t cchRemaining
= 0;
338 if (cbDest
> NTSTRSAFE_MAX_CCH
)
339 Status
= STATUS_INVALID_PARAMETER
;
341 Status
= RtlStringCatExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
342 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
343 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
347 NTSTRSAFEAPI
RtlStringCbCatExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
350 size_t cchDest
= cbDest
/ sizeof(wchar_t);
351 size_t cchRemaining
= 0;
353 if (cchDest
> NTSTRSAFE_MAX_CCH
)
354 Status
= STATUS_INVALID_PARAMETER
;
356 Status
= RtlStringCatExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
357 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
358 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
363 NTSTRSAFEAPI
RtlStringCchCatNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
);
364 NTSTRSAFEAPI
RtlStringCchCatNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
);
367 NTSTRSAFEAPI
RtlStringCchCatNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
)
369 if (cchDest
> NTSTRSAFE_MAX_CCH
)
370 return STATUS_INVALID_PARAMETER
;
371 return RtlStringCatNWorkerA(pszDest
,cchDest
,pszSrc
,cchToAppend
);
374 NTSTRSAFEAPI
RtlStringCchCatNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
)
376 if (cchDest
> NTSTRSAFE_MAX_CCH
)
377 return STATUS_INVALID_PARAMETER
;
378 return RtlStringCatNWorkerW(pszDest
,cchDest
,pszSrc
,cchToAppend
);
382 NTSTRSAFEAPI
RtlStringCbCatNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
);
383 NTSTRSAFEAPI
RtlStringCbCatNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
);
386 NTSTRSAFEAPI
RtlStringCbCatNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
)
388 if (cbDest
> NTSTRSAFE_MAX_CCH
)
389 return STATUS_INVALID_PARAMETER
;
390 return RtlStringCatNWorkerA(pszDest
,cbDest
,pszSrc
,cbToAppend
);
393 NTSTRSAFEAPI
RtlStringCbCatNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
)
395 size_t cchDest
= cbDest
/ sizeof(wchar_t);
396 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
398 if (cchDest
> NTSTRSAFE_MAX_CCH
)
399 return STATUS_INVALID_PARAMETER
;
400 return RtlStringCatNWorkerW(pszDest
,cchDest
,pszSrc
,cchToAppend
);
404 NTSTRSAFEAPI
RtlStringCchCatNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
405 NTSTRSAFEAPI
RtlStringCchCatNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
408 NTSTRSAFEAPI
RtlStringCchCatNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
410 if (cchDest
> NTSTRSAFE_MAX_CCH
)
411 return STATUS_INVALID_PARAMETER
;
412 return RtlStringCatNExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,cchToAppend
,ppszDestEnd
,pcchRemaining
,dwFlags
);
415 NTSTRSAFEAPI
RtlStringCchCatNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
417 if (cchDest
> NTSTRSAFE_MAX_CCH
)
418 return STATUS_INVALID_PARAMETER
;
419 return RtlStringCatNExWorkerW(pszDest
,cchDest
,(cchDest
*sizeof(wchar_t)),pszSrc
,cchToAppend
,ppszDestEnd
,pcchRemaining
,dwFlags
);
423 NTSTRSAFEAPI
RtlStringCbCatNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
424 NTSTRSAFEAPI
RtlStringCbCatNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
427 NTSTRSAFEAPI
RtlStringCbCatNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
430 size_t cchRemaining
= 0;
431 if (cbDest
> NTSTRSAFE_MAX_CCH
)
432 Status
= STATUS_INVALID_PARAMETER
;
434 Status
= RtlStringCatNExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,cbToAppend
,ppszDestEnd
,&cchRemaining
,dwFlags
);
435 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
436 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
440 NTSTRSAFEAPI
RtlStringCbCatNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
443 size_t cchDest
= cbDest
/ sizeof(wchar_t);
444 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
445 size_t cchRemaining
= 0;
446 if (cchDest
> NTSTRSAFE_MAX_CCH
)
447 Status
= STATUS_INVALID_PARAMETER
;
449 Status
= RtlStringCatNExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,cchToAppend
,ppszDestEnd
,&cchRemaining
,dwFlags
);
450 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
451 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
456 NTSTRSAFEAPI
RtlStringCchVPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
457 NTSTRSAFEAPI
RtlStringCchVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
460 NTSTRSAFEAPI
RtlStringCchVPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
462 if (cchDest
> NTSTRSAFE_MAX_CCH
)
463 return STATUS_INVALID_PARAMETER
;
464 return RtlStringVPrintfWorkerA(pszDest
,cchDest
,pszFormat
,argList
);
467 NTSTRSAFEAPI
RtlStringCchVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
469 if (cchDest
> NTSTRSAFE_MAX_CCH
)
470 return STATUS_INVALID_PARAMETER
;
471 return RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
475 NTSTRSAFEAPI
RtlStringCbVPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
476 NTSTRSAFEAPI
RtlStringCbVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
479 NTSTRSAFEAPI
RtlStringCbVPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
481 if (cbDest
> NTSTRSAFE_MAX_CCH
)
482 return STATUS_INVALID_PARAMETER
;
483 return RtlStringVPrintfWorkerA(pszDest
,cbDest
,pszFormat
,argList
);
486 NTSTRSAFEAPI
RtlStringCbVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
488 size_t cchDest
= cbDest
/ sizeof(wchar_t);
489 if (cchDest
> NTSTRSAFE_MAX_CCH
)
490 return STATUS_INVALID_PARAMETER
;
491 return RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
495 NTSTRSAFEAPI
RtlStringCchPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,...);
496 NTSTRSAFEAPI
RtlStringCchPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,...);
499 NTSTRSAFEAPI
RtlStringCchPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,...)
503 if (cchDest
> NTSTRSAFE_MAX_CCH
)
504 return STATUS_INVALID_PARAMETER
;
505 va_start(argList
,pszFormat
);
506 Status
= RtlStringVPrintfWorkerA(pszDest
,cchDest
,pszFormat
,argList
);
511 NTSTRSAFEAPI
RtlStringCchPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,...)
515 if (cchDest
> NTSTRSAFE_MAX_CCH
)
516 return STATUS_INVALID_PARAMETER
;
517 va_start(argList
,pszFormat
);
518 Status
= RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
524 NTSTRSAFEAPI
RtlStringCbPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,...);
525 NTSTRSAFEAPI
RtlStringCbPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,...);
528 NTSTRSAFEAPI
RtlStringCbPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,...)
532 if (cbDest
> NTSTRSAFE_MAX_CCH
)
533 return STATUS_INVALID_PARAMETER
;
534 va_start(argList
,pszFormat
);
535 Status
= RtlStringVPrintfWorkerA(pszDest
,cbDest
,pszFormat
,argList
);
540 NTSTRSAFEAPI
RtlStringCbPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,...)
544 size_t cchDest
= cbDest
/ sizeof(wchar_t);
545 if (cchDest
> NTSTRSAFE_MAX_CCH
)
546 return STATUS_INVALID_PARAMETER
;
547 va_start(argList
,pszFormat
);
548 Status
= RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
554 NTSTRSAFEAPI
RtlStringCchPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...);
555 NTSTRSAFEAPI
RtlStringCchPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...);
558 NTSTRSAFEAPI
RtlStringCchPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...)
562 if (cchDest
> NTSTRSAFE_MAX_CCH
)
563 return STATUS_INVALID_PARAMETER
;
564 va_start(argList
,pszFormat
);
565 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cchDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
570 NTSTRSAFEAPI
RtlStringCchPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...)
573 size_t cbDest
= cchDest
* sizeof(wchar_t);
575 if (cchDest
> NTSTRSAFE_MAX_CCH
)
576 return STATUS_INVALID_PARAMETER
;
577 va_start(argList
,pszFormat
);
578 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
584 NTSTRSAFEAPI
RtlStringCbPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...);
585 NTSTRSAFEAPI
RtlStringCbPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...);
588 NTSTRSAFEAPI
RtlStringCbPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...)
592 size_t cchRemaining
= 0;
593 cchDest
= cbDest
/ sizeof(char);
594 if (cchDest
> NTSTRSAFE_MAX_CCH
)
595 Status
= STATUS_INVALID_PARAMETER
;
599 va_start(argList
,pszFormat
);
600 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
603 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
607 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
613 NTSTRSAFEAPI
RtlStringCbPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...)
617 size_t cchRemaining
= 0;
618 cchDest
= cbDest
/ sizeof(wchar_t);
619 if (cchDest
> NTSTRSAFE_MAX_CCH
)
620 Status
= STATUS_INVALID_PARAMETER
;
624 va_start(argList
,pszFormat
);
625 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
628 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
632 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
639 NTSTRSAFEAPI
RtlStringCchVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
640 NTSTRSAFEAPI
RtlStringCchVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
643 NTSTRSAFEAPI
RtlStringCchVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
646 if (cchDest
> NTSTRSAFE_MAX_CCH
)
647 Status
= STATUS_INVALID_PARAMETER
;
651 cbDest
= cchDest
*sizeof(char);
652 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
657 NTSTRSAFEAPI
RtlStringCchVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
660 if (cchDest
> NTSTRSAFE_MAX_CCH
)
661 Status
= STATUS_INVALID_PARAMETER
;
665 cbDest
= cchDest
*sizeof(wchar_t);
666 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
672 NTSTRSAFEAPI
RtlStringCbVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
673 NTSTRSAFEAPI
RtlStringCbVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
676 NTSTRSAFEAPI
RtlStringCbVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
680 size_t cchRemaining
= 0;
681 cchDest
= cbDest
/ sizeof(char);
682 if (cchDest
> NTSTRSAFE_MAX_CCH
)
683 Status
= STATUS_INVALID_PARAMETER
;
685 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
686 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
690 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
696 NTSTRSAFEAPI
RtlStringCbVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
700 size_t cchRemaining
= 0;
701 cchDest
= cbDest
/ sizeof(wchar_t);
702 if (cchDest
> NTSTRSAFE_MAX_CCH
)
703 Status
= STATUS_INVALID_PARAMETER
;
705 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
706 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
710 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
717 NTSTRSAFEAPI
RtlStringCchLengthA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
);
718 NTSTRSAFEAPI
RtlStringCchLengthW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
);
721 NTSTRSAFEAPI
RtlStringCchLengthA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
)
724 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
725 Status
= STATUS_INVALID_PARAMETER
;
727 Status
= RtlStringLengthWorkerA(psz
,cchMax
,pcchLength
);
728 if (!NT_SUCCESS(Status
) && pcchLength
)
735 NTSTRSAFEAPI
RtlStringCchLengthW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
)
738 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
739 Status
= STATUS_INVALID_PARAMETER
;
741 Status
= RtlStringLengthWorkerW(psz
,cchMax
,pcchLength
);
742 if (!NT_SUCCESS(Status
) && pcchLength
)
750 NTSTRSAFEAPI
RtlStringCbLengthA(STRSAFE_LPCSTR psz
,size_t cbMax
,size_t *pcbLength
);
751 NTSTRSAFEAPI
RtlStringCbLengthW(STRSAFE_LPCWSTR psz
,size_t cbMax
,size_t *pcbLength
);
754 NTSTRSAFEAPI
RtlStringCbLengthA(STRSAFE_LPCSTR psz
,size_t cbMax
,size_t *pcbLength
)
758 size_t cchLength
= 0;
759 cchMax
= cbMax
/ sizeof(char);
760 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
761 Status
= STATUS_INVALID_PARAMETER
;
763 Status
= RtlStringLengthWorkerA(psz
,cchMax
,&cchLength
);
766 if (NT_SUCCESS(Status
))
768 *pcbLength
= cchLength
*sizeof(char);
778 NTSTRSAFEAPI
RtlStringCbLengthW(STRSAFE_LPCWSTR psz
,size_t cbMax
,size_t *pcbLength
)
782 size_t cchLength
= 0;
783 cchMax
= cbMax
/ sizeof(wchar_t);
784 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
785 Status
= STATUS_INVALID_PARAMETER
;
787 Status
= RtlStringLengthWorkerW(psz
,cchMax
,&cchLength
);
790 if (NT_SUCCESS(Status
))
792 *pcbLength
= cchLength
*sizeof(wchar_t);
802 NTSTRSAFEAPI
RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
)
804 NTSTATUS Status
= STATUS_SUCCESS
;
806 Status
= STATUS_INVALID_PARAMETER
;
809 while(cchDest
&& (*pszSrc
!='\0'))
811 *pszDest
++ = *pszSrc
++;
817 Status
= STATUS_BUFFER_OVERFLOW
;
824 NTSTRSAFEAPI
RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
)
826 NTSTATUS Status
= STATUS_SUCCESS
;
828 Status
= STATUS_INVALID_PARAMETER
;
831 while(cchDest
&& (*pszSrc
!=L
'\0'))
833 *pszDest
++ = *pszSrc
++;
839 Status
= STATUS_BUFFER_OVERFLOW
;
846 NTSTRSAFEAPI
RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
848 NTSTATUS Status
= STATUS_SUCCESS
;
849 STRSAFE_LPSTR pszDestEnd
= pszDest
;
850 size_t cchRemaining
= 0;
851 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
852 Status
= STATUS_INVALID_PARAMETER
;
855 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
859 if ((cchDest
!=0) || (cbDest
!=0))
860 Status
= STATUS_INVALID_PARAMETER
;
865 if (NT_SUCCESS(Status
))
869 pszDestEnd
= pszDest
;
874 Status
= STATUS_INVALID_PARAMETER
;
876 Status
= STATUS_BUFFER_OVERFLOW
;
881 pszDestEnd
= pszDest
;
882 cchRemaining
= cchDest
;
883 while(cchRemaining
&& (*pszSrc
!='\0'))
885 *pszDestEnd
++ = *pszSrc
++;
888 if (cchRemaining
> 0)
890 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
892 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
899 Status
= STATUS_BUFFER_OVERFLOW
;
905 if (!NT_SUCCESS(Status
))
909 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
911 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
912 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
914 pszDestEnd
= pszDest
;
915 cchRemaining
= cchDest
;
920 pszDestEnd
= pszDest
+ cchDest
- 1;
925 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
929 pszDestEnd
= pszDest
;
930 cchRemaining
= cchDest
;
936 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
939 *ppszDestEnd
= pszDestEnd
;
941 *pcchRemaining
= cchRemaining
;
946 NTSTRSAFEAPI
RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
948 NTSTATUS Status
= STATUS_SUCCESS
;
949 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
950 size_t cchRemaining
= 0;
951 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
952 Status
= STATUS_INVALID_PARAMETER
;
955 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
959 if ((cchDest
!=0) || (cbDest
!=0))
960 Status
= STATUS_INVALID_PARAMETER
;
965 if (NT_SUCCESS(Status
))
969 pszDestEnd
= pszDest
;
974 Status
= STATUS_INVALID_PARAMETER
;
976 Status
= STATUS_BUFFER_OVERFLOW
;
981 pszDestEnd
= pszDest
;
982 cchRemaining
= cchDest
;
983 while(cchRemaining
&& (*pszSrc
!=L
'\0'))
985 *pszDestEnd
++ = *pszSrc
++;
988 if (cchRemaining
> 0)
990 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
992 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
999 Status
= STATUS_BUFFER_OVERFLOW
;
1001 *pszDestEnd
= L
'\0';
1005 if (!NT_SUCCESS(Status
))
1009 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1011 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1012 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1014 pszDestEnd
= pszDest
;
1015 cchRemaining
= cchDest
;
1020 pszDestEnd
= pszDest
+ cchDest
- 1;
1022 *pszDestEnd
= L
'\0';
1025 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1029 pszDestEnd
= pszDest
;
1030 cchRemaining
= cchDest
;
1031 *pszDestEnd
= L
'\0';
1036 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1039 *ppszDestEnd
= pszDestEnd
;
1041 *pcchRemaining
= cchRemaining
;
1046 NTSTRSAFEAPI
RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchSrc
)
1048 NTSTATUS Status
= STATUS_SUCCESS
;
1050 Status
= STATUS_INVALID_PARAMETER
;
1053 while(cchDest
&& cchSrc
&& (*pszSrc
!='\0'))
1055 *pszDest
++ = *pszSrc
++;
1062 Status
= STATUS_BUFFER_OVERFLOW
;
1069 NTSTRSAFEAPI
RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
)
1071 NTSTATUS Status
= STATUS_SUCCESS
;
1073 Status
= STATUS_INVALID_PARAMETER
;
1076 while(cchDest
&& cchToCopy
&& (*pszSrc
!=L
'\0'))
1078 *pszDest
++ = *pszSrc
++;
1085 Status
= STATUS_BUFFER_OVERFLOW
;
1092 NTSTRSAFEAPI
RtlStringCopyNExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1094 NTSTATUS Status
= STATUS_SUCCESS
;
1095 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1096 size_t cchRemaining
= 0;
1097 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1098 Status
= STATUS_INVALID_PARAMETER
;
1100 if (cchToCopy
> NTSTRSAFE_MAX_CCH
)
1101 Status
= STATUS_INVALID_PARAMETER
;
1104 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1108 if ((cchDest
!=0) || (cbDest
!=0))
1109 Status
= STATUS_INVALID_PARAMETER
;
1114 if (NT_SUCCESS(Status
))
1118 pszDestEnd
= pszDest
;
1120 if ((cchToCopy
!=0) && (*pszSrc
!='\0'))
1123 Status
= STATUS_INVALID_PARAMETER
;
1125 Status
= STATUS_BUFFER_OVERFLOW
;
1130 pszDestEnd
= pszDest
;
1131 cchRemaining
= cchDest
;
1132 while(cchRemaining
&& cchToCopy
&& (*pszSrc
!='\0'))
1134 *pszDestEnd
++ = *pszSrc
++;
1138 if (cchRemaining
> 0)
1140 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1142 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1149 Status
= STATUS_BUFFER_OVERFLOW
;
1155 if (!NT_SUCCESS(Status
))
1159 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1161 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1162 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1164 pszDestEnd
= pszDest
;
1165 cchRemaining
= cchDest
;
1170 pszDestEnd
= pszDest
+ cchDest
- 1;
1175 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1179 pszDestEnd
= pszDest
;
1180 cchRemaining
= cchDest
;
1186 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1189 *ppszDestEnd
= pszDestEnd
;
1191 *pcchRemaining
= cchRemaining
;
1196 NTSTRSAFEAPI
RtlStringCopyNExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1198 NTSTATUS Status
= STATUS_SUCCESS
;
1199 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1200 size_t cchRemaining
= 0;
1201 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1202 Status
= STATUS_INVALID_PARAMETER
;
1204 if (cchToCopy
> NTSTRSAFE_MAX_CCH
)
1205 Status
= STATUS_INVALID_PARAMETER
;
1208 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1212 if ((cchDest
!=0) || (cbDest
!=0))
1213 Status
= STATUS_INVALID_PARAMETER
;
1218 if (NT_SUCCESS(Status
))
1222 pszDestEnd
= pszDest
;
1224 if ((cchToCopy
!=0) && (*pszSrc
!=L
'\0'))
1227 Status
= STATUS_INVALID_PARAMETER
;
1229 Status
= STATUS_BUFFER_OVERFLOW
;
1234 pszDestEnd
= pszDest
;
1235 cchRemaining
= cchDest
;
1236 while(cchRemaining
&& cchToCopy
&& (*pszSrc
!=L
'\0'))
1238 *pszDestEnd
++ = *pszSrc
++;
1242 if (cchRemaining
> 0)
1244 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1246 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1253 Status
= STATUS_BUFFER_OVERFLOW
;
1255 *pszDestEnd
= L
'\0';
1259 if (!NT_SUCCESS(Status
))
1263 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1265 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1266 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1268 pszDestEnd
= pszDest
;
1269 cchRemaining
= cchDest
;
1274 pszDestEnd
= pszDest
+ cchDest
- 1;
1276 *pszDestEnd
= L
'\0';
1279 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1283 pszDestEnd
= pszDest
;
1284 cchRemaining
= cchDest
;
1285 *pszDestEnd
= L
'\0';
1290 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1293 *ppszDestEnd
= pszDestEnd
;
1295 *pcchRemaining
= cchRemaining
;
1300 NTSTRSAFEAPI
RtlStringCatWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
)
1303 size_t cchDestLength
;
1304 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1305 if (NT_SUCCESS(Status
))
1306 Status
= RtlStringCopyWorkerA(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
);
1310 NTSTRSAFEAPI
RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
)
1313 size_t cchDestLength
;
1314 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1315 if (NT_SUCCESS(Status
))
1316 Status
= RtlStringCopyWorkerW(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
);
1320 NTSTRSAFEAPI
RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1322 NTSTATUS Status
= STATUS_SUCCESS
;
1323 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1324 size_t cchRemaining
= 0;
1325 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1326 Status
= STATUS_INVALID_PARAMETER
;
1329 size_t cchDestLength
;
1330 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1334 if ((cchDest
==0) && (cbDest
==0))
1337 Status
= STATUS_INVALID_PARAMETER
;
1341 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1342 if (NT_SUCCESS(Status
))
1344 pszDestEnd
= pszDest
+ cchDestLength
;
1345 cchRemaining
= cchDest
- cchDestLength
;
1353 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1354 if (NT_SUCCESS(Status
))
1356 pszDestEnd
= pszDest
+ cchDestLength
;
1357 cchRemaining
= cchDest
- cchDestLength
;
1360 if (NT_SUCCESS(Status
))
1367 Status
= STATUS_INVALID_PARAMETER
;
1369 Status
= STATUS_BUFFER_OVERFLOW
;
1373 Status
= RtlStringCopyExWorkerA(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char)),pszSrc
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1376 if (!NT_SUCCESS(Status
))
1380 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1382 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1383 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1385 pszDestEnd
= pszDest
;
1386 cchRemaining
= cchDest
;
1391 pszDestEnd
= pszDest
+ cchDest
- 1;
1396 if (dwFlags
& STRSAFE_NULL_ON_FAILURE
)
1400 pszDestEnd
= pszDest
;
1401 cchRemaining
= cchDest
;
1407 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1410 *ppszDestEnd
= pszDestEnd
;
1412 *pcchRemaining
= cchRemaining
;
1417 NTSTRSAFEAPI
RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1419 NTSTATUS Status
= STATUS_SUCCESS
;
1420 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1421 size_t cchRemaining
= 0;
1422 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1423 Status
= STATUS_INVALID_PARAMETER
;
1426 size_t cchDestLength
;
1427 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1431 if ((cchDest
==0) && (cbDest
==0))
1434 Status
= STATUS_INVALID_PARAMETER
;
1438 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1439 if (NT_SUCCESS(Status
))
1441 pszDestEnd
= pszDest
+ cchDestLength
;
1442 cchRemaining
= cchDest
- cchDestLength
;
1450 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1451 if (NT_SUCCESS(Status
))
1453 pszDestEnd
= pszDest
+ cchDestLength
;
1454 cchRemaining
= cchDest
- cchDestLength
;
1457 if (NT_SUCCESS(Status
))
1464 Status
= STATUS_INVALID_PARAMETER
;
1466 Status
= STATUS_BUFFER_OVERFLOW
;
1470 Status
= RtlStringCopyExWorkerW(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)),pszSrc
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1473 if (!NT_SUCCESS(Status
))
1477 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1479 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1480 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1482 pszDestEnd
= pszDest
;
1483 cchRemaining
= cchDest
;
1488 pszDestEnd
= pszDest
+ cchDest
- 1;
1490 *pszDestEnd
= L
'\0';
1493 if (dwFlags
& STRSAFE_NULL_ON_FAILURE
)
1497 pszDestEnd
= pszDest
;
1498 cchRemaining
= cchDest
;
1499 *pszDestEnd
= L
'\0';
1504 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1507 *ppszDestEnd
= pszDestEnd
;
1509 *pcchRemaining
= cchRemaining
;
1514 NTSTRSAFEAPI
RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
)
1517 size_t cchDestLength
;
1518 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1519 if (NT_SUCCESS(Status
))
1520 Status
= RtlStringCopyNWorkerA(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
,cchToAppend
);
1524 NTSTRSAFEAPI
RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
)
1527 size_t cchDestLength
;
1528 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1529 if (NT_SUCCESS(Status
))
1530 Status
= RtlStringCopyNWorkerW(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
,cchToAppend
);
1534 NTSTRSAFEAPI
RtlStringCatNExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1536 NTSTATUS Status
= STATUS_SUCCESS
;
1537 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1538 size_t cchRemaining
= 0;
1539 size_t cchDestLength
= 0;
1540 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1541 Status
= STATUS_INVALID_PARAMETER
;
1543 if (cchToAppend
> NTSTRSAFE_MAX_CCH
)
1544 Status
= STATUS_INVALID_PARAMETER
;
1547 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1551 if ((cchDest
==0) && (cbDest
==0))
1554 Status
= STATUS_INVALID_PARAMETER
;
1558 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1559 if (NT_SUCCESS(Status
))
1561 pszDestEnd
= pszDest
+ cchDestLength
;
1562 cchRemaining
= cchDest
- cchDestLength
;
1570 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1571 if (NT_SUCCESS(Status
))
1573 pszDestEnd
= pszDest
+ cchDestLength
;
1574 cchRemaining
= cchDest
- cchDestLength
;
1577 if (NT_SUCCESS(Status
))
1581 if ((cchToAppend
!=0) && (*pszSrc
!='\0'))
1584 Status
= STATUS_INVALID_PARAMETER
;
1586 Status
= STATUS_BUFFER_OVERFLOW
;
1590 Status
= RtlStringCopyNExWorkerA(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char)),pszSrc
,cchToAppend
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1593 if (!NT_SUCCESS(Status
))
1597 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1599 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1600 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1602 pszDestEnd
= pszDest
;
1603 cchRemaining
= cchDest
;
1608 pszDestEnd
= pszDest
+ cchDest
- 1;
1613 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
))
1617 pszDestEnd
= pszDest
;
1618 cchRemaining
= cchDest
;
1624 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1627 *ppszDestEnd
= pszDestEnd
;
1629 *pcchRemaining
= cchRemaining
;
1634 NTSTRSAFEAPI
RtlStringCatNExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1636 NTSTATUS Status
= STATUS_SUCCESS
;
1637 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1638 size_t cchRemaining
= 0;
1639 size_t cchDestLength
= 0;
1640 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1641 Status
= STATUS_INVALID_PARAMETER
;
1643 if (cchToAppend
> NTSTRSAFE_MAX_CCH
)
1644 Status
= STATUS_INVALID_PARAMETER
;
1647 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1651 if ((cchDest
==0) && (cbDest
==0))
1654 Status
= STATUS_INVALID_PARAMETER
;
1658 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1659 if (NT_SUCCESS(Status
))
1661 pszDestEnd
= pszDest
+ cchDestLength
;
1662 cchRemaining
= cchDest
- cchDestLength
;
1670 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1671 if (NT_SUCCESS(Status
))
1673 pszDestEnd
= pszDest
+ cchDestLength
;
1674 cchRemaining
= cchDest
- cchDestLength
;
1677 if (NT_SUCCESS(Status
))
1681 if ((cchToAppend
!=0) && (*pszSrc
!=L
'\0'))
1684 Status
= STATUS_INVALID_PARAMETER
;
1686 Status
= STATUS_BUFFER_OVERFLOW
;
1690 Status
= RtlStringCopyNExWorkerW(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)),pszSrc
,cchToAppend
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1693 if (!NT_SUCCESS(Status
))
1697 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1699 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1700 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1702 pszDestEnd
= pszDest
;
1703 cchRemaining
= cchDest
;
1708 pszDestEnd
= pszDest
+ cchDest
- 1;
1710 *pszDestEnd
= L
'\0';
1713 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
))
1717 pszDestEnd
= pszDest
;
1718 cchRemaining
= cchDest
;
1719 *pszDestEnd
= L
'\0';
1724 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1727 *ppszDestEnd
= pszDestEnd
;
1729 *pcchRemaining
= cchRemaining
;
1734 NTSTRSAFEAPI
RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
1736 NTSTATUS Status
= STATUS_SUCCESS
;
1738 Status
= STATUS_INVALID_PARAMETER
;
1743 cchMax
= cchDest
- 1;
1744 iRet
= _vsnprintf(pszDest
,cchMax
,pszFormat
,argList
);
1745 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
1749 Status
= STATUS_BUFFER_OVERFLOW
;
1752 if (((size_t)iRet
)==cchMax
)
1761 NTSTRSAFEAPI
RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
1763 NTSTATUS Status
= STATUS_SUCCESS
;
1765 Status
= STATUS_INVALID_PARAMETER
;
1770 cchMax
= cchDest
- 1;
1771 iRet
= _vsnwprintf(pszDest
,cchMax
,pszFormat
,argList
);
1772 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
1776 Status
= STATUS_BUFFER_OVERFLOW
;
1779 if (((size_t)iRet
)==cchMax
)
1788 NTSTRSAFEAPI
RtlStringVPrintfExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
1790 NTSTATUS Status
= STATUS_SUCCESS
;
1791 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1792 size_t cchRemaining
= 0;
1793 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1794 Status
= STATUS_INVALID_PARAMETER
;
1797 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1801 if ((cchDest
!=0) || (cbDest
!=0))
1802 Status
= STATUS_INVALID_PARAMETER
;
1807 if (NT_SUCCESS(Status
))
1811 pszDestEnd
= pszDest
;
1813 if (*pszFormat
!='\0')
1816 Status
= STATUS_INVALID_PARAMETER
;
1818 Status
= STATUS_BUFFER_OVERFLOW
;
1825 cchMax
= cchDest
- 1;
1826 iRet
= _vsnprintf(pszDest
,cchMax
,pszFormat
,argList
);
1827 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
1829 pszDestEnd
= pszDest
+ cchMax
;
1832 Status
= STATUS_BUFFER_OVERFLOW
;
1835 if (((size_t)iRet
)==cchMax
)
1837 pszDestEnd
= pszDest
+ cchMax
;
1842 if (((size_t)iRet
) < cchMax
)
1844 pszDestEnd
= pszDest
+ iRet
;
1845 cchRemaining
= cchDest
- iRet
;
1846 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1848 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1854 if (!NT_SUCCESS(Status
))
1858 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1860 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1861 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1863 pszDestEnd
= pszDest
;
1864 cchRemaining
= cchDest
;
1869 pszDestEnd
= pszDest
+ cchDest
- 1;
1874 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1878 pszDestEnd
= pszDest
;
1879 cchRemaining
= cchDest
;
1885 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1888 *ppszDestEnd
= pszDestEnd
;
1890 *pcchRemaining
= cchRemaining
;
1895 NTSTRSAFEAPI
RtlStringVPrintfExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
1897 NTSTATUS Status
= STATUS_SUCCESS
;
1898 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1899 size_t cchRemaining
= 0;
1900 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1901 Status
= STATUS_INVALID_PARAMETER
;
1904 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1908 if ((cchDest
!=0) || (cbDest
!=0))
1909 Status
= STATUS_INVALID_PARAMETER
;
1914 if (NT_SUCCESS(Status
))
1918 pszDestEnd
= pszDest
;
1920 if (*pszFormat
!=L
'\0')
1923 Status
= STATUS_INVALID_PARAMETER
;
1925 Status
= STATUS_BUFFER_OVERFLOW
;
1932 cchMax
= cchDest
- 1;
1933 iRet
= _vsnwprintf(pszDest
,cchMax
,pszFormat
,argList
);
1934 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
1936 pszDestEnd
= pszDest
+ cchMax
;
1938 *pszDestEnd
= L
'\0';
1939 Status
= STATUS_BUFFER_OVERFLOW
;
1942 if (((size_t)iRet
)==cchMax
)
1944 pszDestEnd
= pszDest
+ cchMax
;
1946 *pszDestEnd
= L
'\0';
1949 if (((size_t)iRet
) < cchMax
)
1951 pszDestEnd
= pszDest
+ iRet
;
1952 cchRemaining
= cchDest
- iRet
;
1953 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1955 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1961 if (!NT_SUCCESS(Status
))
1965 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1967 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1968 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1970 pszDestEnd
= pszDest
;
1971 cchRemaining
= cchDest
;
1976 pszDestEnd
= pszDest
+ cchDest
- 1;
1978 *pszDestEnd
= L
'\0';
1981 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1985 pszDestEnd
= pszDest
;
1986 cchRemaining
= cchDest
;
1987 *pszDestEnd
= L
'\0';
1992 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1995 *ppszDestEnd
= pszDestEnd
;
1997 *pcchRemaining
= cchRemaining
;
2002 NTSTRSAFEAPI
RtlStringLengthWorkerA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
)
2004 NTSTATUS Status
= STATUS_SUCCESS
;
2005 size_t cchMaxPrev
= cchMax
;
2006 while(cchMax
&& (*psz
!='\0'))
2012 Status
= STATUS_INVALID_PARAMETER
;
2015 if (NT_SUCCESS(Status
))
2016 *pcchLength
= cchMaxPrev
- cchMax
;
2023 NTSTRSAFEAPI
RtlStringLengthWorkerW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
)
2025 NTSTATUS Status
= STATUS_SUCCESS
;
2026 size_t cchMaxPrev
= cchMax
;
2027 while(cchMax
&& (*psz
!=L
'\0'))
2033 Status
= STATUS_INVALID_PARAMETER
;
2036 if (NT_SUCCESS(Status
))
2037 *pcchLength
= cchMaxPrev
- cchMax
;
2046 #define RtlStringCopyWorkerA RtlStringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
2047 #define RtlStringCopyWorkerW RtlStringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
2048 #define RtlStringCopyExWorkerA RtlStringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
2049 #define RtlStringCopyExWorkerW RtlStringCopyExWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
2050 #define RtlStringCatWorkerA RtlStringCatWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
2051 #define RtlStringCatWorkerW RtlStringCatWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
2052 #define RtlStringCatExWorkerA RtlStringCatExWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
2053 #define RtlStringCatExWorkerW RtlStringCatExWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
2054 #define RtlStringCatNWorkerA RtlStringCatNWorkerA_instead_use_StringCchCatNA_or_StrincCbCatNA;
2055 #define RtlStringCatNWorkerW RtlStringCatNWorkerW_instead_use_StringCchCatNW_or_StringCbCatNW;
2056 #define RtlStringCatNExWorkerA RtlStringCatNExWorkerA_instead_use_StringCchCatNExA_or_StringCbCatNExA;
2057 #define RtlStringCatNExWorkerW RtlStringCatNExWorkerW_instead_use_StringCchCatNExW_or_StringCbCatNExW;
2058 #define RtlStringVPrintfWorkerA RtlStringVPrintfWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
2059 #define RtlStringVPrintfWorkerW RtlStringVPrintfWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
2060 #define RtlStringVPrintfExWorkerA RtlStringVPrintfExWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
2061 #define RtlStringVPrintfExWorkerW RtlStringVPrintfExWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
2062 #define RtlStringLengthWorkerA RtlStringLengthWorkerA_instead_use_StringCchLengthA_or_StringCbLengthA;
2063 #define RtlStringLengthWorkerW RtlStringLengthWorkerW_instead_use_StringCchLengthW_or_StringCbLengthW;