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 #pragma warning(disable:28719) /* disable banned api usage warning */
20 # define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
22 # define C_ASSERT(e) extern void __C_ASSERT__(int [(e)?1:-1])
27 #define _STRSAFE_EXTERN_C extern "C"
29 #define _STRSAFE_EXTERN_C extern
32 #define NTSTRSAFEAPI static __inline NTSTATUS NTAPI
33 #define NTSTRSAFE_INLINE_API static __inline NTSTATUS NTAPI
35 #ifndef NTSTRSAFE_MAX_CCH
36 #define NTSTRSAFE_MAX_CCH 2147483647
39 #ifndef _STRSAFE_H_INCLUDED_
40 #define STRSAFE_IGNORE_NULLS 0x00000100
41 #define STRSAFE_FILL_BEHIND_NULL 0x00000200
42 #define STRSAFE_FILL_ON_FAILURE 0x00000400
43 #define STRSAFE_NULL_ON_FAILURE 0x00000800
44 #define STRSAFE_NO_TRUNCATION 0x00001000
45 #define STRSAFE_IGNORE_NULL_UNICODE_STRINGS 0x00010000
46 #define STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED 0x00020000
48 #define STRSAFE_VALID_FLAGS (0x000000FF | STRSAFE_IGNORE_NULLS | STRSAFE_FILL_BEHIND_NULL | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)
49 #define STRSAFE_UNICODE_STRING_VALID_FLAGS (STRSAFE_VALID_FLAGS | STRSAFE_IGNORE_NULL_UNICODE_STRINGS | STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED)
51 #define STRSAFE_FILL_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_BEHIND_NULL))
52 #define STRSAFE_FAILURE_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_ON_FAILURE))
54 #define STRSAFE_GET_FILL_PATTERN(dwFlags) ((int)((dwFlags) & 0x000000FF))
57 typedef char *STRSAFE_LPSTR
;
58 typedef const char *STRSAFE_LPCSTR
;
59 typedef wchar_t *STRSAFE_LPWSTR
;
60 typedef const wchar_t *STRSAFE_LPCWSTR
;
62 typedef ULONG STRSAFE_DWORD
;
64 NTSTRSAFEAPI
RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
65 NTSTRSAFEAPI
RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
66 NTSTRSAFEAPI
RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
67 NTSTRSAFEAPI
RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
68 NTSTRSAFEAPI
RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
);
69 NTSTRSAFEAPI
RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
);
70 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
);
71 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
);
72 NTSTRSAFEAPI
RtlStringCatWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
73 NTSTRSAFEAPI
RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
74 NTSTRSAFEAPI
RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
75 NTSTRSAFEAPI
RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
76 NTSTRSAFEAPI
RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
);
77 NTSTRSAFEAPI
RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
);
78 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
);
79 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
);
80 NTSTRSAFEAPI
RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
81 NTSTRSAFEAPI
RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
82 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
);
83 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
);
84 NTSTRSAFEAPI
RtlStringLengthWorkerA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
);
85 NTSTRSAFEAPI
RtlStringLengthWorkerW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
);
87 NTSTRSAFEAPI
RtlStringCchCopyA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
88 NTSTRSAFEAPI
RtlStringCchCopyW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
91 NTSTRSAFEAPI
RtlStringCchCopyA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
)
93 return (cchDest
> NTSTRSAFE_MAX_CCH
? STATUS_INVALID_PARAMETER
: RtlStringCopyWorkerA(pszDest
,cchDest
,pszSrc
));
96 NTSTRSAFEAPI
RtlStringCchCopyW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
)
98 if (cchDest
> NTSTRSAFE_MAX_CCH
)
99 return STATUS_INVALID_PARAMETER
;
100 return RtlStringCopyWorkerW(pszDest
,cchDest
,pszSrc
);
104 NTSTRSAFEAPI
RtlStringCbCopyA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
);
105 NTSTRSAFEAPI
RtlStringCbCopyW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
);
108 NTSTRSAFEAPI
RtlStringCbCopyA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
)
110 if (cbDest
> NTSTRSAFE_MAX_CCH
)
111 return STATUS_INVALID_PARAMETER
;
112 return RtlStringCopyWorkerA(pszDest
,cbDest
,pszSrc
);
115 NTSTRSAFEAPI
RtlStringCbCopyW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
)
117 size_t cchDest
= cbDest
/ sizeof(wchar_t);
118 if (cchDest
> NTSTRSAFE_MAX_CCH
)
119 return STATUS_INVALID_PARAMETER
;
120 return RtlStringCopyWorkerW(pszDest
,cchDest
,pszSrc
);
124 NTSTRSAFEAPI
RtlStringCchCopyExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
125 NTSTRSAFEAPI
RtlStringCchCopyExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
128 NTSTRSAFEAPI
RtlStringCchCopyExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
130 if (cchDest
> NTSTRSAFE_MAX_CCH
)
131 return STATUS_INVALID_PARAMETER
;
132 return RtlStringCopyExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
135 NTSTRSAFEAPI
RtlStringCchCopyExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
138 if (cchDest
> NTSTRSAFE_MAX_CCH
)
139 return STATUS_INVALID_PARAMETER
;
140 cbDest
= cchDest
* sizeof(wchar_t);
141 return RtlStringCopyExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
145 NTSTRSAFEAPI
RtlStringCbCopyExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
146 NTSTRSAFEAPI
RtlStringCbCopyExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
149 NTSTRSAFEAPI
RtlStringCbCopyExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
152 size_t cchRemaining
= 0;
153 if (cbDest
> NTSTRSAFE_MAX_CCH
)
154 return STATUS_INVALID_PARAMETER
;
155 Status
= RtlStringCopyExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
156 if (NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
)
159 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
164 NTSTRSAFEAPI
RtlStringCbCopyExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
167 size_t cchDest
= cbDest
/ sizeof(wchar_t);
168 size_t cchRemaining
= 0;
170 if (cchDest
> NTSTRSAFE_MAX_CCH
)
171 return STATUS_INVALID_PARAMETER
;
172 Status
= RtlStringCopyExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
173 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
176 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
182 NTSTRSAFEAPI
RtlStringCchCopyNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
);
183 NTSTRSAFEAPI
RtlStringCchCopyNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
);
186 NTSTRSAFEAPI
RtlStringCchCopyNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
)
188 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
189 return STATUS_INVALID_PARAMETER
;
190 return RtlStringCopyNWorkerA(pszDest
,cchDest
,pszSrc
,cchToCopy
);
193 NTSTRSAFEAPI
RtlStringCchCopyNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
)
195 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
196 return STATUS_INVALID_PARAMETER
;
197 return RtlStringCopyNWorkerW(pszDest
,cchDest
,pszSrc
,cchToCopy
);
201 NTSTRSAFEAPI
RtlStringCbCopyNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
);
202 NTSTRSAFEAPI
RtlStringCbCopyNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
);
205 NTSTRSAFEAPI
RtlStringCbCopyNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
)
207 if (cbDest
> NTSTRSAFE_MAX_CCH
|| cbToCopy
> NTSTRSAFE_MAX_CCH
)
208 return STATUS_INVALID_PARAMETER
;
209 return RtlStringCopyNWorkerA(pszDest
,cbDest
,pszSrc
,cbToCopy
);
212 NTSTRSAFEAPI
RtlStringCbCopyNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
)
214 size_t cchDest
= cbDest
/ sizeof(wchar_t);
215 size_t cchToCopy
= cbToCopy
/ sizeof(wchar_t);
216 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
217 return STATUS_INVALID_PARAMETER
;
218 return RtlStringCopyNWorkerW(pszDest
,cchDest
,pszSrc
,cchToCopy
);
222 NTSTRSAFEAPI
RtlStringCchCopyNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
223 NTSTRSAFEAPI
RtlStringCchCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
226 NTSTRSAFEAPI
RtlStringCchCopyNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
228 if (cchDest
> NTSTRSAFE_MAX_CCH
)
229 return STATUS_INVALID_PARAMETER
;
230 return RtlStringCopyNExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,cchToCopy
,ppszDestEnd
,pcchRemaining
,dwFlags
);
233 NTSTRSAFEAPI
RtlStringCchCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
235 if (cchDest
> NTSTRSAFE_MAX_CCH
)
236 return STATUS_INVALID_PARAMETER
;
237 return RtlStringCopyNExWorkerW(pszDest
,cchDest
,cchDest
* sizeof(wchar_t),pszSrc
,cchToCopy
,ppszDestEnd
,pcchRemaining
,dwFlags
);
241 NTSTRSAFEAPI
RtlStringCbCopyNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
242 NTSTRSAFEAPI
RtlStringCbCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
245 NTSTRSAFEAPI
RtlStringCbCopyNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
248 size_t cchRemaining
= 0;
249 if (cbDest
> NTSTRSAFE_MAX_CCH
)
250 Status
= STATUS_INVALID_PARAMETER
;
252 Status
= RtlStringCopyNExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,cbToCopy
,ppszDestEnd
,&cchRemaining
,dwFlags
);
253 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
254 *pcbRemaining
= cchRemaining
;
258 NTSTRSAFEAPI
RtlStringCbCopyNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToCopy
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
263 size_t cchRemaining
= 0;
264 cchDest
= cbDest
/ sizeof(wchar_t);
265 cchToCopy
= cbToCopy
/ sizeof(wchar_t);
266 if (cchDest
> NTSTRSAFE_MAX_CCH
)
267 Status
= STATUS_INVALID_PARAMETER
;
269 Status
= RtlStringCopyNExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,cchToCopy
,ppszDestEnd
,&cchRemaining
,dwFlags
);
270 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
271 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
276 NTSTRSAFEAPI
RtlStringCchCatA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
277 NTSTRSAFEAPI
RtlStringCchCatW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
280 NTSTRSAFEAPI
RtlStringCchCatA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
)
282 if (cchDest
> NTSTRSAFE_MAX_CCH
)
283 return STATUS_INVALID_PARAMETER
;
284 return RtlStringCatWorkerA(pszDest
,cchDest
,pszSrc
);
287 NTSTRSAFEAPI
RtlStringCchCatW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
)
289 if (cchDest
> NTSTRSAFE_MAX_CCH
)
290 return STATUS_INVALID_PARAMETER
;
291 return RtlStringCatWorkerW(pszDest
,cchDest
,pszSrc
);
295 NTSTRSAFEAPI
RtlStringCbCatA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
);
296 NTSTRSAFEAPI
RtlStringCbCatW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
);
299 NTSTRSAFEAPI
RtlStringCbCatA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
)
301 if (cbDest
> NTSTRSAFE_MAX_CCH
)
302 return STATUS_INVALID_PARAMETER
;
303 return RtlStringCatWorkerA(pszDest
,cbDest
,pszSrc
);
306 NTSTRSAFEAPI
RtlStringCbCatW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
)
308 size_t cchDest
= cbDest
/ sizeof(wchar_t);
309 if (cchDest
> NTSTRSAFE_MAX_CCH
)
310 return STATUS_INVALID_PARAMETER
;
311 return RtlStringCatWorkerW(pszDest
,cchDest
,pszSrc
);
315 NTSTRSAFEAPI
RtlStringCchCatExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
316 NTSTRSAFEAPI
RtlStringCchCatExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
319 NTSTRSAFEAPI
RtlStringCchCatExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
321 if (cchDest
> NTSTRSAFE_MAX_CCH
)
322 return STATUS_INVALID_PARAMETER
;
323 return RtlStringCatExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
326 NTSTRSAFEAPI
RtlStringCchCatExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
328 size_t cbDest
= cchDest
*sizeof(wchar_t);
329 if (cchDest
> NTSTRSAFE_MAX_CCH
)
330 return STATUS_INVALID_PARAMETER
;
331 return RtlStringCatExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
335 NTSTRSAFEAPI
RtlStringCbCatExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
336 NTSTRSAFEAPI
RtlStringCbCatExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
339 NTSTRSAFEAPI
RtlStringCbCatExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
342 size_t cchRemaining
= 0;
343 if (cbDest
> NTSTRSAFE_MAX_CCH
)
344 Status
= STATUS_INVALID_PARAMETER
;
346 Status
= RtlStringCatExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
347 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
348 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
352 NTSTRSAFEAPI
RtlStringCbCatExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
355 size_t cchDest
= cbDest
/ sizeof(wchar_t);
356 size_t cchRemaining
= 0;
358 if (cchDest
> NTSTRSAFE_MAX_CCH
)
359 Status
= STATUS_INVALID_PARAMETER
;
361 Status
= RtlStringCatExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
362 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
363 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
368 NTSTRSAFEAPI
RtlStringCchCatNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
);
369 NTSTRSAFEAPI
RtlStringCchCatNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
);
372 NTSTRSAFEAPI
RtlStringCchCatNA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
)
374 if (cchDest
> NTSTRSAFE_MAX_CCH
)
375 return STATUS_INVALID_PARAMETER
;
376 return RtlStringCatNWorkerA(pszDest
,cchDest
,pszSrc
,cchToAppend
);
379 NTSTRSAFEAPI
RtlStringCchCatNW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
)
381 if (cchDest
> NTSTRSAFE_MAX_CCH
)
382 return STATUS_INVALID_PARAMETER
;
383 return RtlStringCatNWorkerW(pszDest
,cchDest
,pszSrc
,cchToAppend
);
387 NTSTRSAFEAPI
RtlStringCbCatNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
);
388 NTSTRSAFEAPI
RtlStringCbCatNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
);
391 NTSTRSAFEAPI
RtlStringCbCatNA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
)
393 if (cbDest
> NTSTRSAFE_MAX_CCH
)
394 return STATUS_INVALID_PARAMETER
;
395 return RtlStringCatNWorkerA(pszDest
,cbDest
,pszSrc
,cbToAppend
);
398 NTSTRSAFEAPI
RtlStringCbCatNW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
)
400 size_t cchDest
= cbDest
/ sizeof(wchar_t);
401 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
403 if (cchDest
> NTSTRSAFE_MAX_CCH
)
404 return STATUS_INVALID_PARAMETER
;
405 return RtlStringCatNWorkerW(pszDest
,cchDest
,pszSrc
,cchToAppend
);
409 NTSTRSAFEAPI
RtlStringCchCatNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
410 NTSTRSAFEAPI
RtlStringCchCatNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
413 NTSTRSAFEAPI
RtlStringCchCatNExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
415 if (cchDest
> NTSTRSAFE_MAX_CCH
)
416 return STATUS_INVALID_PARAMETER
;
417 return RtlStringCatNExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,cchToAppend
,ppszDestEnd
,pcchRemaining
,dwFlags
);
420 NTSTRSAFEAPI
RtlStringCchCatNExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
422 if (cchDest
> NTSTRSAFE_MAX_CCH
)
423 return STATUS_INVALID_PARAMETER
;
424 return RtlStringCatNExWorkerW(pszDest
,cchDest
,(cchDest
*sizeof(wchar_t)),pszSrc
,cchToAppend
,ppszDestEnd
,pcchRemaining
,dwFlags
);
428 NTSTRSAFEAPI
RtlStringCbCatNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
429 NTSTRSAFEAPI
RtlStringCbCatNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
);
432 NTSTRSAFEAPI
RtlStringCbCatNExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
435 size_t cchRemaining
= 0;
436 if (cbDest
> NTSTRSAFE_MAX_CCH
)
437 Status
= STATUS_INVALID_PARAMETER
;
439 Status
= RtlStringCatNExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,cbToAppend
,ppszDestEnd
,&cchRemaining
,dwFlags
);
440 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
441 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
445 NTSTRSAFEAPI
RtlStringCbCatNExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,size_t cbToAppend
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
)
448 size_t cchDest
= cbDest
/ sizeof(wchar_t);
449 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
450 size_t cchRemaining
= 0;
451 if (cchDest
> NTSTRSAFE_MAX_CCH
)
452 Status
= STATUS_INVALID_PARAMETER
;
454 Status
= RtlStringCatNExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,cchToAppend
,ppszDestEnd
,&cchRemaining
,dwFlags
);
455 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
456 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
461 NTSTRSAFEAPI
RtlStringCchVPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
462 NTSTRSAFEAPI
RtlStringCchVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
465 NTSTRSAFEAPI
RtlStringCchVPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
467 if (cchDest
> NTSTRSAFE_MAX_CCH
)
468 return STATUS_INVALID_PARAMETER
;
469 return RtlStringVPrintfWorkerA(pszDest
,cchDest
,pszFormat
,argList
);
472 NTSTRSAFEAPI
RtlStringCchVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
474 if (cchDest
> NTSTRSAFE_MAX_CCH
)
475 return STATUS_INVALID_PARAMETER
;
476 return RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
480 NTSTRSAFEAPI
RtlStringCbVPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
481 NTSTRSAFEAPI
RtlStringCbVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
484 NTSTRSAFEAPI
RtlStringCbVPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
486 if (cbDest
> NTSTRSAFE_MAX_CCH
)
487 return STATUS_INVALID_PARAMETER
;
488 return RtlStringVPrintfWorkerA(pszDest
,cbDest
,pszFormat
,argList
);
491 NTSTRSAFEAPI
RtlStringCbVPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
493 size_t cchDest
= cbDest
/ sizeof(wchar_t);
494 if (cchDest
> NTSTRSAFE_MAX_CCH
)
495 return STATUS_INVALID_PARAMETER
;
496 return RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
500 NTSTRSAFEAPI
RtlStringCchPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,...);
501 NTSTRSAFEAPI
RtlStringCchPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,...);
504 NTSTRSAFEAPI
RtlStringCchPrintfA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,...)
508 if (cchDest
> NTSTRSAFE_MAX_CCH
)
509 return STATUS_INVALID_PARAMETER
;
510 va_start(argList
,pszFormat
);
511 Status
= RtlStringVPrintfWorkerA(pszDest
,cchDest
,pszFormat
,argList
);
516 NTSTRSAFEAPI
RtlStringCchPrintfW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,...)
520 if (cchDest
> NTSTRSAFE_MAX_CCH
)
521 return STATUS_INVALID_PARAMETER
;
522 va_start(argList
,pszFormat
);
523 Status
= RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
529 NTSTRSAFEAPI
RtlStringCbPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,...);
530 NTSTRSAFEAPI
RtlStringCbPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,...);
533 NTSTRSAFEAPI
RtlStringCbPrintfA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPCSTR pszFormat
,...)
537 if (cbDest
> NTSTRSAFE_MAX_CCH
)
538 return STATUS_INVALID_PARAMETER
;
539 va_start(argList
,pszFormat
);
540 Status
= RtlStringVPrintfWorkerA(pszDest
,cbDest
,pszFormat
,argList
);
545 NTSTRSAFEAPI
RtlStringCbPrintfW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPCWSTR pszFormat
,...)
549 size_t cchDest
= cbDest
/ sizeof(wchar_t);
550 if (cchDest
> NTSTRSAFE_MAX_CCH
)
551 return STATUS_INVALID_PARAMETER
;
552 va_start(argList
,pszFormat
);
553 Status
= RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
559 NTSTRSAFEAPI
RtlStringCchPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...);
560 NTSTRSAFEAPI
RtlStringCchPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...);
563 NTSTRSAFEAPI
RtlStringCchPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...)
567 if (cchDest
> NTSTRSAFE_MAX_CCH
)
568 return STATUS_INVALID_PARAMETER
;
569 va_start(argList
,pszFormat
);
570 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cchDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
575 NTSTRSAFEAPI
RtlStringCchPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...)
578 size_t cbDest
= cchDest
* sizeof(wchar_t);
580 if (cchDest
> NTSTRSAFE_MAX_CCH
)
581 return STATUS_INVALID_PARAMETER
;
582 va_start(argList
,pszFormat
);
583 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
589 NTSTRSAFEAPI
RtlStringCbPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...);
590 NTSTRSAFEAPI
RtlStringCbPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...);
593 NTSTRSAFEAPI
RtlStringCbPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,...)
597 size_t cchRemaining
= 0;
598 cchDest
= cbDest
/ sizeof(char);
599 if (cchDest
> NTSTRSAFE_MAX_CCH
)
600 Status
= STATUS_INVALID_PARAMETER
;
604 va_start(argList
,pszFormat
);
605 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
608 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
612 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
618 NTSTRSAFEAPI
RtlStringCbPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,...)
622 size_t cchRemaining
= 0;
623 cchDest
= cbDest
/ sizeof(wchar_t);
624 if (cchDest
> NTSTRSAFE_MAX_CCH
)
625 Status
= STATUS_INVALID_PARAMETER
;
629 va_start(argList
,pszFormat
);
630 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
633 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
637 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
644 NTSTRSAFEAPI
RtlStringCchVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
645 NTSTRSAFEAPI
RtlStringCchVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
648 NTSTRSAFEAPI
RtlStringCchVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
651 if (cchDest
> NTSTRSAFE_MAX_CCH
)
652 Status
= STATUS_INVALID_PARAMETER
;
656 cbDest
= cchDest
*sizeof(char);
657 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
662 NTSTRSAFEAPI
RtlStringCchVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
665 if (cchDest
> NTSTRSAFE_MAX_CCH
)
666 Status
= STATUS_INVALID_PARAMETER
;
670 cbDest
= cchDest
*sizeof(wchar_t);
671 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
677 NTSTRSAFEAPI
RtlStringCbVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
678 NTSTRSAFEAPI
RtlStringCbVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
681 NTSTRSAFEAPI
RtlStringCbVPrintfExA(STRSAFE_LPSTR pszDest
,size_t cbDest
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
685 size_t cchRemaining
= 0;
686 cchDest
= cbDest
/ sizeof(char);
687 if (cchDest
> NTSTRSAFE_MAX_CCH
)
688 Status
= STATUS_INVALID_PARAMETER
;
690 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
691 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
695 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
701 NTSTRSAFEAPI
RtlStringCbVPrintfExW(STRSAFE_LPWSTR pszDest
,size_t cbDest
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcbRemaining
,STRSAFE_DWORD dwFlags
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
705 size_t cchRemaining
= 0;
706 cchDest
= cbDest
/ sizeof(wchar_t);
707 if (cchDest
> NTSTRSAFE_MAX_CCH
)
708 Status
= STATUS_INVALID_PARAMETER
;
710 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
711 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
715 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
722 NTSTRSAFEAPI
RtlStringCchLengthA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
);
723 NTSTRSAFEAPI
RtlStringCchLengthW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
);
726 NTSTRSAFEAPI
RtlStringCchLengthA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
)
729 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
730 Status
= STATUS_INVALID_PARAMETER
;
732 Status
= RtlStringLengthWorkerA(psz
,cchMax
,pcchLength
);
733 if (!NT_SUCCESS(Status
) && pcchLength
)
740 NTSTRSAFEAPI
RtlStringCchLengthW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
)
743 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
744 Status
= STATUS_INVALID_PARAMETER
;
746 Status
= RtlStringLengthWorkerW(psz
,cchMax
,pcchLength
);
747 if (!NT_SUCCESS(Status
) && pcchLength
)
755 NTSTRSAFEAPI
RtlStringCbLengthA(STRSAFE_LPCSTR psz
,size_t cbMax
,size_t *pcbLength
);
756 NTSTRSAFEAPI
RtlStringCbLengthW(STRSAFE_LPCWSTR psz
,size_t cbMax
,size_t *pcbLength
);
759 NTSTRSAFEAPI
RtlStringCbLengthA(STRSAFE_LPCSTR psz
,size_t cbMax
,size_t *pcbLength
)
763 size_t cchLength
= 0;
764 cchMax
= cbMax
/ sizeof(char);
765 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
766 Status
= STATUS_INVALID_PARAMETER
;
768 Status
= RtlStringLengthWorkerA(psz
,cchMax
,&cchLength
);
771 if (NT_SUCCESS(Status
))
773 *pcbLength
= cchLength
*sizeof(char);
783 NTSTRSAFEAPI
RtlStringCbLengthW(STRSAFE_LPCWSTR psz
,size_t cbMax
,size_t *pcbLength
)
787 size_t cchLength
= 0;
788 cchMax
= cbMax
/ sizeof(wchar_t);
789 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
790 Status
= STATUS_INVALID_PARAMETER
;
792 Status
= RtlStringLengthWorkerW(psz
,cchMax
,&cchLength
);
795 if (NT_SUCCESS(Status
))
797 *pcbLength
= cchLength
*sizeof(wchar_t);
807 NTSTRSAFEAPI
RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
)
809 NTSTATUS Status
= STATUS_SUCCESS
;
811 Status
= STATUS_INVALID_PARAMETER
;
814 while(cchDest
&& (*pszSrc
!='\0'))
816 *pszDest
++ = *pszSrc
++;
822 Status
= STATUS_BUFFER_OVERFLOW
;
829 NTSTRSAFEAPI
RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
)
831 NTSTATUS Status
= STATUS_SUCCESS
;
833 Status
= STATUS_INVALID_PARAMETER
;
836 while(cchDest
&& (*pszSrc
!=L
'\0'))
838 *pszDest
++ = *pszSrc
++;
844 Status
= STATUS_BUFFER_OVERFLOW
;
851 NTSTRSAFEAPI
RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
853 NTSTATUS Status
= STATUS_SUCCESS
;
854 STRSAFE_LPSTR pszDestEnd
= pszDest
;
855 size_t cchRemaining
= 0;
856 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
857 Status
= STATUS_INVALID_PARAMETER
;
860 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
864 if ((cchDest
!=0) || (cbDest
!=0))
865 Status
= STATUS_INVALID_PARAMETER
;
870 if (NT_SUCCESS(Status
))
874 pszDestEnd
= pszDest
;
879 Status
= STATUS_INVALID_PARAMETER
;
881 Status
= STATUS_BUFFER_OVERFLOW
;
886 pszDestEnd
= pszDest
;
887 cchRemaining
= cchDest
;
888 while(cchRemaining
&& (*pszSrc
!='\0'))
890 *pszDestEnd
++ = *pszSrc
++;
893 if (cchRemaining
> 0)
895 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
897 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
904 Status
= STATUS_BUFFER_OVERFLOW
;
910 if (!NT_SUCCESS(Status
))
914 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
916 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
917 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
919 pszDestEnd
= pszDest
;
920 cchRemaining
= cchDest
;
925 pszDestEnd
= pszDest
+ cchDest
- 1;
930 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
934 pszDestEnd
= pszDest
;
935 cchRemaining
= cchDest
;
941 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
944 *ppszDestEnd
= pszDestEnd
;
946 *pcchRemaining
= cchRemaining
;
951 NTSTRSAFEAPI
RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
953 NTSTATUS Status
= STATUS_SUCCESS
;
954 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
955 size_t cchRemaining
= 0;
956 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
957 Status
= STATUS_INVALID_PARAMETER
;
960 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
964 if ((cchDest
!=0) || (cbDest
!=0))
965 Status
= STATUS_INVALID_PARAMETER
;
970 if (NT_SUCCESS(Status
))
974 pszDestEnd
= pszDest
;
979 Status
= STATUS_INVALID_PARAMETER
;
981 Status
= STATUS_BUFFER_OVERFLOW
;
986 pszDestEnd
= pszDest
;
987 cchRemaining
= cchDest
;
988 while(cchRemaining
&& (*pszSrc
!=L
'\0'))
990 *pszDestEnd
++ = *pszSrc
++;
993 if (cchRemaining
> 0)
995 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
997 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1004 Status
= STATUS_BUFFER_OVERFLOW
;
1006 *pszDestEnd
= L
'\0';
1010 if (!NT_SUCCESS(Status
))
1014 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1016 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1017 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1019 pszDestEnd
= pszDest
;
1020 cchRemaining
= cchDest
;
1025 pszDestEnd
= pszDest
+ cchDest
- 1;
1027 *pszDestEnd
= L
'\0';
1030 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1034 pszDestEnd
= pszDest
;
1035 cchRemaining
= cchDest
;
1036 *pszDestEnd
= L
'\0';
1041 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1044 *ppszDestEnd
= pszDestEnd
;
1046 *pcchRemaining
= cchRemaining
;
1051 NTSTRSAFEAPI
RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchSrc
)
1053 NTSTATUS Status
= STATUS_SUCCESS
;
1055 Status
= STATUS_INVALID_PARAMETER
;
1058 while(cchDest
&& cchSrc
&& (*pszSrc
!='\0'))
1060 *pszDest
++ = *pszSrc
++;
1067 Status
= STATUS_BUFFER_OVERFLOW
;
1074 NTSTRSAFEAPI
RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
)
1076 NTSTATUS Status
= STATUS_SUCCESS
;
1078 Status
= STATUS_INVALID_PARAMETER
;
1081 while(cchDest
&& cchToCopy
&& (*pszSrc
!=L
'\0'))
1083 *pszDest
++ = *pszSrc
++;
1090 Status
= STATUS_BUFFER_OVERFLOW
;
1097 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
)
1099 NTSTATUS Status
= STATUS_SUCCESS
;
1100 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1101 size_t cchRemaining
= 0;
1102 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1103 Status
= STATUS_INVALID_PARAMETER
;
1105 if (cchToCopy
> NTSTRSAFE_MAX_CCH
)
1106 Status
= STATUS_INVALID_PARAMETER
;
1109 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1113 if ((cchDest
!=0) || (cbDest
!=0))
1114 Status
= STATUS_INVALID_PARAMETER
;
1119 if (NT_SUCCESS(Status
))
1123 pszDestEnd
= pszDest
;
1125 if ((cchToCopy
!=0) && (*pszSrc
!='\0'))
1128 Status
= STATUS_INVALID_PARAMETER
;
1130 Status
= STATUS_BUFFER_OVERFLOW
;
1135 pszDestEnd
= pszDest
;
1136 cchRemaining
= cchDest
;
1137 while(cchRemaining
&& cchToCopy
&& (*pszSrc
!='\0'))
1139 *pszDestEnd
++ = *pszSrc
++;
1143 if (cchRemaining
> 0)
1145 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1147 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1154 Status
= STATUS_BUFFER_OVERFLOW
;
1160 if (!NT_SUCCESS(Status
))
1164 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1166 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1167 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1169 pszDestEnd
= pszDest
;
1170 cchRemaining
= cchDest
;
1175 pszDestEnd
= pszDest
+ cchDest
- 1;
1180 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1184 pszDestEnd
= pszDest
;
1185 cchRemaining
= cchDest
;
1191 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1194 *ppszDestEnd
= pszDestEnd
;
1196 *pcchRemaining
= cchRemaining
;
1201 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
)
1203 NTSTATUS Status
= STATUS_SUCCESS
;
1204 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1205 size_t cchRemaining
= 0;
1206 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1207 Status
= STATUS_INVALID_PARAMETER
;
1209 if (cchToCopy
> NTSTRSAFE_MAX_CCH
)
1210 Status
= STATUS_INVALID_PARAMETER
;
1213 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1217 if ((cchDest
!=0) || (cbDest
!=0))
1218 Status
= STATUS_INVALID_PARAMETER
;
1223 if (NT_SUCCESS(Status
))
1227 pszDestEnd
= pszDest
;
1229 if ((cchToCopy
!=0) && (*pszSrc
!=L
'\0'))
1232 Status
= STATUS_INVALID_PARAMETER
;
1234 Status
= STATUS_BUFFER_OVERFLOW
;
1239 pszDestEnd
= pszDest
;
1240 cchRemaining
= cchDest
;
1241 while(cchRemaining
&& cchToCopy
&& (*pszSrc
!=L
'\0'))
1243 *pszDestEnd
++ = *pszSrc
++;
1247 if (cchRemaining
> 0)
1249 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1251 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1258 Status
= STATUS_BUFFER_OVERFLOW
;
1260 *pszDestEnd
= L
'\0';
1264 if (!NT_SUCCESS(Status
))
1268 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1270 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1271 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1273 pszDestEnd
= pszDest
;
1274 cchRemaining
= cchDest
;
1279 pszDestEnd
= pszDest
+ cchDest
- 1;
1281 *pszDestEnd
= L
'\0';
1284 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1288 pszDestEnd
= pszDest
;
1289 cchRemaining
= cchDest
;
1290 *pszDestEnd
= L
'\0';
1295 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1298 *ppszDestEnd
= pszDestEnd
;
1300 *pcchRemaining
= cchRemaining
;
1305 NTSTRSAFEAPI
RtlStringCatWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
)
1308 size_t cchDestLength
;
1309 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1310 if (NT_SUCCESS(Status
))
1311 Status
= RtlStringCopyWorkerA(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
);
1315 NTSTRSAFEAPI
RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
)
1318 size_t cchDestLength
;
1319 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1320 if (NT_SUCCESS(Status
))
1321 Status
= RtlStringCopyWorkerW(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
);
1325 NTSTRSAFEAPI
RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1327 NTSTATUS Status
= STATUS_SUCCESS
;
1328 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1329 size_t cchRemaining
= 0;
1330 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1331 Status
= STATUS_INVALID_PARAMETER
;
1334 size_t cchDestLength
;
1335 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1339 if ((cchDest
==0) && (cbDest
==0))
1342 Status
= STATUS_INVALID_PARAMETER
;
1346 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1347 if (NT_SUCCESS(Status
))
1349 pszDestEnd
= pszDest
+ cchDestLength
;
1350 cchRemaining
= cchDest
- cchDestLength
;
1358 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1359 if (NT_SUCCESS(Status
))
1361 pszDestEnd
= pszDest
+ cchDestLength
;
1362 cchRemaining
= cchDest
- cchDestLength
;
1365 if (NT_SUCCESS(Status
))
1372 Status
= STATUS_INVALID_PARAMETER
;
1374 Status
= STATUS_BUFFER_OVERFLOW
;
1378 Status
= RtlStringCopyExWorkerA(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char)),pszSrc
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1381 if (!NT_SUCCESS(Status
))
1385 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1387 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1388 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1390 pszDestEnd
= pszDest
;
1391 cchRemaining
= cchDest
;
1396 pszDestEnd
= pszDest
+ cchDest
- 1;
1401 if (dwFlags
& STRSAFE_NULL_ON_FAILURE
)
1405 pszDestEnd
= pszDest
;
1406 cchRemaining
= cchDest
;
1412 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1415 *ppszDestEnd
= pszDestEnd
;
1417 *pcchRemaining
= cchRemaining
;
1422 NTSTRSAFEAPI
RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1424 NTSTATUS Status
= STATUS_SUCCESS
;
1425 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1426 size_t cchRemaining
= 0;
1427 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1428 Status
= STATUS_INVALID_PARAMETER
;
1431 size_t cchDestLength
;
1432 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1436 if ((cchDest
==0) && (cbDest
==0))
1439 Status
= STATUS_INVALID_PARAMETER
;
1443 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1444 if (NT_SUCCESS(Status
))
1446 pszDestEnd
= pszDest
+ cchDestLength
;
1447 cchRemaining
= cchDest
- cchDestLength
;
1455 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1456 if (NT_SUCCESS(Status
))
1458 pszDestEnd
= pszDest
+ cchDestLength
;
1459 cchRemaining
= cchDest
- cchDestLength
;
1462 if (NT_SUCCESS(Status
))
1469 Status
= STATUS_INVALID_PARAMETER
;
1471 Status
= STATUS_BUFFER_OVERFLOW
;
1475 Status
= RtlStringCopyExWorkerW(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)),pszSrc
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1478 if (!NT_SUCCESS(Status
))
1482 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1484 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1485 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1487 pszDestEnd
= pszDest
;
1488 cchRemaining
= cchDest
;
1493 pszDestEnd
= pszDest
+ cchDest
- 1;
1495 *pszDestEnd
= L
'\0';
1498 if (dwFlags
& STRSAFE_NULL_ON_FAILURE
)
1502 pszDestEnd
= pszDest
;
1503 cchRemaining
= cchDest
;
1504 *pszDestEnd
= L
'\0';
1509 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1512 *ppszDestEnd
= pszDestEnd
;
1514 *pcchRemaining
= cchRemaining
;
1519 NTSTRSAFEAPI
RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
)
1522 size_t cchDestLength
;
1523 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1524 if (NT_SUCCESS(Status
))
1525 Status
= RtlStringCopyNWorkerA(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
,cchToAppend
);
1529 NTSTRSAFEAPI
RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
)
1532 size_t cchDestLength
;
1533 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1534 if (NT_SUCCESS(Status
))
1535 Status
= RtlStringCopyNWorkerW(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
,cchToAppend
);
1539 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
)
1541 NTSTATUS Status
= STATUS_SUCCESS
;
1542 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1543 size_t cchRemaining
= 0;
1544 size_t cchDestLength
= 0;
1545 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1546 Status
= STATUS_INVALID_PARAMETER
;
1548 if (cchToAppend
> NTSTRSAFE_MAX_CCH
)
1549 Status
= STATUS_INVALID_PARAMETER
;
1552 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1556 if ((cchDest
==0) && (cbDest
==0))
1559 Status
= STATUS_INVALID_PARAMETER
;
1563 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1564 if (NT_SUCCESS(Status
))
1566 pszDestEnd
= pszDest
+ cchDestLength
;
1567 cchRemaining
= cchDest
- cchDestLength
;
1575 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1576 if (NT_SUCCESS(Status
))
1578 pszDestEnd
= pszDest
+ cchDestLength
;
1579 cchRemaining
= cchDest
- cchDestLength
;
1582 if (NT_SUCCESS(Status
))
1586 if ((cchToAppend
!=0) && (*pszSrc
!='\0'))
1589 Status
= STATUS_INVALID_PARAMETER
;
1591 Status
= STATUS_BUFFER_OVERFLOW
;
1595 Status
= RtlStringCopyNExWorkerA(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char)),pszSrc
,cchToAppend
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
1598 if (!NT_SUCCESS(Status
))
1602 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1604 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1605 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1607 pszDestEnd
= pszDest
;
1608 cchRemaining
= cchDest
;
1613 pszDestEnd
= pszDest
+ cchDest
- 1;
1618 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
))
1622 pszDestEnd
= pszDest
;
1623 cchRemaining
= cchDest
;
1629 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1632 *ppszDestEnd
= pszDestEnd
;
1634 *pcchRemaining
= cchRemaining
;
1639 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
)
1641 NTSTATUS Status
= STATUS_SUCCESS
;
1642 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1643 size_t cchRemaining
= 0;
1644 size_t cchDestLength
= 0;
1645 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1646 Status
= STATUS_INVALID_PARAMETER
;
1648 if (cchToAppend
> NTSTRSAFE_MAX_CCH
)
1649 Status
= STATUS_INVALID_PARAMETER
;
1652 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1656 if ((cchDest
==0) && (cbDest
==0))
1659 Status
= STATUS_INVALID_PARAMETER
;
1663 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1664 if (NT_SUCCESS(Status
))
1666 pszDestEnd
= pszDest
+ cchDestLength
;
1667 cchRemaining
= cchDest
- cchDestLength
;
1675 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1676 if (NT_SUCCESS(Status
))
1678 pszDestEnd
= pszDest
+ cchDestLength
;
1679 cchRemaining
= cchDest
- cchDestLength
;
1682 if (NT_SUCCESS(Status
))
1686 if ((cchToAppend
!=0) && (*pszSrc
!=L
'\0'))
1689 Status
= STATUS_INVALID_PARAMETER
;
1691 Status
= STATUS_BUFFER_OVERFLOW
;
1695 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
)));
1698 if (!NT_SUCCESS(Status
))
1702 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1704 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1705 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1707 pszDestEnd
= pszDest
;
1708 cchRemaining
= cchDest
;
1713 pszDestEnd
= pszDest
+ cchDest
- 1;
1715 *pszDestEnd
= L
'\0';
1718 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
))
1722 pszDestEnd
= pszDest
;
1723 cchRemaining
= cchDest
;
1724 *pszDestEnd
= L
'\0';
1729 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1732 *ppszDestEnd
= pszDestEnd
;
1734 *pcchRemaining
= cchRemaining
;
1739 NTSTRSAFEAPI
RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
1741 NTSTATUS Status
= STATUS_SUCCESS
;
1743 Status
= STATUS_INVALID_PARAMETER
;
1748 cchMax
= cchDest
- 1;
1749 iRet
= _vsnprintf(pszDest
,cchMax
,pszFormat
,argList
);
1750 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
1754 Status
= STATUS_BUFFER_OVERFLOW
;
1757 if (((size_t)iRet
)==cchMax
)
1766 NTSTRSAFEAPI
RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
1768 NTSTATUS Status
= STATUS_SUCCESS
;
1770 Status
= STATUS_INVALID_PARAMETER
;
1775 cchMax
= cchDest
- 1;
1776 iRet
= _vsnwprintf(pszDest
,cchMax
,pszFormat
,argList
);
1777 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
1781 Status
= STATUS_BUFFER_OVERFLOW
;
1784 if (((size_t)iRet
)==cchMax
)
1793 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
)
1795 NTSTATUS Status
= STATUS_SUCCESS
;
1796 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1797 size_t cchRemaining
= 0;
1798 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1799 Status
= STATUS_INVALID_PARAMETER
;
1802 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1806 if ((cchDest
!=0) || (cbDest
!=0))
1807 Status
= STATUS_INVALID_PARAMETER
;
1812 if (NT_SUCCESS(Status
))
1816 pszDestEnd
= pszDest
;
1818 if (*pszFormat
!='\0')
1821 Status
= STATUS_INVALID_PARAMETER
;
1823 Status
= STATUS_BUFFER_OVERFLOW
;
1830 cchMax
= cchDest
- 1;
1831 iRet
= _vsnprintf(pszDest
,cchMax
,pszFormat
,argList
);
1832 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
1834 pszDestEnd
= pszDest
+ cchMax
;
1837 Status
= STATUS_BUFFER_OVERFLOW
;
1840 if (((size_t)iRet
)==cchMax
)
1842 pszDestEnd
= pszDest
+ cchMax
;
1847 if (((size_t)iRet
) < cchMax
)
1849 pszDestEnd
= pszDest
+ iRet
;
1850 cchRemaining
= cchDest
- iRet
;
1851 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1853 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1859 if (!NT_SUCCESS(Status
))
1863 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1865 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1866 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1868 pszDestEnd
= pszDest
;
1869 cchRemaining
= cchDest
;
1874 pszDestEnd
= pszDest
+ cchDest
- 1;
1879 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1883 pszDestEnd
= pszDest
;
1884 cchRemaining
= cchDest
;
1890 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1893 *ppszDestEnd
= pszDestEnd
;
1895 *pcchRemaining
= cchRemaining
;
1900 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
)
1902 NTSTATUS Status
= STATUS_SUCCESS
;
1903 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1904 size_t cchRemaining
= 0;
1905 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1906 Status
= STATUS_INVALID_PARAMETER
;
1909 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1913 if ((cchDest
!=0) || (cbDest
!=0))
1914 Status
= STATUS_INVALID_PARAMETER
;
1919 if (NT_SUCCESS(Status
))
1923 pszDestEnd
= pszDest
;
1925 if (*pszFormat
!=L
'\0')
1928 Status
= STATUS_INVALID_PARAMETER
;
1930 Status
= STATUS_BUFFER_OVERFLOW
;
1937 cchMax
= cchDest
- 1;
1938 iRet
= _vsnwprintf(pszDest
,cchMax
,pszFormat
,argList
);
1939 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
1941 pszDestEnd
= pszDest
+ cchMax
;
1943 *pszDestEnd
= L
'\0';
1944 Status
= STATUS_BUFFER_OVERFLOW
;
1947 if (((size_t)iRet
)==cchMax
)
1949 pszDestEnd
= pszDest
+ cchMax
;
1951 *pszDestEnd
= L
'\0';
1954 if (((size_t)iRet
) < cchMax
)
1956 pszDestEnd
= pszDest
+ iRet
;
1957 cchRemaining
= cchDest
- iRet
;
1958 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1960 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1966 if (!NT_SUCCESS(Status
))
1970 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1972 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1973 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1975 pszDestEnd
= pszDest
;
1976 cchRemaining
= cchDest
;
1981 pszDestEnd
= pszDest
+ cchDest
- 1;
1983 *pszDestEnd
= L
'\0';
1986 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1990 pszDestEnd
= pszDest
;
1991 cchRemaining
= cchDest
;
1992 *pszDestEnd
= L
'\0';
1997 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2000 *ppszDestEnd
= pszDestEnd
;
2002 *pcchRemaining
= cchRemaining
;
2007 NTSTRSAFEAPI
RtlStringLengthWorkerA(STRSAFE_LPCSTR psz
,size_t cchMax
,size_t *pcchLength
)
2009 NTSTATUS Status
= STATUS_SUCCESS
;
2010 size_t cchMaxPrev
= cchMax
;
2011 while(cchMax
&& (*psz
!='\0'))
2017 Status
= STATUS_INVALID_PARAMETER
;
2020 if (NT_SUCCESS(Status
))
2021 *pcchLength
= cchMaxPrev
- cchMax
;
2028 NTSTRSAFEAPI
RtlStringLengthWorkerW(STRSAFE_LPCWSTR psz
,size_t cchMax
,size_t *pcchLength
)
2030 NTSTATUS Status
= STATUS_SUCCESS
;
2031 size_t cchMaxPrev
= cchMax
;
2032 while(cchMax
&& (*psz
!=L
'\0'))
2038 Status
= STATUS_INVALID_PARAMETER
;
2041 if (NT_SUCCESS(Status
))
2042 *pcchLength
= cchMaxPrev
- cchMax
;
2051 #define RtlStringCopyWorkerA RtlStringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
2052 #define RtlStringCopyWorkerW RtlStringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
2053 #define RtlStringCopyExWorkerA RtlStringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
2054 #define RtlStringCopyExWorkerW RtlStringCopyExWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
2055 #define RtlStringCatWorkerA RtlStringCatWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
2056 #define RtlStringCatWorkerW RtlStringCatWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
2057 #define RtlStringCatExWorkerA RtlStringCatExWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
2058 #define RtlStringCatExWorkerW RtlStringCatExWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
2059 #define RtlStringCatNWorkerA RtlStringCatNWorkerA_instead_use_StringCchCatNA_or_StrincCbCatNA;
2060 #define RtlStringCatNWorkerW RtlStringCatNWorkerW_instead_use_StringCchCatNW_or_StringCbCatNW;
2061 #define RtlStringCatNExWorkerA RtlStringCatNExWorkerA_instead_use_StringCchCatNExA_or_StringCbCatNExA;
2062 #define RtlStringCatNExWorkerW RtlStringCatNExWorkerW_instead_use_StringCchCatNExW_or_StringCbCatNExW;
2063 #define RtlStringVPrintfWorkerA RtlStringVPrintfWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
2064 #define RtlStringVPrintfWorkerW RtlStringVPrintfWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
2065 #define RtlStringVPrintfExWorkerA RtlStringVPrintfExWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
2066 #define RtlStringVPrintfExWorkerW RtlStringVPrintfExWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
2067 #define RtlStringLengthWorkerA RtlStringLengthWorkerA_instead_use_StringCchLengthA_or_StringCbLengthA;
2068 #define RtlStringLengthWorkerW RtlStringLengthWorkerW_instead_use_StringCchLengthW_or_StringCbLengthW;
2071 #pragma warning(pop)
2072 #endif /* _MSC_VER */
2074 #endif /* _NTSTRSAFE_H_INCLUDED_ */