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 NTSTRSAFE_UNICODE_STRING_MAX_CCH
40 #define NTSTRSAFE_UNICODE_STRING_MAX_CCH 32767
43 #ifndef _STRSAFE_H_INCLUDED_
44 #define STRSAFE_IGNORE_NULLS 0x00000100
45 #define STRSAFE_FILL_BEHIND_NULL 0x00000200
46 #define STRSAFE_FILL_ON_FAILURE 0x00000400
47 #define STRSAFE_NULL_ON_FAILURE 0x00000800
48 #define STRSAFE_NO_TRUNCATION 0x00001000
49 #define STRSAFE_IGNORE_NULL_UNICODE_STRINGS 0x00010000
50 #define STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED 0x00020000
52 #define STRSAFE_VALID_FLAGS (0x000000FF | STRSAFE_IGNORE_NULLS | STRSAFE_FILL_BEHIND_NULL | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)
53 #define STRSAFE_UNICODE_STRING_VALID_FLAGS (STRSAFE_VALID_FLAGS | STRSAFE_IGNORE_NULL_UNICODE_STRINGS | STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED)
55 #define STRSAFE_FILL_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_BEHIND_NULL))
56 #define STRSAFE_FAILURE_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_ON_FAILURE))
58 #define STRSAFE_GET_FILL_PATTERN(dwFlags) ((int)((dwFlags) & 0x000000FF))
61 typedef char *STRSAFE_LPSTR
;
62 typedef const char *STRSAFE_LPCSTR
;
63 typedef wchar_t *STRSAFE_LPWSTR
;
64 typedef const wchar_t *STRSAFE_LPCWSTR
;
66 typedef _Null_terminated_
char *NTSTRSAFE_PSTR
;
67 typedef _Null_terminated_
const char *NTSTRSAFE_PCSTR
;
68 typedef _Null_terminated_
wchar_t *NTSTRSAFE_PWSTR
;
69 typedef _Null_terminated_
const wchar_t *NTSTRSAFE_PCWSTR
;
71 typedef ULONG STRSAFE_DWORD
;
73 NTSTRSAFEAPI
RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
74 NTSTRSAFEAPI
RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
75 NTSTRSAFEAPI
RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
76 NTSTRSAFEAPI
RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
77 NTSTRSAFEAPI
RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToCopy
);
78 NTSTRSAFEAPI
RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
);
79 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
);
80 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
);
81 NTSTRSAFEAPI
RtlStringCatWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
);
82 NTSTRSAFEAPI
RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
);
83 NTSTRSAFEAPI
RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
84 NTSTRSAFEAPI
RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
);
85 NTSTRSAFEAPI
RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
);
86 NTSTRSAFEAPI
RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
);
87 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
);
88 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
);
89 NTSTRSAFEAPI
RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
);
90 NTSTRSAFEAPI
RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
);
91 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
);
92 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
);
95 RtlStringLengthWorkerA(
96 _In_reads_or_z_(cchMax
) STRSAFE_LPCSTR psz
,
97 _In_
_In_range_(<=, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
98 _Out_opt_
_Deref_out_range_(<, cchMax
) size_t *pcchLength
);
101 RtlStringLengthWorkerW(
102 _In_reads_or_z_(cchMax
) STRSAFE_LPCWSTR psz
,
103 _In_
_In_range_(<=, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
104 _Out_opt_
_Deref_out_range_(<, cchMax
) size_t *pcchLength
);
108 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
110 _In_ NTSTRSAFE_PCSTR pszSrc
);
114 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
116 _In_ NTSTRSAFE_PCWSTR pszSrc
);
120 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
122 _In_ NTSTRSAFE_PCSTR pszSrc
)
124 if (cchDest
> NTSTRSAFE_MAX_CCH
)
128 return STATUS_INVALID_PARAMETER
;
131 return RtlStringCopyWorkerA(pszDest
, cchDest
, pszSrc
);
136 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
138 _In_ NTSTRSAFE_PCWSTR pszSrc
)
140 if (cchDest
> NTSTRSAFE_MAX_CCH
)
144 return STATUS_INVALID_PARAMETER
;
147 return RtlStringCopyWorkerW(pszDest
,cchDest
,pszSrc
);
152 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
154 _In_ NTSTRSAFE_PCSTR pszSrc
);
158 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
160 _In_ NTSTRSAFE_PCWSTR pszSrc
);
164 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
166 _In_ NTSTRSAFE_PCSTR pszSrc
)
168 size_t cchDest
= cbDest
/ sizeof(char);
169 if (cchDest
> NTSTRSAFE_MAX_CCH
)
173 return STATUS_INVALID_PARAMETER
;
175 return RtlStringCopyWorkerA(pszDest
,cbDest
,pszSrc
);
180 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
182 _In_ NTSTRSAFE_PCWSTR pszSrc
)
184 size_t cchDest
= cbDest
/ sizeof(wchar_t);
185 if (cchDest
> NTSTRSAFE_MAX_CCH
)
189 return STATUS_INVALID_PARAMETER
;
191 return RtlStringCopyWorkerW(pszDest
,cchDest
,pszSrc
);
196 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
198 _In_ NTSTRSAFE_PCSTR pszSrc
,
199 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
200 _Out_opt_
size_t *pcchRemaining
,
201 _In_ STRSAFE_DWORD dwFlags
);
205 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
207 _In_ NTSTRSAFE_PCWSTR pszSrc
,
208 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
209 _Out_opt_
size_t *pcchRemaining
,
210 _In_ STRSAFE_DWORD dwFlags
);
214 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
216 _In_ NTSTRSAFE_PCSTR pszSrc
,
217 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
218 _Out_opt_
size_t *pcchRemaining
,
219 _In_ STRSAFE_DWORD dwFlags
)
221 if (cchDest
> NTSTRSAFE_MAX_CCH
)
225 return STATUS_INVALID_PARAMETER
;
227 return RtlStringCopyExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
232 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
234 _In_ NTSTRSAFE_PCWSTR pszSrc
,
235 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
236 _Out_opt_
size_t *pcchRemaining
,
237 _In_ STRSAFE_DWORD dwFlags
)
239 size_t cbDest
= cchDest
* sizeof(wchar_t);
241 if (cchDest
> NTSTRSAFE_MAX_CCH
)
245 return STATUS_INVALID_PARAMETER
;
248 return RtlStringCopyExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
253 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
255 _In_ NTSTRSAFE_PCSTR pszSrc
,
256 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) STRSAFE_LPSTR
*ppszDestEnd
,
257 _Out_opt_
size_t *pcbRemaining
,
258 _In_ STRSAFE_DWORD dwFlags
);
262 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
264 _In_ NTSTRSAFE_PCWSTR pszSrc
,
265 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
266 _Out_opt_
size_t *pcbRemaining
,
267 _In_ STRSAFE_DWORD dwFlags
);
271 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
273 _In_ NTSTRSAFE_PCSTR pszSrc
,
274 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) STRSAFE_LPSTR
*ppszDestEnd
,
275 _Out_opt_
size_t *pcbRemaining
,
276 _In_ STRSAFE_DWORD dwFlags
)
279 size_t cchDest
= cbDest
/ sizeof(char);
280 size_t cchRemaining
= 0;
282 if (cchDest
> NTSTRSAFE_MAX_CCH
)
286 return STATUS_INVALID_PARAMETER
;
289 Status
= RtlStringCopyExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
290 if (NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
)
293 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
300 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
302 _In_ NTSTRSAFE_PCWSTR pszSrc
,
303 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
304 _Out_opt_
size_t *pcbRemaining
,
305 _In_ STRSAFE_DWORD dwFlags
)
308 size_t cchDest
= cbDest
/ sizeof(wchar_t);
309 size_t cchRemaining
= 0;
311 if (cchDest
> NTSTRSAFE_MAX_CCH
)
315 return STATUS_INVALID_PARAMETER
;
318 Status
= RtlStringCopyExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
319 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
322 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
329 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
331 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCSTR pszSrc
,
332 _In_
size_t cchToCopy
);
336 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
338 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCWSTR pszSrc
,
339 _In_
size_t cchToCopy
);
344 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
346 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCSTR pszSrc
,
347 _In_
size_t cchToCopy
)
349 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
353 return STATUS_INVALID_PARAMETER
;
356 return RtlStringCopyNWorkerA(pszDest
,cchDest
,pszSrc
,cchToCopy
);
361 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
363 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCWSTR pszSrc
,
364 _In_
size_t cchToCopy
)
366 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
370 return STATUS_INVALID_PARAMETER
;
373 return RtlStringCopyNWorkerW(pszDest
,cchDest
,pszSrc
,cchToCopy
);
378 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
380 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCSTR pszSrc
,
381 _In_
size_t cbToCopy
);
385 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
387 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCWSTR pszSrc
,
388 _In_
size_t cbToCopy
);
392 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
394 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCSTR pszSrc
,
395 _In_
size_t cbToCopy
)
397 size_t cchDest
= cbDest
/ sizeof(char);
398 size_t cchToCopy
= cbToCopy
/ sizeof(char);
400 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
404 return STATUS_INVALID_PARAMETER
;
407 return RtlStringCopyNWorkerA(pszDest
, cchDest
, pszSrc
, cchToCopy
);
412 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
414 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCWSTR pszSrc
,
415 _In_
size_t cbToCopy
)
417 size_t cchDest
= cbDest
/ sizeof(wchar_t);
418 size_t cchToCopy
= cbToCopy
/ sizeof(wchar_t);
420 if (cchDest
> NTSTRSAFE_MAX_CCH
|| cchToCopy
> NTSTRSAFE_MAX_CCH
)
424 return STATUS_INVALID_PARAMETER
;
427 return RtlStringCopyNWorkerW(pszDest
, cchDest
, pszSrc
, cchToCopy
);
431 RtlStringCchCopyNExA(
432 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
434 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCSTR pszSrc
,
435 _In_
size_t cchToCopy
,
436 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
437 _Out_opt_
size_t *pcchRemaining
,
438 _In_ STRSAFE_DWORD dwFlags
);
441 RtlStringCchCopyNExW(
442 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
444 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCWSTR pszSrc
,
445 _In_
size_t cchToCopy
,
446 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
447 _Out_opt_
size_t *pcchRemaining
,
448 _In_ STRSAFE_DWORD dwFlags
);
451 RtlStringCchCopyNExA(
452 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
454 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCSTR pszSrc
,
455 _In_
size_t cchToCopy
,
456 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
457 _Out_opt_
size_t *pcchRemaining
,
458 _In_ STRSAFE_DWORD dwFlags
)
460 if (cchDest
> NTSTRSAFE_MAX_CCH
)
464 return STATUS_INVALID_PARAMETER
;
467 return RtlStringCopyNExWorkerA(pszDest
, cchDest
, cchDest
, pszSrc
, cchToCopy
, ppszDestEnd
, pcchRemaining
, dwFlags
);
471 RtlStringCchCopyNExW(
472 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
474 _In_reads_or_z_(cchToCopy
) STRSAFE_LPCWSTR pszSrc
,
475 _In_
size_t cchToCopy
,
476 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
477 _Out_opt_
size_t *pcchRemaining
,
478 _In_ STRSAFE_DWORD dwFlags
)
480 if (cchDest
> NTSTRSAFE_MAX_CCH
)
484 return STATUS_INVALID_PARAMETER
;
487 return RtlStringCopyNExWorkerW(pszDest
,cchDest
,cchDest
* sizeof(wchar_t), pszSrc
, cchToCopy
, ppszDestEnd
, pcchRemaining
, dwFlags
);
492 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
494 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCSTR pszSrc
,
495 _In_
size_t cbToCopy
,
496 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
497 _Out_opt_
size_t *pcbRemaining
,
498 _In_ STRSAFE_DWORD dwFlags
);
502 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
504 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCWSTR pszSrc
,
505 _In_
size_t cbToCopy
,
506 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
507 _Out_opt_
size_t *pcbRemaining
,
508 _In_ STRSAFE_DWORD dwFlags
);
512 _Out_writes_bytes_(cbDest
) STRSAFE_LPSTR pszDest
,
514 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCSTR pszSrc
,
515 _In_
size_t cbToCopy
,
516 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) STRSAFE_LPSTR
*ppszDestEnd
,
517 _Out_opt_
size_t *pcbRemaining
,
518 _In_ STRSAFE_DWORD dwFlags
)
521 size_t cchRemaining
= 0;
523 if (cbDest
> NTSTRSAFE_MAX_CCH
)
525 if ((pszDest
!= NULL
) && (cbDest
> 0))
527 return STATUS_INVALID_PARAMETER
;
530 Status
= RtlStringCopyNExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,cbToCopy
,ppszDestEnd
,&cchRemaining
,dwFlags
);
531 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
532 *pcbRemaining
= cchRemaining
;
538 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
540 _In_reads_bytes_(cbToCopy
) STRSAFE_LPCWSTR pszSrc
,
541 _In_
size_t cbToCopy
,
542 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
543 _Out_opt_
size_t *pcbRemaining
,
544 _In_ STRSAFE_DWORD dwFlags
)
549 size_t cchRemaining
= 0;
550 cchDest
= cbDest
/ sizeof(wchar_t);
551 cchToCopy
= cbToCopy
/ sizeof(wchar_t);
552 if (cchDest
> NTSTRSAFE_MAX_CCH
)
554 if ((pszDest
!= NULL
) && (cbDest
> 0))
556 return STATUS_INVALID_PARAMETER
;
559 Status
= RtlStringCopyNExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,cchToCopy
,ppszDestEnd
,&cchRemaining
,dwFlags
);
560 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
561 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
567 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
569 _In_ NTSTRSAFE_PCSTR pszSrc
);
573 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
575 _In_ NTSTRSAFE_PCWSTR pszSrc
);
579 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
581 _In_ NTSTRSAFE_PCSTR pszSrc
)
583 if (cchDest
> NTSTRSAFE_MAX_CCH
)
584 return STATUS_INVALID_PARAMETER
;
585 return RtlStringCatWorkerA(pszDest
,cchDest
,pszSrc
);
590 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
592 _In_ NTSTRSAFE_PCWSTR pszSrc
)
594 if (cchDest
> NTSTRSAFE_MAX_CCH
)
595 return STATUS_INVALID_PARAMETER
;
596 return RtlStringCatWorkerW(pszDest
,cchDest
,pszSrc
);
601 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
603 _In_ NTSTRSAFE_PCSTR pszSrc
);
607 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
609 _In_ NTSTRSAFE_PCWSTR pszSrc
);
613 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
615 _In_ NTSTRSAFE_PCSTR pszSrc
)
617 if (cbDest
> NTSTRSAFE_MAX_CCH
)
618 return STATUS_INVALID_PARAMETER
;
619 return RtlStringCatWorkerA(pszDest
,cbDest
,pszSrc
);
624 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
626 _In_ NTSTRSAFE_PCWSTR pszSrc
)
628 size_t cchDest
= cbDest
/ sizeof(wchar_t);
629 if (cchDest
> NTSTRSAFE_MAX_CCH
)
630 return STATUS_INVALID_PARAMETER
;
631 return RtlStringCatWorkerW(pszDest
,cchDest
,pszSrc
);
636 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
638 _In_ NTSTRSAFE_PCSTR pszSrc
,
639 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
640 _Out_opt_
size_t *pcchRemaining
,
641 _In_ STRSAFE_DWORD dwFlags
);
645 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
647 _In_ NTSTRSAFE_PCWSTR pszSrc
,
648 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
649 _Out_opt_
size_t *pcchRemaining
,
650 _In_ STRSAFE_DWORD dwFlags
);
654 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
656 _In_ NTSTRSAFE_PCSTR pszSrc
,
657 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
658 _Out_opt_
size_t *pcchRemaining
,
659 _In_ STRSAFE_DWORD dwFlags
)
661 if (cchDest
> NTSTRSAFE_MAX_CCH
)
662 return STATUS_INVALID_PARAMETER
;
663 return RtlStringCatExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
668 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
670 _In_ NTSTRSAFE_PCWSTR pszSrc
,
671 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
672 _Out_opt_
size_t *pcchRemaining
,
673 _In_ STRSAFE_DWORD dwFlags
)
675 size_t cbDest
= cchDest
*sizeof(wchar_t);
676 if (cchDest
> NTSTRSAFE_MAX_CCH
)
677 return STATUS_INVALID_PARAMETER
;
678 return RtlStringCatExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,pcchRemaining
,dwFlags
);
683 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
685 _In_ NTSTRSAFE_PCSTR pszSrc
,
686 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
687 _Out_opt_
size_t *pcbRemaining
,
688 _In_ STRSAFE_DWORD dwFlags
);
692 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
694 _In_ NTSTRSAFE_PCWSTR pszSrc
,
695 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
696 _Out_opt_
size_t *pcbRemaining
,
697 _In_ STRSAFE_DWORD dwFlags
);
701 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
703 _In_ NTSTRSAFE_PCSTR pszSrc
,
704 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
705 _Out_opt_
size_t *pcbRemaining
,
706 _In_ STRSAFE_DWORD dwFlags
)
709 size_t cchRemaining
= 0;
710 if (cbDest
> NTSTRSAFE_MAX_CCH
)
711 Status
= STATUS_INVALID_PARAMETER
;
713 Status
= RtlStringCatExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
714 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
715 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
721 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
723 _In_ NTSTRSAFE_PCWSTR pszSrc
,
724 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
725 _Out_opt_
size_t *pcbRemaining
,
726 _In_ STRSAFE_DWORD dwFlags
)
729 size_t cchDest
= cbDest
/ sizeof(wchar_t);
730 size_t cchRemaining
= 0;
732 if (cchDest
> NTSTRSAFE_MAX_CCH
)
733 Status
= STATUS_INVALID_PARAMETER
;
735 Status
= RtlStringCatExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,ppszDestEnd
,&cchRemaining
,dwFlags
);
736 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
737 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
743 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
745 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCSTR pszSrc
,
746 _In_
size_t cchToAppend
);
750 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
752 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCWSTR pszSrc
,
753 _In_
size_t cchToAppend
);
757 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
759 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCSTR pszSrc
,
760 _In_
size_t cchToAppend
)
762 if (cchDest
> NTSTRSAFE_MAX_CCH
)
763 return STATUS_INVALID_PARAMETER
;
764 return RtlStringCatNWorkerA(pszDest
,cchDest
,pszSrc
,cchToAppend
);
769 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
771 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCWSTR pszSrc
,
772 _In_
size_t cchToAppend
)
774 if (cchDest
> NTSTRSAFE_MAX_CCH
)
775 return STATUS_INVALID_PARAMETER
;
776 return RtlStringCatNWorkerW(pszDest
,cchDest
,pszSrc
,cchToAppend
);
781 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
783 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCSTR pszSrc
,
784 _In_
size_t cbToAppend
);
788 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
790 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCWSTR pszSrc
,
791 _In_
size_t cbToAppend
);
795 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
797 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCSTR pszSrc
,
798 _In_
size_t cbToAppend
)
800 if (cbDest
> NTSTRSAFE_MAX_CCH
)
801 return STATUS_INVALID_PARAMETER
;
802 return RtlStringCatNWorkerA(pszDest
,cbDest
,pszSrc
,cbToAppend
);
807 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
809 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCWSTR pszSrc
,
810 _In_
size_t cbToAppend
)
812 size_t cchDest
= cbDest
/ sizeof(wchar_t);
813 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
815 if (cchDest
> NTSTRSAFE_MAX_CCH
)
816 return STATUS_INVALID_PARAMETER
;
817 return RtlStringCatNWorkerW(pszDest
,cchDest
,pszSrc
,cchToAppend
);
822 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
824 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCSTR pszSrc
,
825 _In_
size_t cchToAppend
,
826 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
827 _Out_opt_
size_t *pcchRemaining
,
828 _In_ STRSAFE_DWORD dwFlags
);
832 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
834 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCWSTR pszSrc
,
835 _In_
size_t cchToAppend
,
836 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
837 _Out_opt_
size_t *pcchRemaining
,
838 _In_ STRSAFE_DWORD dwFlags
);
842 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
844 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCSTR pszSrc
,
845 _In_
size_t cchToAppend
,
846 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
847 _Out_opt_
size_t *pcchRemaining
,
848 _In_ STRSAFE_DWORD dwFlags
)
850 if (cchDest
> NTSTRSAFE_MAX_CCH
)
851 return STATUS_INVALID_PARAMETER
;
852 return RtlStringCatNExWorkerA(pszDest
,cchDest
,cchDest
,pszSrc
,cchToAppend
,ppszDestEnd
,pcchRemaining
,dwFlags
);
857 _Inout_updates_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
859 _In_reads_or_z_(cchToAppend
) STRSAFE_LPCWSTR pszSrc
,
860 _In_
size_t cchToAppend
,
861 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
862 _Out_opt_
size_t *pcchRemaining
,
863 _In_ STRSAFE_DWORD dwFlags
)
865 if (cchDest
> NTSTRSAFE_MAX_CCH
)
866 return STATUS_INVALID_PARAMETER
;
867 return RtlStringCatNExWorkerW(pszDest
,cchDest
,(cchDest
*sizeof(wchar_t)),pszSrc
,cchToAppend
,ppszDestEnd
,pcchRemaining
,dwFlags
);
872 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
874 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCSTR pszSrc
,
875 _In_
size_t cbToAppend
,
876 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
877 _Out_opt_
size_t *pcbRemaining
,
878 _In_ STRSAFE_DWORD dwFlags
);
882 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
884 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCWSTR pszSrc
,
885 _In_
size_t cbToAppend
,
886 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
887 _Out_opt_
size_t *pcbRemaining
,
888 _In_ STRSAFE_DWORD dwFlags
);
892 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
894 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCSTR pszSrc
,
895 _In_
size_t cbToAppend
,
896 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
897 _Out_opt_
size_t *pcbRemaining
,
898 _In_ STRSAFE_DWORD dwFlags
)
901 size_t cchRemaining
= 0;
902 if (cbDest
> NTSTRSAFE_MAX_CCH
)
903 Status
= STATUS_INVALID_PARAMETER
;
905 Status
= RtlStringCatNExWorkerA(pszDest
,cbDest
,cbDest
,pszSrc
,cbToAppend
,ppszDestEnd
,&cchRemaining
,dwFlags
);
906 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
907 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
913 _Inout_updates_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
915 _In_reads_bytes_(cbToAppend
) STRSAFE_LPCWSTR pszSrc
,
916 _In_
size_t cbToAppend
,
917 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
918 _Out_opt_
size_t *pcbRemaining
,
919 _In_ STRSAFE_DWORD dwFlags
)
922 size_t cchDest
= cbDest
/ sizeof(wchar_t);
923 size_t cchToAppend
= cbToAppend
/ sizeof(wchar_t);
924 size_t cchRemaining
= 0;
925 if (cchDest
> NTSTRSAFE_MAX_CCH
)
926 Status
= STATUS_INVALID_PARAMETER
;
928 Status
= RtlStringCatNExWorkerW(pszDest
,cchDest
,cbDest
,pszSrc
,cchToAppend
,ppszDestEnd
,&cchRemaining
,dwFlags
);
929 if ((NT_SUCCESS(Status
) || Status
== STATUS_BUFFER_OVERFLOW
) && pcbRemaining
)
930 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
935 RtlStringCchVPrintfA(
936 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
938 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
939 _In_
va_list argList
);
942 RtlStringCchVPrintfW(
943 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
945 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
946 _In_
va_list argList
);
949 RtlStringCchVPrintfA(
950 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
952 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
953 _In_
va_list argList
)
955 if (cchDest
> NTSTRSAFE_MAX_CCH
)
959 return STATUS_INVALID_PARAMETER
;
962 return RtlStringVPrintfWorkerA(pszDest
,cchDest
,pszFormat
,argList
);
966 RtlStringCchVPrintfW(
967 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
969 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
970 _In_
va_list argList
)
972 if (cchDest
> NTSTRSAFE_MAX_CCH
)
976 return STATUS_INVALID_PARAMETER
;
978 return RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
983 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
985 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
986 _In_
va_list argList
);
990 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
992 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
993 _In_
va_list argList
);
997 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
999 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1000 _In_
va_list argList
)
1002 if (cbDest
> NTSTRSAFE_MAX_CCH
)
1006 return STATUS_INVALID_PARAMETER
;
1008 return RtlStringVPrintfWorkerA(pszDest
,cbDest
,pszFormat
,argList
);
1012 RtlStringCbVPrintfW(
1013 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1015 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1016 _In_
va_list argList
)
1018 size_t cchDest
= cbDest
/ sizeof(wchar_t);
1019 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1023 return STATUS_INVALID_PARAMETER
;
1025 return RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
1028 static __inline NTSTATUS
1029 RtlStringCchPrintfA(
1030 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1031 _In_
size_t cchDest
,
1032 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1035 static __inline NTSTATUS
1036 RtlStringCchPrintfW(
1037 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1038 _In_
size_t cchDest
,
1039 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1042 static __inline NTSTATUS
1043 RtlStringCchPrintfA(
1044 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1045 _In_
size_t cchDest
,
1046 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1051 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1055 return STATUS_INVALID_PARAMETER
;
1057 va_start(argList
,pszFormat
);
1058 Status
= RtlStringVPrintfWorkerA(pszDest
,cchDest
,pszFormat
,argList
);
1063 static __inline NTSTATUS
1064 RtlStringCchPrintfW(
1065 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1066 _In_
size_t cchDest
,
1067 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1072 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1076 return STATUS_INVALID_PARAMETER
;
1078 va_start(argList
,pszFormat
);
1079 Status
= RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
1084 static __inline NTSTATUS
1086 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1088 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1091 static __inline NTSTATUS
1093 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1095 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1098 static __inline NTSTATUS
1100 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1102 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1107 if (cbDest
> NTSTRSAFE_MAX_CCH
)
1111 return STATUS_INVALID_PARAMETER
;
1113 va_start(argList
,pszFormat
);
1114 Status
= RtlStringVPrintfWorkerA(pszDest
,cbDest
,pszFormat
,argList
);
1119 static __inline NTSTATUS
1121 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1123 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1128 size_t cchDest
= cbDest
/ sizeof(wchar_t);
1129 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1133 return STATUS_INVALID_PARAMETER
;
1135 va_start(argList
,pszFormat
);
1136 Status
= RtlStringVPrintfWorkerW(pszDest
,cchDest
,pszFormat
,argList
);
1141 static __inline NTSTATUS
1142 RtlStringCchPrintfExA(
1143 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1144 _In_
size_t cchDest
,
1145 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1146 _Out_opt_
size_t *pcchRemaining
,
1147 _In_ STRSAFE_DWORD dwFlags
,
1148 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1151 static __inline NTSTATUS
1152 RtlStringCchPrintfExW(
1153 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1154 _In_
size_t cchDest
,
1155 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1156 _Out_opt_
size_t *pcchRemaining
,
1157 _In_ STRSAFE_DWORD dwFlags
,
1158 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1161 static __inline NTSTATUS
1162 RtlStringCchPrintfExA(
1163 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1164 _In_
size_t cchDest
,
1165 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1166 _Out_opt_
size_t *pcchRemaining
,
1167 _In_ STRSAFE_DWORD dwFlags
,
1168 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1173 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1177 return STATUS_INVALID_PARAMETER
;
1179 va_start(argList
,pszFormat
);
1180 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cchDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
1185 static __inline NTSTATUS
1186 RtlStringCchPrintfExW(
1187 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1188 _In_
size_t cchDest
,
1189 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1190 _Out_opt_
size_t *pcchRemaining
,
1191 _In_ STRSAFE_DWORD dwFlags
,
1192 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1196 size_t cbDest
= cchDest
* sizeof(wchar_t);
1198 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1202 return STATUS_INVALID_PARAMETER
;
1204 va_start(argList
,pszFormat
);
1205 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
1210 static __inline NTSTATUS
1211 RtlStringCbPrintfExA(
1212 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1214 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1215 _Out_opt_
size_t *pcbRemaining
,
1216 _In_ STRSAFE_DWORD dwFlags
,
1217 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1220 static __inline NTSTATUS
1221 RtlStringCbPrintfExW(
1222 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1224 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1225 _Out_opt_
size_t *pcbRemaining
,
1226 _In_ STRSAFE_DWORD dwFlags
,
1227 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1230 static __inline NTSTATUS
1231 RtlStringCbPrintfExA(
1232 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) 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
,
1242 size_t cchRemaining
= 0;
1244 cchDest
= cbDest
/ sizeof(char);
1245 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1249 return STATUS_INVALID_PARAMETER
;
1254 va_start(argList
,pszFormat
);
1255 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
1258 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1262 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
1268 static __inline NTSTATUS
1269 RtlStringCbPrintfExW(
1270 _Out_writes_bytes_(cbDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1272 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1273 _Out_opt_
size_t *pcbRemaining
,
1274 _In_ STRSAFE_DWORD dwFlags
,
1275 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1280 size_t cchRemaining
= 0;
1281 cchDest
= cbDest
/ sizeof(wchar_t);
1282 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1286 return STATUS_INVALID_PARAMETER
;
1291 va_start(argList
,pszFormat
);
1292 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
1295 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1299 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
1306 RtlStringCchVPrintfExA(
1307 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1308 _In_
size_t cchDest
,
1309 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1310 _Out_opt_
size_t *pcchRemaining
,
1311 _In_ STRSAFE_DWORD dwFlags
,
1312 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1313 _In_
va_list argList
);
1316 RtlStringCchVPrintfExW(
1317 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1318 _In_
size_t cchDest
,
1319 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1320 _Out_opt_
size_t *pcchRemaining
,
1321 _In_ STRSAFE_DWORD dwFlags
,
1322 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1323 _In_
va_list argList
);
1326 RtlStringCchVPrintfExA(
1327 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PSTR pszDest
,
1328 _In_
size_t cchDest
,
1329 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1330 _Out_opt_
size_t *pcchRemaining
,
1331 _In_ STRSAFE_DWORD dwFlags
,
1332 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1333 _In_
va_list argList
)
1336 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1340 return STATUS_INVALID_PARAMETER
;
1345 cbDest
= cchDest
*sizeof(char);
1346 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
1352 RtlStringCchVPrintfExW(
1353 _Out_writes_(cchDest
) _Always_(_Post_z_
) NTSTRSAFE_PWSTR pszDest
,
1354 _In_
size_t cchDest
,
1355 _Outptr_opt_result_buffer_(*pcchRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1356 _Out_opt_
size_t *pcchRemaining
,
1357 _In_ STRSAFE_DWORD dwFlags
,
1358 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1359 _In_
va_list argList
)
1362 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1366 return STATUS_INVALID_PARAMETER
;
1371 cbDest
= cchDest
*sizeof(wchar_t);
1372 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,pcchRemaining
,dwFlags
,pszFormat
,argList
);
1378 RtlStringCbVPrintfExA(
1379 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
1381 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1382 _Out_opt_
size_t *pcbRemaining
,
1383 _In_ STRSAFE_DWORD dwFlags
,
1384 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1385 _In_
va_list argList
);
1388 RtlStringCbVPrintfExW(
1389 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
1391 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1392 _Out_opt_
size_t *pcbRemaining
,
1393 _In_ STRSAFE_DWORD dwFlags
,
1394 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1395 _In_
va_list argList
);
1398 RtlStringCbVPrintfExA(
1399 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PSTR pszDest
,
1401 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PSTR
*ppszDestEnd
,
1402 _Out_opt_
size_t *pcbRemaining
,
1403 _In_ STRSAFE_DWORD dwFlags
,
1404 _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat
,
1405 _In_
va_list argList
)
1409 size_t cchRemaining
= 0;
1410 cchDest
= cbDest
/ sizeof(char);
1411 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1412 Status
= STATUS_INVALID_PARAMETER
;
1414 Status
= RtlStringVPrintfExWorkerA(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
1415 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1419 *pcbRemaining
= (cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char));
1426 RtlStringCbVPrintfExW(
1427 _Out_writes_bytes_(cbDest
) NTSTRSAFE_PWSTR pszDest
,
1429 _Outptr_opt_result_bytebuffer_(*pcbRemaining
) NTSTRSAFE_PWSTR
*ppszDestEnd
,
1430 _Out_opt_
size_t *pcbRemaining
,
1431 _In_ STRSAFE_DWORD dwFlags
,
1432 _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat
,
1433 _In_
va_list argList
)
1437 size_t cchRemaining
= 0;
1438 cchDest
= cbDest
/ sizeof(wchar_t);
1439 if (cchDest
> NTSTRSAFE_MAX_CCH
)
1440 Status
= STATUS_INVALID_PARAMETER
;
1442 Status
= RtlStringVPrintfExWorkerW(pszDest
,cchDest
,cbDest
,ppszDestEnd
,&cchRemaining
,dwFlags
,pszFormat
,argList
);
1443 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1447 *pcbRemaining
= (cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t));
1454 _Must_inspect_result_
1456 RtlStringCchLengthA(
1457 _In_reads_or_z_(cchMax
) STRSAFE_LPCSTR psz
,
1458 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
1459 _Out_opt_
_Deref_out_range_(<, cchMax
) _Deref_out_range_(<=, _String_length_(psz
)) size_t *pcchLength
);
1461 _Must_inspect_result_
1463 RtlStringCchLengthW(
1464 _In_reads_or_z_(cchMax
) STRSAFE_LPCWSTR psz
,
1465 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
1466 _Out_opt_
_Deref_out_range_(<, cchMax
) _Deref_out_range_(<=, _String_length_(psz
)) size_t *pcchLength
);
1468 _Must_inspect_result_
1470 RtlStringCchLengthA(
1471 _In_reads_or_z_(cchMax
) STRSAFE_LPCSTR psz
,
1472 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
1473 _Out_opt_
_Deref_out_range_(<, cchMax
) _Deref_out_range_(<=, _String_length_(psz
)) size_t *pcchLength
)
1476 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
1477 Status
= STATUS_INVALID_PARAMETER
;
1479 Status
= RtlStringLengthWorkerA(psz
,cchMax
,pcchLength
);
1480 if (!NT_SUCCESS(Status
) && pcchLength
)
1487 _Must_inspect_result_
1489 RtlStringCchLengthW(
1490 _In_reads_or_z_(cchMax
) STRSAFE_LPCWSTR psz
,
1491 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
1492 _Out_opt_
_Deref_out_range_(<, cchMax
) _Deref_out_range_(<=, _String_length_(psz
)) size_t *pcchLength
)
1495 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
1496 Status
= STATUS_INVALID_PARAMETER
;
1498 Status
= RtlStringLengthWorkerW(psz
,cchMax
,pcchLength
);
1499 if (!NT_SUCCESS(Status
) && pcchLength
)
1506 _Must_inspect_result_
1509 _In_reads_or_z_(cbMax
) STRSAFE_LPCSTR psz
,
1510 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
* sizeof(char)) size_t cbMax
,
1511 _Out_opt_
_Deref_out_range_(<, cbMax
) size_t *pcbLength
);
1513 _Must_inspect_result_
1516 _In_reads_or_z_(cbMax
/ sizeof(wchar_t)) STRSAFE_LPCWSTR psz
,
1517 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
* sizeof(wchar_t)) size_t cbMax
,
1518 _Out_opt_
_Deref_out_range_(<, cbMax
- 1) size_t *pcbLength
);
1520 _Must_inspect_result_
1523 _In_reads_or_z_(cbMax
) STRSAFE_LPCSTR psz
,
1524 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
* sizeof(char)) size_t cbMax
,
1525 _Out_opt_
_Deref_out_range_(<, cbMax
) size_t *pcbLength
)
1529 size_t cchLength
= 0;
1530 cchMax
= cbMax
/ sizeof(char);
1531 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
1532 Status
= STATUS_INVALID_PARAMETER
;
1534 Status
= RtlStringLengthWorkerA(psz
,cchMax
,&cchLength
);
1537 if (NT_SUCCESS(Status
))
1539 *pcbLength
= cchLength
*sizeof(char);
1549 _Must_inspect_result_
1552 _In_reads_or_z_(cbMax
/ sizeof(wchar_t)) STRSAFE_LPCWSTR psz
,
1553 _In_
_In_range_(1, NTSTRSAFE_MAX_CCH
* sizeof(wchar_t)) size_t cbMax
,
1554 _Out_opt_
_Deref_out_range_(<, cbMax
- 1) size_t *pcbLength
)
1558 size_t cchLength
= 0;
1559 cchMax
= cbMax
/ sizeof(wchar_t);
1560 if (!psz
|| (cchMax
> NTSTRSAFE_MAX_CCH
))
1561 Status
= STATUS_INVALID_PARAMETER
;
1563 Status
= RtlStringLengthWorkerW(psz
,cchMax
,&cchLength
);
1566 if (NT_SUCCESS(Status
))
1568 *pcbLength
= cchLength
*sizeof(wchar_t);
1578 NTSTRSAFEAPI
RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
)
1580 NTSTATUS Status
= STATUS_SUCCESS
;
1582 Status
= STATUS_INVALID_PARAMETER
;
1585 while(cchDest
&& (*pszSrc
!='\0'))
1587 *pszDest
++ = *pszSrc
++;
1593 Status
= STATUS_BUFFER_OVERFLOW
;
1600 NTSTRSAFEAPI
RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
)
1602 NTSTATUS Status
= STATUS_SUCCESS
;
1604 Status
= STATUS_INVALID_PARAMETER
;
1607 while(cchDest
&& (*pszSrc
!=L
'\0'))
1609 *pszDest
++ = *pszSrc
++;
1615 Status
= STATUS_BUFFER_OVERFLOW
;
1622 NTSTRSAFEAPI
RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1624 NTSTATUS Status
= STATUS_SUCCESS
;
1625 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1626 size_t cchRemaining
= 0;
1627 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1628 Status
= STATUS_INVALID_PARAMETER
;
1631 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1635 if ((cchDest
!=0) || (cbDest
!=0))
1636 Status
= STATUS_INVALID_PARAMETER
;
1641 if (NT_SUCCESS(Status
))
1645 pszDestEnd
= pszDest
;
1650 Status
= STATUS_INVALID_PARAMETER
;
1652 Status
= STATUS_BUFFER_OVERFLOW
;
1657 pszDestEnd
= pszDest
;
1658 cchRemaining
= cchDest
;
1659 while(cchRemaining
&& (*pszSrc
!='\0'))
1661 *pszDestEnd
++ = *pszSrc
++;
1664 if (cchRemaining
> 0)
1666 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1668 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1675 Status
= STATUS_BUFFER_OVERFLOW
;
1681 if (!NT_SUCCESS(Status
))
1685 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1687 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1688 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1690 pszDestEnd
= pszDest
;
1691 cchRemaining
= cchDest
;
1696 pszDestEnd
= pszDest
+ cchDest
- 1;
1701 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1705 pszDestEnd
= pszDest
;
1706 cchRemaining
= cchDest
;
1712 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1715 *ppszDestEnd
= pszDestEnd
;
1717 *pcchRemaining
= cchRemaining
;
1722 NTSTRSAFEAPI
RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
1724 NTSTATUS Status
= STATUS_SUCCESS
;
1725 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1726 size_t cchRemaining
= 0;
1727 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1728 Status
= STATUS_INVALID_PARAMETER
;
1731 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1735 if ((cchDest
!=0) || (cbDest
!=0))
1736 Status
= STATUS_INVALID_PARAMETER
;
1741 if (NT_SUCCESS(Status
))
1745 pszDestEnd
= pszDest
;
1750 Status
= STATUS_INVALID_PARAMETER
;
1752 Status
= STATUS_BUFFER_OVERFLOW
;
1757 pszDestEnd
= pszDest
;
1758 cchRemaining
= cchDest
;
1759 while(cchRemaining
&& (*pszSrc
!=L
'\0'))
1761 *pszDestEnd
++ = *pszSrc
++;
1764 if (cchRemaining
> 0)
1766 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1768 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
1775 Status
= STATUS_BUFFER_OVERFLOW
;
1777 *pszDestEnd
= L
'\0';
1781 if (!NT_SUCCESS(Status
))
1785 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1787 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1788 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1790 pszDestEnd
= pszDest
;
1791 cchRemaining
= cchDest
;
1796 pszDestEnd
= pszDest
+ cchDest
- 1;
1798 *pszDestEnd
= L
'\0';
1801 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1805 pszDestEnd
= pszDest
;
1806 cchRemaining
= cchDest
;
1807 *pszDestEnd
= L
'\0';
1812 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1815 *ppszDestEnd
= pszDestEnd
;
1817 *pcchRemaining
= cchRemaining
;
1822 NTSTRSAFEAPI
RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchSrc
)
1824 NTSTATUS Status
= STATUS_SUCCESS
;
1826 Status
= STATUS_INVALID_PARAMETER
;
1829 while(cchDest
&& cchSrc
&& (*pszSrc
!='\0'))
1831 *pszDest
++ = *pszSrc
++;
1838 Status
= STATUS_BUFFER_OVERFLOW
;
1845 NTSTRSAFEAPI
RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToCopy
)
1847 NTSTATUS Status
= STATUS_SUCCESS
;
1849 Status
= STATUS_INVALID_PARAMETER
;
1852 while(cchDest
&& cchToCopy
&& (*pszSrc
!=L
'\0'))
1854 *pszDest
++ = *pszSrc
++;
1861 Status
= STATUS_BUFFER_OVERFLOW
;
1868 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
)
1870 NTSTATUS Status
= STATUS_SUCCESS
;
1871 STRSAFE_LPSTR pszDestEnd
= pszDest
;
1872 size_t cchRemaining
= 0;
1873 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1874 Status
= STATUS_INVALID_PARAMETER
;
1876 if (cchToCopy
> NTSTRSAFE_MAX_CCH
)
1877 Status
= STATUS_INVALID_PARAMETER
;
1880 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1884 if ((cchDest
!=0) || (cbDest
!=0))
1885 Status
= STATUS_INVALID_PARAMETER
;
1890 if (NT_SUCCESS(Status
))
1894 pszDestEnd
= pszDest
;
1896 if ((cchToCopy
!=0) && (*pszSrc
!='\0'))
1899 Status
= STATUS_INVALID_PARAMETER
;
1901 Status
= STATUS_BUFFER_OVERFLOW
;
1906 pszDestEnd
= pszDest
;
1907 cchRemaining
= cchDest
;
1908 while(cchRemaining
&& cchToCopy
&& (*pszSrc
!='\0'))
1910 *pszDestEnd
++ = *pszSrc
++;
1914 if (cchRemaining
> 0)
1916 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
1918 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
1925 Status
= STATUS_BUFFER_OVERFLOW
;
1931 if (!NT_SUCCESS(Status
))
1935 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
1937 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
1938 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
1940 pszDestEnd
= pszDest
;
1941 cchRemaining
= cchDest
;
1946 pszDestEnd
= pszDest
+ cchDest
- 1;
1951 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
1955 pszDestEnd
= pszDest
;
1956 cchRemaining
= cchDest
;
1962 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
1965 *ppszDestEnd
= pszDestEnd
;
1967 *pcchRemaining
= cchRemaining
;
1972 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
)
1974 NTSTATUS Status
= STATUS_SUCCESS
;
1975 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
1976 size_t cchRemaining
= 0;
1977 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
1978 Status
= STATUS_INVALID_PARAMETER
;
1980 if (cchToCopy
> NTSTRSAFE_MAX_CCH
)
1981 Status
= STATUS_INVALID_PARAMETER
;
1984 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
1988 if ((cchDest
!=0) || (cbDest
!=0))
1989 Status
= STATUS_INVALID_PARAMETER
;
1994 if (NT_SUCCESS(Status
))
1998 pszDestEnd
= pszDest
;
2000 if ((cchToCopy
!=0) && (*pszSrc
!=L
'\0'))
2003 Status
= STATUS_INVALID_PARAMETER
;
2005 Status
= STATUS_BUFFER_OVERFLOW
;
2010 pszDestEnd
= pszDest
;
2011 cchRemaining
= cchDest
;
2012 while(cchRemaining
&& cchToCopy
&& (*pszSrc
!=L
'\0'))
2014 *pszDestEnd
++ = *pszSrc
++;
2018 if (cchRemaining
> 0)
2020 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
2022 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
2029 Status
= STATUS_BUFFER_OVERFLOW
;
2031 *pszDestEnd
= L
'\0';
2035 if (!NT_SUCCESS(Status
))
2039 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2041 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2042 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2044 pszDestEnd
= pszDest
;
2045 cchRemaining
= cchDest
;
2050 pszDestEnd
= pszDest
+ cchDest
- 1;
2052 *pszDestEnd
= L
'\0';
2055 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
2059 pszDestEnd
= pszDest
;
2060 cchRemaining
= cchDest
;
2061 *pszDestEnd
= L
'\0';
2066 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2069 *ppszDestEnd
= pszDestEnd
;
2071 *pcchRemaining
= cchRemaining
;
2076 NTSTRSAFEAPI
RtlStringCatWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
)
2079 size_t cchDestLength
;
2080 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
2081 if (NT_SUCCESS(Status
))
2082 Status
= RtlStringCopyWorkerA(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
);
2086 NTSTRSAFEAPI
RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
)
2089 size_t cchDestLength
;
2090 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
2091 if (NT_SUCCESS(Status
))
2092 Status
= RtlStringCopyWorkerW(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
);
2096 NTSTRSAFEAPI
RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCSTR pszSrc
,STRSAFE_LPSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
2098 NTSTATUS Status
= STATUS_SUCCESS
;
2099 STRSAFE_LPSTR pszDestEnd
= pszDest
;
2100 size_t cchRemaining
= 0;
2101 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2102 Status
= STATUS_INVALID_PARAMETER
;
2105 size_t cchDestLength
;
2106 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2110 if ((cchDest
==0) && (cbDest
==0))
2113 Status
= STATUS_INVALID_PARAMETER
;
2117 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
2118 if (NT_SUCCESS(Status
))
2120 pszDestEnd
= pszDest
+ cchDestLength
;
2121 cchRemaining
= cchDest
- cchDestLength
;
2129 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
2130 if (NT_SUCCESS(Status
))
2132 pszDestEnd
= pszDest
+ cchDestLength
;
2133 cchRemaining
= cchDest
- cchDestLength
;
2136 if (NT_SUCCESS(Status
))
2143 Status
= STATUS_INVALID_PARAMETER
;
2145 Status
= STATUS_BUFFER_OVERFLOW
;
2149 Status
= RtlStringCopyExWorkerA(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char)),pszSrc
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
2152 if (!NT_SUCCESS(Status
))
2156 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2158 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2159 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2161 pszDestEnd
= pszDest
;
2162 cchRemaining
= cchDest
;
2167 pszDestEnd
= pszDest
+ cchDest
- 1;
2172 if (dwFlags
& STRSAFE_NULL_ON_FAILURE
)
2176 pszDestEnd
= pszDest
;
2177 cchRemaining
= cchDest
;
2183 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2186 *ppszDestEnd
= pszDestEnd
;
2188 *pcchRemaining
= cchRemaining
;
2193 NTSTRSAFEAPI
RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,size_t cbDest
,STRSAFE_LPCWSTR pszSrc
,STRSAFE_LPWSTR
*ppszDestEnd
,size_t *pcchRemaining
,STRSAFE_DWORD dwFlags
)
2195 NTSTATUS Status
= STATUS_SUCCESS
;
2196 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
2197 size_t cchRemaining
= 0;
2198 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2199 Status
= STATUS_INVALID_PARAMETER
;
2202 size_t cchDestLength
;
2203 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2207 if ((cchDest
==0) && (cbDest
==0))
2210 Status
= STATUS_INVALID_PARAMETER
;
2214 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
2215 if (NT_SUCCESS(Status
))
2217 pszDestEnd
= pszDest
+ cchDestLength
;
2218 cchRemaining
= cchDest
- cchDestLength
;
2226 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
2227 if (NT_SUCCESS(Status
))
2229 pszDestEnd
= pszDest
+ cchDestLength
;
2230 cchRemaining
= cchDest
- cchDestLength
;
2233 if (NT_SUCCESS(Status
))
2240 Status
= STATUS_INVALID_PARAMETER
;
2242 Status
= STATUS_BUFFER_OVERFLOW
;
2246 Status
= RtlStringCopyExWorkerW(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)),pszSrc
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
2249 if (!NT_SUCCESS(Status
))
2253 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2255 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2256 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2258 pszDestEnd
= pszDest
;
2259 cchRemaining
= cchDest
;
2264 pszDestEnd
= pszDest
+ cchDest
- 1;
2266 *pszDestEnd
= L
'\0';
2269 if (dwFlags
& STRSAFE_NULL_ON_FAILURE
)
2273 pszDestEnd
= pszDest
;
2274 cchRemaining
= cchDest
;
2275 *pszDestEnd
= L
'\0';
2280 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2283 *ppszDestEnd
= pszDestEnd
;
2285 *pcchRemaining
= cchRemaining
;
2290 NTSTRSAFEAPI
RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszSrc
,size_t cchToAppend
)
2293 size_t cchDestLength
;
2294 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
2295 if (NT_SUCCESS(Status
))
2296 Status
= RtlStringCopyNWorkerA(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
,cchToAppend
);
2300 NTSTRSAFEAPI
RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszSrc
,size_t cchToAppend
)
2303 size_t cchDestLength
;
2304 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
2305 if (NT_SUCCESS(Status
))
2306 Status
= RtlStringCopyNWorkerW(pszDest
+ cchDestLength
,cchDest
- cchDestLength
,pszSrc
,cchToAppend
);
2310 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
)
2312 NTSTATUS Status
= STATUS_SUCCESS
;
2313 STRSAFE_LPSTR pszDestEnd
= pszDest
;
2314 size_t cchRemaining
= 0;
2315 size_t cchDestLength
= 0;
2316 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2317 Status
= STATUS_INVALID_PARAMETER
;
2319 if (cchToAppend
> NTSTRSAFE_MAX_CCH
)
2320 Status
= STATUS_INVALID_PARAMETER
;
2323 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2327 if ((cchDest
==0) && (cbDest
==0))
2330 Status
= STATUS_INVALID_PARAMETER
;
2334 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
2335 if (NT_SUCCESS(Status
))
2337 pszDestEnd
= pszDest
+ cchDestLength
;
2338 cchRemaining
= cchDest
- cchDestLength
;
2346 Status
= RtlStringLengthWorkerA(pszDest
,cchDest
,&cchDestLength
);
2347 if (NT_SUCCESS(Status
))
2349 pszDestEnd
= pszDest
+ cchDestLength
;
2350 cchRemaining
= cchDest
- cchDestLength
;
2353 if (NT_SUCCESS(Status
))
2357 if ((cchToAppend
!=0) && (*pszSrc
!='\0'))
2360 Status
= STATUS_INVALID_PARAMETER
;
2362 Status
= STATUS_BUFFER_OVERFLOW
;
2366 Status
= RtlStringCopyNExWorkerA(pszDestEnd
,cchRemaining
,(cchRemaining
*sizeof(char)) + (cbDest
% sizeof(char)),pszSrc
,cchToAppend
,&pszDestEnd
,&cchRemaining
,dwFlags
& (~(STRSAFE_FILL_ON_FAILURE
| STRSAFE_NULL_ON_FAILURE
)));
2369 if (!NT_SUCCESS(Status
))
2373 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2375 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2376 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2378 pszDestEnd
= pszDest
;
2379 cchRemaining
= cchDest
;
2384 pszDestEnd
= pszDest
+ cchDest
- 1;
2389 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
))
2393 pszDestEnd
= pszDest
;
2394 cchRemaining
= cchDest
;
2400 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2403 *ppszDestEnd
= pszDestEnd
;
2405 *pcchRemaining
= cchRemaining
;
2410 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
)
2412 NTSTATUS Status
= STATUS_SUCCESS
;
2413 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
2414 size_t cchRemaining
= 0;
2415 size_t cchDestLength
= 0;
2416 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2417 Status
= STATUS_INVALID_PARAMETER
;
2419 if (cchToAppend
> NTSTRSAFE_MAX_CCH
)
2420 Status
= STATUS_INVALID_PARAMETER
;
2423 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2427 if ((cchDest
==0) && (cbDest
==0))
2430 Status
= STATUS_INVALID_PARAMETER
;
2434 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
2435 if (NT_SUCCESS(Status
))
2437 pszDestEnd
= pszDest
+ cchDestLength
;
2438 cchRemaining
= cchDest
- cchDestLength
;
2446 Status
= RtlStringLengthWorkerW(pszDest
,cchDest
,&cchDestLength
);
2447 if (NT_SUCCESS(Status
))
2449 pszDestEnd
= pszDest
+ cchDestLength
;
2450 cchRemaining
= cchDest
- cchDestLength
;
2453 if (NT_SUCCESS(Status
))
2457 if ((cchToAppend
!=0) && (*pszSrc
!=L
'\0'))
2460 Status
= STATUS_INVALID_PARAMETER
;
2462 Status
= STATUS_BUFFER_OVERFLOW
;
2466 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
)));
2469 if (!NT_SUCCESS(Status
))
2473 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2475 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2476 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2478 pszDestEnd
= pszDest
;
2479 cchRemaining
= cchDest
;
2484 pszDestEnd
= pszDest
+ cchDest
- 1;
2486 *pszDestEnd
= L
'\0';
2489 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
))
2493 pszDestEnd
= pszDest
;
2494 cchRemaining
= cchDest
;
2495 *pszDestEnd
= L
'\0';
2500 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2503 *ppszDestEnd
= pszDestEnd
;
2505 *pcchRemaining
= cchRemaining
;
2510 NTSTRSAFEAPI
RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest
,size_t cchDest
,STRSAFE_LPCSTR pszFormat
,va_list argList
)
2512 NTSTATUS Status
= STATUS_SUCCESS
;
2514 Status
= STATUS_INVALID_PARAMETER
;
2519 cchMax
= cchDest
- 1;
2520 iRet
= _vsnprintf(pszDest
,cchMax
,pszFormat
,argList
);
2521 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
2525 Status
= STATUS_BUFFER_OVERFLOW
;
2528 if (((size_t)iRet
)==cchMax
)
2537 NTSTRSAFEAPI
RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest
,size_t cchDest
,STRSAFE_LPCWSTR pszFormat
,va_list argList
)
2539 NTSTATUS Status
= STATUS_SUCCESS
;
2541 Status
= STATUS_INVALID_PARAMETER
;
2546 cchMax
= cchDest
- 1;
2547 iRet
= _vsnwprintf(pszDest
,cchMax
,pszFormat
,argList
);
2548 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
2552 Status
= STATUS_BUFFER_OVERFLOW
;
2555 if (((size_t)iRet
)==cchMax
)
2564 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
)
2566 NTSTATUS Status
= STATUS_SUCCESS
;
2567 STRSAFE_LPSTR pszDestEnd
= pszDest
;
2568 size_t cchRemaining
= 0;
2569 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2570 Status
= STATUS_INVALID_PARAMETER
;
2573 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2577 if ((cchDest
!=0) || (cbDest
!=0))
2578 Status
= STATUS_INVALID_PARAMETER
;
2583 if (NT_SUCCESS(Status
))
2587 pszDestEnd
= pszDest
;
2589 if (*pszFormat
!='\0')
2592 Status
= STATUS_INVALID_PARAMETER
;
2594 Status
= STATUS_BUFFER_OVERFLOW
;
2601 cchMax
= cchDest
- 1;
2602 iRet
= _vsnprintf(pszDest
,cchMax
,pszFormat
,argList
);
2603 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
2605 pszDestEnd
= pszDest
+ cchMax
;
2608 Status
= STATUS_BUFFER_OVERFLOW
;
2611 if (((size_t)iRet
)==cchMax
)
2613 pszDestEnd
= pszDest
+ cchMax
;
2618 if (((size_t)iRet
) < cchMax
)
2620 pszDestEnd
= pszDest
+ iRet
;
2621 cchRemaining
= cchDest
- iRet
;
2622 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
2624 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(char)) + (cbDest
% sizeof(char)));
2630 if (!NT_SUCCESS(Status
))
2634 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2636 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2637 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2639 pszDestEnd
= pszDest
;
2640 cchRemaining
= cchDest
;
2645 pszDestEnd
= pszDest
+ cchDest
- 1;
2650 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
2654 pszDestEnd
= pszDest
;
2655 cchRemaining
= cchDest
;
2661 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2664 *ppszDestEnd
= pszDestEnd
;
2666 *pcchRemaining
= cchRemaining
;
2671 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
)
2673 NTSTATUS Status
= STATUS_SUCCESS
;
2674 STRSAFE_LPWSTR pszDestEnd
= pszDest
;
2675 size_t cchRemaining
= 0;
2676 if (dwFlags
& (~STRSAFE_VALID_FLAGS
))
2677 Status
= STATUS_INVALID_PARAMETER
;
2680 if (dwFlags
& STRSAFE_IGNORE_NULLS
)
2684 if ((cchDest
!=0) || (cbDest
!=0))
2685 Status
= STATUS_INVALID_PARAMETER
;
2690 if (NT_SUCCESS(Status
))
2694 pszDestEnd
= pszDest
;
2696 if (*pszFormat
!=L
'\0')
2699 Status
= STATUS_INVALID_PARAMETER
;
2701 Status
= STATUS_BUFFER_OVERFLOW
;
2708 cchMax
= cchDest
- 1;
2709 iRet
= _vsnwprintf(pszDest
,cchMax
,pszFormat
,argList
);
2710 if ((iRet
< 0) || (((size_t)iRet
) > cchMax
))
2712 pszDestEnd
= pszDest
+ cchMax
;
2714 *pszDestEnd
= L
'\0';
2715 Status
= STATUS_BUFFER_OVERFLOW
;
2718 if (((size_t)iRet
)==cchMax
)
2720 pszDestEnd
= pszDest
+ cchMax
;
2722 *pszDestEnd
= L
'\0';
2725 if (((size_t)iRet
) < cchMax
)
2727 pszDestEnd
= pszDest
+ iRet
;
2728 cchRemaining
= cchDest
- iRet
;
2729 if (dwFlags
& STRSAFE_FILL_BEHIND_NULL
)
2731 memset(pszDestEnd
+ 1,STRSAFE_GET_FILL_PATTERN(dwFlags
),((cchRemaining
- 1)*sizeof(wchar_t)) + (cbDest
% sizeof(wchar_t)));
2737 if (!NT_SUCCESS(Status
))
2741 if (dwFlags
& STRSAFE_FILL_ON_FAILURE
)
2743 memset(pszDest
,STRSAFE_GET_FILL_PATTERN(dwFlags
),cbDest
);
2744 if (STRSAFE_GET_FILL_PATTERN(dwFlags
)==0)
2746 pszDestEnd
= pszDest
;
2747 cchRemaining
= cchDest
;
2752 pszDestEnd
= pszDest
+ cchDest
- 1;
2754 *pszDestEnd
= L
'\0';
2757 if (dwFlags
& (STRSAFE_NULL_ON_FAILURE
| STRSAFE_NO_TRUNCATION
))
2761 pszDestEnd
= pszDest
;
2762 cchRemaining
= cchDest
;
2763 *pszDestEnd
= L
'\0';
2768 if (NT_SUCCESS(Status
) || (Status
==STATUS_BUFFER_OVERFLOW
))
2771 *ppszDestEnd
= pszDestEnd
;
2773 *pcchRemaining
= cchRemaining
;
2779 RtlStringLengthWorkerA(
2780 _In_reads_or_z_(cchMax
) STRSAFE_LPCSTR psz
,
2781 _In_
_In_range_(<=, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
2782 _Out_opt_
_Deref_out_range_(<, cchMax
) size_t *pcchLength
)
2784 NTSTATUS Status
= STATUS_SUCCESS
;
2785 size_t cchMaxPrev
= cchMax
;
2786 while(cchMax
&& (*psz
!='\0'))
2792 Status
= STATUS_INVALID_PARAMETER
;
2795 if (NT_SUCCESS(Status
))
2796 *pcchLength
= cchMaxPrev
- cchMax
;
2804 RtlStringLengthWorkerW(
2805 _In_reads_or_z_(cchMax
) STRSAFE_LPCWSTR psz
,
2806 _In_
_In_range_(<=, NTSTRSAFE_MAX_CCH
) size_t cchMax
,
2807 _Out_opt_
_Deref_out_range_(<, cchMax
) size_t *pcchLength
)
2809 NTSTATUS Status
= STATUS_SUCCESS
;
2810 size_t cchMaxPrev
= cchMax
;
2811 while(cchMax
&& (*psz
!=L
'\0'))
2817 Status
= STATUS_INVALID_PARAMETER
;
2820 if (NT_SUCCESS(Status
))
2821 *pcchLength
= cchMaxPrev
- cchMax
;
2828 #define RtlStringCopyWorkerA RtlStringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
2829 #define RtlStringCopyWorkerW RtlStringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
2830 #define RtlStringCopyExWorkerA RtlStringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
2831 #define RtlStringCopyExWorkerW RtlStringCopyExWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
2832 #define RtlStringCatWorkerA RtlStringCatWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
2833 #define RtlStringCatWorkerW RtlStringCatWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
2834 #define RtlStringCatExWorkerA RtlStringCatExWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
2835 #define RtlStringCatExWorkerW RtlStringCatExWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
2836 #define RtlStringCatNWorkerA RtlStringCatNWorkerA_instead_use_StringCchCatNA_or_StrincCbCatNA;
2837 #define RtlStringCatNWorkerW RtlStringCatNWorkerW_instead_use_StringCchCatNW_or_StringCbCatNW;
2838 #define RtlStringCatNExWorkerA RtlStringCatNExWorkerA_instead_use_StringCchCatNExA_or_StringCbCatNExA;
2839 #define RtlStringCatNExWorkerW RtlStringCatNExWorkerW_instead_use_StringCchCatNExW_or_StringCbCatNExW;
2840 #define RtlStringVPrintfWorkerA RtlStringVPrintfWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
2841 #define RtlStringVPrintfWorkerW RtlStringVPrintfWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
2842 #define RtlStringVPrintfExWorkerA RtlStringVPrintfExWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
2843 #define RtlStringVPrintfExWorkerW RtlStringVPrintfExWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
2844 #define RtlStringLengthWorkerA RtlStringLengthWorkerA_instead_use_StringCchLengthA_or_StringCbLengthA;
2845 #define RtlStringLengthWorkerW RtlStringLengthWorkerW_instead_use_StringCchLengthW_or_StringCbLengthW;
2848 #pragma warning(pop)
2849 #endif /* _MSC_VER */
2851 #endif /* _NTSTRSAFE_H_INCLUDED_ */