|  | /** | 
|  | * 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 within this package. | 
|  | */ | 
|  | #ifndef _STRSAFE_H_INCLUDED_ | 
|  | #define _STRSAFE_H_INCLUDED_ | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include <string.h> | 
|  | #include <stdarg.h> | 
|  | #include <specstrings.h> | 
|  |  | 
|  | #ifndef _SIZE_T_DEFINED | 
|  | #define _SIZE_T_DEFINED | 
|  | #undef size_t | 
|  | #ifdef _WIN64 | 
|  | #if defined(__GNUC__) && defined(__STRICT_ANSI__) | 
|  | typedef unsigned int size_t __attribute__ ((mode (DI))); | 
|  | #else | 
|  | typedef unsigned __int64 size_t; | 
|  | #endif | 
|  | #else | 
|  | typedef unsigned int size_t; | 
|  | #endif | 
|  | #endif | 
|  |  | 
|  | #ifndef _SSIZE_T_DEFINED | 
|  | #define _SSIZE_T_DEFINED | 
|  | #undef ssize_t | 
|  | #ifdef _WIN64 | 
|  | #if defined(__GNUC__) && defined(__STRICT_ANSI__) | 
|  | typedef int ssize_t __attribute__ ((mode (DI))); | 
|  | #else | 
|  | typedef __int64 ssize_t; | 
|  | #endif | 
|  | #else | 
|  | typedef int ssize_t; | 
|  | #endif | 
|  | #endif | 
|  |  | 
|  | #ifndef _WCHAR_T_DEFINED | 
|  | #define _WCHAR_T_DEFINED | 
|  | typedef unsigned short wchar_t; | 
|  | #endif | 
|  |  | 
|  | #ifndef _HRESULT_DEFINED | 
|  | #define _HRESULT_DEFINED | 
|  | typedef long HRESULT; | 
|  | #endif | 
|  |  | 
|  | #ifndef SUCCEEDED | 
|  | #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0) | 
|  | #endif | 
|  |  | 
|  | #ifndef FAILED | 
|  | #define FAILED(hr) ((HRESULT)(hr) < 0) | 
|  | #endif | 
|  |  | 
|  | #ifndef S_OK | 
|  | #define S_OK ((HRESULT)0x00000000L) | 
|  | #endif | 
|  |  | 
|  | #ifndef C_ASSERT | 
|  | #define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1] | 
|  | #endif | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | #define _STRSAFE_EXTERN_C extern "C" | 
|  | #else | 
|  | #define _STRSAFE_EXTERN_C extern | 
|  | #endif | 
|  |  | 
|  | #ifndef WINAPI | 
|  | #define WINAPI __stdcall | 
|  | #endif | 
|  |  | 
|  | #define STRSAFEAPI static __inline HRESULT WINAPI | 
|  | #define STRSAFE_INLINE_API __CRT_INLINE HRESULT WINAPI | 
|  |  | 
|  | #define STRSAFE_MAX_CCH 2147483647 | 
|  |  | 
|  | #ifndef _NTSTRSAFE_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) ((unsigned long)((x & 0x000000FF) | STRSAFE_FILL_BEHIND_NULL)) | 
|  | #define STRSAFE_FAILURE_BYTE(x) ((unsigned long)((x & 0x000000FF) | STRSAFE_FILL_ON_FAILURE)) | 
|  |  | 
|  | #define STRSAFE_GET_FILL_PATTERN(dwFlags) ((int)(dwFlags & 0x000000FF)) | 
|  | #endif | 
|  |  | 
|  | #define STRSAFE_E_INSUFFICIENT_BUFFER ((HRESULT)0x8007007AL) | 
|  | #define STRSAFE_E_INVALID_PARAMETER ((HRESULT)0x80070057L) | 
|  | #define STRSAFE_E_END_OF_FILE ((HRESULT)0x80070026L) | 
|  |  | 
|  | typedef char *STRSAFE_LPSTR; | 
|  | typedef const char *STRSAFE_LPCSTR; | 
|  | typedef wchar_t *STRSAFE_LPWSTR; | 
|  | typedef const wchar_t *STRSAFE_LPCWSTR; | 
|  |  | 
|  | STRSAFEAPI StringCopyWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc); | 
|  | STRSAFEAPI StringCopyWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc); | 
|  | STRSAFEAPI StringCopyExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCopyExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCopyNWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy); | 
|  | STRSAFEAPI StringCopyNWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy); | 
|  | STRSAFEAPI StringCopyNExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCopyNExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCatWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc); | 
|  | STRSAFEAPI StringCatWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc); | 
|  | STRSAFEAPI StringCatExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCatExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCatNWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend); | 
|  | STRSAFEAPI StringCatNWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend); | 
|  | STRSAFEAPI StringCatNExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCatNExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringVPrintfWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList); | 
|  | STRSAFEAPI StringVPrintfWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList); | 
|  | STRSAFEAPI StringVPrintfExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList); | 
|  | STRSAFEAPI StringVPrintfExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList); | 
|  | STRSAFEAPI StringLengthWorkerA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength); | 
|  | STRSAFEAPI StringLengthWorkerW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength); | 
|  | STRSAFE_INLINE_API StringGetsExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFE_INLINE_API StringGetsExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  |  | 
|  | #ifdef UNICODE | 
|  | #define StringCchCopy StringCchCopyW | 
|  | #else | 
|  | #define StringCchCopy StringCchCopyA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchCopyA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc); | 
|  | STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc); | 
|  |  | 
|  | STRSAFEAPI StringCchCopyA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCopyWorkerA(pszDest,cchDest,pszSrc); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCopyWorkerW(pszDest,cchDest,pszSrc); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | #ifdef UNICODE | 
|  | #define StringCbCopy StringCbCopyW | 
|  | #else | 
|  | #define StringCbCopy StringCbCopyA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbCopyA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc); | 
|  | STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc); | 
|  |  | 
|  | STRSAFEAPI StringCbCopyA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCopyWorkerA(pszDest,cchDest,pszSrc); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCopyWorkerW(pszDest,cchDest,pszSrc); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | #ifdef UNICODE | 
|  | #define StringCchCopyEx StringCchCopyExW | 
|  | #else | 
|  | #define StringCchCopyEx StringCchCopyExA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchCopyExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCchCopyExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  |  | 
|  | STRSAFEAPI StringCchCopyExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(char); | 
|  | hr = StringCopyExWorkerA(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCopyExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(wchar_t); | 
|  | hr = StringCopyExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | #ifdef UNICODE | 
|  | #define StringCbCopyEx StringCbCopyExW | 
|  | #else | 
|  | #define StringCbCopyEx StringCbCopyExA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbCopyExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCbCopyExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags); | 
|  |  | 
|  | STRSAFEAPI StringCbCopyExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCopyExWorkerA(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags); | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(pcbRemaining) { | 
|  | *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char)); | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCopyExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCopyExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags); | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(pcbRemaining) { | 
|  | *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCopyNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy); | 
|  | STRSAFEAPI StringCchCopyNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy); | 
|  | #ifdef UNICODE | 
|  | #define StringCchCopyN StringCchCopyNW | 
|  | #else | 
|  | #define StringCchCopyN StringCchCopyNA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchCopyNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy) { | 
|  | HRESULT hr; | 
|  | if((cchDest > STRSAFE_MAX_CCH) || (cchToCopy > STRSAFE_MAX_CCH)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCopyNWorkerA(pszDest,cchDest,pszSrc,cchToCopy); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCopyNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy) { | 
|  | HRESULT hr; | 
|  | if((cchDest > STRSAFE_MAX_CCH) || (cchToCopy > STRSAFE_MAX_CCH)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCopyNWorkerW(pszDest,cchDest,pszSrc,cchToCopy); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCopyNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy); | 
|  | STRSAFEAPI StringCbCopyNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy); | 
|  | #ifdef UNICODE | 
|  | #define StringCbCopyN StringCbCopyNW | 
|  | #else | 
|  | #define StringCbCopyN StringCbCopyNA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbCopyNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchToCopy; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | cchToCopy = cbToCopy / sizeof(char); | 
|  | if((cchDest > STRSAFE_MAX_CCH) || (cchToCopy > STRSAFE_MAX_CCH)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCopyNWorkerA(pszDest,cchDest,pszSrc,cchToCopy); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCopyNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchToCopy; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | cchToCopy = cbToCopy / sizeof(wchar_t); | 
|  | if((cchDest > STRSAFE_MAX_CCH) || (cchToCopy > STRSAFE_MAX_CCH)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCopyNWorkerW(pszDest,cchDest,pszSrc,cchToCopy); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCopyNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCchCopyNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | #ifdef UNICODE | 
|  | #define StringCchCopyNEx StringCchCopyNExW | 
|  | #else | 
|  | #define StringCchCopyNEx StringCchCopyNExA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchCopyNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(char); | 
|  | hr = StringCopyNExWorkerA(pszDest,cchDest,cbDest,pszSrc,cchToCopy,ppszDestEnd,pcchRemaining,dwFlags); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCopyNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(wchar_t); | 
|  | hr = StringCopyNExWorkerW(pszDest,cchDest,cbDest,pszSrc,cchToCopy,ppszDestEnd,pcchRemaining,dwFlags); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCopyNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCbCopyNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags); | 
|  | #ifdef UNICODE | 
|  | #define StringCbCopyNEx StringCbCopyNExW | 
|  | #else | 
|  | #define StringCbCopyNEx StringCbCopyNExA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbCopyNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchToCopy; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | cchToCopy = cbToCopy / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCopyNExWorkerA(pszDest,cchDest,cbDest,pszSrc,cchToCopy,ppszDestEnd,&cchRemaining,dwFlags); | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(pcbRemaining) { | 
|  | *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char)); | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCopyNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchToCopy; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | cchToCopy = cbToCopy / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCopyNExWorkerW(pszDest,cchDest,cbDest,pszSrc,cchToCopy,ppszDestEnd,&cchRemaining,dwFlags); | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(pcbRemaining) { | 
|  | *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCatA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc); | 
|  | STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc); | 
|  | #ifdef UNICODE | 
|  | #define StringCchCat StringCchCatW | 
|  | #else | 
|  | #define StringCchCat StringCchCatA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchCatA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCatWorkerA(pszDest,cchDest,pszSrc); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCatWorkerW(pszDest,cchDest,pszSrc); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCatA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc); | 
|  | STRSAFEAPI StringCbCatW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc); | 
|  | #ifdef UNICODE | 
|  | #define StringCbCat StringCbCatW | 
|  | #else | 
|  | #define StringCbCat StringCbCatA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbCatA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCatWorkerA(pszDest,cchDest,pszSrc); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCatW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCatWorkerW(pszDest,cchDest,pszSrc); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCatExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCchCatExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | #ifdef UNICODE | 
|  | #define StringCchCatEx StringCchCatExW | 
|  | #else | 
|  | #define StringCchCatEx StringCchCatExA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchCatExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(char); | 
|  | hr = StringCatExWorkerA(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCatExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(wchar_t); | 
|  | hr = StringCatExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCatExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCbCatExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags); | 
|  | #ifdef UNICODE | 
|  | #define StringCbCatEx StringCbCatExW | 
|  | #else | 
|  | #define StringCbCatEx StringCbCatExA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbCatExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCatExWorkerA(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags); | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(pcbRemaining) { | 
|  | *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char)); | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCatExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCatExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags); | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(pcbRemaining) { | 
|  | *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCatNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend); | 
|  | STRSAFEAPI StringCchCatNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend); | 
|  | #ifdef UNICODE | 
|  | #define StringCchCatN StringCchCatNW | 
|  | #else | 
|  | #define StringCchCatN StringCchCatNA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchCatNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCatNWorkerA(pszDest,cchDest,pszSrc,cchToAppend); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCatNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCatNWorkerW(pszDest,cchDest,pszSrc,cchToAppend); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCatNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend); | 
|  | STRSAFEAPI StringCbCatNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend); | 
|  | #ifdef UNICODE | 
|  | #define StringCbCatN StringCbCatNW | 
|  | #else | 
|  | #define StringCbCatN StringCbCatNA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbCatNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchToAppend; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | cchToAppend = cbToAppend / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCatNWorkerA(pszDest,cchDest,pszSrc,cchToAppend); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCatNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchToAppend; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | cchToAppend = cbToAppend / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCatNWorkerW(pszDest,cchDest,pszSrc,cchToAppend); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCatNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCchCatNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | #ifdef UNICODE | 
|  | #define StringCchCatNEx StringCchCatNExW | 
|  | #else | 
|  | #define StringCchCatNEx StringCchCatNExA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchCatNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(char); | 
|  | hr = StringCatNExWorkerA(pszDest,cchDest,cbDest,pszSrc,cchToAppend,ppszDestEnd,pcchRemaining,dwFlags); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchCatNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(wchar_t); | 
|  | hr = StringCatNExWorkerW(pszDest,cchDest,cbDest,pszSrc,cchToAppend,ppszDestEnd,pcchRemaining,dwFlags); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCatNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags); | 
|  | STRSAFEAPI StringCbCatNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags); | 
|  | #ifdef UNICODE | 
|  | #define StringCbCatNEx StringCbCatNExW | 
|  | #else | 
|  | #define StringCbCatNEx StringCbCatNExA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbCatNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchToAppend; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | cchToAppend = cbToAppend / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCatNExWorkerA(pszDest,cchDest,cbDest,pszSrc,cchToAppend,ppszDestEnd,&cchRemaining,dwFlags); | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(pcbRemaining) { | 
|  | *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char)); | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbCatNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchToAppend; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | cchToAppend = cbToAppend / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringCatNExWorkerW(pszDest,cchDest,cbDest,pszSrc,cchToAppend,ppszDestEnd,&cchRemaining,dwFlags); | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(pcbRemaining) { | 
|  | *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchVPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList); | 
|  | STRSAFEAPI StringCchVPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList); | 
|  | #ifdef UNICODE | 
|  | #define StringCchVPrintf StringCchVPrintfW | 
|  | #else | 
|  | #define StringCchVPrintf StringCchVPrintfA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchVPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringVPrintfWorkerA(pszDest,cchDest,pszFormat,argList); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchVPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbVPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,va_list argList); | 
|  | STRSAFEAPI StringCbVPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,va_list argList); | 
|  | #ifdef UNICODE | 
|  | #define StringCbVPrintf StringCbVPrintfW | 
|  | #else | 
|  | #define StringCbVPrintf StringCbVPrintfA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbVPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,va_list argList) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringVPrintfWorkerA(pszDest,cchDest,pszFormat,argList); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbVPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,va_list argList) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,...); | 
|  | STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,...); | 
|  | #ifdef UNICODE | 
|  | #define StringCchPrintf StringCchPrintfW | 
|  | #else | 
|  | #define StringCchPrintf StringCchPrintfA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,...) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | va_list argList; | 
|  | va_start(argList,pszFormat); | 
|  | hr = StringVPrintfWorkerA(pszDest,cchDest,pszFormat,argList); | 
|  | va_end(argList); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,...) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | va_list argList; | 
|  | va_start(argList,pszFormat); | 
|  | hr = StringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList); | 
|  | va_end(argList); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,...); | 
|  | STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,...); | 
|  | #ifdef UNICODE | 
|  | #define StringCbPrintf StringCbPrintfW | 
|  | #else | 
|  | #define StringCbPrintf StringCbPrintfA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,...) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | va_list argList; | 
|  | va_start(argList,pszFormat); | 
|  | hr = StringVPrintfWorkerA(pszDest,cchDest,pszFormat,argList); | 
|  | va_end(argList); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,...) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | va_list argList; | 
|  | va_start(argList,pszFormat); | 
|  | hr = StringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList); | 
|  | va_end(argList); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags,STRSAFE_LPCSTR pszFormat,...); | 
|  | STRSAFEAPI StringCchPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags,STRSAFE_LPCWSTR pszFormat,...); | 
|  | #ifdef UNICODE | 
|  | #define StringCchPrintfEx StringCchPrintfExW | 
|  | #else | 
|  | #define StringCchPrintfEx StringCchPrintfExA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags,STRSAFE_LPCSTR pszFormat,...) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | va_list argList; | 
|  | cbDest = cchDest*sizeof(char); | 
|  | va_start(argList,pszFormat); | 
|  | hr = StringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList); | 
|  | va_end(argList); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags,STRSAFE_LPCWSTR pszFormat,...) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | va_list argList; | 
|  | cbDest = cchDest*sizeof(wchar_t); | 
|  | va_start(argList,pszFormat); | 
|  | hr = StringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList); | 
|  | va_end(argList); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags,STRSAFE_LPCSTR pszFormat,...); | 
|  | STRSAFEAPI StringCbPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags,STRSAFE_LPCWSTR pszFormat,...); | 
|  | #ifdef UNICODE | 
|  | #define StringCbPrintfEx StringCbPrintfExW | 
|  | #else | 
|  | #define StringCbPrintfEx StringCbPrintfExA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags,STRSAFE_LPCSTR pszFormat,...) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | va_list argList; | 
|  | va_start(argList,pszFormat); | 
|  | hr = StringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList); | 
|  | va_end(argList); | 
|  | } | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(pcbRemaining) { | 
|  | *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char)); | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags,STRSAFE_LPCWSTR pszFormat,...) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | va_list argList; | 
|  | va_start(argList,pszFormat); | 
|  | hr = StringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList); | 
|  | va_end(argList); | 
|  | } | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(pcbRemaining) { | 
|  | *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchVPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList); | 
|  | STRSAFEAPI StringCchVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList); | 
|  | #ifdef UNICODE | 
|  | #define StringCchVPrintfEx StringCchVPrintfExW | 
|  | #else | 
|  | #define StringCchVPrintfEx StringCchVPrintfExA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchVPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(char); | 
|  | hr = StringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(wchar_t); | 
|  | hr = StringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbVPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList); | 
|  | STRSAFEAPI StringCbVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList); | 
|  | #ifdef UNICODE | 
|  | #define StringCbVPrintfEx StringCbVPrintfExW | 
|  | #else | 
|  | #define StringCbVPrintfEx StringCbVPrintfExA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbVPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList); | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(pcbRemaining) { | 
|  | *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char)); | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList); | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(pcbRemaining) { | 
|  | *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFE_INLINE_API StringCchGetsA(STRSAFE_LPSTR pszDest,size_t cchDest); | 
|  | STRSAFE_INLINE_API StringCchGetsW(STRSAFE_LPWSTR pszDest,size_t cchDest); | 
|  | #ifdef UNICODE | 
|  | #define StringCchGets StringCchGetsW | 
|  | #else | 
|  | #define StringCchGets StringCchGetsA | 
|  | #endif | 
|  |  | 
|  | STRSAFE_INLINE_API StringCchGetsA(STRSAFE_LPSTR pszDest,size_t cchDest) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(char); | 
|  | hr = StringGetsExWorkerA(pszDest,cchDest,cbDest,NULL,NULL,0); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFE_INLINE_API StringCchGetsW(STRSAFE_LPWSTR pszDest,size_t cchDest) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(wchar_t); | 
|  | hr = StringGetsExWorkerW(pszDest,cchDest,cbDest,NULL,NULL,0); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFE_INLINE_API StringCbGetsA(STRSAFE_LPSTR pszDest,size_t cbDest); | 
|  | STRSAFE_INLINE_API StringCbGetsW(STRSAFE_LPWSTR pszDest,size_t cbDest); | 
|  | #ifdef UNICODE | 
|  | #define StringCbGets StringCbGetsW | 
|  | #else | 
|  | #define StringCbGets StringCbGetsA | 
|  | #endif | 
|  |  | 
|  | STRSAFE_INLINE_API StringCbGetsA(STRSAFE_LPSTR pszDest,size_t cbDest) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringGetsExWorkerA(pszDest,cchDest,cbDest,NULL,NULL,0); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFE_INLINE_API StringCbGetsW(STRSAFE_LPWSTR pszDest,size_t cbDest) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringGetsExWorkerW(pszDest,cchDest,cbDest,NULL,NULL,0); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFE_INLINE_API StringCchGetsExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | STRSAFE_INLINE_API StringCchGetsExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags); | 
|  | #ifdef UNICODE | 
|  | #define StringCchGetsEx StringCchGetsExW | 
|  | #else | 
|  | #define StringCchGetsEx StringCchGetsExA | 
|  | #endif | 
|  |  | 
|  | STRSAFE_INLINE_API StringCchGetsExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(char); | 
|  | hr = StringGetsExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFE_INLINE_API StringCchGetsExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cbDest; | 
|  | cbDest = cchDest*sizeof(wchar_t); | 
|  | hr = StringGetsExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFE_INLINE_API StringCbGetsExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags); | 
|  | STRSAFE_INLINE_API StringCbGetsExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags); | 
|  | #ifdef UNICODE | 
|  | #define StringCbGetsEx StringCbGetsExW | 
|  | #else | 
|  | #define StringCbGetsEx StringCbGetsExA | 
|  | #endif | 
|  |  | 
|  | STRSAFE_INLINE_API StringCbGetsExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(char); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringGetsExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags); | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER) || (hr==STRSAFE_E_END_OF_FILE)) { | 
|  | if(pcbRemaining) *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char)); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFE_INLINE_API StringCbGetsExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr; | 
|  | size_t cchDest; | 
|  | size_t cchRemaining = 0; | 
|  | cchDest = cbDest / sizeof(wchar_t); | 
|  | if(cchDest > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringGetsExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags); | 
|  | if(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER) || (hr==STRSAFE_E_END_OF_FILE)) { | 
|  | if(pcbRemaining) *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)); | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchLengthA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength); | 
|  | STRSAFEAPI StringCchLengthW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength); | 
|  | #ifdef UNICODE | 
|  | #define StringCchLength StringCchLengthW | 
|  | #else | 
|  | #define StringCchLength StringCchLengthA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCchLengthA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength) { | 
|  | HRESULT hr; | 
|  | if(!psz || (cchMax > STRSAFE_MAX_CCH)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringLengthWorkerA(psz,cchMax,pcchLength); | 
|  | if(FAILED(hr) && pcchLength) { | 
|  | *pcchLength = 0; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCchLengthW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength) { | 
|  | HRESULT hr; | 
|  | if(!psz || (cchMax > STRSAFE_MAX_CCH)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringLengthWorkerW(psz,cchMax,pcchLength); | 
|  | if(FAILED(hr) && pcchLength) { | 
|  | *pcchLength = 0; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbLengthA(STRSAFE_LPCSTR psz,size_t cbMax,size_t *pcbLength); | 
|  | STRSAFEAPI StringCbLengthW(STRSAFE_LPCWSTR psz,size_t cbMax,size_t *pcbLength); | 
|  | #ifdef UNICODE | 
|  | #define StringCbLength StringCbLengthW | 
|  | #else | 
|  | #define StringCbLength StringCbLengthA | 
|  | #endif | 
|  |  | 
|  | STRSAFEAPI StringCbLengthA(STRSAFE_LPCSTR psz,size_t cbMax,size_t *pcbLength) { | 
|  | HRESULT hr; | 
|  | size_t cchMax; | 
|  | size_t cchLength = 0; | 
|  | cchMax = cbMax / sizeof(char); | 
|  | if(!psz || (cchMax > STRSAFE_MAX_CCH)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringLengthWorkerA(psz,cchMax,&cchLength); | 
|  | if(pcbLength) { | 
|  | if(SUCCEEDED(hr)) { | 
|  | *pcbLength = cchLength*sizeof(char); | 
|  | } else { | 
|  | *pcbLength = 0; | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCbLengthW(STRSAFE_LPCWSTR psz,size_t cbMax,size_t *pcbLength) { | 
|  | HRESULT hr; | 
|  | size_t cchMax; | 
|  | size_t cchLength = 0; | 
|  | cchMax = cbMax / sizeof(wchar_t); | 
|  | if(!psz || (cchMax > STRSAFE_MAX_CCH)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = StringLengthWorkerW(psz,cchMax,&cchLength); | 
|  | if(pcbLength) { | 
|  | if(SUCCEEDED(hr)) { | 
|  | *pcbLength = cchLength*sizeof(wchar_t); | 
|  | } else { | 
|  | *pcbLength = 0; | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCopyWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc) { | 
|  | HRESULT hr = S_OK; | 
|  | if(cchDest==0) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | while(cchDest && (*pszSrc!='\0')) { | 
|  | *pszDest++ = *pszSrc++; | 
|  | cchDest--; | 
|  | } | 
|  | if(cchDest==0) { | 
|  | pszDest--; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | *pszDest= '\0'; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCopyWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc) { | 
|  | HRESULT hr = S_OK; | 
|  | if(cchDest==0) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | while(cchDest && (*pszSrc!=L'\0')) { | 
|  | *pszDest++ = *pszSrc++; | 
|  | cchDest--; | 
|  | } | 
|  | if(cchDest==0) { | 
|  | pszDest--; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | *pszDest= L'\0'; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCopyExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr = S_OK; | 
|  | STRSAFE_LPSTR pszDestEnd = pszDest; | 
|  | size_t cchRemaining = 0; | 
|  | if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | if(dwFlags & STRSAFE_IGNORE_NULLS) { | 
|  | if(!pszDest) { | 
|  | if((cchDest!=0) || (cbDest!=0)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } | 
|  | if(!pszSrc) pszSrc = ""; | 
|  | } | 
|  | if(SUCCEEDED(hr)) { | 
|  | if(cchDest==0) { | 
|  | pszDestEnd = pszDest; | 
|  | cchRemaining = 0; | 
|  | if(*pszSrc!='\0') { | 
|  | if(!pszDest) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | } 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++; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | *pszDestEnd = '\0'; | 
|  | } | 
|  | } | 
|  | } | 
|  | if(FAILED(hr)) { | 
|  | 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(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(ppszDestEnd) *ppszDestEnd = pszDestEnd; | 
|  | if(pcchRemaining) *pcchRemaining = cchRemaining; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCopyExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr = S_OK; | 
|  | STRSAFE_LPWSTR pszDestEnd = pszDest; | 
|  | size_t cchRemaining = 0; | 
|  | if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | if(dwFlags & STRSAFE_IGNORE_NULLS) { | 
|  | if(!pszDest) { | 
|  | if((cchDest!=0) || (cbDest!=0)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } | 
|  | if(!pszSrc) pszSrc = L""; | 
|  | } | 
|  | if(SUCCEEDED(hr)) { | 
|  | if(cchDest==0) { | 
|  | pszDestEnd = pszDest; | 
|  | cchRemaining = 0; | 
|  | if(*pszSrc!=L'\0') { | 
|  | if(!pszDest) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | } 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++; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | *pszDestEnd = L'\0'; | 
|  | } | 
|  | } | 
|  | } | 
|  | if(FAILED(hr)) { | 
|  | 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(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(ppszDestEnd) *ppszDestEnd = pszDestEnd; | 
|  | if(pcchRemaining) *pcchRemaining = cchRemaining; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCopyNWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchSrc) { | 
|  | HRESULT hr = S_OK; | 
|  | if(cchDest==0) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | while(cchDest && cchSrc && (*pszSrc!='\0')) { | 
|  | *pszDest++ = *pszSrc++; | 
|  | cchDest--; | 
|  | cchSrc--; | 
|  | } | 
|  | if(cchDest==0) { | 
|  | pszDest--; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | *pszDest= '\0'; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCopyNWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy) { | 
|  | HRESULT hr = S_OK; | 
|  | if(cchDest==0) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | while(cchDest && cchToCopy && (*pszSrc!=L'\0')) { | 
|  | *pszDest++ = *pszSrc++; | 
|  | cchDest--; | 
|  | cchToCopy--; | 
|  | } | 
|  | if(cchDest==0) { | 
|  | pszDest--; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | *pszDest= L'\0'; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCopyNExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr = S_OK; | 
|  | STRSAFE_LPSTR pszDestEnd = pszDest; | 
|  | size_t cchRemaining = 0; | 
|  | if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else if(cchToCopy > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | if(dwFlags & STRSAFE_IGNORE_NULLS) { | 
|  | if(!pszDest) { | 
|  | if((cchDest!=0) || (cbDest!=0)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } | 
|  | if(!pszSrc) pszSrc = ""; | 
|  | } | 
|  | if(SUCCEEDED(hr)) { | 
|  | if(cchDest==0) { | 
|  | pszDestEnd = pszDest; | 
|  | cchRemaining = 0; | 
|  | if((cchToCopy!=0) && (*pszSrc!='\0')) { | 
|  | if(!pszDest) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | } 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++; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | *pszDestEnd = '\0'; | 
|  | } | 
|  | } | 
|  | } | 
|  | if(FAILED(hr)) { | 
|  | 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(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(ppszDestEnd) *ppszDestEnd = pszDestEnd; | 
|  | if(pcchRemaining) *pcchRemaining = cchRemaining; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCopyNExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr = S_OK; | 
|  | STRSAFE_LPWSTR pszDestEnd = pszDest; | 
|  | size_t cchRemaining = 0; | 
|  | if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else if(cchToCopy > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | if(dwFlags & STRSAFE_IGNORE_NULLS) { | 
|  | if(!pszDest) { | 
|  | if((cchDest!=0) || (cbDest!=0)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } | 
|  | if(!pszSrc) pszSrc = L""; | 
|  | } | 
|  | if(SUCCEEDED(hr)) { | 
|  | if(cchDest==0) { | 
|  | pszDestEnd = pszDest; | 
|  | cchRemaining = 0; | 
|  | if((cchToCopy!=0) && (*pszSrc!=L'\0')) { | 
|  | if(!pszDest) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | } 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++; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | *pszDestEnd = L'\0'; | 
|  | } | 
|  | } | 
|  | } | 
|  | if(FAILED(hr)) { | 
|  | 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(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(ppszDestEnd) *ppszDestEnd = pszDestEnd; | 
|  | if(pcchRemaining) *pcchRemaining = cchRemaining; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCatWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc) { | 
|  | HRESULT hr; | 
|  | size_t cchDestLength; | 
|  | hr = StringLengthWorkerA(pszDest,cchDest,&cchDestLength); | 
|  | if(SUCCEEDED(hr)) hr = StringCopyWorkerA(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCatWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc) { | 
|  | HRESULT hr; | 
|  | size_t cchDestLength; | 
|  | hr = StringLengthWorkerW(pszDest,cchDest,&cchDestLength); | 
|  | if(SUCCEEDED(hr)) hr = StringCopyWorkerW(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCatExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr = S_OK; | 
|  | STRSAFE_LPSTR pszDestEnd = pszDest; | 
|  | size_t cchRemaining = 0; | 
|  | if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cchDestLength; | 
|  | if(dwFlags & STRSAFE_IGNORE_NULLS) { | 
|  | if(!pszDest) { | 
|  | if((cchDest==0) && (cbDest==0)) cchDestLength = 0; | 
|  | else hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } else { | 
|  | hr = StringLengthWorkerA(pszDest,cchDest,&cchDestLength); | 
|  | if(SUCCEEDED(hr)) { | 
|  | pszDestEnd = pszDest + cchDestLength; | 
|  | cchRemaining = cchDest - cchDestLength; | 
|  | } | 
|  | } | 
|  | if(!pszSrc) pszSrc = ""; | 
|  | } else { | 
|  | hr = StringLengthWorkerA(pszDest,cchDest,&cchDestLength); | 
|  | if(SUCCEEDED(hr)) { | 
|  | pszDestEnd = pszDest + cchDestLength; | 
|  | cchRemaining = cchDest - cchDestLength; | 
|  | } | 
|  | } | 
|  | if(SUCCEEDED(hr)) { | 
|  | if(cchDest==0) { | 
|  | if(*pszSrc!='\0') { | 
|  | if(!pszDest) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | } else hr = StringCopyExWorkerA(pszDestEnd,cchRemaining,(cchRemaining*sizeof(char)) + (cbDest % sizeof(char)),pszSrc,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE))); | 
|  | } | 
|  | } | 
|  | if(FAILED(hr)) { | 
|  | 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(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(ppszDestEnd) *ppszDestEnd = pszDestEnd; | 
|  | if(pcchRemaining) *pcchRemaining = cchRemaining; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCatExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr = S_OK; | 
|  | STRSAFE_LPWSTR pszDestEnd = pszDest; | 
|  | size_t cchRemaining = 0; | 
|  | if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | size_t cchDestLength; | 
|  | if(dwFlags & STRSAFE_IGNORE_NULLS) { | 
|  | if(!pszDest) { | 
|  | if((cchDest==0) && (cbDest==0)) cchDestLength = 0; | 
|  | else hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } else { | 
|  | hr = StringLengthWorkerW(pszDest,cchDest,&cchDestLength); | 
|  | if(SUCCEEDED(hr)) { | 
|  | pszDestEnd = pszDest + cchDestLength; | 
|  | cchRemaining = cchDest - cchDestLength; | 
|  | } | 
|  | } | 
|  | if(!pszSrc) pszSrc = L""; | 
|  | } else { | 
|  | hr = StringLengthWorkerW(pszDest,cchDest,&cchDestLength); | 
|  | if(SUCCEEDED(hr)) { | 
|  | pszDestEnd = pszDest + cchDestLength; | 
|  | cchRemaining = cchDest - cchDestLength; | 
|  | } | 
|  | } | 
|  | if(SUCCEEDED(hr)) { | 
|  | if(cchDest==0) { | 
|  | if(*pszSrc!=L'\0') { | 
|  | if(!pszDest) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | } else hr = StringCopyExWorkerW(pszDestEnd,cchRemaining,(cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)),pszSrc,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE))); | 
|  | } | 
|  | } | 
|  | if(FAILED(hr)) { | 
|  | 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(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(ppszDestEnd) *ppszDestEnd = pszDestEnd; | 
|  | if(pcchRemaining) *pcchRemaining = cchRemaining; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCatNWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend) { | 
|  | HRESULT hr; | 
|  | size_t cchDestLength; | 
|  | hr = StringLengthWorkerA(pszDest,cchDest,&cchDestLength); | 
|  | if(SUCCEEDED(hr)) hr = StringCopyNWorkerA(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc,cchToAppend); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCatNWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend) { | 
|  | HRESULT hr; | 
|  | size_t cchDestLength; | 
|  | hr = StringLengthWorkerW(pszDest,cchDest,&cchDestLength); | 
|  | if(SUCCEEDED(hr)) hr = StringCopyNWorkerW(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc,cchToAppend); | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCatNExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr = S_OK; | 
|  | STRSAFE_LPSTR pszDestEnd = pszDest; | 
|  | size_t cchRemaining = 0; | 
|  | size_t cchDestLength = 0; | 
|  | if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else if(cchToAppend > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | if(dwFlags & STRSAFE_IGNORE_NULLS) { | 
|  | if(!pszDest) { | 
|  | if((cchDest==0) && (cbDest==0)) cchDestLength = 0; | 
|  | else hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } else { | 
|  | hr = StringLengthWorkerA(pszDest,cchDest,&cchDestLength); | 
|  | if(SUCCEEDED(hr)) { | 
|  | pszDestEnd = pszDest + cchDestLength; | 
|  | cchRemaining = cchDest - cchDestLength; | 
|  | } | 
|  | } | 
|  | if(!pszSrc) pszSrc = ""; | 
|  | } else { | 
|  | hr = StringLengthWorkerA(pszDest,cchDest,&cchDestLength); | 
|  | if(SUCCEEDED(hr)) { | 
|  | pszDestEnd = pszDest + cchDestLength; | 
|  | cchRemaining = cchDest - cchDestLength; | 
|  | } | 
|  | } | 
|  | if(SUCCEEDED(hr)) { | 
|  | if(cchDest==0) { | 
|  | if((cchToAppend!=0) && (*pszSrc!='\0')) { | 
|  | if(!pszDest) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | } else hr = StringCopyNExWorkerA(pszDestEnd,cchRemaining,(cchRemaining*sizeof(char)) + (cbDest % sizeof(char)),pszSrc,cchToAppend,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE))); | 
|  | } | 
|  | } | 
|  | if(FAILED(hr)) { | 
|  | 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(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(ppszDestEnd) *ppszDestEnd = pszDestEnd; | 
|  | if(pcchRemaining) *pcchRemaining = cchRemaining; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringCatNExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr = S_OK; | 
|  | STRSAFE_LPWSTR pszDestEnd = pszDest; | 
|  | size_t cchRemaining = 0; | 
|  | size_t cchDestLength = 0; | 
|  | if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else if(cchToAppend > STRSAFE_MAX_CCH) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | if(dwFlags & STRSAFE_IGNORE_NULLS) { | 
|  | if(!pszDest) { | 
|  | if((cchDest==0) && (cbDest==0)) cchDestLength = 0; | 
|  | else hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } else { | 
|  | hr = StringLengthWorkerW(pszDest,cchDest,&cchDestLength); | 
|  | if(SUCCEEDED(hr)) { | 
|  | pszDestEnd = pszDest + cchDestLength; | 
|  | cchRemaining = cchDest - cchDestLength; | 
|  | } | 
|  | } | 
|  | if(!pszSrc) pszSrc = L""; | 
|  | } else { | 
|  | hr = StringLengthWorkerW(pszDest,cchDest,&cchDestLength); | 
|  | if(SUCCEEDED(hr)) { | 
|  | pszDestEnd = pszDest + cchDestLength; | 
|  | cchRemaining = cchDest - cchDestLength; | 
|  | } | 
|  | } | 
|  | if(SUCCEEDED(hr)) { | 
|  | if(cchDest==0) { | 
|  | if((cchToAppend!=0) && (*pszSrc!=L'\0')) { | 
|  | if(!pszDest) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | } else hr = StringCopyNExWorkerW(pszDestEnd,cchRemaining,(cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)),pszSrc,cchToAppend,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE))); | 
|  | } | 
|  | } | 
|  | if(FAILED(hr)) { | 
|  | 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(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(ppszDestEnd) *ppszDestEnd = pszDestEnd; | 
|  | if(pcchRemaining) *pcchRemaining = cchRemaining; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringVPrintfWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList) { | 
|  | HRESULT hr = S_OK; | 
|  | if(cchDest==0) hr = STRSAFE_E_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'; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } else if(((size_t)iRet)==cchMax) { | 
|  | pszDest += cchMax; | 
|  | *pszDest = '\0'; | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringVPrintfWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList) { | 
|  | HRESULT hr = S_OK; | 
|  | if(cchDest==0) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | int iRet; | 
|  | size_t cchMax; | 
|  | cchMax = cchDest - 1; | 
|  | iRet = _vsnwprintf(pszDest,cchMax,pszFormat,argList); | 
|  | if((iRet < 0) || (((size_t)iRet) > cchMax)) { | 
|  | pszDest += cchMax; | 
|  | *pszDest = L'\0'; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } else if(((size_t)iRet)==cchMax) { | 
|  | pszDest += cchMax; | 
|  | *pszDest = L'\0'; | 
|  | } | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringVPrintfExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList) { | 
|  | HRESULT hr = S_OK; | 
|  | STRSAFE_LPSTR pszDestEnd = pszDest; | 
|  | size_t cchRemaining = 0; | 
|  | if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | if(dwFlags & STRSAFE_IGNORE_NULLS) { | 
|  | if(!pszDest) { | 
|  | if((cchDest!=0) || (cbDest!=0)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } | 
|  | if(!pszFormat) pszFormat = ""; | 
|  | } | 
|  | if(SUCCEEDED(hr)) { | 
|  | if(cchDest==0) { | 
|  | pszDestEnd = pszDest; | 
|  | cchRemaining = 0; | 
|  | if(*pszFormat!='\0') { | 
|  | if(!pszDest) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | } 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'; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } 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(FAILED(hr)) { | 
|  | 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(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(ppszDestEnd) *ppszDestEnd = pszDestEnd; | 
|  | if(pcchRemaining) *pcchRemaining = cchRemaining; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringVPrintfExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList) { | 
|  | HRESULT hr = S_OK; | 
|  | STRSAFE_LPWSTR pszDestEnd = pszDest; | 
|  | size_t cchRemaining = 0; | 
|  | if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | if(dwFlags & STRSAFE_IGNORE_NULLS) { | 
|  | if(!pszDest) { | 
|  | if((cchDest!=0) || (cbDest!=0)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } | 
|  | if(!pszFormat) pszFormat = L""; | 
|  | } | 
|  | if(SUCCEEDED(hr)) { | 
|  | if(cchDest==0) { | 
|  | pszDestEnd = pszDest; | 
|  | cchRemaining = 0; | 
|  | if(*pszFormat!=L'\0') { | 
|  | if(!pszDest) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } | 
|  | } 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'; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } 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))); | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | } | 
|  | if(FAILED(hr)) { | 
|  | 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(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER)) { | 
|  | if(ppszDestEnd) *ppszDestEnd = pszDestEnd; | 
|  | if(pcchRemaining) *pcchRemaining = cchRemaining; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringLengthWorkerA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength) { | 
|  | HRESULT hr = S_OK; | 
|  | size_t cchMaxPrev = cchMax; | 
|  | while(cchMax && (*psz!='\0')) { | 
|  | psz++; | 
|  | cchMax--; | 
|  | } | 
|  | if(cchMax==0) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | if(pcchLength) { | 
|  | if(SUCCEEDED(hr)) *pcchLength = cchMaxPrev - cchMax; | 
|  | else *pcchLength = 0; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFEAPI StringLengthWorkerW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength) { | 
|  | HRESULT hr = S_OK; | 
|  | size_t cchMaxPrev = cchMax; | 
|  | while(cchMax && (*psz!=L'\0')) { | 
|  | psz++; | 
|  | cchMax--; | 
|  | } | 
|  | if(cchMax==0) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | if(pcchLength) { | 
|  | if(SUCCEEDED(hr)) *pcchLength = cchMaxPrev - cchMax; | 
|  | else *pcchLength = 0; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFE_INLINE_API StringGetsExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr = S_OK; | 
|  | STRSAFE_LPSTR pszDestEnd = pszDest; | 
|  | size_t cchRemaining = 0; | 
|  |  | 
|  | if(dwFlags & (~STRSAFE_VALID_FLAGS)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | else { | 
|  | if(dwFlags & STRSAFE_IGNORE_NULLS) { | 
|  | if(!pszDest) { | 
|  | if((cchDest!=0) || (cbDest!=0)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } | 
|  | } | 
|  | if(SUCCEEDED(hr)) { | 
|  | if(cchDest <= 1) { | 
|  | pszDestEnd = pszDest; | 
|  | cchRemaining = cchDest; | 
|  | if(cchDest==1) *pszDestEnd = '\0'; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } else { | 
|  | pszDestEnd = pszDest; | 
|  | cchRemaining = cchDest; | 
|  | while(cchRemaining > 1) { | 
|  | char ch; | 
|  | int i = getc(stdin); | 
|  | if(i==EOF) { | 
|  | if(pszDestEnd==pszDest) hr = STRSAFE_E_END_OF_FILE; | 
|  | break; | 
|  | } | 
|  | ch = (char)i; | 
|  | if(ch=='\n') break; | 
|  | *pszDestEnd = ch; | 
|  | pszDestEnd++; | 
|  | 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))); | 
|  | } | 
|  | } | 
|  | *pszDestEnd = '\0'; | 
|  | } | 
|  | } | 
|  | } | 
|  | if(FAILED(hr)) { | 
|  | 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(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER) || (hr==STRSAFE_E_END_OF_FILE)) { | 
|  | if(ppszDestEnd) *ppszDestEnd = pszDestEnd; | 
|  | if(pcchRemaining) *pcchRemaining = cchRemaining; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | STRSAFE_INLINE_API StringGetsExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,unsigned long dwFlags) { | 
|  | HRESULT hr = S_OK; | 
|  | STRSAFE_LPWSTR pszDestEnd = pszDest; | 
|  | size_t cchRemaining = 0; | 
|  | if(dwFlags & (~STRSAFE_VALID_FLAGS)) { | 
|  | hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } else { | 
|  | if(dwFlags & STRSAFE_IGNORE_NULLS) { | 
|  | if(!pszDest) { | 
|  | if((cchDest!=0) || (cbDest!=0)) hr = STRSAFE_E_INVALID_PARAMETER; | 
|  | } | 
|  | } | 
|  | if(SUCCEEDED(hr)) { | 
|  | if(cchDest <= 1) { | 
|  | pszDestEnd = pszDest; | 
|  | cchRemaining = cchDest; | 
|  | if(cchDest==1) *pszDestEnd = L'\0'; | 
|  | hr = STRSAFE_E_INSUFFICIENT_BUFFER; | 
|  | } else { | 
|  | pszDestEnd = pszDest; | 
|  | cchRemaining = cchDest; | 
|  | while(cchRemaining > 1) { | 
|  | wchar_t ch = getwc(stdin); | 
|  | if(ch==WEOF) { | 
|  | if(pszDestEnd==pszDest) hr = STRSAFE_E_END_OF_FILE; | 
|  | break; | 
|  | } | 
|  | if(ch==L'\n') break; | 
|  | *pszDestEnd = ch; | 
|  | pszDestEnd++; | 
|  | 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))); | 
|  | } | 
|  | } | 
|  | *pszDestEnd = L'\0'; | 
|  | } | 
|  | } | 
|  | } | 
|  | if(FAILED(hr)) { | 
|  | 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(SUCCEEDED(hr) || (hr==STRSAFE_E_INSUFFICIENT_BUFFER) || (hr==STRSAFE_E_END_OF_FILE)) { | 
|  | if(ppszDestEnd) *ppszDestEnd = pszDestEnd; | 
|  | if(pcchRemaining) *pcchRemaining = cchRemaining; | 
|  | } | 
|  | return hr; | 
|  | } | 
|  |  | 
|  | #define StringCopyWorkerA StringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA; | 
|  | #define StringCopyWorkerW StringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW; | 
|  | #define StringCopyExWorkerA StringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA; | 
|  | #define StringCopyExWorkerW StringCopyExWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW; | 
|  | #define StringCatWorkerA StringCatWorkerA_instead_use_StringCchCatA_or_StringCchCatExA; | 
|  | #define StringCatWorkerW StringCatWorkerW_instead_use_StringCchCatW_or_StringCchCatExW; | 
|  | #define StringCatExWorkerA StringCatExWorkerA_instead_use_StringCchCatA_or_StringCchCatExA; | 
|  | #define StringCatExWorkerW StringCatExWorkerW_instead_use_StringCchCatW_or_StringCchCatExW; | 
|  | #define StringCatNWorkerA StringCatNWorkerA_instead_use_StringCchCatNA_or_StrincCbCatNA; | 
|  | #define StringCatNWorkerW StringCatNWorkerW_instead_use_StringCchCatNW_or_StringCbCatNW; | 
|  | #define StringCatNExWorkerA StringCatNExWorkerA_instead_use_StringCchCatNExA_or_StringCbCatNExA; | 
|  | #define StringCatNExWorkerW StringCatNExWorkerW_instead_use_StringCchCatNExW_or_StringCbCatNExW; | 
|  | #define StringVPrintfWorkerA StringVPrintfWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA; | 
|  | #define StringVPrintfWorkerW StringVPrintfWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW; | 
|  | #define StringVPrintfExWorkerA StringVPrintfExWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA; | 
|  | #define StringVPrintfExWorkerW StringVPrintfExWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW; | 
|  | #define StringLengthWorkerA StringLengthWorkerA_instead_use_StringCchLengthA_or_StringCbLengthA; | 
|  | #define StringLengthWorkerW StringLengthWorkerW_instead_use_StringCchLengthW_or_StringCbLengthW; | 
|  | #define StringGetsExWorkerA StringGetsExWorkerA_instead_use_StringCchGetsA_or_StringCbGetsA | 
|  | #define StringGetsExWorkerW StringGetsExWorkerW_instead_use_StringCchGetsW_or_StringCbGetsW | 
|  |  | 
|  | #ifndef STRSAFE_NO_DEPRECATE | 
|  |  | 
|  | #undef strcpy | 
|  | #define strcpy strcpy_instead_use_StringCbCopyA_or_StringCchCopyA; | 
|  |  | 
|  | #undef wcscpy | 
|  | #define wcscpy wcscpy_instead_use_StringCbCopyW_or_StringCchCopyW; | 
|  |  | 
|  | #undef strcat | 
|  | #define strcat strcat_instead_use_StringCbCatA_or_StringCchCatA; | 
|  |  | 
|  | #undef wcscat | 
|  | #define wcscat wcscat_instead_use_StringCbCatW_or_StringCchCatW; | 
|  |  | 
|  | #undef sprintf | 
|  | #define sprintf sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA; | 
|  |  | 
|  | #undef swprintf | 
|  | #define swprintf swprintf_instead_use_StringCbPrintfW_or_StringCchPrintfW; | 
|  |  | 
|  | #undef vsprintf | 
|  | #define vsprintf vsprintf_instead_use_StringCbVPrintfA_or_StringCchVPrintfA; | 
|  |  | 
|  | #undef vswprintf | 
|  | #define vswprintf vswprintf_instead_use_StringCbVPrintfW_or_StringCchVPrintfW; | 
|  |  | 
|  | #undef _snprintf | 
|  | #define _snprintf _snprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA; | 
|  |  | 
|  | #undef _snwprintf | 
|  | #define _snwprintf _snwprintf_instead_use_StringCbPrintfW_or_StringCchPrintfW; | 
|  |  | 
|  | #undef _vsnprintf | 
|  | #define _vsnprintf _vsnprintf_instead_use_StringCbVPrintfA_or_StringCchVPrintfA; | 
|  |  | 
|  | #undef _vsnwprintf | 
|  | #define _vsnwprintf _vsnwprintf_instead_use_StringCbVPrintfW_or_StringCchVPrintfW; | 
|  |  | 
|  | #undef strcpyA | 
|  | #define strcpyA strcpyA_instead_use_StringCbCopyA_or_StringCchCopyA; | 
|  |  | 
|  | #undef strcpyW | 
|  | #define strcpyW strcpyW_instead_use_StringCbCopyW_or_StringCchCopyW; | 
|  |  | 
|  | #undef lstrcpy | 
|  | #define lstrcpy lstrcpy_instead_use_StringCbCopy_or_StringCchCopy; | 
|  |  | 
|  | #undef lstrcpyA | 
|  | #define lstrcpyA lstrcpyA_instead_use_StringCbCopyA_or_StringCchCopyA; | 
|  |  | 
|  | #undef lstrcpyW | 
|  | #define lstrcpyW lstrcpyW_instead_use_StringCbCopyW_or_StringCchCopyW; | 
|  |  | 
|  | #undef StrCpy | 
|  | #define StrCpy StrCpy_instead_use_StringCbCopy_or_StringCchCopy; | 
|  |  | 
|  | #undef StrCpyA | 
|  | #define StrCpyA StrCpyA_instead_use_StringCbCopyA_or_StringCchCopyA; | 
|  |  | 
|  | #undef StrCpyW | 
|  | #define StrCpyW StrCpyW_instead_use_StringCbCopyW_or_StringCchCopyW; | 
|  |  | 
|  | #undef _tcscpy | 
|  | #define _tcscpy _tcscpy_instead_use_StringCbCopy_or_StringCchCopy; | 
|  |  | 
|  | #undef _ftcscpy | 
|  | #define _ftcscpy _ftcscpy_instead_use_StringCbCopy_or_StringCchCopy; | 
|  |  | 
|  | #undef lstrcat | 
|  | #define lstrcat lstrcat_instead_use_StringCbCat_or_StringCchCat; | 
|  |  | 
|  | #undef lstrcatA | 
|  | #define lstrcatA lstrcatA_instead_use_StringCbCatA_or_StringCchCatA; | 
|  |  | 
|  | #undef lstrcatW | 
|  | #define lstrcatW lstrcatW_instead_use_StringCbCatW_or_StringCchCatW; | 
|  |  | 
|  | #undef StrCat | 
|  | #define StrCat StrCat_instead_use_StringCbCat_or_StringCchCat; | 
|  |  | 
|  | #undef StrCatA | 
|  | #define StrCatA StrCatA_instead_use_StringCbCatA_or_StringCchCatA; | 
|  |  | 
|  | #undef StrCatW | 
|  | #define StrCatW StrCatW_instead_use_StringCbCatW_or_StringCchCatW; | 
|  |  | 
|  | #undef StrNCat | 
|  | #define StrNCat StrNCat_instead_use_StringCbCatN_or_StringCchCatN; | 
|  |  | 
|  | #undef StrNCatA | 
|  | #define StrNCatA StrNCatA_instead_use_StringCbCatNA_or_StringCchCatNA; | 
|  |  | 
|  | #undef StrNCatW | 
|  | #define StrNCatW StrNCatW_instead_use_StringCbCatNW_or_StringCchCatNW; | 
|  |  | 
|  | #undef StrCatN | 
|  | #define StrCatN StrCatN_instead_use_StringCbCatN_or_StringCchCatN; | 
|  |  | 
|  | #undef StrCatNA | 
|  | #define StrCatNA StrCatNA_instead_use_StringCbCatNA_or_StringCchCatNA; | 
|  |  | 
|  | #undef StrCatNW | 
|  | #define StrCatNW StrCatNW_instead_use_StringCbCatNW_or_StringCchCatNW; | 
|  |  | 
|  | #undef _tcscat | 
|  | #define _tcscat _tcscat_instead_use_StringCbCat_or_StringCchCat; | 
|  |  | 
|  | #undef _ftcscat | 
|  | #define _ftcscat _ftcscat_instead_use_StringCbCat_or_StringCchCat; | 
|  |  | 
|  | #undef wsprintf | 
|  | #define wsprintf wsprintf_instead_use_StringCbPrintf_or_StringCchPrintf; | 
|  |  | 
|  | #undef wsprintfA | 
|  | #define wsprintfA wsprintfA_instead_use_StringCbPrintfA_or_StringCchPrintfA; | 
|  |  | 
|  | #undef wsprintfW | 
|  | #define wsprintfW wsprintfW_instead_use_StringCbPrintfW_or_StringCchPrintfW; | 
|  |  | 
|  | #undef wvsprintf | 
|  | #define wvsprintf wvsprintf_instead_use_StringCbVPrintf_or_StringCchVPrintf; | 
|  |  | 
|  | #undef wvsprintfA | 
|  | #define wvsprintfA wvsprintfA_instead_use_StringCbVPrintfA_or_StringCchVPrintfA; | 
|  |  | 
|  | #undef wvsprintfW | 
|  | #define wvsprintfW wvsprintfW_instead_use_StringCbVPrintfW_or_StringCchVPrintfW; | 
|  |  | 
|  | #undef _vstprintf | 
|  | #define _vstprintf _vstprintf_instead_use_StringCbVPrintf_or_StringCchVPrintf; | 
|  |  | 
|  | #undef _vsntprintf | 
|  | #define _vsntprintf _vsntprintf_instead_use_StringCbVPrintf_or_StringCchVPrintf; | 
|  |  | 
|  | #undef _stprintf | 
|  | #define _stprintf _stprintf_instead_use_StringCbPrintf_or_StringCchPrintf; | 
|  |  | 
|  | #undef _sntprintf | 
|  | #define _sntprintf _sntprintf_instead_use_StringCbPrintf_or_StringCchPrintf; | 
|  |  | 
|  | #undef _getts | 
|  | #define _getts _getts_instead_use_StringCbGets_or_StringCchGets; | 
|  |  | 
|  | #undef gets | 
|  | #define gets _gets_instead_use_StringCbGetsA_or_StringCchGetsA; | 
|  |  | 
|  | #undef _getws | 
|  | #define _getws _getws_instead_use_StringCbGetsW_or_StringCchGetsW; | 
|  | #endif | 
|  | #endif |