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 NTSTRSAFEVAPI static __inline NTSTATUS __cdecl
34 #define NTSTRSAFE_INLINE_API static __inline NTSTATUS NTAPI
36 #ifndef NTSTRSAFE_MAX_CCH
37 #define NTSTRSAFE_MAX_CCH 2147483647
40 #ifndef NTSTRSAFE_UNICODE_STRING_MAX_CCH
41 #define NTSTRSAFE_UNICODE_STRING_MAX_CCH 32767
44 #ifndef _STRSAFE_H_INCLUDED_
45 #define STRSAFE_IGNORE_NULLS 0x00000100
46 #define STRSAFE_FILL_BEHIND_NULL 0x00000200
47 #define STRSAFE_FILL_ON_FAILURE 0x00000400
48 #define STRSAFE_NULL_ON_FAILURE 0x00000800
49 #define STRSAFE_NO_TRUNCATION 0x00001000
50 #define STRSAFE_IGNORE_NULL_UNICODE_STRINGS 0x00010000
51 #define STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED 0x00020000
53 #define STRSAFE_VALID_FLAGS (0x000000FF | STRSAFE_IGNORE_NULLS | STRSAFE_FILL_BEHIND_NULL | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)
54 #define STRSAFE_UNICODE_STRING_VALID_FLAGS (STRSAFE_VALID_FLAGS | STRSAFE_IGNORE_NULL_UNICODE_STRINGS | STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED)
56 #define STRSAFE_FILL_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_BEHIND_NULL))
57 #define STRSAFE_FAILURE_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_ON_FAILURE))
59 #define STRSAFE_GET_FILL_PATTERN(dwFlags) ((int)((dwFlags) & 0x000000FF))
62 #define STRSAFE_FILL_BEHIND STRSAFE_FILL_BEHIND_NULL
63 #define STRSAFE_ZERO_LENGTH_ON_FAILURE STRSAFE_NULL_ON_FAILURE
65 typedef char *STRSAFE_LPSTR
;
66 typedef const char *STRSAFE_LPCSTR
;
67 typedef wchar_t *STRSAFE_LPWSTR
;
68 typedef const wchar_t *STRSAFE_LPCWSTR
;
70 typedef _Null_terminated_
char *NTSTRSAFE_PSTR
;
71 typedef _Null_terminated_
const char *NTSTRSAFE_PCSTR
;
72 typedef _Null_terminated_
wchar_t *NTSTRSAFE_PWSTR
;
73 typedef _Null_terminated_
const wchar_t *NTSTRSAFE_PCWSTR
;
75 typedef ULONG STRSAFE_DWORD
;
77 NTSTRSAFEAPI
RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest
, size_t cchDest
, STRSAFE_LPCSTR pszSrc
);
78 NTSTRSAFEAPI
RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest
, size_t cchDest
, STRSAFE_LPCWSTR pszSrc
);
79 NTSTRSAFEAPI
RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest
, size_t cchDest
, size_t cbDest
, STRSAFE_LPCSTR pszSrc
, STRSAFE_LPSTR
*ppszDestEnd
, size_t *pcchRemaining
, STRSAFE_DWORD dwFlags
);
80 NTSTRSAFEAPI
RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest
, size_t cchDest
, size_t cbDest
, STRSAFE_LPCWSTR pszSrc
, STRSAFE_LPWSTR
*ppszDestEnd
, size_t *pcchRemaining
, STRSAFE_DWORD dwFlags
);
81 NTSTRSAFEAPI
RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest
, size_t cchDest
, STRSAFE_LPCSTR pszSrc
, size_t cchToCopy
);
82 NTSTRSAFEAPI
RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest
, size_t cchDest
, STRSAFE_LPCWSTR pszSrc
, size_t cchToCopy
);
83 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
);
84 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
);
85 NTSTRSAFEAPI
RtlStringCatWorkerA(STRSAFE_LPSTR pszDest
, size_t cchDest
, STRSAFE_LPCSTR pszSrc
);
86 NTSTRSAFEAPI
RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest
, size_t cchDest
, STRSAFE_LPCWSTR pszSrc
);
87 NTSTRSAFEAPI
RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest
, size_t cchDest
, size_t cbDest
, STRSAFE_LPCSTR pszSrc
, STRSAFE_LPSTR
*ppszDestEnd
, size_t *pcchRemaining
, STRSAFE_DWORD dwFlags
);
88 NTSTRSAFEAPI
RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest
, size_t cchDest
, size_t cbDest
, STRSAFE_LPCWSTR pszSrc
, STRSAFE_LPWSTR
*ppszDestEnd
, size_t *pcchRemaining
, STRSAFE_DWORD dwFlags
);
89 NTSTRSAFEAPI
RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest
, size_t cchDest
, STRSAFE_LPCSTR pszSrc
, size_t cchToAppend
);
90 NTSTRSAFEAPI
RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest
, size_t cchDest
, STRSAFE_LPCWSTR pszSrc
, size_t cchToAppend
);
91 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
);
92 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
);
93 NTSTRSAFEAPI
RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest
, size_t cchDest
, STRSAFE_LPCSTR pszFormat
, va_list argList
);
94 NTSTRSAFEAPI
RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
, size_t cchDest
, STRSAFE_LPCWSTR pszFormat
, va_list argList
);
95 NTSTRSAFEAPI
RtlStringVPrintfWorkerLenW(STRSAFE_LPWSTR pszDest
, size_t cchDest
, STRSAFE_LPCWSTR pszFormat
, size_t* pcchDestNewLen
, va_list argList
);
96 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
);
97 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
);
98 NTSTRSAFEAPI
RtlStringVPrintfExWorkerLenW(STRSAFE_LPWSTR pszDest
, size_t cchDest
, size_t cbDest
, STRSAFE_LPWSTR
*ppszDestEnd
, size_t *pcchRemaining
, STRSAFE_DWORD dwFlags
, STRSAFE_LPCWSTR pszFormat
, size_t* pcchDestNewLen
, va_list argList
);
99 NTSTRSAFEAPI
RtlUnicodeStringValidate(PCUNICODE_STRING SourceString
);
102 RtlStringLengthWorkerA(
103 _In_reads_or_z_(cchMax
) STRSAFE_LPCSTR psz
,
104 _In_
_In_range_(<=, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
105 _Out_opt_
_Deref_out_range_(<, cchMax
) size_t *pcchLength
);
108 RtlStringLengthWorkerW(
109 _In_reads_or_z_(cchMax
) STRSAFE_LPCWSTR psz
,
110 _In_
_In_range_(<=, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
111 _Out_opt_
_Deref_out_range_(<, cchMax
) size_t *pcchLength
);
115 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
117 _In_ NTSTRSAFE_PCSTR pszSrc
);
121 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
123 _In_ NTSTRSAFE_PCWSTR pszSrc
);
127 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
129 _In_ NTSTRSAFE_PCSTR pszSrc
)
131 if (cchDest
> NTSTRSAFE_MAX_CCH
)
136 return STATUS_INVALID_PARAMETER
;
139 return RtlStringCopyWorkerA(pszDest
, cchDest
, pszSrc
);
144 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
146 _In_ NTSTRSAFE_PCWSTR pszSrc
)
148 if (cchDest
> NTSTRSAFE_MAX_CCH
)
153 return STATUS_INVALID_PARAMETER
;
156 return RtlStringCopyWorkerW(pszDest
, cchDest
, pszSrc
);
161 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
163 _In_ NTSTRSAFE_PCSTR pszSrc
);
167 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
169 _In_ NTSTRSAFE_PCWSTR pszSrc
);
173 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
175 _In_ NTSTRSAFE_PCSTR pszSrc
)
177 size_t cchDest
= cbDest
/ sizeof(char);
179 if (cchDest
> NTSTRSAFE_MAX_CCH
)
184 return STATUS_INVALID_PARAMETER
;
186 return RtlStringCopyWorkerA(pszDest
, cbDest
, pszSrc
);
191 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
193 _In_ NTSTRSAFE_PCWSTR pszSrc
)
195 size_t cchDest
= cbDest
/ sizeof(wchar_t);
197 if (cchDest
> NTSTRSAFE_MAX_CCH
)
202 return STATUS_INVALID_PARAMETER
;
204 return RtlStringCopyWorkerW(pszDest
, cchDest
, pszSrc
);
209 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
211 _In_ NTSTRSAFE_PCSTR pszSrc
,
212 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
213 _Out_opt_
size_t *pcchRemaining
,
214 _In_ STRSAFE_DWORD dwFlags
);
218 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
220 _In_ NTSTRSAFE_PCWSTR pszSrc
,
221 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
222 _Out_opt_
size_t *pcchRemaining
,
223 _In_ STRSAFE_DWORD dwFlags
);
227 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
229 _In_ NTSTRSAFE_PCSTR pszSrc
,
230 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
231 _Out_opt_
size_t *pcchRemaining
,
232 _In_ STRSAFE_DWORD dwFlags
)
234 if (cchDest
> NTSTRSAFE_MAX_CCH
)
239 return STATUS_INVALID_PARAMETER
;
242 return RtlStringCopyExWorkerA(pszDest
, cchDest
, cchDest
, pszSrc
, ppszDestEnd
, pcchRemaining
, dwFlags
);
247 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
249 _In_ NTSTRSAFE_PCWSTR pszSrc
,
250 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
251 _Out_opt_
size_t *pcchRemaining
,
252 _In_ STRSAFE_DWORD dwFlags
)
254 size_t cbDest
= cchDest
* sizeof(wchar_t);
256 if (cchDest
> NTSTRSAFE_MAX_CCH
)
261 return STATUS_INVALID_PARAMETER
;
264 return RtlStringCopyExWorkerW(pszDest
, cchDest
, cbDest
, pszSrc
, ppszDestEnd
, pcchRemaining
, dwFlags
);
269 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
271 _In_ NTSTRSAFE_PCSTR pszSrc
,
272 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) STRSAFE_LPSTR
*ppszDestEnd
,
273 _Out_opt_
size_t *pcbRemaining
,
274 _In_ STRSAFE_DWORD dwFlags
);
278 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
280 _In_ NTSTRSAFE_PCWSTR pszSrc
,
281 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
282 _Out_opt_
size_t *pcbRemaining
,
283 _In_ STRSAFE_DWORD dwFlags
);
287 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
289 _In_ NTSTRSAFE_PCSTR pszSrc
,
290 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) STRSAFE_LPSTR
*ppszDestEnd
,
291 _Out_opt_
size_t *pcbRemaining
,
292 _In_ STRSAFE_DWORD dwFlags
)
295 size_t cchDest
= cbDest
/ sizeof(char);
296 size_t cchRemaining
= 0;
298 if (cchDest
> NTSTRSAFE_MAX_CCH
)
303 return STATUS_INVALID_PARAMETER
;
306 Status
= RtlStringCopyExWorkerA(pszDest
, cbDest
, cbDest
, pszSrc
, ppszDestEnd
, &cchRemaining
, dwFlags
);
307 if (NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
)
310 *pcbRemaining
= (cchRemaining
* sizeof(char)) + (cbDest
% sizeof(char));
317 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
319 _In_ NTSTRSAFE_PCWSTR pszSrc
,
320 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
321 _Out_opt_
size_t *pcbRemaining
,
322 _In_ STRSAFE_DWORD dwFlags
)
325 size_t cchDest
= cbDest
/ sizeof(wchar_t);
326 size_t cchRemaining
= 0;
328 if (cchDest
> NTSTRSAFE_MAX_CCH
)
333 return STATUS_INVALID_PARAMETER
;
336 Status
= RtlStringCopyExWorkerW(pszDest
, cchDest
, cbDest
, pszSrc
, ppszDestEnd
, &cchRemaining
, dwFlags
);
337 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
340 *pcbRemaining
= (cchRemaining
* sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
347 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
349 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCSTR pszSrc
,
350 _In_
size_t cchToCopy
);
354 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
356 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCWSTR pszSrc
,
357 _In_
size_t cchToCopy
);
362 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
364 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCSTR pszSrc
,
365 _In_
size_t cchToCopy
)
367 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
372 return STATUS_INVALID_PARAMETER
;
375 return RtlStringCopyNWorkerA(pszDest
, cchDest
, pszSrc
, cchToCopy
);
380 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
382 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCWSTR pszSrc
,
383 _In_
size_t cchToCopy
)
385 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
390 return STATUS_INVALID_PARAMETER
;
393 return RtlStringCopyNWorkerW(pszDest
, cchDest
, pszSrc
, cchToCopy
);
398 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
400 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCSTR pszSrc
,
401 _In_
size_t cbToCopy
);
405 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
407 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCWSTR pszSrc
,
408 _In_
size_t cbToCopy
);
412 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
414 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCSTR pszSrc
,
415 _In_
size_t cbToCopy
)
417 size_t cchDest
= cbDest
/ sizeof(char);
418 size_t cchToCopy
= cbToCopy
/ sizeof(char);
420 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
425 return STATUS_INVALID_PARAMETER
;
428 return RtlStringCopyNWorkerA(pszDest
, cchDest
, pszSrc
, cchToCopy
);
433 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
435 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCWSTR pszSrc
,
436 _In_
size_t cbToCopy
)
438 size_t cchDest
= cbDest
/ sizeof(wchar_t);
439 size_t cchToCopy
= cbToCopy
/ sizeof(wchar_t);
441 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
446 return STATUS_INVALID_PARAMETER
;
449 return RtlStringCopyNWorkerW(pszDest
, cchDest
, pszSrc
, cchToCopy
);
453 RtlStringCchCopyNExA(
454 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
456 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCSTR pszSrc
,
457 _In_
size_t cchToCopy
,
458 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
459 _Out_opt_
size_t *pcchRemaining
,
460 _In_ STRSAFE_DWORD dwFlags
);
463 RtlStringCchCopyNExW(
464 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
466 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCWSTR pszSrc
,
467 _In_
size_t cchToCopy
,
468 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
469 _Out_opt_
size_t *pcchRemaining
,
470 _In_ STRSAFE_DWORD dwFlags
);
473 RtlStringCchCopyNExA(
474 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
476 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCSTR pszSrc
,
477 _In_
size_t cchToCopy
,
478 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
479 _Out_opt_
size_t *pcchRemaining
,
480 _In_ STRSAFE_DWORD dwFlags
)
482 if (cchDest
> NTSTRSAFE_MAX_CCH
)
487 return STATUS_INVALID_PARAMETER
;
490 return RtlStringCopyNExWorkerA(pszDest
, cchDest
, cchDest
, pszSrc
, cchToCopy
, ppszDestEnd
, pcchRemaining
, dwFlags
);
494 RtlStringCchCopyNExW(
495 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
497 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCWSTR pszSrc
,
498 _In_
size_t cchToCopy
,
499 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
500 _Out_opt_
size_t *pcchRemaining
,
501 _In_ STRSAFE_DWORD dwFlags
)
503 if (cchDest
> NTSTRSAFE_MAX_CCH
)
508 return STATUS_INVALID_PARAMETER
;
511 return RtlStringCopyNExWorkerW(pszDest
, cchDest
, cchDest
* sizeof(wchar_t), pszSrc
, cchToCopy
, ppszDestEnd
, pcchRemaining
, dwFlags
);
516 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
518 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCSTR pszSrc
,
519 _In_
size_t cbToCopy
,
520 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
521 _Out_opt_
size_t *pcbRemaining
,
522 _In_ STRSAFE_DWORD dwFlags
);
526 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
528 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCWSTR pszSrc
,
529 _In_
size_t cbToCopy
,
530 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
531 _Out_opt_
size_t *pcbRemaining
,
532 _In_ STRSAFE_DWORD dwFlags
);
536 _Out_writes_bytes_(cbDest
) STRSAFE_LPSTR pszDest
,
538 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCSTR pszSrc
,
539 _In_
size_t cbToCopy
,
540 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) STRSAFE_LPSTR
*ppszDestEnd
,
541 _Out_opt_
size_t *pcbRemaining
,
542 _In_ STRSAFE_DWORD dwFlags
)
545 size_t cchRemaining
= 0;
547 if (cbDest
> NTSTRSAFE_MAX_CCH
)
549 if ((pszDest
!= NULL
) && (cbDest
> 0))
552 return STATUS_INVALID_PARAMETER
;
555 Status
= RtlStringCopyNExWorkerA(pszDest
, cbDest
, cbDest
, pszSrc
, cbToCopy
, ppszDestEnd
, &cchRemaining
, dwFlags
);
556 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
557 *pcbRemaining
= cchRemaining
;
564 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
566 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCWSTR pszSrc
,
567 _In_
size_t cbToCopy
,
568 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
569 _Out_opt_
size_t *pcbRemaining
,
570 _In_ STRSAFE_DWORD dwFlags
)
573 size_t cchDest
= cbDest
/ sizeof(wchar_t);
574 size_t cchToCopy
= cbToCopy
/ sizeof(wchar_t);
575 size_t cchRemaining
= 0;
577 if (cchDest
> NTSTRSAFE_MAX_CCH
)
579 if ((pszDest
!= NULL
) && (cbDest
> 0))
582 return STATUS_INVALID_PARAMETER
;
585 Status
= RtlStringCopyNExWorkerW(pszDest
, cchDest
, cbDest
, pszSrc
, cchToCopy
, ppszDestEnd
, &cchRemaining
, dwFlags
);
586 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
587 *pcbRemaining
= (cchRemaining
* sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
594 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
596 _In_ NTSTRSAFE_PCSTR pszSrc
);
600 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
602 _In_ NTSTRSAFE_PCWSTR pszSrc
);
606 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
608 _In_ NTSTRSAFE_PCSTR pszSrc
)
610 if (cchDest
> NTSTRSAFE_MAX_CCH
)
611 return STATUS_INVALID_PARAMETER
;
613 return RtlStringCatWorkerA(pszDest
, cchDest
, pszSrc
);
618 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
620 _In_ NTSTRSAFE_PCWSTR pszSrc
)
622 if (cchDest
> NTSTRSAFE_MAX_CCH
)
623 return STATUS_INVALID_PARAMETER
;
625 return RtlStringCatWorkerW(pszDest
, cchDest
, pszSrc
);
630 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
632 _In_ NTSTRSAFE_PCSTR pszSrc
);
636 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
638 _In_ NTSTRSAFE_PCWSTR pszSrc
);
642 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
644 _In_ NTSTRSAFE_PCSTR pszSrc
)
646 if (cbDest
> NTSTRSAFE_MAX_CCH
)
647 return STATUS_INVALID_PARAMETER
;
648 return RtlStringCatWorkerA(pszDest
, cbDest
, pszSrc
);
653 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
655 _In_ NTSTRSAFE_PCWSTR pszSrc
)
657 size_t cchDest
= cbDest
/ sizeof(wchar_t);
659 if (cchDest
> NTSTRSAFE_MAX_CCH
)
660 return STATUS_INVALID_PARAMETER
;
662 return RtlStringCatWorkerW(pszDest
, cchDest
, pszSrc
);
667 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
669 _In_ NTSTRSAFE_PCSTR pszSrc
,
670 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
671 _Out_opt_
size_t *pcchRemaining
,
672 _In_ STRSAFE_DWORD dwFlags
);
676 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
678 _In_ NTSTRSAFE_PCWSTR pszSrc
,
679 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
680 _Out_opt_
size_t *pcchRemaining
,
681 _In_ STRSAFE_DWORD dwFlags
);
685 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
687 _In_ NTSTRSAFE_PCSTR pszSrc
,
688 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
689 _Out_opt_
size_t *pcchRemaining
,
690 _In_ STRSAFE_DWORD dwFlags
)
692 if (cchDest
> NTSTRSAFE_MAX_CCH
)
693 return STATUS_INVALID_PARAMETER
;
695 return RtlStringCatExWorkerA(pszDest
, cchDest
, cchDest
, pszSrc
, ppszDestEnd
, pcchRemaining
, dwFlags
);
700 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
702 _In_ NTSTRSAFE_PCWSTR pszSrc
,
703 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
704 _Out_opt_
size_t *pcchRemaining
,
705 _In_ STRSAFE_DWORD dwFlags
)
707 size_t cbDest
= cchDest
* sizeof(wchar_t);
709 if (cchDest
> NTSTRSAFE_MAX_CCH
)
710 return STATUS_INVALID_PARAMETER
;
712 return RtlStringCatExWorkerW(pszDest
, cchDest
, cbDest
, pszSrc
, ppszDestEnd
, pcchRemaining
, dwFlags
);
717 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
719 _In_ NTSTRSAFE_PCSTR pszSrc
,
720 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
721 _Out_opt_
size_t *pcbRemaining
,
722 _In_ STRSAFE_DWORD dwFlags
);
726 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
728 _In_ NTSTRSAFE_PCWSTR pszSrc
,
729 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
730 _Out_opt_
size_t *pcbRemaining
,
731 _In_ STRSAFE_DWORD dwFlags
);
735 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
737 _In_ NTSTRSAFE_PCSTR pszSrc
,
738 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
739 _Out_opt_
size_t *pcbRemaining
,
740 _In_ STRSAFE_DWORD dwFlags
)
743 size_t cchRemaining
= 0;
745 if (cbDest
> NTSTRSAFE_MAX_CCH
)
746 Status
= STATUS_INVALID_PARAMETER
;
748 Status
= RtlStringCatExWorkerA(pszDest
, cbDest
, cbDest
, pszSrc
, ppszDestEnd
, &cchRemaining
, dwFlags
);
750 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
751 *pcbRemaining
= (cchRemaining
* sizeof(char)) + (cbDest
% sizeof(char));
758 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
760 _In_ NTSTRSAFE_PCWSTR pszSrc
,
761 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
762 _Out_opt_
size_t *pcbRemaining
,
763 _In_ STRSAFE_DWORD dwFlags
)
766 size_t cchDest
= cbDest
/ sizeof(wchar_t);
767 size_t cchRemaining
= 0;
769 if (cchDest
> NTSTRSAFE_MAX_CCH
)
770 Status
= STATUS_INVALID_PARAMETER
;
772 Status
= RtlStringCatExWorkerW(pszDest
, cchDest
, cbDest
, pszSrc
, ppszDestEnd
, &cchRemaining
, dwFlags
);
774 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
775 *pcbRemaining
= (cchRemaining
* sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
782 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
784 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCSTR pszSrc
,
785 _In_
size_t cchToAppend
);
789 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
791 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCWSTR pszSrc
,
792 _In_
size_t cchToAppend
);
796 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
798 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCSTR pszSrc
,
799 _In_
size_t cchToAppend
)
801 if (cchDest
> NTSTRSAFE_MAX_CCH
)
802 return STATUS_INVALID_PARAMETER
;
804 return RtlStringCatNWorkerA(pszDest
, cchDest
, pszSrc
, cchToAppend
);
809 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
811 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCWSTR pszSrc
,
812 _In_
size_t cchToAppend
)
814 if (cchDest
> NTSTRSAFE_MAX_CCH
)
815 return STATUS_INVALID_PARAMETER
;
817 return RtlStringCatNWorkerW(pszDest
, cchDest
, pszSrc
, cchToAppend
);
822 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
824 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCSTR pszSrc
,
825 _In_
size_t cbToAppend
);
829 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
831 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCWSTR pszSrc
,
832 _In_
size_t cbToAppend
);
836 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
838 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCSTR pszSrc
,
839 _In_
size_t cbToAppend
)
841 if (cbDest
> NTSTRSAFE_MAX_CCH
)
842 return STATUS_INVALID_PARAMETER
;
844 return RtlStringCatNWorkerA(pszDest
, cbDest
, pszSrc
, cbToAppend
);
849 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
851 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCWSTR pszSrc
,
852 _In_
size_t cbToAppend
)
854 size_t cchDest
= cbDest
/ sizeof(wchar_t);
855 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
857 if (cchDest
> NTSTRSAFE_MAX_CCH
)
858 return STATUS_INVALID_PARAMETER
;
860 return RtlStringCatNWorkerW(pszDest
, cchDest
, pszSrc
, cchToAppend
);
865 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
867 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCSTR pszSrc
,
868 _In_
size_t cchToAppend
,
869 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
870 _Out_opt_
size_t *pcchRemaining
,
871 _In_ STRSAFE_DWORD dwFlags
);
875 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
877 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCWSTR pszSrc
,
878 _In_
size_t cchToAppend
,
879 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
880 _Out_opt_
size_t *pcchRemaining
,
881 _In_ STRSAFE_DWORD dwFlags
);
885 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
887 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCSTR pszSrc
,
888 _In_
size_t cchToAppend
,
889 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
890 _Out_opt_
size_t *pcchRemaining
,
891 _In_ STRSAFE_DWORD dwFlags
)
893 if (cchDest
> NTSTRSAFE_MAX_CCH
)
894 return STATUS_INVALID_PARAMETER
;
896 return RtlStringCatNExWorkerA(pszDest
, cchDest
, cchDest
, pszSrc
, cchToAppend
, ppszDestEnd
, pcchRemaining
, dwFlags
);
901 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
903 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCWSTR pszSrc
,
904 _In_
size_t cchToAppend
,
905 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
906 _Out_opt_
size_t *pcchRemaining
,
907 _In_ STRSAFE_DWORD dwFlags
)
909 if (cchDest
> NTSTRSAFE_MAX_CCH
)
910 return STATUS_INVALID_PARAMETER
;
912 return RtlStringCatNExWorkerW(pszDest
, cchDest
, (cchDest
* sizeof(wchar_t)), pszSrc
, cchToAppend
, ppszDestEnd
, pcchRemaining
, dwFlags
);
917 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
919 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCSTR pszSrc
,
920 _In_
size_t cbToAppend
,
921 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
922 _Out_opt_
size_t *pcbRemaining
,
923 _In_ STRSAFE_DWORD dwFlags
);
927 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
929 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCWSTR pszSrc
,
930 _In_
size_t cbToAppend
,
931 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
932 _Out_opt_
size_t *pcbRemaining
,
933 _In_ STRSAFE_DWORD dwFlags
);
937 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
939 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCSTR pszSrc
,
940 _In_
size_t cbToAppend
,
941 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
942 _Out_opt_
size_t *pcbRemaining
,
943 _In_ STRSAFE_DWORD dwFlags
)
946 size_t cchRemaining
= 0;
948 if (cbDest
> NTSTRSAFE_MAX_CCH
)
949 Status
= STATUS_INVALID_PARAMETER
;
951 Status
= RtlStringCatNExWorkerA(pszDest
, cbDest
, cbDest
, pszSrc
, cbToAppend
, ppszDestEnd
, &cchRemaining
, dwFlags
);
953 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
954 *pcbRemaining
= (cchRemaining
* sizeof(char)) + (cbDest
% sizeof(char));
961 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
963 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCWSTR pszSrc
,
964 _In_
size_t cbToAppend
,
965 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
966 _Out_opt_
size_t *pcbRemaining
,
967 _In_ STRSAFE_DWORD dwFlags
)
970 size_t cchDest
= cbDest
/ sizeof(wchar_t);
971 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
972 size_t cchRemaining
= 0;
974 if (cchDest
> NTSTRSAFE_MAX_CCH
)
975 Status
= STATUS_INVALID_PARAMETER
;
977 Status
= RtlStringCatNExWorkerW(pszDest
, cchDest
, cbDest
, pszSrc
, cchToAppend
, ppszDestEnd
, &cchRemaining
, dwFlags
);
979 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
980 *pcbRemaining
= (cchRemaining
* sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
986 RtlStringCchVPrintfA(
987 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
989 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
990 _In_
va_list argList
);
993 RtlStringCchVPrintfW(
994 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
996 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
997 _In_
va_list argList
);
1000 RtlStringCchVPrintfA(
1001 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1002 _In_
size_t cchDest
,
1003 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1004 _In_
va_list argList
)
1006 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1011 return STATUS_INVALID_PARAMETER
;
1014 return RtlStringVPrintfWorkerA(pszDest
, cchDest
, pszFormat
, argList
);
1018 RtlStringCchVPrintfW(
1019 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1020 _In_
size_t cchDest
,
1021 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1022 _In_
va_list argList
)
1024 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1029 return STATUS_INVALID_PARAMETER
;
1032 return RtlStringVPrintfWorkerW(pszDest
, cchDest
, pszFormat
, argList
);
1036 RtlStringCbVPrintfA(
1037 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1039 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1040 _In_
va_list argList
);
1043 RtlStringCbVPrintfW(
1044 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1046 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1047 _In_
va_list argList
);
1050 RtlStringCbVPrintfA(
1051 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1053 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1054 _In_
va_list argList
)
1056 if (cbDest
> NTSTRSAFE_MAX_CCH
)
1061 return STATUS_INVALID_PARAMETER
;
1064 return RtlStringVPrintfWorkerA(pszDest
, cbDest
, pszFormat
, argList
);
1068 RtlStringCbVPrintfW(
1069 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1071 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1072 _In_
va_list argList
)
1074 size_t cchDest
= cbDest
/ sizeof(wchar_t);
1076 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1080 return STATUS_INVALID_PARAMETER
;
1083 return RtlStringVPrintfWorkerW(pszDest
, cchDest
, pszFormat
, argList
);
1087 RtlStringCchPrintfA(
1088 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1089 _In_
size_t cchDest
,
1090 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1094 RtlStringCchPrintfW(
1095 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1096 _In_
size_t cchDest
,
1097 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1101 RtlStringCchPrintfA(
1102 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1103 _In_
size_t cchDest
,
1104 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1110 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1115 return STATUS_INVALID_PARAMETER
;
1118 va_start(argList
, pszFormat
);
1119 Status
= RtlStringVPrintfWorkerA(pszDest
, cchDest
, pszFormat
, argList
);
1126 RtlStringCchPrintfW(
1127 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1128 _In_
size_t cchDest
,
1129 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1135 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1139 return STATUS_INVALID_PARAMETER
;
1142 va_start(argList
, pszFormat
);
1143 Status
= RtlStringVPrintfWorkerW(pszDest
, cchDest
, pszFormat
, argList
);
1151 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1153 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1158 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1160 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1165 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1167 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1173 if (cbDest
> NTSTRSAFE_MAX_CCH
)
1178 return STATUS_INVALID_PARAMETER
;
1181 va_start(argList
, pszFormat
);
1182 Status
= RtlStringVPrintfWorkerA(pszDest
, cbDest
, pszFormat
, argList
);
1190 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1192 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1197 size_t cchDest
= cbDest
/ sizeof(wchar_t);
1199 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1203 return STATUS_INVALID_PARAMETER
;
1206 va_start(argList
, pszFormat
);
1207 Status
= RtlStringVPrintfWorkerW(pszDest
, cchDest
, pszFormat
, argList
);
1214 RtlStringCchPrintfExA(
1215 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1216 _In_
size_t cchDest
,
1217 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1218 _Out_opt_
size_t *pcchRemaining
,
1219 _In_ STRSAFE_DWORD dwFlags
,
1220 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1224 RtlStringCchPrintfExW(
1225 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1226 _In_
size_t cchDest
,
1227 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1228 _Out_opt_
size_t *pcchRemaining
,
1229 _In_ STRSAFE_DWORD dwFlags
,
1230 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1234 RtlStringCchPrintfExA(
1235 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1236 _In_
size_t cchDest
,
1237 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1238 _Out_opt_
size_t *pcchRemaining
,
1239 _In_ STRSAFE_DWORD dwFlags
,
1240 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1246 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1251 return STATUS_INVALID_PARAMETER
;
1254 va_start(argList
, pszFormat
);
1255 Status
= RtlStringVPrintfExWorkerA(pszDest
, cchDest
, cchDest
, ppszDestEnd
, pcchRemaining
, dwFlags
, pszFormat
, argList
);
1262 RtlStringCchPrintfExW(
1263 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1264 _In_
size_t cchDest
,
1265 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1266 _Out_opt_
size_t *pcchRemaining
,
1267 _In_ STRSAFE_DWORD dwFlags
,
1268 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1272 size_t cbDest
= cchDest
* sizeof(wchar_t);
1275 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1279 return STATUS_INVALID_PARAMETER
;
1282 va_start(argList
, pszFormat
);
1283 Status
= RtlStringVPrintfExWorkerW(pszDest
, cchDest
, cbDest
, ppszDestEnd
, pcchRemaining
, dwFlags
, pszFormat
, argList
);
1290 RtlStringCbPrintfExA(
1291 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1293 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1294 _Out_opt_
size_t *pcbRemaining
,
1295 _In_ STRSAFE_DWORD dwFlags
,
1296 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1300 RtlStringCbPrintfExW(
1301 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1303 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1304 _Out_opt_
size_t *pcbRemaining
,
1305 _In_ STRSAFE_DWORD dwFlags
,
1306 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1310 RtlStringCbPrintfExA(
1311 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1313 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1314 _Out_opt_
size_t *pcbRemaining
,
1315 _In_ STRSAFE_DWORD dwFlags
,
1316 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1321 size_t cchRemaining
= 0;
1323 cchDest
= cbDest
/ sizeof(char);
1324 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1329 return STATUS_INVALID_PARAMETER
;
1334 va_start(argList
, pszFormat
);
1335 Status
= RtlStringVPrintfExWorkerA(pszDest
, cchDest
, cbDest
, ppszDestEnd
, &cchRemaining
, dwFlags
, pszFormat
, argList
);
1339 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
1343 *pcbRemaining
= (cchRemaining
* sizeof(char)) + (cbDest
% sizeof(char));
1351 RtlStringCbPrintfExW(
1352 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1354 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1355 _Out_opt_
size_t *pcbRemaining
,
1356 _In_ STRSAFE_DWORD dwFlags
,
1357 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1362 size_t cchRemaining
= 0;
1363 cchDest
= cbDest
/ sizeof(wchar_t);
1365 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1369 return STATUS_INVALID_PARAMETER
;
1374 va_start(argList
, pszFormat
);
1375 Status
= RtlStringVPrintfExWorkerW(pszDest
, cchDest
, cbDest
, ppszDestEnd
, &cchRemaining
, dwFlags
, pszFormat
, argList
);
1379 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
1383 *pcbRemaining
= (cchRemaining
* sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
1390 RtlStringCchVPrintfExA(
1391 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1392 _In_
size_t cchDest
,
1393 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1394 _Out_opt_
size_t *pcchRemaining
,
1395 _In_ STRSAFE_DWORD dwFlags
,
1396 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1397 _In_
va_list argList
);
1400 RtlStringCchVPrintfExW(
1401 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1402 _In_
size_t cchDest
,
1403 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1404 _Out_opt_
size_t *pcchRemaining
,
1405 _In_ STRSAFE_DWORD dwFlags
,
1406 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1407 _In_
va_list argList
);
1410 RtlStringCchVPrintfExA(
1411 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1412 _In_
size_t cchDest
,
1413 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1414 _Out_opt_
size_t *pcchRemaining
,
1415 _In_ STRSAFE_DWORD dwFlags
,
1416 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1417 _In_
va_list argList
)
1421 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1426 return STATUS_INVALID_PARAMETER
;
1431 cbDest
= cchDest
* sizeof(char);
1432 Status
= RtlStringVPrintfExWorkerA(pszDest
, cchDest
, cbDest
, ppszDestEnd
, pcchRemaining
, dwFlags
, pszFormat
, argList
);
1439 RtlStringCchVPrintfExW(
1440 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1441 _In_
size_t cchDest
,
1442 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1443 _Out_opt_
size_t *pcchRemaining
,
1444 _In_ STRSAFE_DWORD dwFlags
,
1445 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1446 _In_
va_list argList
)
1450 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1455 return STATUS_INVALID_PARAMETER
;
1460 cbDest
= cchDest
* sizeof(wchar_t);
1461 Status
= RtlStringVPrintfExWorkerW(pszDest
, cchDest
, cbDest
, ppszDestEnd
, pcchRemaining
, dwFlags
, pszFormat
, argList
);
1468 RtlStringCbVPrintfExA(
1469 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
1471 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1472 _Out_opt_
size_t *pcbRemaining
,
1473 _In_ STRSAFE_DWORD dwFlags
,
1474 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1475 _In_
va_list argList
);
1478 RtlStringCbVPrintfExW(
1479 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
1481 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1482 _Out_opt_
size_t *pcbRemaining
,
1483 _In_ STRSAFE_DWORD dwFlags
,
1484 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1485 _In_
va_list argList
);
1488 RtlStringCbVPrintfExA(
1489 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
1491 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1492 _Out_opt_
size_t *pcbRemaining
,
1493 _In_ STRSAFE_DWORD dwFlags
,
1494 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1495 _In_
va_list argList
)
1499 size_t cchRemaining
= 0;
1500 cchDest
= cbDest
/ sizeof(char);
1502 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1503 Status
= STATUS_INVALID_PARAMETER
;
1505 Status
= RtlStringVPrintfExWorkerA(pszDest
, cchDest
, cbDest
, ppszDestEnd
, &cchRemaining
, dwFlags
, pszFormat
, argList
);
1507 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
1511 *pcbRemaining
= (cchRemaining
* sizeof(char)) + (cbDest
% sizeof(char));
1519 RtlStringCbVPrintfExW(
1520 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
1522 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1523 _Out_opt_
size_t *pcbRemaining
,
1524 _In_ STRSAFE_DWORD dwFlags
,
1525 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1526 _In_
va_list argList
)
1530 size_t cchRemaining
= 0;
1531 cchDest
= cbDest
/ sizeof(wchar_t);
1533 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1534 Status
= STATUS_INVALID_PARAMETER
;
1536 Status
= RtlStringVPrintfExWorkerW(pszDest
, cchDest
, cbDest
, ppszDestEnd
, &cchRemaining
, dwFlags
, pszFormat
, argList
);
1538 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
1542 *pcbRemaining
= (cchRemaining
* sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
1550 _Must_inspect_result_
1552 RtlStringCchLengthA(
1553 _In_reads_or_z_(cchMax
) STRSAFE_LPCSTR psz
,
1554 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
1555 _Out_opt_
_Deref_out_range_(< , cchMax
) _Deref_out_range_(<= , _String_length_(psz
)) size_t *pcchLength
);
1557 _Must_inspect_result_
1559 RtlStringCchLengthW(
1560 _In_reads_or_z_(cchMax
) STRSAFE_LPCWSTR psz
,
1561 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
1562 _Out_opt_
_Deref_out_range_(< , cchMax
) _Deref_out_range_(<= , _String_length_(psz
)) size_t *pcchLength
);
1564 _Must_inspect_result_
1566 RtlStringCchLengthA(
1567 _In_reads_or_z_(cchMax
) STRSAFE_LPCSTR psz
,
1568 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
1569 _Out_opt_
_Deref_out_range_(< , cchMax
) _Deref_out_range_(<= , _String_length_(psz
)) size_t *pcchLength
)
1573 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
1574 Status
= STATUS_INVALID_PARAMETER
;
1576 Status
= RtlStringLengthWorkerA(psz
, cchMax
, pcchLength
);
1578 if (!NT_SUCCESS(Status
) && pcchLength
)
1586 _Must_inspect_result_
1588 RtlStringCchLengthW(
1589 _In_reads_or_z_(cchMax
) STRSAFE_LPCWSTR psz
,
1590 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
1591 _Out_opt_
_Deref_out_range_(< , cchMax
) _Deref_out_range_(<= , _String_length_(psz
)) size_t *pcchLength
)
1595 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
1596 Status
= STATUS_INVALID_PARAMETER
;
1598 Status
= RtlStringLengthWorkerW(psz
, cchMax
, pcchLength
);
1600 if (!NT_SUCCESS(Status
) && pcchLength
)
1608 _Must_inspect_result_
1611 _In_reads_or_z_(cbMax
) STRSAFE_LPCSTR psz
,
1612 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
* sizeof(char)) size_t cbMax
,
1613 _Out_opt_
_Deref_out_range_(< , cbMax
) size_t *pcbLength
);
1615 _Must_inspect_result_
1618 _In_reads_or_z_(cbMax
/ sizeof(wchar_t)) STRSAFE_LPCWSTR psz
,
1619 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
* sizeof(wchar_t)) size_t cbMax
,
1620 _Out_opt_
_Deref_out_range_(< , cbMax
- 1) size_t *pcbLength
);
1622 _Must_inspect_result_
1625 _In_reads_or_z_(cbMax
) STRSAFE_LPCSTR psz
,
1626 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
* sizeof(char)) size_t cbMax
,
1627 _Out_opt_
_Deref_out_range_(< , cbMax
) size_t *pcbLength
)
1631 size_t cchLength
= 0;
1632 cchMax
= cbMax
/ sizeof(char);
1634 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
1635 Status
= STATUS_INVALID_PARAMETER
;
1637 Status
= RtlStringLengthWorkerA(psz
, cchMax
, &cchLength
);
1641 if (NT_SUCCESS(Status
))
1643 *pcbLength
= cchLength
* sizeof(char);
1654 _Must_inspect_result_
1657 _In_reads_or_z_(cbMax
/ sizeof(wchar_t)) STRSAFE_LPCWSTR psz
,
1658 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
* sizeof(wchar_t)) size_t cbMax
,
1659 _Out_opt_
_Deref_out_range_(< , cbMax
- 1) size_t *pcbLength
)
1663 size_t cchLength
= 0;
1664 cchMax
= cbMax
/ sizeof(wchar_t);
1666 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
1667 Status
= STATUS_INVALID_PARAMETER
;
1669 Status
= RtlStringLengthWorkerW(psz
, cchMax
, &cchLength
);
1673 if (NT_SUCCESS(Status
))
1675 *pcbLength
= cchLength
* sizeof(wchar_t);
1686 NTSTRSAFEAPI
RtlStringCopyWorkerA(
1687 STRSAFE_LPSTR pszDest
,
1689 STRSAFE_LPCSTR pszSrc
)
1691 NTSTATUS Status
= STATUS_SUCCESS
;
1695 Status
= STATUS_INVALID_PARAMETER
;
1699 while (cchDest
&& (*pszSrc
!= '\0'))
1701 *pszDest
++ = *pszSrc
++;
1708 Status
= STATUS_BUFFER_OVERFLOW
;
1717 NTSTRSAFEAPI
RtlStringCopyWorkerW(
1718 STRSAFE_LPWSTR pszDest
,
1720 STRSAFE_LPCWSTR pszSrc
)
1722 NTSTATUS Status
= STATUS_SUCCESS
;
1726 Status
= STATUS_INVALID_PARAMETER
;
1730 while (cchDest
&& (*pszSrc
!= L
'\0'))
1732 *pszDest
++ = *pszSrc
++;
1739 Status
= STATUS_BUFFER_OVERFLOW
;
1748 NTSTRSAFEAPI
RtlStringCopyExWorkerA(
1749 STRSAFE_LPSTR pszDest
,
1752 STRSAFE_LPCSTR pszSrc
,
1753 STRSAFE_LPSTR
*ppszDestEnd
,
1754 size_t *pcchRemaining
,
1755 STRSAFE_DWORD dwFlags
)
1757 NTSTATUS Status
= STATUS_SUCCESS
;
1758 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1759 size_t cchRemaining
= 0;
1761 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1763 Status
= STATUS_INVALID_PARAMETER
;
1767 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1771 if ((cchDest
!= 0) || (cbDest
!= 0))
1772 Status
= STATUS_INVALID_PARAMETER
;
1779 if (NT_SUCCESS(Status
))
1783 pszDestEnd
= pszDest
;
1786 if (*pszSrc
!= '\0')
1789 Status
= STATUS_INVALID_PARAMETER
;
1791 Status
= STATUS_BUFFER_OVERFLOW
;
1796 pszDestEnd
= pszDest
;
1797 cchRemaining
= cchDest
;
1799 while (cchRemaining
&& (*pszSrc
!= '\0'))
1801 *pszDestEnd
++ = *pszSrc
++;
1805 if (cchRemaining
> 0)
1807 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1809 memset(pszDestEnd
+ 1, STRSAFE_GET_FILL_PATTERN(dwFlags
), ((cchRemaining
- 1) * sizeof(char)) + (cbDest
% sizeof(char)));
1816 Status
= STATUS_BUFFER_OVERFLOW
;
1824 if (!NT_SUCCESS(Status
))
1828 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1830 memset(pszDest
, STRSAFE_GET_FILL_PATTERN(dwFlags
), cbDest
);
1831 if (STRSAFE_GET_FILL_PATTERN(dwFlags
) == 0)
1833 pszDestEnd
= pszDest
;
1834 cchRemaining
= cchDest
;
1836 else if (cchDest
> 0)
1838 pszDestEnd
= pszDest
+ cchDest
- 1;
1844 if ((dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) && cchDest
> 0)
1846 pszDestEnd
= pszDest
;
1847 cchRemaining
= cchDest
;
1853 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
1856 *ppszDestEnd
= pszDestEnd
;
1859 *pcchRemaining
= cchRemaining
;
1865 NTSTRSAFEAPI
RtlStringCopyExWorkerW(
1866 STRSAFE_LPWSTR pszDest
,
1869 STRSAFE_LPCWSTR pszSrc
,
1870 STRSAFE_LPWSTR
*ppszDestEnd
,
1871 size_t *pcchRemaining
,
1872 STRSAFE_DWORD dwFlags
)
1874 NTSTATUS Status
= STATUS_SUCCESS
;
1875 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1876 size_t cchRemaining
= 0;
1878 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1880 Status
= STATUS_INVALID_PARAMETER
;
1884 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1888 if ((cchDest
!= 0) || (cbDest
!= 0))
1889 Status
= STATUS_INVALID_PARAMETER
;
1896 if (NT_SUCCESS(Status
))
1900 pszDestEnd
= pszDest
;
1903 if (*pszSrc
!= L
'\0')
1906 Status
= STATUS_INVALID_PARAMETER
;
1908 Status
= STATUS_BUFFER_OVERFLOW
;
1913 pszDestEnd
= pszDest
;
1914 cchRemaining
= cchDest
;
1916 while (cchRemaining
&& (*pszSrc
!= L
'\0'))
1918 *pszDestEnd
++ = *pszSrc
++;
1922 if (cchRemaining
> 0)
1924 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1926 memset(pszDestEnd
+ 1, STRSAFE_GET_FILL_PATTERN(dwFlags
), ((cchRemaining
- 1) * sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1933 Status
= STATUS_BUFFER_OVERFLOW
;
1936 *pszDestEnd
= L
'\0';
1941 if (!NT_SUCCESS(Status
))
1945 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1947 memset(pszDest
, STRSAFE_GET_FILL_PATTERN(dwFlags
), cbDest
);
1949 if (STRSAFE_GET_FILL_PATTERN(dwFlags
) == 0)
1951 pszDestEnd
= pszDest
;
1952 cchRemaining
= cchDest
;
1954 else if (cchDest
> 0)
1956 pszDestEnd
= pszDest
+ cchDest
- 1;
1958 *pszDestEnd
= L
'\0';
1962 if ((dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
)) && cchDest
> 0)
1964 pszDestEnd
= pszDest
;
1965 cchRemaining
= cchDest
;
1966 *pszDestEnd
= L
'\0';
1971 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
1974 *ppszDestEnd
= pszDestEnd
;
1977 *pcchRemaining
= cchRemaining
;
1983 NTSTRSAFEAPI
RtlStringCopyNWorkerA(
1984 STRSAFE_LPSTR pszDest
,
1986 STRSAFE_LPCSTR pszSrc
,
1989 NTSTATUS Status
= STATUS_SUCCESS
;
1993 Status
= STATUS_INVALID_PARAMETER
;
1997 while (cchDest
&& cchSrc
&& (*pszSrc
!= '\0'))
1999 *pszDest
++ = *pszSrc
++;
2007 Status
= STATUS_BUFFER_OVERFLOW
;
2016 NTSTRSAFEAPI
RtlStringCopyNWorkerW(
2017 STRSAFE_LPWSTR pszDest
,
2019 STRSAFE_LPCWSTR pszSrc
,
2022 NTSTATUS Status
= STATUS_SUCCESS
;
2026 Status
= STATUS_INVALID_PARAMETER
;
2030 while (cchDest
&& cchToCopy
&& (*pszSrc
!= L
'\0'))
2032 *pszDest
++ = *pszSrc
++;
2040 Status
= STATUS_BUFFER_OVERFLOW
;
2049 NTSTRSAFEAPI
RtlStringCopyNExWorkerA(
2050 STRSAFE_LPSTR pszDest
,
2053 STRSAFE_LPCSTR pszSrc
,
2055 STRSAFE_LPSTR
*ppszDestEnd
,
2056 size_t *pcchRemaining
,
2057 STRSAFE_DWORD dwFlags
)
2059 NTSTATUS Status
= STATUS_SUCCESS
;
2060 STRSAFE_LPSTR pszDestEnd
= pszDest
;
2061 size_t cchRemaining
= 0;
2063 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2065 Status
= STATUS_INVALID_PARAMETER
;
2067 else if (cchToCopy
> NTSTRSAFE_MAX_CCH
)
2069 Status
= STATUS_INVALID_PARAMETER
;
2073 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2077 if ((cchDest
!= 0) || (cbDest
!= 0))
2078 Status
= STATUS_INVALID_PARAMETER
;
2085 if (NT_SUCCESS(Status
))
2089 pszDestEnd
= pszDest
;
2092 if ((cchToCopy
!= 0) && (*pszSrc
!= '\0'))
2095 Status
= STATUS_INVALID_PARAMETER
;
2097 Status
= STATUS_BUFFER_OVERFLOW
;
2102 pszDestEnd
= pszDest
;
2103 cchRemaining
= cchDest
;
2105 while (cchRemaining
&& cchToCopy
&& (*pszSrc
!= '\0'))
2107 *pszDestEnd
++ = *pszSrc
++;
2112 if (cchRemaining
> 0)
2114 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
2116 memset(pszDestEnd
+ 1, STRSAFE_GET_FILL_PATTERN(dwFlags
), ((cchRemaining
- 1) * sizeof(char)) + (cbDest
% sizeof(char)));
2123 Status
= STATUS_BUFFER_OVERFLOW
;
2131 if (!NT_SUCCESS(Status
))
2135 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2137 memset(pszDest
, STRSAFE_GET_FILL_PATTERN(dwFlags
), cbDest
);
2138 if (STRSAFE_GET_FILL_PATTERN(dwFlags
) == 0)
2140 pszDestEnd
= pszDest
;
2141 cchRemaining
= cchDest
;
2143 else if (cchDest
> 0)
2145 pszDestEnd
= pszDest
+ cchDest
- 1;
2151 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
2155 pszDestEnd
= pszDest
;
2156 cchRemaining
= cchDest
;
2163 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
2166 *ppszDestEnd
= pszDestEnd
;
2169 *pcchRemaining
= cchRemaining
;
2175 NTSTRSAFEAPI
RtlStringCopyNExWorkerW(
2176 STRSAFE_LPWSTR pszDest
,
2179 STRSAFE_LPCWSTR pszSrc
,
2181 STRSAFE_LPWSTR
*ppszDestEnd
,
2182 size_t *pcchRemaining
,
2183 STRSAFE_DWORD dwFlags
)
2185 NTSTATUS Status
= STATUS_SUCCESS
;
2186 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
2187 size_t cchRemaining
= 0;
2189 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2191 Status
= STATUS_INVALID_PARAMETER
;
2193 else if (cchToCopy
> NTSTRSAFE_MAX_CCH
)
2195 Status
= STATUS_INVALID_PARAMETER
;
2199 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2203 if ((cchDest
!= 0) || (cbDest
!= 0))
2204 Status
= STATUS_INVALID_PARAMETER
;
2211 if (NT_SUCCESS(Status
))
2215 pszDestEnd
= pszDest
;
2218 if ((cchToCopy
!= 0) && (*pszSrc
!= L
'\0'))
2221 Status
= STATUS_INVALID_PARAMETER
;
2223 Status
= STATUS_BUFFER_OVERFLOW
;
2228 pszDestEnd
= pszDest
;
2229 cchRemaining
= cchDest
;
2231 while (cchRemaining
&& cchToCopy
&& (*pszSrc
!= L
'\0'))
2233 *pszDestEnd
++ = *pszSrc
++;
2238 if (cchRemaining
> 0)
2240 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
2242 memset(pszDestEnd
+ 1, STRSAFE_GET_FILL_PATTERN(dwFlags
), ((cchRemaining
- 1) * sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
2249 Status
= STATUS_BUFFER_OVERFLOW
;
2252 *pszDestEnd
= L
'\0';
2257 if (!NT_SUCCESS(Status
))
2261 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2263 memset(pszDest
, STRSAFE_GET_FILL_PATTERN(dwFlags
), cbDest
);
2264 if (STRSAFE_GET_FILL_PATTERN(dwFlags
) == 0)
2266 pszDestEnd
= pszDest
;
2267 cchRemaining
= cchDest
;
2269 else if (cchDest
> 0)
2271 pszDestEnd
= pszDest
+ cchDest
- 1;
2273 *pszDestEnd
= L
'\0';
2276 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
2280 pszDestEnd
= pszDest
;
2281 cchRemaining
= cchDest
;
2282 *pszDestEnd
= L
'\0';
2288 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
2291 *ppszDestEnd
= pszDestEnd
;
2294 *pcchRemaining
= cchRemaining
;
2300 NTSTRSAFEAPI
RtlStringCatWorkerA(
2301 STRSAFE_LPSTR pszDest
,
2303 STRSAFE_LPCSTR pszSrc
)
2305 size_t cchDestLength
;
2306 NTSTATUS Status
= RtlStringLengthWorkerA(pszDest
, cchDest
, &cchDestLength
);
2307 if (NT_SUCCESS(Status
))
2308 Status
= RtlStringCopyWorkerA(pszDest
+ cchDestLength
, cchDest
- cchDestLength
, pszSrc
);
2313 NTSTRSAFEAPI
RtlStringCatWorkerW(
2314 STRSAFE_LPWSTR pszDest
,
2316 STRSAFE_LPCWSTR pszSrc
)
2318 size_t cchDestLength
;
2319 NTSTATUS Status
= RtlStringLengthWorkerW(pszDest
, cchDest
, &cchDestLength
);
2320 if (NT_SUCCESS(Status
))
2321 Status
= RtlStringCopyWorkerW(pszDest
+ cchDestLength
, cchDest
- cchDestLength
, pszSrc
);
2326 NTSTRSAFEAPI
RtlStringCatExWorkerA(
2327 STRSAFE_LPSTR pszDest
,
2330 STRSAFE_LPCSTR pszSrc
,
2331 STRSAFE_LPSTR
*ppszDestEnd
,
2332 size_t *pcchRemaining
,
2333 STRSAFE_DWORD dwFlags
)
2335 NTSTATUS Status
= STATUS_SUCCESS
;
2336 STRSAFE_LPSTR pszDestEnd
= pszDest
;
2337 size_t cchRemaining
= 0;
2339 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2341 Status
= STATUS_INVALID_PARAMETER
;
2345 size_t cchDestLength
;
2346 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2350 if ((cchDest
== 0) && (cbDest
== 0))
2353 Status
= STATUS_INVALID_PARAMETER
;
2357 Status
= RtlStringLengthWorkerA(pszDest
, cchDest
, &cchDestLength
);
2358 if (NT_SUCCESS(Status
))
2360 pszDestEnd
= pszDest
+ cchDestLength
;
2361 cchRemaining
= cchDest
- cchDestLength
;
2370 Status
= RtlStringLengthWorkerA(pszDest
, cchDest
, &cchDestLength
);
2371 if (NT_SUCCESS(Status
))
2373 pszDestEnd
= pszDest
+ cchDestLength
;
2374 cchRemaining
= cchDest
- cchDestLength
;
2378 if (NT_SUCCESS(Status
))
2382 if (*pszSrc
!= '\0')
2385 Status
= STATUS_INVALID_PARAMETER
;
2387 Status
= STATUS_BUFFER_OVERFLOW
;
2392 Status
= RtlStringCopyExWorkerA(pszDestEnd
, cchRemaining
, (cchRemaining
* sizeof(char)) + (cbDest
% sizeof(char)), pszSrc
, &pszDestEnd
, &cchRemaining
, dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
2397 if (!NT_SUCCESS(Status
))
2401 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2403 memset(pszDest
, STRSAFE_GET_FILL_PATTERN(dwFlags
), cbDest
);
2404 if (STRSAFE_GET_FILL_PATTERN(dwFlags
) == 0)
2406 pszDestEnd
= pszDest
;
2407 cchRemaining
= cchDest
;
2409 else if (cchDest
> 0)
2411 pszDestEnd
= pszDest
+ cchDest
- 1;
2417 if ((dwFlags
& STRSAFE_NULL_ON_FAILURE
) && cchDest
> 0)
2419 pszDestEnd
= pszDest
;
2420 cchRemaining
= cchDest
;
2426 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
2429 *ppszDestEnd
= pszDestEnd
;
2432 *pcchRemaining
= cchRemaining
;
2438 NTSTRSAFEAPI
RtlStringCatExWorkerW(
2439 STRSAFE_LPWSTR pszDest
,
2442 STRSAFE_LPCWSTR pszSrc
,
2443 STRSAFE_LPWSTR
*ppszDestEnd
,
2444 size_t *pcchRemaining
,
2445 STRSAFE_DWORD dwFlags
)
2447 NTSTATUS Status
= STATUS_SUCCESS
;
2448 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
2449 size_t cchRemaining
= 0;
2451 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2453 Status
= STATUS_INVALID_PARAMETER
;
2457 size_t cchDestLength
;
2458 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2462 if ((cchDest
== 0) && (cbDest
== 0))
2465 Status
= STATUS_INVALID_PARAMETER
;
2469 Status
= RtlStringLengthWorkerW(pszDest
, cchDest
, &cchDestLength
);
2470 if (NT_SUCCESS(Status
))
2472 pszDestEnd
= pszDest
+ cchDestLength
;
2473 cchRemaining
= cchDest
- cchDestLength
;
2482 Status
= RtlStringLengthWorkerW(pszDest
, cchDest
, &cchDestLength
);
2483 if (NT_SUCCESS(Status
))
2485 pszDestEnd
= pszDest
+ cchDestLength
;
2486 cchRemaining
= cchDest
- cchDestLength
;
2490 if (NT_SUCCESS(Status
))
2494 if (*pszSrc
!= L
'\0')
2497 Status
= STATUS_INVALID_PARAMETER
;
2499 Status
= STATUS_BUFFER_OVERFLOW
;
2504 Status
= RtlStringCopyExWorkerW(pszDestEnd
, cchRemaining
, (cchRemaining
* sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)), pszSrc
, &pszDestEnd
, &cchRemaining
, dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
2509 if (!NT_SUCCESS(Status
))
2513 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2515 memset(pszDest
, STRSAFE_GET_FILL_PATTERN(dwFlags
), cbDest
);
2516 if (STRSAFE_GET_FILL_PATTERN(dwFlags
) == 0)
2518 pszDestEnd
= pszDest
;
2519 cchRemaining
= cchDest
;
2521 else if (cchDest
> 0)
2523 pszDestEnd
= pszDest
+ cchDest
- 1;
2525 *pszDestEnd
= L
'\0';
2529 if ((dwFlags
& STRSAFE_NULL_ON_FAILURE
) && cchDest
> 0)
2531 pszDestEnd
= pszDest
;
2532 cchRemaining
= cchDest
;
2533 *pszDestEnd
= L
'\0';
2538 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
2541 *ppszDestEnd
= pszDestEnd
;
2543 *pcchRemaining
= cchRemaining
;
2549 NTSTRSAFEAPI
RtlStringCatNWorkerA(
2550 STRSAFE_LPSTR pszDest
,
2552 STRSAFE_LPCSTR pszSrc
,
2555 size_t cchDestLength
;
2556 NTSTATUS Status
= RtlStringLengthWorkerA(pszDest
, cchDest
, &cchDestLength
);
2557 if (NT_SUCCESS(Status
))
2558 Status
= RtlStringCopyNWorkerA(pszDest
+ cchDestLength
, cchDest
- cchDestLength
, pszSrc
, cchToAppend
);
2563 NTSTRSAFEAPI
RtlStringCatNWorkerW(
2564 STRSAFE_LPWSTR pszDest
,
2566 STRSAFE_LPCWSTR pszSrc
,
2569 size_t cchDestLength
;
2570 NTSTATUS Status
= RtlStringLengthWorkerW(pszDest
, cchDest
, &cchDestLength
);
2571 if (NT_SUCCESS(Status
))
2572 Status
= RtlStringCopyNWorkerW(pszDest
+ cchDestLength
, cchDest
- cchDestLength
, pszSrc
, cchToAppend
);
2577 NTSTRSAFEAPI
RtlStringCatNExWorkerA(
2578 STRSAFE_LPSTR pszDest
,
2581 STRSAFE_LPCSTR pszSrc
,
2583 STRSAFE_LPSTR
*ppszDestEnd
,
2584 size_t *pcchRemaining
,
2585 STRSAFE_DWORD dwFlags
)
2587 NTSTATUS Status
= STATUS_SUCCESS
;
2588 STRSAFE_LPSTR pszDestEnd
= pszDest
;
2589 size_t cchRemaining
= 0;
2590 size_t cchDestLength
= 0;
2592 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2594 Status
= STATUS_INVALID_PARAMETER
;
2596 else if (cchToAppend
> NTSTRSAFE_MAX_CCH
)
2598 Status
= STATUS_INVALID_PARAMETER
;
2602 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2606 if ((cchDest
== 0) && (cbDest
== 0))
2609 Status
= STATUS_INVALID_PARAMETER
;
2613 Status
= RtlStringLengthWorkerA(pszDest
, cchDest
, &cchDestLength
);
2614 if (NT_SUCCESS(Status
))
2616 pszDestEnd
= pszDest
+ cchDestLength
;
2617 cchRemaining
= cchDest
- cchDestLength
;
2626 Status
= RtlStringLengthWorkerA(pszDest
, cchDest
, &cchDestLength
);
2627 if (NT_SUCCESS(Status
))
2629 pszDestEnd
= pszDest
+ cchDestLength
;
2630 cchRemaining
= cchDest
- cchDestLength
;
2634 if (NT_SUCCESS(Status
))
2638 if ((cchToAppend
!= 0) && (*pszSrc
!= '\0'))
2641 Status
= STATUS_INVALID_PARAMETER
;
2643 Status
= STATUS_BUFFER_OVERFLOW
;
2648 Status
= RtlStringCopyNExWorkerA(pszDestEnd
, cchRemaining
, (cchRemaining
* sizeof(char)) + (cbDest
% sizeof(char)), pszSrc
, cchToAppend
, &pszDestEnd
, &cchRemaining
, dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
2653 if (!NT_SUCCESS(Status
))
2657 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2659 memset(pszDest
, STRSAFE_GET_FILL_PATTERN(dwFlags
), cbDest
);
2660 if (STRSAFE_GET_FILL_PATTERN(dwFlags
) == 0)
2662 pszDestEnd
= pszDest
;
2663 cchRemaining
= cchDest
;
2665 else if (cchDest
> 0)
2667 pszDestEnd
= pszDest
+ cchDest
- 1;
2673 if ((dwFlags
& STRSAFE_NULL_ON_FAILURE
) && cchDest
> 0)
2675 pszDestEnd
= pszDest
;
2676 cchRemaining
= cchDest
;
2682 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
2685 *ppszDestEnd
= pszDestEnd
;
2688 *pcchRemaining
= cchRemaining
;
2694 NTSTRSAFEAPI
RtlStringCatNExWorkerW(
2695 STRSAFE_LPWSTR pszDest
,
2698 STRSAFE_LPCWSTR pszSrc
,
2700 STRSAFE_LPWSTR
*ppszDestEnd
,
2701 size_t *pcchRemaining
,
2702 STRSAFE_DWORD dwFlags
)
2704 NTSTATUS Status
= STATUS_SUCCESS
;
2705 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
2706 size_t cchRemaining
= 0;
2707 size_t cchDestLength
= 0;
2709 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2711 Status
= STATUS_INVALID_PARAMETER
;
2713 else if (cchToAppend
> NTSTRSAFE_MAX_CCH
)
2715 Status
= STATUS_INVALID_PARAMETER
;
2719 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2723 if ((cchDest
== 0) && (cbDest
== 0))
2726 Status
= STATUS_INVALID_PARAMETER
;
2730 Status
= RtlStringLengthWorkerW(pszDest
, cchDest
, &cchDestLength
);
2731 if (NT_SUCCESS(Status
))
2733 pszDestEnd
= pszDest
+ cchDestLength
;
2734 cchRemaining
= cchDest
- cchDestLength
;
2743 Status
= RtlStringLengthWorkerW(pszDest
, cchDest
, &cchDestLength
);
2744 if (NT_SUCCESS(Status
))
2746 pszDestEnd
= pszDest
+ cchDestLength
;
2747 cchRemaining
= cchDest
- cchDestLength
;
2751 if (NT_SUCCESS(Status
))
2755 if ((cchToAppend
!= 0) && (*pszSrc
!= L
'\0'))
2758 Status
= STATUS_INVALID_PARAMETER
;
2760 Status
= STATUS_BUFFER_OVERFLOW
;
2765 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
)));
2770 if (!NT_SUCCESS(Status
))
2774 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2776 memset(pszDest
, STRSAFE_GET_FILL_PATTERN(dwFlags
), cbDest
);
2778 if (STRSAFE_GET_FILL_PATTERN(dwFlags
) == 0)
2780 pszDestEnd
= pszDest
;
2781 cchRemaining
= cchDest
;
2783 else if (cchDest
> 0)
2785 pszDestEnd
= pszDest
+ cchDest
- 1;
2787 *pszDestEnd
= L
'\0';
2791 if ((dwFlags
& STRSAFE_NULL_ON_FAILURE
) && cchDest
> 0)
2793 pszDestEnd
= pszDest
;
2794 cchRemaining
= cchDest
;
2795 *pszDestEnd
= L
'\0';
2800 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
2803 *ppszDestEnd
= pszDestEnd
;
2806 *pcchRemaining
= cchRemaining
;
2812 NTSTRSAFEAPI
RtlStringVPrintfWorkerA(
2813 STRSAFE_LPSTR pszDest
,
2815 STRSAFE_LPCSTR pszFormat
,
2818 NTSTATUS Status
= STATUS_SUCCESS
;
2822 Status
= STATUS_INVALID_PARAMETER
;
2826 size_t cchMax
= cchDest
- 1;
2827 int iRet
= _vsnprintf(pszDest
, cchMax
, pszFormat
, argList
);
2829 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
2833 Status
= STATUS_BUFFER_OVERFLOW
;
2835 else if (((size_t)iRet
) == cchMax
)
2845 NTSTRSAFEAPI
RtlpStringVPrintfWorkerW(
2846 STRSAFE_LPWSTR pszDest
,
2848 STRSAFE_LPCWSTR pszFormat
,
2849 size_t* pcchDestNewLen
,
2852 NTSTATUS Status
= STATUS_SUCCESS
;
2853 size_t cchMax
= cchDest
- 1;
2854 int iRet
= _vsnwprintf(pszDest
, cchMax
, pszFormat
, argList
);
2856 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
2860 Status
= STATUS_BUFFER_OVERFLOW
;
2862 else if (((size_t)iRet
) == cchMax
)
2869 *pcchDestNewLen
= (iRet
== -1) ? cchDest
: iRet
;
2874 NTSTRSAFEAPI
RtlStringVPrintfWorkerW(
2875 STRSAFE_LPWSTR pszDest
,
2877 STRSAFE_LPCWSTR pszFormat
,
2881 return STATUS_INVALID_PARAMETER
;
2883 return RtlpStringVPrintfWorkerW(pszDest
, cchDest
, pszFormat
, NULL
, argList
);
2886 NTSTRSAFEAPI
RtlStringVPrintfWorkerLenW(
2887 STRSAFE_LPWSTR pszDest
,
2889 STRSAFE_LPCWSTR pszFormat
,
2890 size_t* pcchDestNewLen
,
2893 if (cchDest
== 0 || pcchDestNewLen
== 0)
2894 return STATUS_INVALID_PARAMETER
;
2896 return RtlpStringVPrintfWorkerW(pszDest
, cchDest
, pszFormat
, pcchDestNewLen
, argList
);
2899 NTSTRSAFEAPI
RtlStringVPrintfExWorkerA(
2900 STRSAFE_LPSTR pszDest
,
2903 STRSAFE_LPSTR
*ppszDestEnd
,
2904 size_t *pcchRemaining
,
2905 STRSAFE_DWORD dwFlags
,
2906 STRSAFE_LPCSTR pszFormat
,
2909 NTSTATUS Status
= STATUS_SUCCESS
;
2910 STRSAFE_LPSTR pszDestEnd
= pszDest
;
2911 size_t cchRemaining
= 0;
2913 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2915 Status
= STATUS_INVALID_PARAMETER
;
2919 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2923 if ((cchDest
!= 0) || (cbDest
!= 0))
2924 Status
= STATUS_INVALID_PARAMETER
;
2930 if (NT_SUCCESS(Status
))
2934 pszDestEnd
= pszDest
;
2937 if (*pszFormat
!= '\0')
2940 Status
= STATUS_INVALID_PARAMETER
;
2942 Status
= STATUS_BUFFER_OVERFLOW
;
2949 cchMax
= cchDest
- 1;
2950 iRet
= _vsnprintf(pszDest
, cchMax
, pszFormat
, argList
);
2951 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
2953 pszDestEnd
= pszDest
+ cchMax
;
2956 Status
= STATUS_BUFFER_OVERFLOW
;
2958 else if (((size_t)iRet
) == cchMax
)
2960 pszDestEnd
= pszDest
+ cchMax
;
2964 else if (((size_t)iRet
) < cchMax
)
2966 pszDestEnd
= pszDest
+ iRet
;
2967 cchRemaining
= cchDest
- iRet
;
2969 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
2971 memset(pszDestEnd
+ 1, STRSAFE_GET_FILL_PATTERN(dwFlags
), ((cchRemaining
- 1) * sizeof(char)) + (cbDest
% sizeof(char)));
2978 if (!NT_SUCCESS(Status
))
2982 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2984 memset(pszDest
, STRSAFE_GET_FILL_PATTERN(dwFlags
), cbDest
);
2985 if (STRSAFE_GET_FILL_PATTERN(dwFlags
) == 0)
2987 pszDestEnd
= pszDest
;
2988 cchRemaining
= cchDest
;
2990 else if (cchDest
> 0)
2992 pszDestEnd
= pszDest
+ cchDest
- 1;
2998 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
3002 pszDestEnd
= pszDest
;
3003 cchRemaining
= cchDest
;
3010 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
3013 *ppszDestEnd
= pszDestEnd
;
3016 *pcchRemaining
= cchRemaining
;
3022 NTSTRSAFEAPI
RtlpStringVPrintfExWorkerW(
3023 STRSAFE_LPWSTR pszDest
,
3026 STRSAFE_LPWSTR
*ppszDestEnd
,
3027 size_t *pcchRemaining
,
3028 STRSAFE_DWORD dwFlags
,
3029 STRSAFE_LPCWSTR pszFormat
,
3030 size_t* pcchDestNewLen
,
3033 NTSTATUS Status
= STATUS_SUCCESS
;
3034 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
3035 size_t cchRemaining
= 0;
3037 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
3039 Status
= STATUS_INVALID_PARAMETER
;
3043 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
3047 if ((cchDest
!= 0) || (cbDest
!= 0))
3048 Status
= STATUS_INVALID_PARAMETER
;
3055 if (NT_SUCCESS(Status
))
3059 pszDestEnd
= pszDest
;
3061 if (*pszFormat
!= L
'\0')
3064 Status
= STATUS_INVALID_PARAMETER
;
3066 Status
= STATUS_BUFFER_OVERFLOW
;
3072 size_t cchMax
= cchDest
- 1;
3073 iRet
= _vsnwprintf(pszDest
, cchMax
, pszFormat
, argList
);
3074 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
3076 pszDestEnd
= pszDest
+ cchMax
;
3078 *pszDestEnd
= L
'\0';
3079 Status
= STATUS_BUFFER_OVERFLOW
;
3081 else if (((size_t)iRet
) == cchMax
)
3083 pszDestEnd
= pszDest
+ cchMax
;
3085 *pszDestEnd
= L
'\0';
3087 else if (((size_t)iRet
) < cchMax
)
3089 pszDestEnd
= pszDest
+ iRet
;
3090 cchRemaining
= cchDest
- iRet
;
3092 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
3094 memset(pszDestEnd
+ 1, STRSAFE_GET_FILL_PATTERN(dwFlags
), ((cchRemaining
- 1) * sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
3099 *pcchDestNewLen
= iRet
== -1 ? cchDest
: iRet
;
3104 if (!NT_SUCCESS(Status
))
3108 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
3110 memset(pszDest
, STRSAFE_GET_FILL_PATTERN(dwFlags
), cbDest
);
3111 if (STRSAFE_GET_FILL_PATTERN(dwFlags
) == 0)
3113 pszDestEnd
= pszDest
;
3114 cchRemaining
= cchDest
;
3116 else if (cchDest
> 0)
3118 pszDestEnd
= pszDest
+ cchDest
- 1;
3120 *pszDestEnd
= L
'\0';
3123 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
3127 pszDestEnd
= pszDest
;
3128 cchRemaining
= cchDest
;
3129 *pszDestEnd
= L
'\0';
3135 if (NT_SUCCESS(Status
) || (Status
== STATUS_BUFFER_OVERFLOW
))
3138 *ppszDestEnd
= pszDestEnd
;
3141 *pcchRemaining
= cchRemaining
;
3147 NTSTRSAFEAPI
RtlStringVPrintfExWorkerW(
3148 STRSAFE_LPWSTR pszDest
,
3151 STRSAFE_LPWSTR
*ppszDestEnd
,
3152 size_t *pcchRemaining
,
3153 STRSAFE_DWORD dwFlags
,
3154 STRSAFE_LPCWSTR pszFormat
,
3157 return RtlpStringVPrintfExWorkerW(pszDest
, cchDest
, cbDest
, ppszDestEnd
, pcchRemaining
, dwFlags
, pszFormat
, NULL
, argList
);
3160 NTSTRSAFEAPI
RtlStringVPrintfExWorkerLenW(
3161 STRSAFE_LPWSTR pszDest
,
3164 STRSAFE_LPWSTR
*ppszDestEnd
,
3165 size_t *pcchRemaining
,
3166 STRSAFE_DWORD dwFlags
,
3167 STRSAFE_LPCWSTR pszFormat
,
3168 size_t* pcchDestNewLen
,
3171 if (pcchDestNewLen
== 0)
3172 return STATUS_INVALID_PARAMETER
;
3174 return RtlpStringVPrintfExWorkerW(pszDest
, cchDest
, cbDest
, ppszDestEnd
, pcchRemaining
, dwFlags
, pszFormat
, pcchDestNewLen
, argList
);
3179 RtlStringLengthWorkerA(
3180 _In_reads_or_z_(cchMax
) STRSAFE_LPCSTR psz
,
3181 _In_
_In_range_(<=, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
3182 _Out_opt_
_Deref_out_range_(<, cchMax
) size_t *pcchLength
)
3184 NTSTATUS Status
= STATUS_SUCCESS
;
3185 size_t cchMaxPrev
= cchMax
;
3187 while (cchMax
&& (*psz
!= '\0'))
3194 Status
= STATUS_INVALID_PARAMETER
;
3198 if (NT_SUCCESS(Status
))
3199 *pcchLength
= cchMaxPrev
- cchMax
;
3208 RtlStringLengthWorkerW(
3209 _In_reads_or_z_(cchMax
) STRSAFE_LPCWSTR psz
,
3210 _In_
_In_range_(<=, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
3211 _Out_opt_
_Deref_out_range_(<, cchMax
) size_t *pcchLength
)
3213 NTSTATUS Status
= STATUS_SUCCESS
;
3214 size_t cchMaxPrev
= cchMax
;
3216 while (cchMax
&& (*psz
!= L
'\0'))
3223 Status
= STATUS_INVALID_PARAMETER
;
3227 if (NT_SUCCESS(Status
))
3228 *pcchLength
= cchMaxPrev
- cchMax
;
3237 RtlpUnicodeStringValidate(
3238 _In_opt_ PCUNICODE_STRING SourceString
,
3239 _In_ STRSAFE_DWORD dwFlags
)
3243 if (SourceString
->Length
% sizeof(WCHAR
) != 0 ||
3244 SourceString
->MaximumLength
% sizeof(WCHAR
) != 0 ||
3245 SourceString
->Length
> SourceString
->MaximumLength
||
3246 SourceString
->MaximumLength
> NTSTRSAFE_UNICODE_STRING_MAX_CCH
* sizeof(WCHAR
) ||
3247 (SourceString
->Buffer
== NULL
&& (SourceString
->Length
!= 0 || SourceString
->MaximumLength
!= 0)))
3249 return STATUS_INVALID_PARAMETER
;
3254 if (!(dwFlags
& STRSAFE_IGNORE_NULLS
))
3255 return STATUS_INVALID_PARAMETER
;
3258 return STATUS_SUCCESS
;
3262 RtlUnicodeStringValidate(_In_opt_ PCUNICODE_STRING SourceString
)
3264 return RtlpUnicodeStringValidate(SourceString
, 0);
3268 RtlUnicodeStringValidateEx(
3269 _In_opt_ PCUNICODE_STRING SourceString
,
3270 _In_ STRSAFE_DWORD dwFlags
)
3272 if (dwFlags
& ~(STRSAFE_UNICODE_STRING_VALID_FLAGS
))
3273 return STATUS_INVALID_PARAMETER
;
3275 return RtlpUnicodeStringValidate(SourceString
, dwFlags
);
3279 RtlUnicodeStringPrintf(
3280 _In_ PUNICODE_STRING DestinationString
,
3281 _In_ NTSTRSAFE_PCWSTR pszFormat
,
3285 size_t cchFinalLength
;
3288 if (DestinationString
== NULL
|| pszFormat
== NULL
|| DestinationString
->Buffer
== NULL
)
3290 Status
= STATUS_INVALID_PARAMETER
;
3294 Status
= RtlUnicodeStringValidate(DestinationString
);
3295 if (NT_SUCCESS(Status
))
3297 va_start(argList
, pszFormat
);
3299 Status
= RtlStringVPrintfWorkerLenW(DestinationString
->Buffer
,
3300 DestinationString
->MaximumLength
/ sizeof(WCHAR
),
3305 if (NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
)
3307 DestinationString
->Length
= (USHORT
)(cchFinalLength
* sizeof(WCHAR
));
3318 RtlUnicodeStringPrintfEx(
3319 _In_opt_ PUNICODE_STRING DestinationString
,
3320 _In_opt_ PUNICODE_STRING RemainingString
,
3321 _In_ STRSAFE_DWORD dwFlags
,
3322 _In_ NTSTRSAFE_PCWSTR pszFormat
, ...)
3325 size_t cchFinalLength
;
3326 size_t cchRemaining
;
3329 va_start(argList
, pszFormat
);
3331 Status
= RtlStringVPrintfExWorkerLenW(DestinationString
->Buffer
,
3332 DestinationString
->MaximumLength
/ sizeof(WCHAR
),
3333 DestinationString
->MaximumLength
,
3334 &RemainingString
->Buffer
,
3343 if (Status
== STATUS_BUFFER_OVERFLOW
|| NT_SUCCESS(Status
))
3345 DestinationString
->Length
= (USHORT
)(cchFinalLength
* sizeof(WCHAR
));
3347 if (RemainingString
)
3349 RemainingString
->Length
= 0;
3350 RemainingString
->MaximumLength
= (USHORT
)cchRemaining
* sizeof(WCHAR
);
3357 #define RtlStringCopyWorkerA RtlStringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
3358 #define RtlStringCopyWorkerW RtlStringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
3359 #define RtlStringCopyExWorkerA RtlStringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
3360 #define RtlStringCopyExWorkerW RtlStringCopyExWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
3361 #define RtlStringCatWorkerA RtlStringCatWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
3362 #define RtlStringCatWorkerW RtlStringCatWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
3363 #define RtlStringCatExWorkerA RtlStringCatExWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
3364 #define RtlStringCatExWorkerW RtlStringCatExWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
3365 #define RtlStringCatNWorkerA RtlStringCatNWorkerA_instead_use_StringCchCatNA_or_StrincCbCatNA;
3366 #define RtlStringCatNWorkerW RtlStringCatNWorkerW_instead_use_StringCchCatNW_or_StringCbCatNW;
3367 #define RtlStringCatNExWorkerA RtlStringCatNExWorkerA_instead_use_StringCchCatNExA_or_StringCbCatNExA;
3368 #define RtlStringCatNExWorkerW RtlStringCatNExWorkerW_instead_use_StringCchCatNExW_or_StringCbCatNExW;
3369 #define RtlStringVPrintfWorkerA RtlStringVPrintfWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
3370 #define RtlStringVPrintfWorkerW RtlStringVPrintfWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
3371 #define RtlStringVPrintfExWorkerA RtlStringVPrintfExWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
3372 #define RtlStringVPrintfExWorkerW RtlStringVPrintfExWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
3373 #define RtlStringLengthWorkerA RtlStringLengthWorkerA_instead_use_StringCchLengthA_or_StringCbLengthA;
3374 #define RtlStringLengthWorkerW RtlStringLengthWorkerW_instead_use_StringCchLengthW_or_StringCbLengthW;
3377 #pragma warning(pop)
3378 #endif /* _MSC_VER */
3380 #endif /* _NTSTRSAFE_H_INCLUDED_ */