reactos/sdk/include/ddk/ntstrsafe.h

3124 lines
96 KiB
C
Raw Normal View History

/**
* This file has no copyright assigned and is placed in the Public Domain.
* This file is part of the w64 mingw-runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
#ifndef _NTSTRSAFE_H_INCLUDED_
#define _NTSTRSAFE_H_INCLUDED_
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:28719) /* disable banned api usage warning */
#endif /* _MSC_VER */
#ifndef C_ASSERT
#ifdef _MSC_VER
# define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
#else
# define C_ASSERT(e) extern void __C_ASSERT__(int [(e)?1:-1])
#endif
#endif /* C_ASSERT */
#ifdef __cplusplus
#define _STRSAFE_EXTERN_C extern "C"
#else
#define _STRSAFE_EXTERN_C extern
#endif
#define NTSTRSAFEAPI static __inline NTSTATUS NTAPI
#define NTSTRSAFE_INLINE_API static __inline NTSTATUS NTAPI
#ifndef NTSTRSAFE_MAX_CCH
#define NTSTRSAFE_MAX_CCH 2147483647
#endif
#ifndef NTSTRSAFE_UNICODE_STRING_MAX_CCH
#define NTSTRSAFE_UNICODE_STRING_MAX_CCH 32767
#endif
#ifndef _STRSAFE_H_INCLUDED_
#define STRSAFE_IGNORE_NULLS 0x00000100
#define STRSAFE_FILL_BEHIND_NULL 0x00000200
#define STRSAFE_FILL_ON_FAILURE 0x00000400
#define STRSAFE_NULL_ON_FAILURE 0x00000800
#define STRSAFE_NO_TRUNCATION 0x00001000
#define STRSAFE_IGNORE_NULL_UNICODE_STRINGS 0x00010000
#define STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED 0x00020000
#define STRSAFE_VALID_FLAGS (0x000000FF | STRSAFE_IGNORE_NULLS | STRSAFE_FILL_BEHIND_NULL | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)
#define STRSAFE_UNICODE_STRING_VALID_FLAGS (STRSAFE_VALID_FLAGS | STRSAFE_IGNORE_NULL_UNICODE_STRINGS | STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED)
#define STRSAFE_FILL_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_BEHIND_NULL))
#define STRSAFE_FAILURE_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_ON_FAILURE))
#define STRSAFE_GET_FILL_PATTERN(dwFlags) ((int)((dwFlags) & 0x000000FF))
#endif
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
#define STRSAFE_FILL_BEHIND STRSAFE_FILL_BEHIND_NULL
#define STRSAFE_ZERO_LENGTH_ON_FAILURE STRSAFE_NULL_ON_FAILURE
typedef char *STRSAFE_LPSTR;
typedef const char *STRSAFE_LPCSTR;
typedef wchar_t *STRSAFE_LPWSTR;
typedef const wchar_t *STRSAFE_LPCWSTR;
typedef _Null_terminated_ char *NTSTRSAFE_PSTR;
typedef _Null_terminated_ const char *NTSTRSAFE_PCSTR;
typedef _Null_terminated_ wchar_t *NTSTRSAFE_PWSTR;
typedef _Null_terminated_ const wchar_t *NTSTRSAFE_PCWSTR;
typedef ULONG STRSAFE_DWORD;
NTSTRSAFEAPI RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc);
NTSTRSAFEAPI RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc);
NTSTRSAFEAPI RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy);
NTSTRSAFEAPI RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy);
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);
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);
NTSTRSAFEAPI RtlStringCatWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc);
NTSTRSAFEAPI RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc);
NTSTRSAFEAPI RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend);
NTSTRSAFEAPI RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend);
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);
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);
NTSTRSAFEAPI RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList);
NTSTRSAFEAPI RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList);
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringVPrintfWorkerLenW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,size_t* pcchDestNewLen, va_list argList);
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);
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);
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
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);
NTSTRSAFEAPI RtlUnicodeStringValidate(PCUNICODE_STRING SourceString);
NTSTRSAFEAPI
RtlStringLengthWorkerA(
_In_reads_or_z_(cchMax) STRSAFE_LPCSTR psz,
_In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax,
_Out_opt_ _Deref_out_range_(<, cchMax) size_t *pcchLength);
NTSTRSAFEAPI
RtlStringLengthWorkerW(
_In_reads_or_z_(cchMax) STRSAFE_LPCWSTR psz,
_In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax,
_Out_opt_ _Deref_out_range_(<, cchMax) size_t *pcchLength);
NTSTRSAFEAPI
RtlStringCchCopyA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCSTR pszSrc);
NTSTRSAFEAPI
RtlStringCchCopyW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCWSTR pszSrc);
NTSTRSAFEAPI
RtlStringCchCopyA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCSTR pszSrc)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringCopyWorkerA(pszDest, cchDest, pszSrc);
}
NTSTRSAFEAPI
RtlStringCchCopyW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCWSTR pszSrc)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringCopyWorkerW(pszDest,cchDest,pszSrc);
}
NTSTRSAFEAPI
RtlStringCbCopyA(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCSTR pszSrc);
NTSTRSAFEAPI
RtlStringCbCopyW(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCWSTR pszSrc);
NTSTRSAFEAPI
RtlStringCbCopyA(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCSTR pszSrc)
{
size_t cchDest = cbDest / sizeof(char);
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringCopyWorkerA(pszDest,cbDest,pszSrc);
}
NTSTRSAFEAPI
RtlStringCbCopyW(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCWSTR pszSrc)
{
size_t cchDest = cbDest / sizeof(wchar_t);
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringCopyWorkerW(pszDest,cchDest,pszSrc);
}
NTSTRSAFEAPI
RtlStringCchCopyExA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCSTR pszSrc,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCchCopyExW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCWSTR pszSrc,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCchCopyExA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCSTR pszSrc,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringCopyExWorkerA(pszDest,cchDest,cchDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags);
}
NTSTRSAFEAPI
RtlStringCchCopyExW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCWSTR pszSrc,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
size_t cbDest = cchDest * sizeof(wchar_t);
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringCopyExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags);
}
NTSTRSAFEAPI
RtlStringCbCopyExA(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCSTR pszSrc,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) STRSAFE_LPSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCbCopyExW(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCWSTR pszSrc,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCbCopyExA(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCSTR pszSrc,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) STRSAFE_LPSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
NTSTATUS Status;
size_t cchDest = cbDest / sizeof(char);
size_t cchRemaining = 0;
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
Status = RtlStringCopyExWorkerA(pszDest,cbDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags);
if (NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW)
{
if (pcbRemaining)
*pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char));
}
return Status;
}
NTSTRSAFEAPI
RtlStringCbCopyExW(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCWSTR pszSrc,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
NTSTATUS Status;
size_t cchDest = cbDest / sizeof(wchar_t);
size_t cchRemaining = 0;
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
Status = RtlStringCopyExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags);
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (pcbRemaining)
*pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
}
return Status;
}
NTSTRSAFEAPI
RtlStringCchCopyNA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToCopy) STRSAFE_LPCSTR pszSrc,
_In_ size_t cchToCopy);
NTSTRSAFEAPI
RtlStringCchCopyNW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cchToCopy);
NTSTRSAFEAPI
RtlStringCchCopyNA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToCopy) STRSAFE_LPCSTR pszSrc,
_In_ size_t cchToCopy)
{
if (cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringCopyNWorkerA(pszDest,cchDest,pszSrc,cchToCopy);
}
NTSTRSAFEAPI
RtlStringCchCopyNW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cchToCopy)
{
if (cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringCopyNWorkerW(pszDest,cchDest,pszSrc,cchToCopy);
}
NTSTRSAFEAPI
RtlStringCbCopyNA(
_Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc,
_In_ size_t cbToCopy);
NTSTRSAFEAPI
RtlStringCbCopyNW(
_Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cbToCopy);
NTSTRSAFEAPI
RtlStringCbCopyNA(
_Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc,
_In_ size_t cbToCopy)
{
size_t cchDest = cbDest / sizeof(char);
size_t cchToCopy = cbToCopy / sizeof(char);
if (cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringCopyNWorkerA(pszDest, cchDest, pszSrc, cchToCopy);
}
NTSTRSAFEAPI
RtlStringCbCopyNW(
_Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cbToCopy)
{
size_t cchDest = cbDest / sizeof(wchar_t);
size_t cchToCopy = cbToCopy / sizeof(wchar_t);
if (cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringCopyNWorkerW(pszDest, cchDest, pszSrc, cchToCopy);
}
NTSTRSAFEAPI
RtlStringCchCopyNExA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToCopy) STRSAFE_LPCSTR pszSrc,
_In_ size_t cchToCopy,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCchCopyNExW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cchToCopy,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCchCopyNExA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToCopy) STRSAFE_LPCSTR pszSrc,
_In_ size_t cchToCopy,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringCopyNExWorkerA(pszDest, cchDest, cchDest, pszSrc, cchToCopy, ppszDestEnd, pcchRemaining, dwFlags);
}
NTSTRSAFEAPI
RtlStringCchCopyNExW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToCopy) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cchToCopy,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringCopyNExWorkerW(pszDest,cchDest,cchDest * sizeof(wchar_t), pszSrc, cchToCopy, ppszDestEnd, pcchRemaining, dwFlags);
}
NTSTRSAFEAPI
RtlStringCbCopyNExA(
_Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc,
_In_ size_t cbToCopy,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCbCopyNExW(
_Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cbToCopy,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCbCopyNExA(
_Out_writes_bytes_(cbDest) STRSAFE_LPSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToCopy) STRSAFE_LPCSTR pszSrc,
_In_ size_t cbToCopy,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) STRSAFE_LPSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
NTSTATUS Status;
size_t cchRemaining = 0;
if (cbDest > NTSTRSAFE_MAX_CCH)
{
if ((pszDest != NULL) && (cbDest > 0))
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
Status = RtlStringCopyNExWorkerA(pszDest,cbDest,cbDest,pszSrc,cbToCopy,ppszDestEnd,&cchRemaining,dwFlags);
if ((NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW) && pcbRemaining)
*pcbRemaining = cchRemaining;
return Status;
}
NTSTRSAFEAPI
RtlStringCbCopyNExW(
_Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToCopy) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cbToCopy,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
NTSTATUS Status;
size_t cchDest;
size_t cchToCopy;
size_t cchRemaining = 0;
cchDest = cbDest / sizeof(wchar_t);
cchToCopy = cbToCopy / sizeof(wchar_t);
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if ((pszDest != NULL) && (cbDest > 0))
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
Status = RtlStringCopyNExWorkerW(pszDest,cchDest,cbDest,pszSrc,cchToCopy,ppszDestEnd,&cchRemaining,dwFlags);
if ((NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW) && pcbRemaining)
*pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
return Status;
}
NTSTRSAFEAPI
RtlStringCchCatA(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCSTR pszSrc);
NTSTRSAFEAPI
RtlStringCchCatW(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCWSTR pszSrc);
NTSTRSAFEAPI
RtlStringCchCatA(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCSTR pszSrc)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
return STATUS_INVALID_PARAMETER;
return RtlStringCatWorkerA(pszDest,cchDest,pszSrc);
}
NTSTRSAFEAPI
RtlStringCchCatW(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCWSTR pszSrc)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
return STATUS_INVALID_PARAMETER;
return RtlStringCatWorkerW(pszDest,cchDest,pszSrc);
}
NTSTRSAFEAPI
RtlStringCbCatA(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCSTR pszSrc);
NTSTRSAFEAPI
RtlStringCbCatW(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCWSTR pszSrc);
NTSTRSAFEAPI
RtlStringCbCatA(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCSTR pszSrc)
{
if (cbDest > NTSTRSAFE_MAX_CCH)
return STATUS_INVALID_PARAMETER;
return RtlStringCatWorkerA(pszDest,cbDest,pszSrc);
}
NTSTRSAFEAPI
RtlStringCbCatW(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCWSTR pszSrc)
{
size_t cchDest = cbDest / sizeof(wchar_t);
if (cchDest > NTSTRSAFE_MAX_CCH)
return STATUS_INVALID_PARAMETER;
return RtlStringCatWorkerW(pszDest,cchDest,pszSrc);
}
NTSTRSAFEAPI
RtlStringCchCatExA(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCSTR pszSrc,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCchCatExW(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCWSTR pszSrc,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCchCatExA(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCSTR pszSrc,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
return STATUS_INVALID_PARAMETER;
return RtlStringCatExWorkerA(pszDest,cchDest,cchDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags);
}
NTSTRSAFEAPI
RtlStringCchCatExW(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_ NTSTRSAFE_PCWSTR pszSrc,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
size_t cbDest = cchDest*sizeof(wchar_t);
if (cchDest > NTSTRSAFE_MAX_CCH)
return STATUS_INVALID_PARAMETER;
return RtlStringCatExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags);
}
NTSTRSAFEAPI
RtlStringCbCatExA(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCSTR pszSrc,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCbCatExW(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCWSTR pszSrc,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCbCatExA(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCSTR pszSrc,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
NTSTATUS Status;
size_t cchRemaining = 0;
if (cbDest > NTSTRSAFE_MAX_CCH)
Status = STATUS_INVALID_PARAMETER;
else
Status = RtlStringCatExWorkerA(pszDest,cbDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags);
if ((NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW) && pcbRemaining)
*pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char));
return Status;
}
NTSTRSAFEAPI
RtlStringCbCatExW(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_ NTSTRSAFE_PCWSTR pszSrc,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
NTSTATUS Status;
size_t cchDest = cbDest / sizeof(wchar_t);
size_t cchRemaining = 0;
if (cchDest > NTSTRSAFE_MAX_CCH)
Status = STATUS_INVALID_PARAMETER;
else
Status = RtlStringCatExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags);
if ((NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW) && pcbRemaining)
*pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
return Status;
}
NTSTRSAFEAPI
RtlStringCchCatNA(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToAppend) STRSAFE_LPCSTR pszSrc,
_In_ size_t cchToAppend);
NTSTRSAFEAPI
RtlStringCchCatNW(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToAppend) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cchToAppend);
NTSTRSAFEAPI
RtlStringCchCatNA(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToAppend) STRSAFE_LPCSTR pszSrc,
_In_ size_t cchToAppend)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
return STATUS_INVALID_PARAMETER;
return RtlStringCatNWorkerA(pszDest,cchDest,pszSrc,cchToAppend);
}
NTSTRSAFEAPI
RtlStringCchCatNW(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToAppend) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cchToAppend)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
return STATUS_INVALID_PARAMETER;
return RtlStringCatNWorkerW(pszDest,cchDest,pszSrc,cchToAppend);
}
NTSTRSAFEAPI
RtlStringCbCatNA(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToAppend) STRSAFE_LPCSTR pszSrc,
_In_ size_t cbToAppend);
NTSTRSAFEAPI
RtlStringCbCatNW(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToAppend) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cbToAppend);
NTSTRSAFEAPI
RtlStringCbCatNA(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToAppend) STRSAFE_LPCSTR pszSrc,
_In_ size_t cbToAppend)
{
if (cbDest > NTSTRSAFE_MAX_CCH)
return STATUS_INVALID_PARAMETER;
return RtlStringCatNWorkerA(pszDest,cbDest,pszSrc,cbToAppend);
}
NTSTRSAFEAPI
RtlStringCbCatNW(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToAppend) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cbToAppend)
{
size_t cchDest = cbDest / sizeof(wchar_t);
size_t cchToAppend = cbToAppend / sizeof(wchar_t);
if (cchDest > NTSTRSAFE_MAX_CCH)
return STATUS_INVALID_PARAMETER;
return RtlStringCatNWorkerW(pszDest,cchDest,pszSrc,cchToAppend);
}
NTSTRSAFEAPI
RtlStringCchCatNExA(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToAppend) STRSAFE_LPCSTR pszSrc,
_In_ size_t cchToAppend,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCchCatNExW(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToAppend) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cchToAppend,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCchCatNExA(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToAppend) STRSAFE_LPCSTR pszSrc,
_In_ size_t cchToAppend,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
return STATUS_INVALID_PARAMETER;
return RtlStringCatNExWorkerA(pszDest,cchDest,cchDest,pszSrc,cchToAppend,ppszDestEnd,pcchRemaining,dwFlags);
}
NTSTRSAFEAPI
RtlStringCchCatNExW(
_Inout_updates_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_reads_or_z_(cchToAppend) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cchToAppend,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
return STATUS_INVALID_PARAMETER;
return RtlStringCatNExWorkerW(pszDest,cchDest,(cchDest*sizeof(wchar_t)),pszSrc,cchToAppend,ppszDestEnd,pcchRemaining,dwFlags);
}
NTSTRSAFEAPI
RtlStringCbCatNExA(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToAppend) STRSAFE_LPCSTR pszSrc,
_In_ size_t cbToAppend,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCbCatNExW(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToAppend) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cbToAppend,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags);
NTSTRSAFEAPI
RtlStringCbCatNExA(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToAppend) STRSAFE_LPCSTR pszSrc,
_In_ size_t cbToAppend,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
NTSTATUS Status;
size_t cchRemaining = 0;
if (cbDest > NTSTRSAFE_MAX_CCH)
Status = STATUS_INVALID_PARAMETER;
else
Status = RtlStringCatNExWorkerA(pszDest,cbDest,cbDest,pszSrc,cbToAppend,ppszDestEnd,&cchRemaining,dwFlags);
if ((NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW) && pcbRemaining)
*pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char));
return Status;
}
NTSTRSAFEAPI
RtlStringCbCatNExW(
_Inout_updates_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_reads_bytes_(cbToAppend) STRSAFE_LPCWSTR pszSrc,
_In_ size_t cbToAppend,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags)
{
NTSTATUS Status;
size_t cchDest = cbDest / sizeof(wchar_t);
size_t cchToAppend = cbToAppend / sizeof(wchar_t);
size_t cchRemaining = 0;
if (cchDest > NTSTRSAFE_MAX_CCH)
Status = STATUS_INVALID_PARAMETER;
else
Status = RtlStringCatNExWorkerW(pszDest,cchDest,cbDest,pszSrc,cchToAppend,ppszDestEnd,&cchRemaining,dwFlags);
if ((NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW) && pcbRemaining)
*pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
return Status;
}
NTSTRSAFEAPI
RtlStringCchVPrintfA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
_In_ va_list argList);
NTSTRSAFEAPI
RtlStringCchVPrintfW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
_In_ va_list argList);
NTSTRSAFEAPI
RtlStringCchVPrintfA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
_In_ va_list argList)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringVPrintfWorkerA(pszDest,cchDest,pszFormat,argList);
}
NTSTRSAFEAPI
RtlStringCchVPrintfW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
_In_ va_list argList)
{
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList);
}
NTSTRSAFEAPI
RtlStringCbVPrintfA(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
_In_ va_list argList);
NTSTRSAFEAPI
RtlStringCbVPrintfW(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
_In_ va_list argList);
NTSTRSAFEAPI
RtlStringCbVPrintfA(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
_In_ va_list argList)
{
if (cbDest > NTSTRSAFE_MAX_CCH)
{
if (cbDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringVPrintfWorkerA(pszDest,cbDest,pszFormat,argList);
}
NTSTRSAFEAPI
RtlStringCbVPrintfW(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
_In_ va_list argList)
{
size_t cchDest = cbDest / sizeof(wchar_t);
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
return RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList);
}
static __inline NTSTATUS
RtlStringCchPrintfA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
...);
static __inline NTSTATUS
RtlStringCchPrintfW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
...);
static __inline NTSTATUS
RtlStringCchPrintfA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
...)
{
NTSTATUS Status;
va_list argList;
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
va_start(argList,pszFormat);
Status = RtlStringVPrintfWorkerA(pszDest,cchDest,pszFormat,argList);
va_end(argList);
return Status;
}
static __inline NTSTATUS
RtlStringCchPrintfW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
...)
{
NTSTATUS Status;
va_list argList;
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
va_start(argList,pszFormat);
Status = RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList);
va_end(argList);
return Status;
}
static __inline NTSTATUS
RtlStringCbPrintfA(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
...);
static __inline NTSTATUS
RtlStringCbPrintfW(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
...);
static __inline NTSTATUS
RtlStringCbPrintfA(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
...)
{
NTSTATUS Status;
va_list argList;
if (cbDest > NTSTRSAFE_MAX_CCH)
{
if (cbDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
va_start(argList,pszFormat);
Status = RtlStringVPrintfWorkerA(pszDest,cbDest,pszFormat,argList);
va_end(argList);
return Status;
}
static __inline NTSTATUS
RtlStringCbPrintfW(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
...)
{
NTSTATUS Status;
va_list argList;
size_t cchDest = cbDest / sizeof(wchar_t);
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
va_start(argList,pszFormat);
Status = RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList);
va_end(argList);
return Status;
}
static __inline NTSTATUS
RtlStringCchPrintfExA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
...);
static __inline NTSTATUS
RtlStringCchPrintfExW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
...);
static __inline NTSTATUS
RtlStringCchPrintfExA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
...)
{
NTSTATUS Status;
va_list argList;
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
va_start(argList,pszFormat);
Status = RtlStringVPrintfExWorkerA(pszDest,cchDest,cchDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList);
va_end(argList);
return Status;
}
static __inline NTSTATUS
RtlStringCchPrintfExW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
...)
{
NTSTATUS Status;
size_t cbDest = cchDest * sizeof(wchar_t);
va_list argList;
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
va_start(argList,pszFormat);
Status = RtlStringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList);
va_end(argList);
return Status;
}
static __inline NTSTATUS
RtlStringCbPrintfExA(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
...);
static __inline NTSTATUS
RtlStringCbPrintfExW(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
...);
static __inline NTSTATUS
RtlStringCbPrintfExA(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
...)
{
NTSTATUS Status;
size_t cchDest;
size_t cchRemaining = 0;
cchDest = cbDest / sizeof(char);
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
{
va_list argList;
va_start(argList,pszFormat);
Status = RtlStringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList);
va_end(argList);
}
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (pcbRemaining)
{
*pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char));
}
}
return Status;
}
static __inline NTSTATUS
RtlStringCbPrintfExW(
_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
...)
{
NTSTATUS Status;
size_t cchDest;
size_t cchRemaining = 0;
cchDest = cbDest / sizeof(wchar_t);
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
{
va_list argList;
va_start(argList,pszFormat);
Status = RtlStringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList);
va_end(argList);
}
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (pcbRemaining)
{
*pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
}
}
return Status;
}
NTSTRSAFEAPI
RtlStringCchVPrintfExA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
_In_ va_list argList);
NTSTRSAFEAPI
RtlStringCchVPrintfExW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
_In_ va_list argList);
NTSTRSAFEAPI
RtlStringCchVPrintfExA(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest,
_In_ size_t cchDest,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
_In_ va_list argList)
{
NTSTATUS Status;
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = '\0';
return STATUS_INVALID_PARAMETER;
}
{
size_t cbDest;
cbDest = cchDest*sizeof(char);
Status = RtlStringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList);
}
return Status;
}
NTSTRSAFEAPI
RtlStringCchVPrintfExW(
_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cchDest,
_Outptr_opt_result_buffer_(*pcchRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcchRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
_In_ va_list argList)
{
NTSTATUS Status;
if (cchDest > NTSTRSAFE_MAX_CCH)
{
if (cchDest > 0)
*pszDest = L'\0';
return STATUS_INVALID_PARAMETER;
}
{
size_t cbDest;
cbDest = cchDest*sizeof(wchar_t);
Status = RtlStringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList);
}
return Status;
}
NTSTRSAFEAPI
RtlStringCbVPrintfExA(
_Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
_In_ va_list argList);
NTSTRSAFEAPI
RtlStringCbVPrintfExW(
_Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
_In_ va_list argList);
NTSTRSAFEAPI
RtlStringCbVPrintfExA(
_Out_writes_bytes_(cbDest) NTSTRSAFE_PSTR pszDest,
_In_ size_t cbDest,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,
_In_ va_list argList)
{
NTSTATUS Status;
size_t cchDest;
size_t cchRemaining = 0;
cchDest = cbDest / sizeof(char);
if (cchDest > NTSTRSAFE_MAX_CCH)
Status = STATUS_INVALID_PARAMETER;
else
Status = RtlStringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList);
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (pcbRemaining)
{
*pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char));
}
}
return Status;
}
NTSTRSAFEAPI
RtlStringCbVPrintfExW(
_Out_writes_bytes_(cbDest) NTSTRSAFE_PWSTR pszDest,
_In_ size_t cbDest,
_Outptr_opt_result_bytebuffer_(*pcbRemaining) NTSTRSAFE_PWSTR *ppszDestEnd,
_Out_opt_ size_t *pcbRemaining,
_In_ STRSAFE_DWORD dwFlags,
_In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,
_In_ va_list argList)
{
NTSTATUS Status;
size_t cchDest;
size_t cchRemaining = 0;
cchDest = cbDest / sizeof(wchar_t);
if (cchDest > NTSTRSAFE_MAX_CCH)
Status = STATUS_INVALID_PARAMETER;
else
Status = RtlStringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList);
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (pcbRemaining)
{
*pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
}
}
return Status;
}
_Must_inspect_result_
NTSTRSAFEAPI
RtlStringCchLengthA(
_In_reads_or_z_(cchMax) STRSAFE_LPCSTR psz,
_In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax,
_Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t *pcchLength);
_Must_inspect_result_
NTSTRSAFEAPI
RtlStringCchLengthW(
_In_reads_or_z_(cchMax) STRSAFE_LPCWSTR psz,
_In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax,
_Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t *pcchLength);
_Must_inspect_result_
NTSTRSAFEAPI
RtlStringCchLengthA(
_In_reads_or_z_(cchMax) STRSAFE_LPCSTR psz,
_In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax,
_Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t *pcchLength)
{
NTSTATUS Status;
if (!psz || (cchMax > NTSTRSAFE_MAX_CCH))
Status = STATUS_INVALID_PARAMETER;
else
Status = RtlStringLengthWorkerA(psz,cchMax,pcchLength);
if (!NT_SUCCESS(Status) && pcchLength)
{
*pcchLength = 0;
}
return Status;
}
_Must_inspect_result_
NTSTRSAFEAPI
RtlStringCchLengthW(
_In_reads_or_z_(cchMax) STRSAFE_LPCWSTR psz,
_In_ _In_range_(1, NTSTRSAFE_MAX_CCH) size_t cchMax,
_Out_opt_ _Deref_out_range_(<, cchMax) _Deref_out_range_(<=, _String_length_(psz)) size_t *pcchLength)
{
NTSTATUS Status;
if (!psz || (cchMax > NTSTRSAFE_MAX_CCH))
Status = STATUS_INVALID_PARAMETER;
else
Status = RtlStringLengthWorkerW(psz,cchMax,pcchLength);
if (!NT_SUCCESS(Status) && pcchLength)
{
*pcchLength = 0;
}
return Status;
}
_Must_inspect_result_
NTSTRSAFEAPI
RtlStringCbLengthA(
_In_reads_or_z_(cbMax) STRSAFE_LPCSTR psz,
_In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(char)) size_t cbMax,
_Out_opt_ _Deref_out_range_(<, cbMax) size_t *pcbLength);
_Must_inspect_result_
NTSTRSAFEAPI
RtlStringCbLengthW(
_In_reads_or_z_(cbMax / sizeof(wchar_t)) STRSAFE_LPCWSTR psz,
_In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(wchar_t)) size_t cbMax,
_Out_opt_ _Deref_out_range_(<, cbMax - 1) size_t *pcbLength);
_Must_inspect_result_
NTSTRSAFEAPI
RtlStringCbLengthA(
_In_reads_or_z_(cbMax) STRSAFE_LPCSTR psz,
_In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(char)) size_t cbMax,
_Out_opt_ _Deref_out_range_(<, cbMax) size_t *pcbLength)
{
NTSTATUS Status;
size_t cchMax;
size_t cchLength = 0;
cchMax = cbMax / sizeof(char);
if (!psz || (cchMax > NTSTRSAFE_MAX_CCH))
Status = STATUS_INVALID_PARAMETER;
else
Status = RtlStringLengthWorkerA(psz,cchMax,&cchLength);
if (pcbLength)
{
if (NT_SUCCESS(Status))
{
*pcbLength = cchLength*sizeof(char);
}
else
{
*pcbLength = 0;
}
}
return Status;
}
_Must_inspect_result_
NTSTRSAFEAPI
RtlStringCbLengthW(
_In_reads_or_z_(cbMax / sizeof(wchar_t)) STRSAFE_LPCWSTR psz,
_In_ _In_range_(1, NTSTRSAFE_MAX_CCH * sizeof(wchar_t)) size_t cbMax,
_Out_opt_ _Deref_out_range_(<, cbMax - 1) size_t *pcbLength)
{
NTSTATUS Status;
size_t cchMax;
size_t cchLength = 0;
cchMax = cbMax / sizeof(wchar_t);
if (!psz || (cchMax > NTSTRSAFE_MAX_CCH))
Status = STATUS_INVALID_PARAMETER;
else
Status = RtlStringLengthWorkerW(psz,cchMax,&cchLength);
if (pcbLength)
{
if (NT_SUCCESS(Status))
{
*pcbLength = cchLength*sizeof(wchar_t);
}
else
{
*pcbLength = 0;
}
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest,
size_t cchDest,
STRSAFE_LPCSTR pszSrc)
{
NTSTATUS Status = STATUS_SUCCESS;
if (cchDest==0)
Status = STATUS_INVALID_PARAMETER;
else
{
while(cchDest && (*pszSrc!='\0'))
{
*pszDest++ = *pszSrc++;
cchDest--;
}
if (cchDest==0)
{
pszDest--;
Status = STATUS_BUFFER_OVERFLOW;
}
*pszDest= '\0';
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest,
size_t cchDest,
STRSAFE_LPCWSTR pszSrc)
{
NTSTATUS Status = STATUS_SUCCESS;
if (cchDest==0)
Status = STATUS_INVALID_PARAMETER;
else
{
while(cchDest && (*pszSrc!=L'\0'))
{
*pszDest++ = *pszSrc++;
cchDest--;
}
if (cchDest==0)
{
pszDest--;
Status = STATUS_BUFFER_OVERFLOW;
}
*pszDest= L'\0';
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest,
size_t cchDest,
size_t cbDest,
STRSAFE_LPCSTR pszSrc,
STRSAFE_LPSTR *ppszDestEnd,
size_t *pcchRemaining,
STRSAFE_DWORD dwFlags)
{
NTSTATUS Status = STATUS_SUCCESS;
STRSAFE_LPSTR pszDestEnd = pszDest;
size_t cchRemaining = 0;
if (dwFlags & (~STRSAFE_VALID_FLAGS))
Status = STATUS_INVALID_PARAMETER;
else
{
if (dwFlags & STRSAFE_IGNORE_NULLS)
{
if (!pszDest)
{
if ((cchDest!=0) || (cbDest!=0))
Status = STATUS_INVALID_PARAMETER;
}
if (!pszSrc)
pszSrc = "";
}
if (NT_SUCCESS(Status))
{
if (cchDest==0)
{
pszDestEnd = pszDest;
cchRemaining = 0;
if (*pszSrc!='\0')
{
if (!pszDest)
Status = STATUS_INVALID_PARAMETER;
else
Status = STATUS_BUFFER_OVERFLOW;
}
}
else
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
while(cchRemaining && (*pszSrc!='\0'))
{
*pszDestEnd++ = *pszSrc++;
cchRemaining--;
}
if (cchRemaining > 0)
{
if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
{
memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(char)) + (cbDest % sizeof(char)));
}
}
else
{
pszDestEnd--;
cchRemaining++;
Status = STATUS_BUFFER_OVERFLOW;
}
*pszDestEnd = '\0';
}
}
}
if (!NT_SUCCESS(Status))
{
if (pszDest)
{
if (dwFlags & STRSAFE_FILL_ON_FAILURE)
{
memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
}
else
if (cchDest > 0)
{
pszDestEnd = pszDest + cchDest - 1;
cchRemaining = 1;
*pszDestEnd = '\0';
}
}
if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
{
if (cchDest > 0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
*pszDestEnd = '\0';
}
}
}
}
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (ppszDestEnd)
*ppszDestEnd = pszDestEnd;
if (pcchRemaining)
*pcchRemaining = cchRemaining;
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest,
size_t cchDest,
size_t cbDest,
STRSAFE_LPCWSTR pszSrc,
STRSAFE_LPWSTR *ppszDestEnd,
size_t *pcchRemaining,
STRSAFE_DWORD dwFlags)
{
NTSTATUS Status = STATUS_SUCCESS;
STRSAFE_LPWSTR pszDestEnd = pszDest;
size_t cchRemaining = 0;
if (dwFlags & (~STRSAFE_VALID_FLAGS))
Status = STATUS_INVALID_PARAMETER;
else
{
if (dwFlags & STRSAFE_IGNORE_NULLS)
{
if (!pszDest)
{
if ((cchDest!=0) || (cbDest!=0))
Status = STATUS_INVALID_PARAMETER;
}
if (!pszSrc)
pszSrc = L"";
}
if (NT_SUCCESS(Status))
{
if (cchDest==0)
{
pszDestEnd = pszDest;
cchRemaining = 0;
if (*pszSrc!=L'\0')
{
if (!pszDest)
Status = STATUS_INVALID_PARAMETER;
else
Status = STATUS_BUFFER_OVERFLOW;
}
}
else
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
while(cchRemaining && (*pszSrc!=L'\0'))
{
*pszDestEnd++ = *pszSrc++;
cchRemaining--;
}
if (cchRemaining > 0)
{
if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
{
memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
}
}
else
{
pszDestEnd--;
cchRemaining++;
Status = STATUS_BUFFER_OVERFLOW;
}
*pszDestEnd = L'\0';
}
}
}
if (!NT_SUCCESS(Status))
{
if (pszDest)
{
if (dwFlags & STRSAFE_FILL_ON_FAILURE)
{
memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
}
else
if (cchDest > 0)
{
pszDestEnd = pszDest + cchDest - 1;
cchRemaining = 1;
*pszDestEnd = L'\0';
}
}
if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
{
if (cchDest > 0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
*pszDestEnd = L'\0';
}
}
}
}
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (ppszDestEnd)
*ppszDestEnd = pszDestEnd;
if (pcchRemaining)
*pcchRemaining = cchRemaining;
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest,
size_t cchDest,
STRSAFE_LPCSTR pszSrc,size_t cchSrc)
{
NTSTATUS Status = STATUS_SUCCESS;
if (cchDest==0)
Status = STATUS_INVALID_PARAMETER;
else
{
while(cchDest && cchSrc && (*pszSrc!='\0'))
{
*pszDest++ = *pszSrc++;
cchDest--;
cchSrc--;
}
if (cchDest==0)
{
pszDest--;
Status = STATUS_BUFFER_OVERFLOW;
}
*pszDest= '\0';
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest,
size_t cchDest,
STRSAFE_LPCWSTR pszSrc,
size_t cchToCopy)
{
NTSTATUS Status = STATUS_SUCCESS;
if (cchDest==0)
Status = STATUS_INVALID_PARAMETER;
else
{
while(cchDest && cchToCopy && (*pszSrc!=L'\0'))
{
*pszDest++ = *pszSrc++;
cchDest--;
cchToCopy--;
}
if (cchDest==0)
{
pszDest--;
Status = STATUS_BUFFER_OVERFLOW;
}
*pszDest= L'\0';
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
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)
{
NTSTATUS Status = STATUS_SUCCESS;
STRSAFE_LPSTR pszDestEnd = pszDest;
size_t cchRemaining = 0;
if (dwFlags & (~STRSAFE_VALID_FLAGS))
Status = STATUS_INVALID_PARAMETER;
else
if (cchToCopy > NTSTRSAFE_MAX_CCH)
Status = STATUS_INVALID_PARAMETER;
else
{
if (dwFlags & STRSAFE_IGNORE_NULLS)
{
if (!pszDest)
{
if ((cchDest!=0) || (cbDest!=0))
Status = STATUS_INVALID_PARAMETER;
}
if (!pszSrc)
pszSrc = "";
}
if (NT_SUCCESS(Status))
{
if (cchDest==0)
{
pszDestEnd = pszDest;
cchRemaining = 0;
if ((cchToCopy!=0) && (*pszSrc!='\0'))
{
if (!pszDest)
Status = STATUS_INVALID_PARAMETER;
else
Status = STATUS_BUFFER_OVERFLOW;
}
}
else
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
while(cchRemaining && cchToCopy && (*pszSrc!='\0'))
{
*pszDestEnd++ = *pszSrc++;
cchRemaining--;
cchToCopy--;
}
if (cchRemaining > 0)
{
if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
{
memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(char)) + (cbDest % sizeof(char)));
}
}
else
{
pszDestEnd--;
cchRemaining++;
Status = STATUS_BUFFER_OVERFLOW;
}
*pszDestEnd = '\0';
}
}
}
if (!NT_SUCCESS(Status))
{
if (pszDest)
{
if (dwFlags & STRSAFE_FILL_ON_FAILURE)
{
memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
}
else
if (cchDest > 0)
{
pszDestEnd = pszDest + cchDest - 1;
cchRemaining = 1;
*pszDestEnd = '\0';
}
}
if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
{
if (cchDest > 0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
*pszDestEnd = '\0';
}
}
}
}
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (ppszDestEnd)
*ppszDestEnd = pszDestEnd;
if (pcchRemaining)
*pcchRemaining = cchRemaining;
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
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)
{
NTSTATUS Status = STATUS_SUCCESS;
STRSAFE_LPWSTR pszDestEnd = pszDest;
size_t cchRemaining = 0;
if (dwFlags & (~STRSAFE_VALID_FLAGS))
Status = STATUS_INVALID_PARAMETER;
else
if (cchToCopy > NTSTRSAFE_MAX_CCH)
Status = STATUS_INVALID_PARAMETER;
else
{
if (dwFlags & STRSAFE_IGNORE_NULLS)
{
if (!pszDest)
{
if ((cchDest!=0) || (cbDest!=0))
Status = STATUS_INVALID_PARAMETER;
}
if (!pszSrc)
pszSrc = L"";
}
if (NT_SUCCESS(Status))
{
if (cchDest==0)
{
pszDestEnd = pszDest;
cchRemaining = 0;
if ((cchToCopy!=0) && (*pszSrc!=L'\0'))
{
if (!pszDest)
Status = STATUS_INVALID_PARAMETER;
else
Status = STATUS_BUFFER_OVERFLOW;
}
}
else
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
while(cchRemaining && cchToCopy && (*pszSrc!=L'\0'))
{
*pszDestEnd++ = *pszSrc++;
cchRemaining--;
cchToCopy--;
}
if (cchRemaining > 0)
{
if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
{
memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
}
}
else
{
pszDestEnd--;
cchRemaining++;
Status = STATUS_BUFFER_OVERFLOW;
}
*pszDestEnd = L'\0';
}
}
}
if (!NT_SUCCESS(Status))
{
if (pszDest)
{
if (dwFlags & STRSAFE_FILL_ON_FAILURE)
{
memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
}
else
if (cchDest > 0)
{
pszDestEnd = pszDest + cchDest - 1;
cchRemaining = 1;
*pszDestEnd = L'\0';
}
}
if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
{
if (cchDest > 0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
*pszDestEnd = L'\0';
}
}
}
}
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (ppszDestEnd)
*ppszDestEnd = pszDestEnd;
if (pcchRemaining)
*pcchRemaining = cchRemaining;
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringCatWorkerA(STRSAFE_LPSTR pszDest,
size_t cchDest,
STRSAFE_LPCSTR pszSrc)
{
NTSTATUS Status;
size_t cchDestLength;
Status = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength);
if (NT_SUCCESS(Status))
Status = RtlStringCopyWorkerA(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc);
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest,
size_t cchDest,
STRSAFE_LPCWSTR pszSrc)
{
NTSTATUS Status;
size_t cchDestLength;
Status = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength);
if (NT_SUCCESS(Status))
Status = RtlStringCopyWorkerW(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc);
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest,
size_t cchDest,
size_t cbDest,
STRSAFE_LPCSTR pszSrc,
STRSAFE_LPSTR *ppszDestEnd,
size_t *pcchRemaining,
STRSAFE_DWORD dwFlags)
{
NTSTATUS Status = STATUS_SUCCESS;
STRSAFE_LPSTR pszDestEnd = pszDest;
size_t cchRemaining = 0;
if (dwFlags & (~STRSAFE_VALID_FLAGS))
Status = STATUS_INVALID_PARAMETER;
else
{
size_t cchDestLength;
if (dwFlags & STRSAFE_IGNORE_NULLS)
{
if (!pszDest)
{
if ((cchDest==0) && (cbDest==0))
cchDestLength = 0;
else
Status = STATUS_INVALID_PARAMETER;
}
else
{
Status = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength);
if (NT_SUCCESS(Status))
{
pszDestEnd = pszDest + cchDestLength;
cchRemaining = cchDest - cchDestLength;
}
}
if (!pszSrc)
pszSrc = "";
}
else
{
Status = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength);
if (NT_SUCCESS(Status))
{
pszDestEnd = pszDest + cchDestLength;
cchRemaining = cchDest - cchDestLength;
}
}
if (NT_SUCCESS(Status))
{
if (cchDest==0)
{
if (*pszSrc!='\0')
{
if (!pszDest)
Status = STATUS_INVALID_PARAMETER;
else
Status = STATUS_BUFFER_OVERFLOW;
}
}
else
Status = RtlStringCopyExWorkerA(pszDestEnd,cchRemaining,(cchRemaining*sizeof(char)) + (cbDest % sizeof(char)),pszSrc,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)));
}
}
if (!NT_SUCCESS(Status))
{
if (pszDest)
{
if (dwFlags & STRSAFE_FILL_ON_FAILURE)
{
memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
}
else
if (cchDest > 0)
{
pszDestEnd = pszDest + cchDest - 1;
cchRemaining = 1;
*pszDestEnd = '\0';
}
}
if (dwFlags & STRSAFE_NULL_ON_FAILURE)
{
if (cchDest > 0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
*pszDestEnd = '\0';
}
}
}
}
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (ppszDestEnd)
*ppszDestEnd = pszDestEnd;
if (pcchRemaining)
*pcchRemaining = cchRemaining;
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest,
size_t cchDest,
size_t cbDest,
STRSAFE_LPCWSTR pszSrc,
STRSAFE_LPWSTR *ppszDestEnd,
size_t *pcchRemaining,
STRSAFE_DWORD dwFlags)
{
NTSTATUS Status = STATUS_SUCCESS;
STRSAFE_LPWSTR pszDestEnd = pszDest;
size_t cchRemaining = 0;
if (dwFlags & (~STRSAFE_VALID_FLAGS))
Status = STATUS_INVALID_PARAMETER;
else
{
size_t cchDestLength;
if (dwFlags & STRSAFE_IGNORE_NULLS)
{
if (!pszDest)
{
if ((cchDest==0) && (cbDest==0))
cchDestLength = 0;
else
Status = STATUS_INVALID_PARAMETER;
}
else
{
Status = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength);
if (NT_SUCCESS(Status))
{
pszDestEnd = pszDest + cchDestLength;
cchRemaining = cchDest - cchDestLength;
}
}
if (!pszSrc)
pszSrc = L"";
}
else
{
Status = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength);
if (NT_SUCCESS(Status))
{
pszDestEnd = pszDest + cchDestLength;
cchRemaining = cchDest - cchDestLength;
}
}
if (NT_SUCCESS(Status))
{
if (cchDest==0)
{
if (*pszSrc!=L'\0')
{
if (!pszDest)
Status = STATUS_INVALID_PARAMETER;
else
Status = STATUS_BUFFER_OVERFLOW;
}
}
else
Status = RtlStringCopyExWorkerW(pszDestEnd,cchRemaining,(cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)),pszSrc,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)));
}
}
if (!NT_SUCCESS(Status))
{
if (pszDest)
{
if (dwFlags & STRSAFE_FILL_ON_FAILURE)
{
memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
}
else
if (cchDest > 0)
{
pszDestEnd = pszDest + cchDest - 1;
cchRemaining = 1;
*pszDestEnd = L'\0';
}
}
if (dwFlags & STRSAFE_NULL_ON_FAILURE)
{
if (cchDest > 0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
*pszDestEnd = L'\0';
}
}
}
}
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (ppszDestEnd)
*ppszDestEnd = pszDestEnd;
if (pcchRemaining)
*pcchRemaining = cchRemaining;
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest,
size_t cchDest,
STRSAFE_LPCSTR pszSrc,
size_t cchToAppend)
{
NTSTATUS Status;
size_t cchDestLength;
Status = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength);
if (NT_SUCCESS(Status))
Status = RtlStringCopyNWorkerA(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc,cchToAppend);
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest,
size_t cchDest,
STRSAFE_LPCWSTR pszSrc,
size_t cchToAppend)
{
NTSTATUS Status;
size_t cchDestLength;
Status = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength);
if (NT_SUCCESS(Status))
Status = RtlStringCopyNWorkerW(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc,cchToAppend);
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
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)
{
NTSTATUS Status = STATUS_SUCCESS;
STRSAFE_LPSTR pszDestEnd = pszDest;
size_t cchRemaining = 0;
size_t cchDestLength = 0;
if (dwFlags & (~STRSAFE_VALID_FLAGS))
Status = STATUS_INVALID_PARAMETER;
else
if (cchToAppend > NTSTRSAFE_MAX_CCH)
Status = STATUS_INVALID_PARAMETER;
else
{
if (dwFlags & STRSAFE_IGNORE_NULLS)
{
if (!pszDest)
{
if ((cchDest==0) && (cbDest==0))
cchDestLength = 0;
else
Status = STATUS_INVALID_PARAMETER;
}
else
{
Status = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength);
if (NT_SUCCESS(Status))
{
pszDestEnd = pszDest + cchDestLength;
cchRemaining = cchDest - cchDestLength;
}
}
if (!pszSrc)
pszSrc = "";
}
else
{
Status = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength);
if (NT_SUCCESS(Status))
{
pszDestEnd = pszDest + cchDestLength;
cchRemaining = cchDest - cchDestLength;
}
}
if (NT_SUCCESS(Status))
{
if (cchDest==0)
{
if ((cchToAppend!=0) && (*pszSrc!='\0'))
{
if (!pszDest)
Status = STATUS_INVALID_PARAMETER;
else
Status = STATUS_BUFFER_OVERFLOW;
}
}
else
Status = RtlStringCopyNExWorkerA(pszDestEnd,cchRemaining,(cchRemaining*sizeof(char)) + (cbDest % sizeof(char)),pszSrc,cchToAppend,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)));
}
}
if (!NT_SUCCESS(Status))
{
if (pszDest)
{
if (dwFlags & STRSAFE_FILL_ON_FAILURE)
{
memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
}
else
if (cchDest > 0)
{
pszDestEnd = pszDest + cchDest - 1;
cchRemaining = 1;
*pszDestEnd = '\0';
}
}
if (dwFlags & (STRSAFE_NULL_ON_FAILURE))
{
if (cchDest > 0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
*pszDestEnd = '\0';
}
}
}
}
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (ppszDestEnd)
*ppszDestEnd = pszDestEnd;
if (pcchRemaining)
*pcchRemaining = cchRemaining;
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
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)
{
NTSTATUS Status = STATUS_SUCCESS;
STRSAFE_LPWSTR pszDestEnd = pszDest;
size_t cchRemaining = 0;
size_t cchDestLength = 0;
if (dwFlags & (~STRSAFE_VALID_FLAGS))
Status = STATUS_INVALID_PARAMETER;
else
if (cchToAppend > NTSTRSAFE_MAX_CCH)
Status = STATUS_INVALID_PARAMETER;
else
{
if (dwFlags & STRSAFE_IGNORE_NULLS)
{
if (!pszDest)
{
if ((cchDest==0) && (cbDest==0))
cchDestLength = 0;
else
Status = STATUS_INVALID_PARAMETER;
}
else
{
Status = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength);
if (NT_SUCCESS(Status))
{
pszDestEnd = pszDest + cchDestLength;
cchRemaining = cchDest - cchDestLength;
}
}
if (!pszSrc)
pszSrc = L"";
}
else
{
Status = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength);
if (NT_SUCCESS(Status))
{
pszDestEnd = pszDest + cchDestLength;
cchRemaining = cchDest - cchDestLength;
}
}
if (NT_SUCCESS(Status))
{
if (cchDest==0)
{
if ((cchToAppend!=0) && (*pszSrc!=L'\0'))
{
if (!pszDest)
Status = STATUS_INVALID_PARAMETER;
else
Status = STATUS_BUFFER_OVERFLOW;
}
}
else
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)));
}
}
if (!NT_SUCCESS(Status))
{
if (pszDest)
{
if (dwFlags & STRSAFE_FILL_ON_FAILURE)
{
memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
}
else
if (cchDest > 0)
{
pszDestEnd = pszDest + cchDest - 1;
cchRemaining = 1;
*pszDestEnd = L'\0';
}
}
if (dwFlags & (STRSAFE_NULL_ON_FAILURE))
{
if (cchDest > 0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
*pszDestEnd = L'\0';
}
}
}
}
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (ppszDestEnd)
*ppszDestEnd = pszDestEnd;
if (pcchRemaining)
*pcchRemaining = cchRemaining;
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest,
size_t cchDest,
STRSAFE_LPCSTR pszFormat,
va_list argList)
{
NTSTATUS Status = STATUS_SUCCESS;
if (cchDest==0)
Status = STATUS_INVALID_PARAMETER;
else
{
int iRet;
size_t cchMax;
cchMax = cchDest - 1;
iRet = _vsnprintf(pszDest,cchMax,pszFormat,argList);
if ((iRet < 0) || (((size_t)iRet) > cchMax))
{
pszDest += cchMax;
*pszDest = '\0';
Status = STATUS_BUFFER_OVERFLOW;
}
else
if (((size_t)iRet)==cchMax)
{
pszDest += cchMax;
*pszDest = '\0';
}
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlpStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest,
size_t cchDest,
STRSAFE_LPCWSTR pszFormat,
size_t* pcchDestNewLen,
va_list argList)
{
NTSTATUS Status = STATUS_SUCCESS;
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
int iRet;
size_t cchMax;
cchMax = cchDest - 1;
iRet = _vsnwprintf(pszDest, cchMax, pszFormat, argList);
if ((iRet < 0) || (((size_t) iRet) > cchMax))
{
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
pszDest += cchMax;
*pszDest = L'\0';
Status = STATUS_BUFFER_OVERFLOW;
}
else
if (((size_t) iRet) == cchMax)
{
pszDest += cchMax;
*pszDest = L'\0';
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
if (pcchDestNewLen)
*pcchDestNewLen = (iRet == -1) ? cchDest : iRet;
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest,
size_t cchDest,
STRSAFE_LPCWSTR pszFormat,
va_list argList)
{
if (cchDest==0)
return STATUS_INVALID_PARAMETER;
return RtlpStringVPrintfWorkerW(pszDest, cchDest, pszFormat, NULL, argList);
}
NTSTRSAFEAPI RtlStringVPrintfWorkerLenW(STRSAFE_LPWSTR pszDest,
size_t cchDest,
STRSAFE_LPCWSTR pszFormat,
size_t* pcchDestNewLen,
va_list argList)
{
if (cchDest == 0 || pcchDestNewLen == 0)
return STATUS_INVALID_PARAMETER;
return RtlpStringVPrintfWorkerW(pszDest, cchDest, pszFormat, pcchDestNewLen, argList);
}
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)
{
NTSTATUS Status = STATUS_SUCCESS;
STRSAFE_LPSTR pszDestEnd = pszDest;
size_t cchRemaining = 0;
if (dwFlags & (~STRSAFE_VALID_FLAGS))
Status = STATUS_INVALID_PARAMETER;
else
{
if (dwFlags & STRSAFE_IGNORE_NULLS)
{
if (!pszDest)
{
if ((cchDest!=0) || (cbDest!=0))
Status = STATUS_INVALID_PARAMETER;
}
if (!pszFormat)
pszFormat = "";
}
if (NT_SUCCESS(Status))
{
if (cchDest==0)
{
pszDestEnd = pszDest;
cchRemaining = 0;
if (*pszFormat!='\0')
{
if (!pszDest)
Status = STATUS_INVALID_PARAMETER;
else
Status = STATUS_BUFFER_OVERFLOW;
}
}
else
{
int iRet;
size_t cchMax;
cchMax = cchDest - 1;
iRet = _vsnprintf(pszDest,cchMax,pszFormat,argList);
if ((iRet < 0) || (((size_t)iRet) > cchMax))
{
pszDestEnd = pszDest + cchMax;
cchRemaining = 1;
*pszDestEnd = '\0';
Status = STATUS_BUFFER_OVERFLOW;
}
else
if (((size_t)iRet)==cchMax)
{
pszDestEnd = pszDest + cchMax;
cchRemaining = 1;
*pszDestEnd = '\0';
}
else
if (((size_t)iRet) < cchMax)
{
pszDestEnd = pszDest + iRet;
cchRemaining = cchDest - iRet;
if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
{
memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(char)) + (cbDest % sizeof(char)));
}
}
}
}
}
if (!NT_SUCCESS(Status))
{
if (pszDest)
{
if (dwFlags & STRSAFE_FILL_ON_FAILURE)
{
memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
}
else
if (cchDest > 0)
{
pszDestEnd = pszDest + cchDest - 1;
cchRemaining = 1;
*pszDestEnd = '\0';
}
}
if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
{
if (cchDest > 0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
*pszDestEnd = '\0';
}
}
}
}
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (ppszDestEnd)
*ppszDestEnd = pszDestEnd;
if (pcchRemaining)
*pcchRemaining = cchRemaining;
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI RtlpStringVPrintfExWorkerW(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)
{
NTSTATUS Status = STATUS_SUCCESS;
STRSAFE_LPWSTR pszDestEnd = pszDest;
size_t cchRemaining = 0;
if (dwFlags & (~STRSAFE_VALID_FLAGS))
Status = STATUS_INVALID_PARAMETER;
else
{
if (dwFlags & STRSAFE_IGNORE_NULLS)
{
if (!pszDest)
{
if ((cchDest!=0) || (cbDest!=0))
Status = STATUS_INVALID_PARAMETER;
}
if (!pszFormat)
pszFormat = L"";
}
if (NT_SUCCESS(Status))
{
if (cchDest==0)
{
pszDestEnd = pszDest;
cchRemaining = 0;
if (*pszFormat!=L'\0')
{
if (!pszDest)
Status = STATUS_INVALID_PARAMETER;
else
Status = STATUS_BUFFER_OVERFLOW;
}
}
else
{
int iRet;
size_t cchMax;
cchMax = cchDest - 1;
iRet = _vsnwprintf(pszDest,cchMax,pszFormat,argList);
if ((iRet < 0) || (((size_t)iRet) > cchMax))
{
pszDestEnd = pszDest + cchMax;
cchRemaining = 1;
*pszDestEnd = L'\0';
Status = STATUS_BUFFER_OVERFLOW;
}
else
if (((size_t)iRet)==cchMax)
{
pszDestEnd = pszDest + cchMax;
cchRemaining = 1;
*pszDestEnd = L'\0';
}
else
if (((size_t)iRet) < cchMax)
{
pszDestEnd = pszDest + iRet;
cchRemaining = cchDest - iRet;
if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
{
memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
}
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
if (pcchDestNewLen)
*pcchDestNewLen = iRet == -1 ? cchDest : iRet;
}
}
}
if (!NT_SUCCESS(Status))
{
if (pszDest)
{
if (dwFlags & STRSAFE_FILL_ON_FAILURE)
{
memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
}
else
if (cchDest > 0)
{
pszDestEnd = pszDest + cchDest - 1;
cchRemaining = 1;
*pszDestEnd = L'\0';
}
}
if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
{
if (cchDest > 0)
{
pszDestEnd = pszDest;
cchRemaining = cchDest;
*pszDestEnd = L'\0';
}
}
}
}
if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
{
if (ppszDestEnd)
*ppszDestEnd = pszDestEnd;
if (pcchRemaining)
*pcchRemaining = cchRemaining;
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
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)
{
return RtlpStringVPrintfExWorkerW(pszDest, cchDest, cbDest, ppszDestEnd, pcchRemaining, dwFlags, pszFormat, NULL, argList);
}
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)
{
if (pcchDestNewLen == 0)
return STATUS_INVALID_PARAMETER;
return RtlpStringVPrintfExWorkerW(pszDest, cchDest, cbDest, ppszDestEnd, pcchRemaining, dwFlags, pszFormat, pcchDestNewLen, argList);
}
NTSTRSAFEAPI
RtlStringLengthWorkerA(
_In_reads_or_z_(cchMax) STRSAFE_LPCSTR psz,
_In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax,
_Out_opt_ _Deref_out_range_(<, cchMax) size_t *pcchLength)
{
NTSTATUS Status = STATUS_SUCCESS;
size_t cchMaxPrev = cchMax;
while(cchMax && (*psz!='\0'))
{
psz++;
cchMax--;
}
if (cchMax==0)
Status = STATUS_INVALID_PARAMETER;
if (pcchLength)
{
if (NT_SUCCESS(Status))
*pcchLength = cchMaxPrev - cchMax;
else
*pcchLength = 0;
}
return Status;
}
NTSTRSAFEAPI
RtlStringLengthWorkerW(
_In_reads_or_z_(cchMax) STRSAFE_LPCWSTR psz,
_In_ _In_range_(<=, NTSTRSAFE_MAX_CCH) size_t cchMax,
_Out_opt_ _Deref_out_range_(<, cchMax) size_t *pcchLength)
{
NTSTATUS Status = STATUS_SUCCESS;
size_t cchMaxPrev = cchMax;
while(cchMax && (*psz!=L'\0'))
{
psz++;
cchMax--;
}
if (cchMax==0)
Status = STATUS_INVALID_PARAMETER;
if (pcchLength)
{
if (NT_SUCCESS(Status))
*pcchLength = cchMaxPrev - cchMax;
else
*pcchLength = 0;
}
return Status;
}
[DDK] RtlUnicodeStringPrintf(Ex) implementations and ntstrsafe.h tests (#522, #523) [KMTESTS:RTL] (CORE-14565) + Added buffer overrun tests. + New style header. + ISO C90 compatibility [DDK] (CORE-9819): RtlUnicodeStringPrintf(Ex) and RtlUnicodeStringValidate(Ex) fixes plus formatting. [DDK]: Cosmetic changes (NTSTATUS variable naming and tabs) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [DDK] First implementation of Unicode functions for NtStrSafe (CORE-9819) + This implementation does not modify the interface of previous functions. + Since we need length returned for the destination UNICODE_STRING.Length field: - an intermediate "Len" postfixed function was added with optional argument to return the _vsnwprintf character count. - Wide Printf(Ex) functions already existent work now call new Rtlp private worker functions. + For several UnicodeStringPrintf(Ex) tests, see work going on CORE-14565 NOTES: + MSDN says they won't insert NULL characters on formatted strings. But seems this is incorrect at MSDN (interpret this as DONT ASSUME NULL-termination). We return zero-terminated strings, and MS functions seems to do the same. (XP DDK 7.1) [KMTESTS:RTL] Tests for new RtlUnicodePrintf(Ex) functions (CORE-14565) + 45 Tests working. + Lacks remaining non-Unicode functions in NtStrSafe.h for now. + Used for first tests on CORE-9819 [KMTESTS/RTL] Fixed test not taking care of null (CORE-14565) [DDK] Fixed bad NtStrSafe.h va_start call (CORE-9819) [KMTESTS:RTL] First Test. Update on RtlUnicodeStringPrintfEx plus cosmetic changes. [KMTESTS] Added NtStrSafe to test lists (CORE-14565) First commit: Skeleton for test implementation + Addition to COMMON SOURCES in kmtests Cmake lists. WIP. +Implementation of RtlStringVPrintfWorkerLenW, RtlStringVPrintfExWorkerLenW to avoid changing existing public functions. This is required as existent functions did not return vsnprintf result, so we didn't have any return info to update UNICODE_STRING.Length. +Additional implementation of RtlUnicodeStringValidate for checking purposes. +Former RtlStringVPrintfWorker(ex) refactored to RtlInternalStringVPrintf(Ex)WorkerW. +No ANSI functions affected as we didn't need them for Unicode printf's. WIP: RtlUnicodeStringPrintf
2018-04-21 06:56:12 +00:00
NTSTRSAFEAPI
RtlpUnicodeStringValidate(_In_opt_ PCUNICODE_STRING SourceString,
_In_ STRSAFE_DWORD dwFlags)
{
if (SourceString)
{
if (SourceString->Length % sizeof(WCHAR) != 0 ||
SourceString->MaximumLength % sizeof(WCHAR) != 0 ||
SourceString->Length > SourceString->MaximumLength ||
SourceString->MaximumLength > NTSTRSAFE_UNICODE_STRING_MAX_CCH * sizeof(WCHAR) ||
(SourceString->Buffer == NULL && (SourceString->Length != 0 || SourceString->MaximumLength != 0)))
{
return STATUS_INVALID_PARAMETER;
}
}
else
{
if (!(dwFlags & STRSAFE_IGNORE_NULLS))
return STATUS_INVALID_PARAMETER;
}
return STATUS_SUCCESS;
}
NTSTRSAFEAPI
RtlUnicodeStringValidate(_In_opt_ PCUNICODE_STRING SourceString)
{
return RtlpUnicodeStringValidate(SourceString, 0);
}
NTSTRSAFEAPI
RtlUnicodeStringValidateEx(_In_opt_ PCUNICODE_STRING SourceString,
_In_ STRSAFE_DWORD dwFlags)
{
if (dwFlags & ~(STRSAFE_UNICODE_STRING_VALID_FLAGS))
return STATUS_INVALID_PARAMETER;
return RtlpUnicodeStringValidate(SourceString, dwFlags);
}
static
NTSTATUS
__cdecl
RtlUnicodeStringPrintf(_In_ PUNICODE_STRING DestinationString,
_In_ NTSTRSAFE_PCWSTR pszFormat, ...)
{
NTSTATUS Status;
size_t cchFinalLength;
va_list argList;
if (DestinationString == NULL || pszFormat == NULL || DestinationString->Buffer == NULL)
{
Status = STATUS_INVALID_PARAMETER;
}
else
{
Status = RtlUnicodeStringValidate(DestinationString);
if (NT_SUCCESS(Status))
{
va_start(argList, pszFormat);
Status = RtlStringVPrintfWorkerLenW(DestinationString->Buffer,
DestinationString->MaximumLength / sizeof(WCHAR),
pszFormat,
&cchFinalLength,
argList);
if (NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW)
{
DestinationString->Length = (USHORT)(cchFinalLength * sizeof(WCHAR));
}
va_end(argList);
}
}
return Status;
}
static
NTSTATUS
__cdecl
RtlUnicodeStringPrintfEx(_In_opt_ PUNICODE_STRING DestinationString,
_In_opt_ PUNICODE_STRING RemainingString,
_In_ STRSAFE_DWORD dwFlags,
_In_ NTSTRSAFE_PCWSTR pszFormat, ...)
{
NTSTATUS Status;
size_t cchFinalLength;
size_t cchRemaining;
va_list argList;
va_start(argList, pszFormat);
Status = RtlStringVPrintfExWorkerLenW(DestinationString->Buffer,
DestinationString->MaximumLength / sizeof(WCHAR),
DestinationString->MaximumLength,
&RemainingString->Buffer,
&cchRemaining,
dwFlags,
pszFormat,
&cchFinalLength,
argList);
va_end(argList);
if (Status == STATUS_BUFFER_OVERFLOW || NT_SUCCESS(Status))
{
DestinationString->Length = (USHORT)(cchFinalLength * sizeof(WCHAR));
if (RemainingString)
{
RemainingString->Length = 0;
RemainingString->MaximumLength = (USHORT)cchRemaining * sizeof(WCHAR);
}
}
return Status;
}
#define RtlStringCopyWorkerA RtlStringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
#define RtlStringCopyWorkerW RtlStringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
#define RtlStringCopyExWorkerA RtlStringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
#define RtlStringCopyExWorkerW RtlStringCopyExWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
#define RtlStringCatWorkerA RtlStringCatWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
#define RtlStringCatWorkerW RtlStringCatWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
#define RtlStringCatExWorkerA RtlStringCatExWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
#define RtlStringCatExWorkerW RtlStringCatExWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
#define RtlStringCatNWorkerA RtlStringCatNWorkerA_instead_use_StringCchCatNA_or_StrincCbCatNA;
#define RtlStringCatNWorkerW RtlStringCatNWorkerW_instead_use_StringCchCatNW_or_StringCbCatNW;
#define RtlStringCatNExWorkerA RtlStringCatNExWorkerA_instead_use_StringCchCatNExA_or_StringCbCatNExA;
#define RtlStringCatNExWorkerW RtlStringCatNExWorkerW_instead_use_StringCchCatNExW_or_StringCbCatNExW;
#define RtlStringVPrintfWorkerA RtlStringVPrintfWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
#define RtlStringVPrintfWorkerW RtlStringVPrintfWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
#define RtlStringVPrintfExWorkerA RtlStringVPrintfExWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
#define RtlStringVPrintfExWorkerW RtlStringVPrintfExWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
#define RtlStringLengthWorkerA RtlStringLengthWorkerA_instead_use_StringCchLengthA_or_StringCbLengthA;
#define RtlStringLengthWorkerW RtlStringLengthWorkerW_instead_use_StringCchLengthW_or_StringCbLengthW;
#ifdef _MSC_VER
#pragma warning(pop)
#endif /* _MSC_VER */
#endif /* _NTSTRSAFE_H_INCLUDED_ */