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 _Null_terminated_
char *NTSTRSAFE_PSTR
;
63 typedef _Null_terminated_
const char *NTSTRSAFE_PCSTR
;
64 typedef _Null_terminated_
wchar_t *NTSTRSAFE_PWSTR
;
65 typedef _Null_terminated_
const wchar_t *NTSTRSAFE_PCWSTR
;
67 typedef ULONG STRSAFE_DWORD
;
69 NTSTRSAFEAPI
RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
70 NTSTRSAFEAPI
RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
71 NTSTRSAFEAPI
RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
72 NTSTRSAFEAPI
RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
73 NTSTRSAFEAPI
RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
);
74 NTSTRSAFEAPI
RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
);
75 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
);
76 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
);
77 NTSTRSAFEAPI
RtlStringCatWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
78 NTSTRSAFEAPI
RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
79 NTSTRSAFEAPI
RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
80 NTSTRSAFEAPI
RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
81 NTSTRSAFEAPI
RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
);
82 NTSTRSAFEAPI
RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
);
83 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
);
84 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
);
85 NTSTRSAFEAPI
RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
86 NTSTRSAFEAPI
RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
87 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
);
88 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
);
91 RtlStringLengthWorkerA(
92 _In_reads_or_z_(cchMax
) STRSAFE_LPCSTR psz
,
93 _In_
_In_range_(<=, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
94 _Out_opt_
_Deref_out_range_(<, cchMax
) size_t *pcchLength
);
97 RtlStringLengthWorkerW(
98 _In_reads_or_z_(cchMax
) STRSAFE_LPCWSTR psz
,
99 _In_
_In_range_(<=, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
100 _Out_opt_
_Deref_out_range_(<, cchMax
) size_t *pcchLength
);
104 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
106 _In_ NTSTRSAFE_PCSTR pszSrc
);
110 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
112 _In_ NTSTRSAFE_PCWSTR pszSrc
);
116 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
118 _In_ NTSTRSAFE_PCSTR pszSrc
)
120 return (cchDest
> NTSTRSAFE_MAX_CCH
? STATUS_INVALID_PARAMETER
: RtlStringCopyWorkerA(pszDest
,cchDest
,pszSrc
));
125 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
127 _In_ NTSTRSAFE_PCWSTR pszSrc
)
129 if (cchDest
> NTSTRSAFE_MAX_CCH
)
130 return STATUS_INVALID_PARAMETER
;
131 return RtlStringCopyWorkerW(pszDest
,cchDest
,pszSrc
);
136 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
138 _In_ NTSTRSAFE_PCSTR pszSrc
);
142 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
144 _In_ NTSTRSAFE_PCWSTR pszSrc
);
148 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
150 _In_ NTSTRSAFE_PCSTR pszSrc
)
152 if (cbDest
> NTSTRSAFE_MAX_CCH
)
153 return STATUS_INVALID_PARAMETER
;
154 return RtlStringCopyWorkerA(pszDest
,cbDest
,pszSrc
);
159 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
161 _In_ NTSTRSAFE_PCWSTR pszSrc
)
163 size_t cchDest
= cbDest
/ sizeof(wchar_t);
164 if (cchDest
> NTSTRSAFE_MAX_CCH
)
165 return STATUS_INVALID_PARAMETER
;
166 return RtlStringCopyWorkerW(pszDest
,cchDest
,pszSrc
);
171 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
173 _In_ NTSTRSAFE_PCSTR pszSrc
,
174 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
175 _Out_opt_
size_t *pcchRemaining
,
176 _In_ STRSAFE_DWORD dwFlags
);
180 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
182 _In_ NTSTRSAFE_PCWSTR pszSrc
,
183 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
184 _Out_opt_
size_t *pcchRemaining
,
185 _In_ STRSAFE_DWORD dwFlags
);
189 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
191 _In_ NTSTRSAFE_PCSTR pszSrc
,
192 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
193 _Out_opt_
size_t *pcchRemaining
,
194 _In_ STRSAFE_DWORD dwFlags
)
196 if (cchDest
> NTSTRSAFE_MAX_CCH
)
197 return STATUS_INVALID_PARAMETER
;
198 return RtlStringCopyExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
203 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
205 _In_ NTSTRSAFE_PCWSTR pszSrc
,
206 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
207 _Out_opt_
size_t *pcchRemaining
,
208 _In_ STRSAFE_DWORD dwFlags
)
211 if (cchDest
> NTSTRSAFE_MAX_CCH
)
212 return STATUS_INVALID_PARAMETER
;
213 cbDest
= cchDest
* sizeof(wchar_t);
214 return RtlStringCopyExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
219 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
221 _In_ NTSTRSAFE_PCSTR pszSrc
,
222 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) STRSAFE_LPSTR
*ppszDestEnd
,
223 _Out_opt_
size_t *pcbRemaining
,
224 _In_ STRSAFE_DWORD dwFlags
);
228 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
230 _In_ NTSTRSAFE_PCWSTR pszSrc
,
231 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
232 _Out_opt_
size_t *pcbRemaining
,
233 _In_ STRSAFE_DWORD dwFlags
);
237 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
239 _In_ NTSTRSAFE_PCSTR pszSrc
,
240 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) STRSAFE_LPSTR
*ppszDestEnd
,
241 _Out_opt_
size_t *pcbRemaining
,
242 _In_ STRSAFE_DWORD dwFlags
)
245 size_t cchRemaining
= 0;
246 if (cbDest
> NTSTRSAFE_MAX_CCH
)
247 return STATUS_INVALID_PARAMETER
;
248 Status
= RtlStringCopyExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
249 if (NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
)
252 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
259 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
261 _In_ NTSTRSAFE_PCWSTR pszSrc
,
262 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
263 _Out_opt_
size_t *pcbRemaining
,
264 _In_ STRSAFE_DWORD dwFlags
)
267 size_t cchDest
= cbDest
/ sizeof(wchar_t);
268 size_t cchRemaining
= 0;
270 if (cchDest
> NTSTRSAFE_MAX_CCH
)
271 return STATUS_INVALID_PARAMETER
;
272 Status
= RtlStringCopyExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
273 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
276 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
283 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
285 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCSTR pszSrc
,
286 _In_
size_t cchToCopy
);
290 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
292 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCWSTR pszSrc
,
293 _In_
size_t cchToCopy
);
298 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
300 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCSTR pszSrc
,
301 _In_
size_t cchToCopy
)
303 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
304 return STATUS_INVALID_PARAMETER
;
305 return RtlStringCopyNWorkerA(pszDest
,cchDest
,pszSrc
,cchToCopy
);
310 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
312 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCWSTR pszSrc
,
313 _In_
size_t cchToCopy
)
315 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
316 return STATUS_INVALID_PARAMETER
;
317 return RtlStringCopyNWorkerW(pszDest
,cchDest
,pszSrc
,cchToCopy
);
322 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
324 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCSTR pszSrc
,
325 _In_
size_t cbToCopy
);
329 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
331 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCWSTR pszSrc
,
332 _In_
size_t cbToCopy
);
336 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
338 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCSTR pszSrc
,
339 _In_
size_t cbToCopy
)
341 if (cbDest
> NTSTRSAFE_MAX_CCH
|| cbToCopy
> NTSTRSAFE_MAX_CCH
)
342 return STATUS_INVALID_PARAMETER
;
343 return RtlStringCopyNWorkerA(pszDest
,cbDest
,pszSrc
,cbToCopy
);
348 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
350 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCWSTR pszSrc
,
351 _In_
size_t cbToCopy
)
353 size_t cchDest
= cbDest
/ sizeof(wchar_t);
354 size_t cchToCopy
= cbToCopy
/ sizeof(wchar_t);
355 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
356 return STATUS_INVALID_PARAMETER
;
357 return RtlStringCopyNWorkerW(pszDest
,cchDest
,pszSrc
,cchToCopy
);
361 RtlStringCchCopyNExA(
362 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
364 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCSTR pszSrc
,
365 _In_
size_t cchToCopy
,
366 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
367 _Out_opt_
size_t *pcchRemaining
,
368 _In_ STRSAFE_DWORD dwFlags
);
371 RtlStringCchCopyNExW(
372 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
374 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCWSTR pszSrc
,
375 _In_
size_t cchToCopy
,
376 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
377 _Out_opt_
size_t *pcchRemaining
,
378 _In_ STRSAFE_DWORD dwFlags
);
381 RtlStringCchCopyNExA(
382 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
384 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCSTR pszSrc
,
385 _In_
size_t cchToCopy
,
386 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
387 _Out_opt_
size_t *pcchRemaining
,
388 _In_ STRSAFE_DWORD dwFlags
)
390 if (cchDest
> NTSTRSAFE_MAX_CCH
)
391 return STATUS_INVALID_PARAMETER
;
392 return RtlStringCopyNExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,cchToCopy
,ppszDestEnd
,pcchRemaining
,dwFlags
);
396 RtlStringCchCopyNExW(
397 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
399 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCWSTR pszSrc
,
400 _In_
size_t cchToCopy
,
401 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
402 _Out_opt_
size_t *pcchRemaining
,
403 _In_ STRSAFE_DWORD dwFlags
)
405 if (cchDest
> NTSTRSAFE_MAX_CCH
)
406 return STATUS_INVALID_PARAMETER
;
407 return RtlStringCopyNExWorkerW(pszDest
,cchDest
,cchDest
* sizeof(wchar_t),pszSrc
,cchToCopy
,ppszDestEnd
,pcchRemaining
,dwFlags
);
412 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
414 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCSTR pszSrc
,
415 _In_
size_t cbToCopy
,
416 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
417 _Out_opt_
size_t *pcbRemaining
,
418 _In_ STRSAFE_DWORD dwFlags
);
422 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
424 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCWSTR pszSrc
,
425 _In_
size_t cbToCopy
,
426 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
427 _Out_opt_
size_t *pcbRemaining
,
428 _In_ STRSAFE_DWORD dwFlags
);
432 _Out_writes_bytes_(cbDest
) STRSAFE_LPSTR pszDest
,
434 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCSTR pszSrc
,
435 _In_
size_t cbToCopy
,
436 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) STRSAFE_LPSTR
*ppszDestEnd
,
437 _Out_opt_
size_t *pcbRemaining
,
438 _In_ STRSAFE_DWORD dwFlags
)
441 size_t cchRemaining
= 0;
442 if (cbDest
> NTSTRSAFE_MAX_CCH
)
443 Status
= STATUS_INVALID_PARAMETER
;
445 Status
= RtlStringCopyNExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,cbToCopy
,ppszDestEnd
,&cchRemaining
,dwFlags
);
446 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
447 *pcbRemaining
= cchRemaining
;
453 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
455 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCWSTR pszSrc
,
456 _In_
size_t cbToCopy
,
457 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
458 _Out_opt_
size_t *pcbRemaining
,
459 _In_ STRSAFE_DWORD dwFlags
)
464 size_t cchRemaining
= 0;
465 cchDest
= cbDest
/ sizeof(wchar_t);
466 cchToCopy
= cbToCopy
/ sizeof(wchar_t);
467 if (cchDest
> NTSTRSAFE_MAX_CCH
)
468 Status
= STATUS_INVALID_PARAMETER
;
470 Status
= RtlStringCopyNExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,cchToCopy
,ppszDestEnd
,&cchRemaining
,dwFlags
);
471 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
472 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
478 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
480 _In_ NTSTRSAFE_PCSTR pszSrc
);
484 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
486 _In_ NTSTRSAFE_PCWSTR pszSrc
);
490 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
492 _In_ NTSTRSAFE_PCSTR pszSrc
)
494 if (cchDest
> NTSTRSAFE_MAX_CCH
)
495 return STATUS_INVALID_PARAMETER
;
496 return RtlStringCatWorkerA(pszDest
,cchDest
,pszSrc
);
501 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
503 _In_ NTSTRSAFE_PCWSTR pszSrc
)
505 if (cchDest
> NTSTRSAFE_MAX_CCH
)
506 return STATUS_INVALID_PARAMETER
;
507 return RtlStringCatWorkerW(pszDest
,cchDest
,pszSrc
);
512 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
514 _In_ NTSTRSAFE_PCSTR pszSrc
);
518 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
520 _In_ NTSTRSAFE_PCWSTR pszSrc
);
524 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
526 _In_ NTSTRSAFE_PCSTR pszSrc
)
528 if (cbDest
> NTSTRSAFE_MAX_CCH
)
529 return STATUS_INVALID_PARAMETER
;
530 return RtlStringCatWorkerA(pszDest
,cbDest
,pszSrc
);
535 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
537 _In_ NTSTRSAFE_PCWSTR pszSrc
)
539 size_t cchDest
= cbDest
/ sizeof(wchar_t);
540 if (cchDest
> NTSTRSAFE_MAX_CCH
)
541 return STATUS_INVALID_PARAMETER
;
542 return RtlStringCatWorkerW(pszDest
,cchDest
,pszSrc
);
547 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
549 _In_ NTSTRSAFE_PCSTR pszSrc
,
550 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
551 _Out_opt_
size_t *pcchRemaining
,
552 _In_ STRSAFE_DWORD dwFlags
);
556 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
558 _In_ NTSTRSAFE_PCWSTR pszSrc
,
559 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
560 _Out_opt_
size_t *pcchRemaining
,
561 _In_ STRSAFE_DWORD dwFlags
);
565 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
567 _In_ NTSTRSAFE_PCSTR pszSrc
,
568 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
569 _Out_opt_
size_t *pcchRemaining
,
570 _In_ STRSAFE_DWORD dwFlags
)
572 if (cchDest
> NTSTRSAFE_MAX_CCH
)
573 return STATUS_INVALID_PARAMETER
;
574 return RtlStringCatExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
579 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
581 _In_ NTSTRSAFE_PCWSTR pszSrc
,
582 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
583 _Out_opt_
size_t *pcchRemaining
,
584 _In_ STRSAFE_DWORD dwFlags
)
586 size_t cbDest
= cchDest
*sizeof(wchar_t);
587 if (cchDest
> NTSTRSAFE_MAX_CCH
)
588 return STATUS_INVALID_PARAMETER
;
589 return RtlStringCatExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
594 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
596 _In_ NTSTRSAFE_PCSTR pszSrc
,
597 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
598 _Out_opt_
size_t *pcbRemaining
,
599 _In_ STRSAFE_DWORD dwFlags
);
603 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
605 _In_ NTSTRSAFE_PCWSTR pszSrc
,
606 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
607 _Out_opt_
size_t *pcbRemaining
,
608 _In_ STRSAFE_DWORD dwFlags
);
612 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
614 _In_ NTSTRSAFE_PCSTR pszSrc
,
615 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
616 _Out_opt_
size_t *pcbRemaining
,
617 _In_ STRSAFE_DWORD dwFlags
)
620 size_t cchRemaining
= 0;
621 if (cbDest
> NTSTRSAFE_MAX_CCH
)
622 Status
= STATUS_INVALID_PARAMETER
;
624 Status
= RtlStringCatExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
625 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
626 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
632 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
634 _In_ NTSTRSAFE_PCWSTR pszSrc
,
635 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
636 _Out_opt_
size_t *pcbRemaining
,
637 _In_ STRSAFE_DWORD dwFlags
)
640 size_t cchDest
= cbDest
/ sizeof(wchar_t);
641 size_t cchRemaining
= 0;
643 if (cchDest
> NTSTRSAFE_MAX_CCH
)
644 Status
= STATUS_INVALID_PARAMETER
;
646 Status
= RtlStringCatExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
647 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
648 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
654 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
656 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCSTR pszSrc
,
657 _In_
size_t cchToAppend
);
661 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
663 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCWSTR pszSrc
,
664 _In_
size_t cchToAppend
);
668 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
670 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCSTR pszSrc
,
671 _In_
size_t cchToAppend
)
673 if (cchDest
> NTSTRSAFE_MAX_CCH
)
674 return STATUS_INVALID_PARAMETER
;
675 return RtlStringCatNWorkerA(pszDest
,cchDest
,pszSrc
,cchToAppend
);
680 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
682 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCWSTR pszSrc
,
683 _In_
size_t cchToAppend
)
685 if (cchDest
> NTSTRSAFE_MAX_CCH
)
686 return STATUS_INVALID_PARAMETER
;
687 return RtlStringCatNWorkerW(pszDest
,cchDest
,pszSrc
,cchToAppend
);
692 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
694 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCSTR pszSrc
,
695 _In_
size_t cbToAppend
);
699 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
701 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCWSTR pszSrc
,
702 _In_
size_t cbToAppend
);
706 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
708 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCSTR pszSrc
,
709 _In_
size_t cbToAppend
)
711 if (cbDest
> NTSTRSAFE_MAX_CCH
)
712 return STATUS_INVALID_PARAMETER
;
713 return RtlStringCatNWorkerA(pszDest
,cbDest
,pszSrc
,cbToAppend
);
718 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
720 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCWSTR pszSrc
,
721 _In_
size_t cbToAppend
)
723 size_t cchDest
= cbDest
/ sizeof(wchar_t);
724 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
726 if (cchDest
> NTSTRSAFE_MAX_CCH
)
727 return STATUS_INVALID_PARAMETER
;
728 return RtlStringCatNWorkerW(pszDest
,cchDest
,pszSrc
,cchToAppend
);
733 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
735 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCSTR pszSrc
,
736 _In_
size_t cchToAppend
,
737 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
738 _Out_opt_
size_t *pcchRemaining
,
739 _In_ STRSAFE_DWORD dwFlags
);
743 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
745 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCWSTR pszSrc
,
746 _In_
size_t cchToAppend
,
747 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
748 _Out_opt_
size_t *pcchRemaining
,
749 _In_ STRSAFE_DWORD dwFlags
);
753 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
755 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCSTR pszSrc
,
756 _In_
size_t cchToAppend
,
757 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
758 _Out_opt_
size_t *pcchRemaining
,
759 _In_ STRSAFE_DWORD dwFlags
)
761 if (cchDest
> NTSTRSAFE_MAX_CCH
)
762 return STATUS_INVALID_PARAMETER
;
763 return RtlStringCatNExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,cchToAppend
,ppszDestEnd
,pcchRemaining
,dwFlags
);
768 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
770 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCWSTR pszSrc
,
771 _In_
size_t cchToAppend
,
772 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
773 _Out_opt_
size_t *pcchRemaining
,
774 _In_ STRSAFE_DWORD dwFlags
)
776 if (cchDest
> NTSTRSAFE_MAX_CCH
)
777 return STATUS_INVALID_PARAMETER
;
778 return RtlStringCatNExWorkerW(pszDest
,cchDest
,(cchDest
*sizeof(wchar_t)),pszSrc
,cchToAppend
,ppszDestEnd
,pcchRemaining
,dwFlags
);
783 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
785 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCSTR pszSrc
,
786 _In_
size_t cbToAppend
,
787 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
788 _Out_opt_
size_t *pcbRemaining
,
789 _In_ STRSAFE_DWORD dwFlags
);
793 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
795 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCWSTR pszSrc
,
796 _In_
size_t cbToAppend
,
797 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
798 _Out_opt_
size_t *pcbRemaining
,
799 _In_ STRSAFE_DWORD dwFlags
);
803 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
805 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCSTR pszSrc
,
806 _In_
size_t cbToAppend
,
807 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
808 _Out_opt_
size_t *pcbRemaining
,
809 _In_ STRSAFE_DWORD dwFlags
)
812 size_t cchRemaining
= 0;
813 if (cbDest
> NTSTRSAFE_MAX_CCH
)
814 Status
= STATUS_INVALID_PARAMETER
;
816 Status
= RtlStringCatNExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,cbToAppend
,ppszDestEnd
,&cchRemaining
,dwFlags
);
817 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
818 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
824 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
826 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCWSTR pszSrc
,
827 _In_
size_t cbToAppend
,
828 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
829 _Out_opt_
size_t *pcbRemaining
,
830 _In_ STRSAFE_DWORD dwFlags
)
833 size_t cchDest
= cbDest
/ sizeof(wchar_t);
834 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
835 size_t cchRemaining
= 0;
836 if (cchDest
> NTSTRSAFE_MAX_CCH
)
837 Status
= STATUS_INVALID_PARAMETER
;
839 Status
= RtlStringCatNExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,cchToAppend
,ppszDestEnd
,&cchRemaining
,dwFlags
);
840 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
841 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
846 RtlStringCchVPrintfA(
847 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
849 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
850 _In_
va_list argList
);
853 RtlStringCchVPrintfW(
854 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
856 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
857 _In_
va_list argList
);
860 RtlStringCchVPrintfA(
861 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
863 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
864 _In_
va_list argList
)
866 if (cchDest
> NTSTRSAFE_MAX_CCH
)
867 return STATUS_INVALID_PARAMETER
;
868 return RtlStringVPrintfWorkerA(pszDest
,cchDest
,pszFormat
,argList
);
872 RtlStringCchVPrintfW(
873 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
875 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
876 _In_
va_list argList
)
878 if (cchDest
> NTSTRSAFE_MAX_CCH
)
879 return STATUS_INVALID_PARAMETER
;
880 return RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
885 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
887 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
888 _In_
va_list argList
);
892 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
894 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
895 _In_
va_list argList
);
899 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
901 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
902 _In_
va_list argList
)
904 if (cbDest
> NTSTRSAFE_MAX_CCH
)
905 return STATUS_INVALID_PARAMETER
;
906 return RtlStringVPrintfWorkerA(pszDest
,cbDest
,pszFormat
,argList
);
911 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
913 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
914 _In_
va_list argList
)
916 size_t cchDest
= cbDest
/ sizeof(wchar_t);
917 if (cchDest
> NTSTRSAFE_MAX_CCH
)
918 return STATUS_INVALID_PARAMETER
;
919 return RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
924 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
926 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
931 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
933 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
938 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
940 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
945 if (cchDest
> NTSTRSAFE_MAX_CCH
)
946 return STATUS_INVALID_PARAMETER
;
947 va_start(argList
,pszFormat
);
948 Status
= RtlStringVPrintfWorkerA(pszDest
,cchDest
,pszFormat
,argList
);
955 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
957 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
962 if (cchDest
> NTSTRSAFE_MAX_CCH
)
963 return STATUS_INVALID_PARAMETER
;
964 va_start(argList
,pszFormat
);
965 Status
= RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
972 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
974 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
979 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
981 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
986 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
988 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
993 if (cbDest
> NTSTRSAFE_MAX_CCH
)
994 return STATUS_INVALID_PARAMETER
;
995 va_start(argList
,pszFormat
);
996 Status
= RtlStringVPrintfWorkerA(pszDest
,cbDest
,pszFormat
,argList
);
1003 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1005 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1010 size_t cchDest
= cbDest
/ sizeof(wchar_t);
1011 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1012 return STATUS_INVALID_PARAMETER
;
1013 va_start(argList
,pszFormat
);
1014 Status
= RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
1020 RtlStringCchPrintfExA(
1021 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1022 _In_
size_t cchDest
,
1023 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1024 _Out_opt_
size_t *pcchRemaining
,
1025 _In_ STRSAFE_DWORD dwFlags
,
1026 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1030 RtlStringCchPrintfExW(
1031 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1032 _In_
size_t cchDest
,
1033 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1034 _Out_opt_
size_t *pcchRemaining
,
1035 _In_ STRSAFE_DWORD dwFlags
,
1036 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1040 RtlStringCchPrintfExA(
1041 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1042 _In_
size_t cchDest
,
1043 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1044 _Out_opt_
size_t *pcchRemaining
,
1045 _In_ STRSAFE_DWORD dwFlags
,
1046 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1051 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1052 return STATUS_INVALID_PARAMETER
;
1053 va_start(argList
,pszFormat
);
1054 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cchDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
1060 RtlStringCchPrintfExW(
1061 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1062 _In_
size_t cchDest
,
1063 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1064 _Out_opt_
size_t *pcchRemaining
,
1065 _In_ STRSAFE_DWORD dwFlags
,
1066 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1070 size_t cbDest
= cchDest
* sizeof(wchar_t);
1072 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1073 return STATUS_INVALID_PARAMETER
;
1074 va_start(argList
,pszFormat
);
1075 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
1081 RtlStringCbPrintfExA(
1082 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1084 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1085 _Out_opt_
size_t *pcbRemaining
,
1086 _In_ STRSAFE_DWORD dwFlags
,
1087 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1091 RtlStringCbPrintfExW(
1092 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1094 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1095 _Out_opt_
size_t *pcbRemaining
,
1096 _In_ STRSAFE_DWORD dwFlags
,
1097 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1101 RtlStringCbPrintfExA(
1102 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1104 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1105 _Out_opt_
size_t *pcbRemaining
,
1106 _In_ STRSAFE_DWORD dwFlags
,
1107 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1112 size_t cchRemaining
= 0;
1113 cchDest
= cbDest
/ sizeof(char);
1114 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1115 Status
= STATUS_INVALID_PARAMETER
;
1119 va_start(argList
,pszFormat
);
1120 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
1123 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1127 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
1134 RtlStringCbPrintfExW(
1135 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1137 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1138 _Out_opt_
size_t *pcbRemaining
,
1139 _In_ STRSAFE_DWORD dwFlags
,
1140 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1145 size_t cchRemaining
= 0;
1146 cchDest
= cbDest
/ sizeof(wchar_t);
1147 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1148 Status
= STATUS_INVALID_PARAMETER
;
1152 va_start(argList
,pszFormat
);
1153 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
1156 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1160 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
1167 RtlStringCchVPrintfExA(
1168 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1169 _In_
size_t cchDest
,
1170 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1171 _Out_opt_
size_t *pcchRemaining
,
1172 _In_ STRSAFE_DWORD dwFlags
,
1173 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1174 _In_
va_list argList
);
1177 RtlStringCchVPrintfExW(
1178 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1179 _In_
size_t cchDest
,
1180 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1181 _Out_opt_
size_t *pcchRemaining
,
1182 _In_ STRSAFE_DWORD dwFlags
,
1183 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1184 _In_
va_list argList
);
1187 RtlStringCchVPrintfExA(
1188 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1189 _In_
size_t cchDest
,
1190 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1191 _Out_opt_
size_t *pcchRemaining
,
1192 _In_ STRSAFE_DWORD dwFlags
,
1193 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1194 _In_
va_list argList
)
1197 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1198 Status
= STATUS_INVALID_PARAMETER
;
1202 cbDest
= cchDest
*sizeof(char);
1203 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
1209 RtlStringCchVPrintfExW(
1210 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1211 _In_
size_t cchDest
,
1212 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1213 _Out_opt_
size_t *pcchRemaining
,
1214 _In_ STRSAFE_DWORD dwFlags
,
1215 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1216 _In_
va_list argList
)
1219 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1220 Status
= STATUS_INVALID_PARAMETER
;
1224 cbDest
= cchDest
*sizeof(wchar_t);
1225 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
1231 RtlStringCbVPrintfExA(
1232 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
1234 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1235 _Out_opt_
size_t *pcbRemaining
,
1236 _In_ STRSAFE_DWORD dwFlags
,
1237 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1238 _In_
va_list argList
);
1241 RtlStringCbVPrintfExW(
1242 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
1244 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1245 _Out_opt_
size_t *pcbRemaining
,
1246 _In_ STRSAFE_DWORD dwFlags
,
1247 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1248 _In_
va_list argList
);
1251 RtlStringCbVPrintfExA(
1252 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
1254 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1255 _Out_opt_
size_t *pcbRemaining
,
1256 _In_ STRSAFE_DWORD dwFlags
,
1257 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1258 _In_
va_list argList
)
1262 size_t cchRemaining
= 0;
1263 cchDest
= cbDest
/ sizeof(char);
1264 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1265 Status
= STATUS_INVALID_PARAMETER
;
1267 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
1268 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1272 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
1279 RtlStringCbVPrintfExW(
1280 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
1282 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1283 _Out_opt_
size_t *pcbRemaining
,
1284 _In_ STRSAFE_DWORD dwFlags
,
1285 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1286 _In_
va_list argList
)
1290 size_t cchRemaining
= 0;
1291 cchDest
= cbDest
/ sizeof(wchar_t);
1292 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1293 Status
= STATUS_INVALID_PARAMETER
;
1295 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
1296 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1300 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
1307 _Must_inspect_result_
1309 RtlStringCchLengthA(
1310 _In_reads_or_z_(cchMax
) STRSAFE_LPCSTR psz
,
1311 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
1312 _Out_opt_
_Deref_out_range_(<, cchMax
) _Deref_out_range_(<=, _String_length_(psz
)) size_t *pcchLength
);
1314 _Must_inspect_result_
1316 RtlStringCchLengthW(
1317 _In_reads_or_z_(cchMax
) STRSAFE_LPCWSTR psz
,
1318 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
1319 _Out_opt_
_Deref_out_range_(<, cchMax
) _Deref_out_range_(<=, _String_length_(psz
)) size_t *pcchLength
);
1321 _Must_inspect_result_
1323 RtlStringCchLengthA(
1324 _In_reads_or_z_(cchMax
) STRSAFE_LPCSTR psz
,
1325 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
1326 _Out_opt_
_Deref_out_range_(<, cchMax
) _Deref_out_range_(<=, _String_length_(psz
)) size_t *pcchLength
)
1329 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
1330 Status
= STATUS_INVALID_PARAMETER
;
1332 Status
= RtlStringLengthWorkerA(psz
,cchMax
,pcchLength
);
1333 if (!NT_SUCCESS(Status
) && pcchLength
)
1340 _Must_inspect_result_
1342 RtlStringCchLengthW(
1343 _In_reads_or_z_(cchMax
) STRSAFE_LPCWSTR psz
,
1344 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
1345 _Out_opt_
_Deref_out_range_(<, cchMax
) _Deref_out_range_(<=, _String_length_(psz
)) size_t *pcchLength
)
1348 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
1349 Status
= STATUS_INVALID_PARAMETER
;
1351 Status
= RtlStringLengthWorkerW(psz
,cchMax
,pcchLength
);
1352 if (!NT_SUCCESS(Status
) && pcchLength
)
1359 _Must_inspect_result_
1362 _In_reads_or_z_(cbMax
) STRSAFE_LPCSTR psz
,
1363 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
* sizeof(char)) size_t cbMax
,
1364 _Out_opt_
_Deref_out_range_(<, cbMax
) size_t *pcbLength
);
1366 _Must_inspect_result_
1369 _In_reads_or_z_(cbMax
/ sizeof(wchar_t)) STRSAFE_LPCWSTR psz
,
1370 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
* sizeof(wchar_t)) size_t cbMax
,
1371 _Out_opt_
_Deref_out_range_(<, cbMax
- 1) size_t *pcbLength
);
1373 _Must_inspect_result_
1376 _In_reads_or_z_(cbMax
) STRSAFE_LPCSTR psz
,
1377 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
* sizeof(char)) size_t cbMax
,
1378 _Out_opt_
_Deref_out_range_(<, cbMax
) size_t *pcbLength
)
1382 size_t cchLength
= 0;
1383 cchMax
= cbMax
/ sizeof(char);
1384 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
1385 Status
= STATUS_INVALID_PARAMETER
;
1387 Status
= RtlStringLengthWorkerA(psz
,cchMax
,&cchLength
);
1390 if (NT_SUCCESS(Status
))
1392 *pcbLength
= cchLength
*sizeof(char);
1402 _Must_inspect_result_
1405 _In_reads_or_z_(cbMax
/ sizeof(wchar_t)) STRSAFE_LPCWSTR psz
,
1406 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
* sizeof(wchar_t)) size_t cbMax
,
1407 _Out_opt_
_Deref_out_range_(<, cbMax
- 1) size_t *pcbLength
)
1411 size_t cchLength
= 0;
1412 cchMax
= cbMax
/ sizeof(wchar_t);
1413 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
1414 Status
= STATUS_INVALID_PARAMETER
;
1416 Status
= RtlStringLengthWorkerW(psz
,cchMax
,&cchLength
);
1419 if (NT_SUCCESS(Status
))
1421 *pcbLength
= cchLength
*sizeof(wchar_t);
1431 NTSTRSAFEAPI
RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
)
1433 NTSTATUS Status
= STATUS_SUCCESS
;
1435 Status
= STATUS_INVALID_PARAMETER
;
1438 while(cchDest
&& (*pszSrc
!='\0'))
1440 *pszDest
++ = *pszSrc
++;
1446 Status
= STATUS_BUFFER_OVERFLOW
;
1453 NTSTRSAFEAPI
RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
)
1455 NTSTATUS Status
= STATUS_SUCCESS
;
1457 Status
= STATUS_INVALID_PARAMETER
;
1460 while(cchDest
&& (*pszSrc
!=L
'\0'))
1462 *pszDest
++ = *pszSrc
++;
1468 Status
= STATUS_BUFFER_OVERFLOW
;
1475 NTSTRSAFEAPI
RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1477 NTSTATUS Status
= STATUS_SUCCESS
;
1478 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1479 size_t cchRemaining
= 0;
1480 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1481 Status
= STATUS_INVALID_PARAMETER
;
1484 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1488 if ((cchDest
!=0) || (cbDest
!=0))
1489 Status
= STATUS_INVALID_PARAMETER
;
1494 if (NT_SUCCESS(Status
))
1498 pszDestEnd
= pszDest
;
1503 Status
= STATUS_INVALID_PARAMETER
;
1505 Status
= STATUS_BUFFER_OVERFLOW
;
1510 pszDestEnd
= pszDest
;
1511 cchRemaining
= cchDest
;
1512 while(cchRemaining
&& (*pszSrc
!='\0'))
1514 *pszDestEnd
++ = *pszSrc
++;
1517 if (cchRemaining
> 0)
1519 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1521 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1528 Status
= STATUS_BUFFER_OVERFLOW
;
1534 if (!NT_SUCCESS(Status
))
1538 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1540 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1541 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1543 pszDestEnd
= pszDest
;
1544 cchRemaining
= cchDest
;
1549 pszDestEnd
= pszDest
+ cchDest
- 1;
1554 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1558 pszDestEnd
= pszDest
;
1559 cchRemaining
= cchDest
;
1565 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1568 *ppszDestEnd
= pszDestEnd
;
1570 *pcchRemaining
= cchRemaining
;
1575 NTSTRSAFEAPI
RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1577 NTSTATUS Status
= STATUS_SUCCESS
;
1578 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1579 size_t cchRemaining
= 0;
1580 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1581 Status
= STATUS_INVALID_PARAMETER
;
1584 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1588 if ((cchDest
!=0) || (cbDest
!=0))
1589 Status
= STATUS_INVALID_PARAMETER
;
1594 if (NT_SUCCESS(Status
))
1598 pszDestEnd
= pszDest
;
1603 Status
= STATUS_INVALID_PARAMETER
;
1605 Status
= STATUS_BUFFER_OVERFLOW
;
1610 pszDestEnd
= pszDest
;
1611 cchRemaining
= cchDest
;
1612 while(cchRemaining
&& (*pszSrc
!=L
'\0'))
1614 *pszDestEnd
++ = *pszSrc
++;
1617 if (cchRemaining
> 0)
1619 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1621 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1628 Status
= STATUS_BUFFER_OVERFLOW
;
1630 *pszDestEnd
= L
'\0';
1634 if (!NT_SUCCESS(Status
))
1638 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1640 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1641 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1643 pszDestEnd
= pszDest
;
1644 cchRemaining
= cchDest
;
1649 pszDestEnd
= pszDest
+ cchDest
- 1;
1651 *pszDestEnd
= L
'\0';
1654 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1658 pszDestEnd
= pszDest
;
1659 cchRemaining
= cchDest
;
1660 *pszDestEnd
= L
'\0';
1665 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1668 *ppszDestEnd
= pszDestEnd
;
1670 *pcchRemaining
= cchRemaining
;
1675 NTSTRSAFEAPI
RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchSrc
)
1677 NTSTATUS Status
= STATUS_SUCCESS
;
1679 Status
= STATUS_INVALID_PARAMETER
;
1682 while(cchDest
&& cchSrc
&& (*pszSrc
!='\0'))
1684 *pszDest
++ = *pszSrc
++;
1691 Status
= STATUS_BUFFER_OVERFLOW
;
1698 NTSTRSAFEAPI
RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
)
1700 NTSTATUS Status
= STATUS_SUCCESS
;
1702 Status
= STATUS_INVALID_PARAMETER
;
1705 while(cchDest
&& cchToCopy
&& (*pszSrc
!=L
'\0'))
1707 *pszDest
++ = *pszSrc
++;
1714 Status
= STATUS_BUFFER_OVERFLOW
;
1721 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
)
1723 NTSTATUS Status
= STATUS_SUCCESS
;
1724 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1725 size_t cchRemaining
= 0;
1726 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1727 Status
= STATUS_INVALID_PARAMETER
;
1729 if (cchToCopy
> NTSTRSAFE_MAX_CCH
)
1730 Status
= STATUS_INVALID_PARAMETER
;
1733 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1737 if ((cchDest
!=0) || (cbDest
!=0))
1738 Status
= STATUS_INVALID_PARAMETER
;
1743 if (NT_SUCCESS(Status
))
1747 pszDestEnd
= pszDest
;
1749 if ((cchToCopy
!=0) && (*pszSrc
!='\0'))
1752 Status
= STATUS_INVALID_PARAMETER
;
1754 Status
= STATUS_BUFFER_OVERFLOW
;
1759 pszDestEnd
= pszDest
;
1760 cchRemaining
= cchDest
;
1761 while(cchRemaining
&& cchToCopy
&& (*pszSrc
!='\0'))
1763 *pszDestEnd
++ = *pszSrc
++;
1767 if (cchRemaining
> 0)
1769 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1771 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1778 Status
= STATUS_BUFFER_OVERFLOW
;
1784 if (!NT_SUCCESS(Status
))
1788 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1790 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1791 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1793 pszDestEnd
= pszDest
;
1794 cchRemaining
= cchDest
;
1799 pszDestEnd
= pszDest
+ cchDest
- 1;
1804 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1808 pszDestEnd
= pszDest
;
1809 cchRemaining
= cchDest
;
1815 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1818 *ppszDestEnd
= pszDestEnd
;
1820 *pcchRemaining
= cchRemaining
;
1825 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
)
1827 NTSTATUS Status
= STATUS_SUCCESS
;
1828 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1829 size_t cchRemaining
= 0;
1830 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1831 Status
= STATUS_INVALID_PARAMETER
;
1833 if (cchToCopy
> NTSTRSAFE_MAX_CCH
)
1834 Status
= STATUS_INVALID_PARAMETER
;
1837 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1841 if ((cchDest
!=0) || (cbDest
!=0))
1842 Status
= STATUS_INVALID_PARAMETER
;
1847 if (NT_SUCCESS(Status
))
1851 pszDestEnd
= pszDest
;
1853 if ((cchToCopy
!=0) && (*pszSrc
!=L
'\0'))
1856 Status
= STATUS_INVALID_PARAMETER
;
1858 Status
= STATUS_BUFFER_OVERFLOW
;
1863 pszDestEnd
= pszDest
;
1864 cchRemaining
= cchDest
;
1865 while(cchRemaining
&& cchToCopy
&& (*pszSrc
!=L
'\0'))
1867 *pszDestEnd
++ = *pszSrc
++;
1871 if (cchRemaining
> 0)
1873 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1875 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1882 Status
= STATUS_BUFFER_OVERFLOW
;
1884 *pszDestEnd
= L
'\0';
1888 if (!NT_SUCCESS(Status
))
1892 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1894 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1895 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1897 pszDestEnd
= pszDest
;
1898 cchRemaining
= cchDest
;
1903 pszDestEnd
= pszDest
+ cchDest
- 1;
1905 *pszDestEnd
= L
'\0';
1908 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1912 pszDestEnd
= pszDest
;
1913 cchRemaining
= cchDest
;
1914 *pszDestEnd
= L
'\0';
1919 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1922 *ppszDestEnd
= pszDestEnd
;
1924 *pcchRemaining
= cchRemaining
;
1929 NTSTRSAFEAPI
RtlStringCatWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
)
1932 size_t cchDestLength
;
1933 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1934 if (NT_SUCCESS(Status
))
1935 Status
= RtlStringCopyWorkerA(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
);
1939 NTSTRSAFEAPI
RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
)
1942 size_t cchDestLength
;
1943 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
1944 if (NT_SUCCESS(Status
))
1945 Status
= RtlStringCopyWorkerW(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
);
1949 NTSTRSAFEAPI
RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1951 NTSTATUS Status
= STATUS_SUCCESS
;
1952 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1953 size_t cchRemaining
= 0;
1954 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1955 Status
= STATUS_INVALID_PARAMETER
;
1958 size_t cchDestLength
;
1959 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1963 if ((cchDest
==0) && (cbDest
==0))
1966 Status
= STATUS_INVALID_PARAMETER
;
1970 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1971 if (NT_SUCCESS(Status
))
1973 pszDestEnd
= pszDest
+ cchDestLength
;
1974 cchRemaining
= cchDest
- cchDestLength
;
1982 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
1983 if (NT_SUCCESS(Status
))
1985 pszDestEnd
= pszDest
+ cchDestLength
;
1986 cchRemaining
= cchDest
- cchDestLength
;
1989 if (NT_SUCCESS(Status
))
1996 Status
= STATUS_INVALID_PARAMETER
;
1998 Status
= STATUS_BUFFER_OVERFLOW
;
2002 Status
= RtlStringCopyExWorkerA(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char)),pszSrc
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
2005 if (!NT_SUCCESS(Status
))
2009 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2011 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2012 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2014 pszDestEnd
= pszDest
;
2015 cchRemaining
= cchDest
;
2020 pszDestEnd
= pszDest
+ cchDest
- 1;
2025 if (dwFlags
& STRSAFE_NULL_ON_FAILURE
)
2029 pszDestEnd
= pszDest
;
2030 cchRemaining
= cchDest
;
2036 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2039 *ppszDestEnd
= pszDestEnd
;
2041 *pcchRemaining
= cchRemaining
;
2046 NTSTRSAFEAPI
RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
2048 NTSTATUS Status
= STATUS_SUCCESS
;
2049 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
2050 size_t cchRemaining
= 0;
2051 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2052 Status
= STATUS_INVALID_PARAMETER
;
2055 size_t cchDestLength
;
2056 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2060 if ((cchDest
==0) && (cbDest
==0))
2063 Status
= STATUS_INVALID_PARAMETER
;
2067 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
2068 if (NT_SUCCESS(Status
))
2070 pszDestEnd
= pszDest
+ cchDestLength
;
2071 cchRemaining
= cchDest
- cchDestLength
;
2079 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
2080 if (NT_SUCCESS(Status
))
2082 pszDestEnd
= pszDest
+ cchDestLength
;
2083 cchRemaining
= cchDest
- cchDestLength
;
2086 if (NT_SUCCESS(Status
))
2093 Status
= STATUS_INVALID_PARAMETER
;
2095 Status
= STATUS_BUFFER_OVERFLOW
;
2099 Status
= RtlStringCopyExWorkerW(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)),pszSrc
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
2102 if (!NT_SUCCESS(Status
))
2106 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2108 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2109 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2111 pszDestEnd
= pszDest
;
2112 cchRemaining
= cchDest
;
2117 pszDestEnd
= pszDest
+ cchDest
- 1;
2119 *pszDestEnd
= L
'\0';
2122 if (dwFlags
& STRSAFE_NULL_ON_FAILURE
)
2126 pszDestEnd
= pszDest
;
2127 cchRemaining
= cchDest
;
2128 *pszDestEnd
= L
'\0';
2133 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2136 *ppszDestEnd
= pszDestEnd
;
2138 *pcchRemaining
= cchRemaining
;
2143 NTSTRSAFEAPI
RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
)
2146 size_t cchDestLength
;
2147 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
2148 if (NT_SUCCESS(Status
))
2149 Status
= RtlStringCopyNWorkerA(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
,cchToAppend
);
2153 NTSTRSAFEAPI
RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
)
2156 size_t cchDestLength
;
2157 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
2158 if (NT_SUCCESS(Status
))
2159 Status
= RtlStringCopyNWorkerW(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
,cchToAppend
);
2163 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
)
2165 NTSTATUS Status
= STATUS_SUCCESS
;
2166 STRSAFE_LPSTR pszDestEnd
= pszDest
;
2167 size_t cchRemaining
= 0;
2168 size_t cchDestLength
= 0;
2169 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2170 Status
= STATUS_INVALID_PARAMETER
;
2172 if (cchToAppend
> NTSTRSAFE_MAX_CCH
)
2173 Status
= STATUS_INVALID_PARAMETER
;
2176 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2180 if ((cchDest
==0) && (cbDest
==0))
2183 Status
= STATUS_INVALID_PARAMETER
;
2187 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
2188 if (NT_SUCCESS(Status
))
2190 pszDestEnd
= pszDest
+ cchDestLength
;
2191 cchRemaining
= cchDest
- cchDestLength
;
2199 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
2200 if (NT_SUCCESS(Status
))
2202 pszDestEnd
= pszDest
+ cchDestLength
;
2203 cchRemaining
= cchDest
- cchDestLength
;
2206 if (NT_SUCCESS(Status
))
2210 if ((cchToAppend
!=0) && (*pszSrc
!='\0'))
2213 Status
= STATUS_INVALID_PARAMETER
;
2215 Status
= STATUS_BUFFER_OVERFLOW
;
2219 Status
= RtlStringCopyNExWorkerA(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char)),pszSrc
,cchToAppend
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
2222 if (!NT_SUCCESS(Status
))
2226 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2228 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2229 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2231 pszDestEnd
= pszDest
;
2232 cchRemaining
= cchDest
;
2237 pszDestEnd
= pszDest
+ cchDest
- 1;
2242 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
))
2246 pszDestEnd
= pszDest
;
2247 cchRemaining
= cchDest
;
2253 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2256 *ppszDestEnd
= pszDestEnd
;
2258 *pcchRemaining
= cchRemaining
;
2263 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
)
2265 NTSTATUS Status
= STATUS_SUCCESS
;
2266 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
2267 size_t cchRemaining
= 0;
2268 size_t cchDestLength
= 0;
2269 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2270 Status
= STATUS_INVALID_PARAMETER
;
2272 if (cchToAppend
> NTSTRSAFE_MAX_CCH
)
2273 Status
= STATUS_INVALID_PARAMETER
;
2276 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2280 if ((cchDest
==0) && (cbDest
==0))
2283 Status
= STATUS_INVALID_PARAMETER
;
2287 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
2288 if (NT_SUCCESS(Status
))
2290 pszDestEnd
= pszDest
+ cchDestLength
;
2291 cchRemaining
= cchDest
- cchDestLength
;
2299 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
2300 if (NT_SUCCESS(Status
))
2302 pszDestEnd
= pszDest
+ cchDestLength
;
2303 cchRemaining
= cchDest
- cchDestLength
;
2306 if (NT_SUCCESS(Status
))
2310 if ((cchToAppend
!=0) && (*pszSrc
!=L
'\0'))
2313 Status
= STATUS_INVALID_PARAMETER
;
2315 Status
= STATUS_BUFFER_OVERFLOW
;
2319 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
)));
2322 if (!NT_SUCCESS(Status
))
2326 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2328 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2329 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2331 pszDestEnd
= pszDest
;
2332 cchRemaining
= cchDest
;
2337 pszDestEnd
= pszDest
+ cchDest
- 1;
2339 *pszDestEnd
= L
'\0';
2342 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
))
2346 pszDestEnd
= pszDest
;
2347 cchRemaining
= cchDest
;
2348 *pszDestEnd
= L
'\0';
2353 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2356 *ppszDestEnd
= pszDestEnd
;
2358 *pcchRemaining
= cchRemaining
;
2363 NTSTRSAFEAPI
RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
2365 NTSTATUS Status
= STATUS_SUCCESS
;
2367 Status
= STATUS_INVALID_PARAMETER
;
2372 cchMax
= cchDest
- 1;
2373 iRet
= _vsnprintf(pszDest
,cchMax
,pszFormat
,argList
);
2374 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
2378 Status
= STATUS_BUFFER_OVERFLOW
;
2381 if (((size_t)iRet
)==cchMax
)
2390 NTSTRSAFEAPI
RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
2392 NTSTATUS Status
= STATUS_SUCCESS
;
2394 Status
= STATUS_INVALID_PARAMETER
;
2399 cchMax
= cchDest
- 1;
2400 iRet
= _vsnwprintf(pszDest
,cchMax
,pszFormat
,argList
);
2401 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
2405 Status
= STATUS_BUFFER_OVERFLOW
;
2408 if (((size_t)iRet
)==cchMax
)
2417 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
)
2419 NTSTATUS Status
= STATUS_SUCCESS
;
2420 STRSAFE_LPSTR pszDestEnd
= pszDest
;
2421 size_t cchRemaining
= 0;
2422 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2423 Status
= STATUS_INVALID_PARAMETER
;
2426 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2430 if ((cchDest
!=0) || (cbDest
!=0))
2431 Status
= STATUS_INVALID_PARAMETER
;
2436 if (NT_SUCCESS(Status
))
2440 pszDestEnd
= pszDest
;
2442 if (*pszFormat
!='\0')
2445 Status
= STATUS_INVALID_PARAMETER
;
2447 Status
= STATUS_BUFFER_OVERFLOW
;
2454 cchMax
= cchDest
- 1;
2455 iRet
= _vsnprintf(pszDest
,cchMax
,pszFormat
,argList
);
2456 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
2458 pszDestEnd
= pszDest
+ cchMax
;
2461 Status
= STATUS_BUFFER_OVERFLOW
;
2464 if (((size_t)iRet
)==cchMax
)
2466 pszDestEnd
= pszDest
+ cchMax
;
2471 if (((size_t)iRet
) < cchMax
)
2473 pszDestEnd
= pszDest
+ iRet
;
2474 cchRemaining
= cchDest
- iRet
;
2475 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
2477 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
2483 if (!NT_SUCCESS(Status
))
2487 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2489 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2490 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2492 pszDestEnd
= pszDest
;
2493 cchRemaining
= cchDest
;
2498 pszDestEnd
= pszDest
+ cchDest
- 1;
2503 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
2507 pszDestEnd
= pszDest
;
2508 cchRemaining
= cchDest
;
2514 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2517 *ppszDestEnd
= pszDestEnd
;
2519 *pcchRemaining
= cchRemaining
;
2524 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
)
2526 NTSTATUS Status
= STATUS_SUCCESS
;
2527 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
2528 size_t cchRemaining
= 0;
2529 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2530 Status
= STATUS_INVALID_PARAMETER
;
2533 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2537 if ((cchDest
!=0) || (cbDest
!=0))
2538 Status
= STATUS_INVALID_PARAMETER
;
2543 if (NT_SUCCESS(Status
))
2547 pszDestEnd
= pszDest
;
2549 if (*pszFormat
!=L
'\0')
2552 Status
= STATUS_INVALID_PARAMETER
;
2554 Status
= STATUS_BUFFER_OVERFLOW
;
2561 cchMax
= cchDest
- 1;
2562 iRet
= _vsnwprintf(pszDest
,cchMax
,pszFormat
,argList
);
2563 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
2565 pszDestEnd
= pszDest
+ cchMax
;
2567 *pszDestEnd
= L
'\0';
2568 Status
= STATUS_BUFFER_OVERFLOW
;
2571 if (((size_t)iRet
)==cchMax
)
2573 pszDestEnd
= pszDest
+ cchMax
;
2575 *pszDestEnd
= L
'\0';
2578 if (((size_t)iRet
) < cchMax
)
2580 pszDestEnd
= pszDest
+ iRet
;
2581 cchRemaining
= cchDest
- iRet
;
2582 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
2584 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
2590 if (!NT_SUCCESS(Status
))
2594 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2596 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2597 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2599 pszDestEnd
= pszDest
;
2600 cchRemaining
= cchDest
;
2605 pszDestEnd
= pszDest
+ cchDest
- 1;
2607 *pszDestEnd
= L
'\0';
2610 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
2614 pszDestEnd
= pszDest
;
2615 cchRemaining
= cchDest
;
2616 *pszDestEnd
= L
'\0';
2621 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2624 *ppszDestEnd
= pszDestEnd
;
2626 *pcchRemaining
= cchRemaining
;
2632 RtlStringLengthWorkerA(
2633 _In_reads_or_z_(cchMax
) STRSAFE_LPCSTR psz
,
2634 _In_
_In_range_(<=, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
2635 _Out_opt_
_Deref_out_range_(<, cchMax
) size_t *pcchLength
)
2637 NTSTATUS Status
= STATUS_SUCCESS
;
2638 size_t cchMaxPrev
= cchMax
;
2639 while(cchMax
&& (*psz
!='\0'))
2645 Status
= STATUS_INVALID_PARAMETER
;
2648 if (NT_SUCCESS(Status
))
2649 *pcchLength
= cchMaxPrev
- cchMax
;
2657 RtlStringLengthWorkerW(
2658 _In_reads_or_z_(cchMax
) STRSAFE_LPCWSTR psz
,
2659 _In_
_In_range_(<=, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
2660 _Out_opt_
_Deref_out_range_(<, cchMax
) size_t *pcchLength
)
2662 NTSTATUS Status
= STATUS_SUCCESS
;
2663 size_t cchMaxPrev
= cchMax
;
2664 while(cchMax
&& (*psz
!=L
'\0'))
2670 Status
= STATUS_INVALID_PARAMETER
;
2673 if (NT_SUCCESS(Status
))
2674 *pcchLength
= cchMaxPrev
- cchMax
;
2681 #define RtlStringCopyWorkerA RtlStringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
2682 #define RtlStringCopyWorkerW RtlStringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
2683 #define RtlStringCopyExWorkerA RtlStringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
2684 #define RtlStringCopyExWorkerW RtlStringCopyExWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
2685 #define RtlStringCatWorkerA RtlStringCatWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
2686 #define RtlStringCatWorkerW RtlStringCatWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
2687 #define RtlStringCatExWorkerA RtlStringCatExWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
2688 #define RtlStringCatExWorkerW RtlStringCatExWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
2689 #define RtlStringCatNWorkerA RtlStringCatNWorkerA_instead_use_StringCchCatNA_or_StrincCbCatNA;
2690 #define RtlStringCatNWorkerW RtlStringCatNWorkerW_instead_use_StringCchCatNW_or_StringCbCatNW;
2691 #define RtlStringCatNExWorkerA RtlStringCatNExWorkerA_instead_use_StringCchCatNExA_or_StringCbCatNExA;
2692 #define RtlStringCatNExWorkerW RtlStringCatNExWorkerW_instead_use_StringCchCatNExW_or_StringCbCatNExW;
2693 #define RtlStringVPrintfWorkerA RtlStringVPrintfWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
2694 #define RtlStringVPrintfWorkerW RtlStringVPrintfWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
2695 #define RtlStringVPrintfExWorkerA RtlStringVPrintfExWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
2696 #define RtlStringVPrintfExWorkerW RtlStringVPrintfExWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
2697 #define RtlStringLengthWorkerA RtlStringLengthWorkerA_instead_use_StringCchLengthA_or_StringCbLengthA;
2698 #define RtlStringLengthWorkerW RtlStringLengthWorkerW_instead_use_StringCchLengthW_or_StringCbLengthW;
2701 #pragma warning(pop)
2702 #endif /* _MSC_VER */
2704 #endif /* _NTSTRSAFE_H_INCLUDED_ */