ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

ntstrsafe.h
Go to the documentation of this file.
00001 
00006 #ifndef _NTSTRSAFE_H_INCLUDED_
00007 #define _NTSTRSAFE_H_INCLUDED_
00008 
00009 #include <stdio.h>
00010 #include <string.h>
00011 #include <stdarg.h>
00012 
00013 #ifdef _MSC_VER
00014 #pragma warning(push)
00015 #pragma warning(disable:28719) /* disable banned api usage warning */
00016 #endif /* _MSC_VER */
00017 
00018 #ifndef C_ASSERT
00019 #ifdef _MSC_VER
00020 # define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
00021 #else
00022 # define C_ASSERT(e) extern void __C_ASSERT__(int [(e)?1:-1])
00023 #endif
00024 #endif /* C_ASSERT */
00025 
00026 #ifdef __cplusplus
00027 #define _STRSAFE_EXTERN_C extern "C"
00028 #else
00029 #define _STRSAFE_EXTERN_C extern
00030 #endif
00031 
00032 #define NTSTRSAFEAPI static __inline NTSTATUS NTAPI
00033 #define NTSTRSAFE_INLINE_API static __inline NTSTATUS NTAPI
00034 
00035 #ifndef NTSTRSAFE_MAX_CCH
00036 #define NTSTRSAFE_MAX_CCH 2147483647
00037 #endif
00038 
00039 #ifndef _STRSAFE_H_INCLUDED_
00040 #define STRSAFE_IGNORE_NULLS 0x00000100
00041 #define STRSAFE_FILL_BEHIND_NULL 0x00000200
00042 #define STRSAFE_FILL_ON_FAILURE 0x00000400
00043 #define STRSAFE_NULL_ON_FAILURE 0x00000800
00044 #define STRSAFE_NO_TRUNCATION 0x00001000
00045 #define STRSAFE_IGNORE_NULL_UNICODE_STRINGS 0x00010000
00046 #define STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED 0x00020000
00047 
00048 #define STRSAFE_VALID_FLAGS (0x000000FF | STRSAFE_IGNORE_NULLS | STRSAFE_FILL_BEHIND_NULL | STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION)
00049 #define STRSAFE_UNICODE_STRING_VALID_FLAGS (STRSAFE_VALID_FLAGS | STRSAFE_IGNORE_NULL_UNICODE_STRINGS | STRSAFE_UNICODE_STRING_DEST_NULL_TERMINATED)
00050 
00051 #define STRSAFE_FILL_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_BEHIND_NULL))
00052 #define STRSAFE_FAILURE_BYTE(x) ((STRSAFE_DWORD)(((x) & 0x000000FF) | STRSAFE_FILL_ON_FAILURE))
00053 
00054 #define STRSAFE_GET_FILL_PATTERN(dwFlags) ((int)((dwFlags) & 0x000000FF))
00055 #endif
00056 
00057 typedef char *STRSAFE_LPSTR;
00058 typedef const char *STRSAFE_LPCSTR;
00059 typedef wchar_t *STRSAFE_LPWSTR;
00060 typedef const wchar_t *STRSAFE_LPCWSTR;
00061 
00062 typedef ULONG STRSAFE_DWORD;
00063 
00064 NTSTRSAFEAPI RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc);
00065 NTSTRSAFEAPI RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc);
00066 NTSTRSAFEAPI RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00067 NTSTRSAFEAPI RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00068 NTSTRSAFEAPI RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy);
00069 NTSTRSAFEAPI RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy);
00070 NTSTRSAFEAPI RtlStringCopyNExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00071 NTSTRSAFEAPI RtlStringCopyNExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00072 NTSTRSAFEAPI RtlStringCatWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc);
00073 NTSTRSAFEAPI RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc);
00074 NTSTRSAFEAPI RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00075 NTSTRSAFEAPI RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00076 NTSTRSAFEAPI RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend);
00077 NTSTRSAFEAPI RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend);
00078 NTSTRSAFEAPI RtlStringCatNExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00079 NTSTRSAFEAPI RtlStringCatNExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00080 NTSTRSAFEAPI RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList);
00081 NTSTRSAFEAPI RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList);
00082 NTSTRSAFEAPI RtlStringVPrintfExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList);
00083 NTSTRSAFEAPI RtlStringVPrintfExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList);
00084 NTSTRSAFEAPI RtlStringLengthWorkerA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength);
00085 NTSTRSAFEAPI RtlStringLengthWorkerW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength);
00086 
00087 NTSTRSAFEAPI RtlStringCchCopyA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc);
00088 NTSTRSAFEAPI RtlStringCchCopyW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc);
00089 
00090 
00091 NTSTRSAFEAPI RtlStringCchCopyA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc)
00092 {
00093     return (cchDest > NTSTRSAFE_MAX_CCH ? STATUS_INVALID_PARAMETER : RtlStringCopyWorkerA(pszDest,cchDest,pszSrc));
00094 }
00095 
00096 NTSTRSAFEAPI RtlStringCchCopyW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc)
00097 {
00098     if (cchDest > NTSTRSAFE_MAX_CCH)
00099         return STATUS_INVALID_PARAMETER;
00100     return RtlStringCopyWorkerW(pszDest,cchDest,pszSrc);
00101 }
00102 
00103 
00104 NTSTRSAFEAPI RtlStringCbCopyA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc);
00105 NTSTRSAFEAPI RtlStringCbCopyW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc);
00106 
00107 
00108 NTSTRSAFEAPI RtlStringCbCopyA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc)
00109 {
00110     if (cbDest > NTSTRSAFE_MAX_CCH)
00111         return STATUS_INVALID_PARAMETER;
00112     return RtlStringCopyWorkerA(pszDest,cbDest,pszSrc);
00113 }
00114 
00115 NTSTRSAFEAPI RtlStringCbCopyW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc)
00116 {
00117     size_t cchDest = cbDest / sizeof(wchar_t);
00118     if (cchDest > NTSTRSAFE_MAX_CCH)
00119         return STATUS_INVALID_PARAMETER;
00120     return RtlStringCopyWorkerW(pszDest,cchDest,pszSrc);
00121 }
00122 
00123 
00124 NTSTRSAFEAPI RtlStringCchCopyExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00125 NTSTRSAFEAPI RtlStringCchCopyExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00126 
00127 
00128 NTSTRSAFEAPI RtlStringCchCopyExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
00129 {
00130     if (cchDest > NTSTRSAFE_MAX_CCH)
00131         return STATUS_INVALID_PARAMETER;
00132     return RtlStringCopyExWorkerA(pszDest,cchDest,cchDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags);
00133 }
00134 
00135 NTSTRSAFEAPI RtlStringCchCopyExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
00136 {
00137     size_t cbDest;
00138     if (cchDest > NTSTRSAFE_MAX_CCH)
00139         return STATUS_INVALID_PARAMETER;
00140     cbDest = cchDest * sizeof(wchar_t);
00141     return RtlStringCopyExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags);
00142 }
00143 
00144 
00145 NTSTRSAFEAPI RtlStringCbCopyExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags);
00146 NTSTRSAFEAPI RtlStringCbCopyExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags);
00147 
00148 
00149 NTSTRSAFEAPI RtlStringCbCopyExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags)
00150 {
00151     NTSTATUS Status;
00152     size_t cchRemaining = 0;
00153     if (cbDest > NTSTRSAFE_MAX_CCH)
00154         return STATUS_INVALID_PARAMETER;
00155     Status = RtlStringCopyExWorkerA(pszDest,cbDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags);
00156     if (NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW)
00157     {
00158         if (pcbRemaining)
00159             *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char));
00160     }
00161     return Status;
00162 }
00163 
00164 NTSTRSAFEAPI RtlStringCbCopyExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags)
00165 {
00166     NTSTATUS Status;
00167     size_t cchDest = cbDest / sizeof(wchar_t);
00168     size_t cchRemaining = 0;
00169 
00170     if (cchDest > NTSTRSAFE_MAX_CCH)
00171         return STATUS_INVALID_PARAMETER;
00172     Status = RtlStringCopyExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags);
00173     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
00174     {
00175         if (pcbRemaining)
00176             *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
00177     }
00178     return Status;
00179 }
00180 
00181 
00182 NTSTRSAFEAPI RtlStringCchCopyNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy);
00183 NTSTRSAFEAPI RtlStringCchCopyNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy);
00184 
00185 
00186 NTSTRSAFEAPI RtlStringCchCopyNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy)
00187 {
00188     if (cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH)
00189         return STATUS_INVALID_PARAMETER;
00190     return RtlStringCopyNWorkerA(pszDest,cchDest,pszSrc,cchToCopy);
00191 }
00192 
00193 NTSTRSAFEAPI RtlStringCchCopyNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy)
00194 {
00195     if (cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH)
00196         return STATUS_INVALID_PARAMETER;
00197     return RtlStringCopyNWorkerW(pszDest,cchDest,pszSrc,cchToCopy);
00198 }
00199 
00200 
00201 NTSTRSAFEAPI RtlStringCbCopyNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy);
00202 NTSTRSAFEAPI RtlStringCbCopyNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy);
00203 
00204 
00205 NTSTRSAFEAPI RtlStringCbCopyNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy)
00206 {
00207     if (cbDest > NTSTRSAFE_MAX_CCH || cbToCopy > NTSTRSAFE_MAX_CCH)
00208         return STATUS_INVALID_PARAMETER;
00209     return RtlStringCopyNWorkerA(pszDest,cbDest,pszSrc,cbToCopy);
00210 }
00211 
00212 NTSTRSAFEAPI RtlStringCbCopyNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy)
00213 {
00214     size_t cchDest  = cbDest / sizeof(wchar_t);
00215     size_t cchToCopy = cbToCopy / sizeof(wchar_t);
00216     if (cchDest > NTSTRSAFE_MAX_CCH || cchToCopy > NTSTRSAFE_MAX_CCH)
00217         return STATUS_INVALID_PARAMETER;
00218     return RtlStringCopyNWorkerW(pszDest,cchDest,pszSrc,cchToCopy);
00219 }
00220 
00221 
00222 NTSTRSAFEAPI RtlStringCchCopyNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00223 NTSTRSAFEAPI RtlStringCchCopyNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00224 
00225 
00226 NTSTRSAFEAPI RtlStringCchCopyNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
00227 {
00228     if (cchDest > NTSTRSAFE_MAX_CCH)
00229         return STATUS_INVALID_PARAMETER;
00230     return RtlStringCopyNExWorkerA(pszDest,cchDest,cchDest,pszSrc,cchToCopy,ppszDestEnd,pcchRemaining,dwFlags);
00231 }
00232 
00233 NTSTRSAFEAPI RtlStringCchCopyNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
00234 {
00235     if (cchDest > NTSTRSAFE_MAX_CCH)
00236         return STATUS_INVALID_PARAMETER;
00237     return RtlStringCopyNExWorkerW(pszDest,cchDest,cchDest * sizeof(wchar_t),pszSrc,cchToCopy,ppszDestEnd,pcchRemaining,dwFlags);
00238 }
00239 
00240 
00241 NTSTRSAFEAPI RtlStringCbCopyNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags);
00242 NTSTRSAFEAPI RtlStringCbCopyNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags);
00243 
00244 
00245 NTSTRSAFEAPI RtlStringCbCopyNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags)
00246 {
00247     NTSTATUS Status;
00248     size_t cchRemaining = 0;
00249     if (cbDest > NTSTRSAFE_MAX_CCH)
00250         Status = STATUS_INVALID_PARAMETER;
00251     else
00252         Status = RtlStringCopyNExWorkerA(pszDest,cbDest,cbDest,pszSrc,cbToCopy,ppszDestEnd,&cchRemaining,dwFlags);
00253     if ((NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW) && pcbRemaining)
00254         *pcbRemaining = cchRemaining;
00255     return Status;
00256 }
00257 
00258 NTSTRSAFEAPI RtlStringCbCopyNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags)
00259 {
00260     NTSTATUS Status;
00261     size_t cchDest;
00262     size_t cchToCopy;
00263     size_t cchRemaining = 0;
00264     cchDest = cbDest / sizeof(wchar_t);
00265     cchToCopy = cbToCopy / sizeof(wchar_t);
00266     if (cchDest > NTSTRSAFE_MAX_CCH)
00267         Status = STATUS_INVALID_PARAMETER;
00268     else
00269         Status = RtlStringCopyNExWorkerW(pszDest,cchDest,cbDest,pszSrc,cchToCopy,ppszDestEnd,&cchRemaining,dwFlags);
00270     if ((NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW) && pcbRemaining)
00271         *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
00272     return Status;
00273 }
00274 
00275 
00276 NTSTRSAFEAPI RtlStringCchCatA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc);
00277 NTSTRSAFEAPI RtlStringCchCatW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc);
00278 
00279 
00280 NTSTRSAFEAPI RtlStringCchCatA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc)
00281 {
00282     if (cchDest > NTSTRSAFE_MAX_CCH)
00283         return STATUS_INVALID_PARAMETER;
00284     return RtlStringCatWorkerA(pszDest,cchDest,pszSrc);
00285 }
00286 
00287 NTSTRSAFEAPI RtlStringCchCatW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc)
00288 {
00289     if (cchDest > NTSTRSAFE_MAX_CCH)
00290         return STATUS_INVALID_PARAMETER;
00291     return RtlStringCatWorkerW(pszDest,cchDest,pszSrc);
00292 }
00293 
00294 
00295 NTSTRSAFEAPI RtlStringCbCatA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc);
00296 NTSTRSAFEAPI RtlStringCbCatW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc);
00297 
00298 
00299 NTSTRSAFEAPI RtlStringCbCatA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc)
00300 {
00301     if (cbDest > NTSTRSAFE_MAX_CCH)
00302         return STATUS_INVALID_PARAMETER;
00303     return RtlStringCatWorkerA(pszDest,cbDest,pszSrc);
00304 }
00305 
00306 NTSTRSAFEAPI RtlStringCbCatW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc)
00307 {
00308     size_t cchDest = cbDest / sizeof(wchar_t);
00309     if (cchDest > NTSTRSAFE_MAX_CCH)
00310         return STATUS_INVALID_PARAMETER;
00311     return RtlStringCatWorkerW(pszDest,cchDest,pszSrc);
00312 }
00313 
00314 
00315 NTSTRSAFEAPI RtlStringCchCatExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00316 NTSTRSAFEAPI RtlStringCchCatExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00317 
00318 
00319 NTSTRSAFEAPI RtlStringCchCatExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
00320 {
00321     if (cchDest > NTSTRSAFE_MAX_CCH)
00322         return STATUS_INVALID_PARAMETER;
00323     return RtlStringCatExWorkerA(pszDest,cchDest,cchDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags);
00324 }
00325 
00326 NTSTRSAFEAPI RtlStringCchCatExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
00327 {
00328     size_t cbDest = cchDest*sizeof(wchar_t);
00329     if (cchDest > NTSTRSAFE_MAX_CCH)
00330         return STATUS_INVALID_PARAMETER;
00331     return RtlStringCatExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,pcchRemaining,dwFlags);
00332 }
00333 
00334 
00335 NTSTRSAFEAPI RtlStringCbCatExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags);
00336 NTSTRSAFEAPI RtlStringCbCatExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags);
00337 
00338 
00339 NTSTRSAFEAPI RtlStringCbCatExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags)
00340 {
00341     NTSTATUS Status;
00342     size_t cchRemaining = 0;
00343     if (cbDest > NTSTRSAFE_MAX_CCH)
00344         Status = STATUS_INVALID_PARAMETER;
00345     else
00346         Status = RtlStringCatExWorkerA(pszDest,cbDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags);
00347     if ((NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW) && pcbRemaining)
00348         *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char));
00349     return Status;
00350 }
00351 
00352 NTSTRSAFEAPI RtlStringCbCatExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags)
00353 {
00354     NTSTATUS Status;
00355     size_t cchDest = cbDest / sizeof(wchar_t);
00356     size_t cchRemaining = 0;
00357 
00358     if (cchDest > NTSTRSAFE_MAX_CCH)
00359         Status = STATUS_INVALID_PARAMETER;
00360     else
00361         Status = RtlStringCatExWorkerW(pszDest,cchDest,cbDest,pszSrc,ppszDestEnd,&cchRemaining,dwFlags);
00362     if ((NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW) && pcbRemaining)
00363         *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
00364     return Status;
00365 }
00366 
00367 
00368 NTSTRSAFEAPI RtlStringCchCatNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend);
00369 NTSTRSAFEAPI RtlStringCchCatNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend);
00370 
00371 
00372 NTSTRSAFEAPI RtlStringCchCatNA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend)
00373 {
00374     if (cchDest > NTSTRSAFE_MAX_CCH)
00375         return STATUS_INVALID_PARAMETER;
00376     return RtlStringCatNWorkerA(pszDest,cchDest,pszSrc,cchToAppend);
00377 }
00378 
00379 NTSTRSAFEAPI RtlStringCchCatNW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend)
00380 {
00381     if (cchDest > NTSTRSAFE_MAX_CCH)
00382         return STATUS_INVALID_PARAMETER;
00383     return RtlStringCatNWorkerW(pszDest,cchDest,pszSrc,cchToAppend);
00384 }
00385 
00386 
00387 NTSTRSAFEAPI RtlStringCbCatNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend);
00388 NTSTRSAFEAPI RtlStringCbCatNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend);
00389 
00390 
00391 NTSTRSAFEAPI RtlStringCbCatNA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend)
00392 {
00393     if (cbDest > NTSTRSAFE_MAX_CCH)
00394         return STATUS_INVALID_PARAMETER;
00395     return RtlStringCatNWorkerA(pszDest,cbDest,pszSrc,cbToAppend);
00396 }
00397 
00398 NTSTRSAFEAPI RtlStringCbCatNW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend)
00399 {
00400     size_t cchDest = cbDest / sizeof(wchar_t);
00401     size_t cchToAppend = cbToAppend / sizeof(wchar_t);
00402 
00403     if (cchDest > NTSTRSAFE_MAX_CCH)
00404         return STATUS_INVALID_PARAMETER;
00405     return RtlStringCatNWorkerW(pszDest,cchDest,pszSrc,cchToAppend);
00406 }
00407 
00408 
00409 NTSTRSAFEAPI RtlStringCchCatNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00410 NTSTRSAFEAPI RtlStringCchCatNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags);
00411 
00412 
00413 NTSTRSAFEAPI RtlStringCchCatNExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
00414 {
00415     if (cchDest > NTSTRSAFE_MAX_CCH)
00416         return STATUS_INVALID_PARAMETER;
00417     return RtlStringCatNExWorkerA(pszDest,cchDest,cchDest,pszSrc,cchToAppend,ppszDestEnd,pcchRemaining,dwFlags);
00418 }
00419 
00420 NTSTRSAFEAPI RtlStringCchCatNExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
00421 {
00422     if (cchDest > NTSTRSAFE_MAX_CCH)
00423         return STATUS_INVALID_PARAMETER;
00424     return RtlStringCatNExWorkerW(pszDest,cchDest,(cchDest*sizeof(wchar_t)),pszSrc,cchToAppend,ppszDestEnd,pcchRemaining,dwFlags);
00425 }
00426 
00427 
00428 NTSTRSAFEAPI RtlStringCbCatNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags);
00429 NTSTRSAFEAPI RtlStringCbCatNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags);
00430 
00431 
00432 NTSTRSAFEAPI RtlStringCbCatNExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cbToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags)
00433 {
00434     NTSTATUS Status;
00435     size_t cchRemaining = 0;
00436     if (cbDest > NTSTRSAFE_MAX_CCH)
00437         Status = STATUS_INVALID_PARAMETER;
00438     else
00439         Status = RtlStringCatNExWorkerA(pszDest,cbDest,cbDest,pszSrc,cbToAppend,ppszDestEnd,&cchRemaining,dwFlags);
00440     if ((NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW) && pcbRemaining)
00441         *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char));
00442     return Status;
00443 }
00444 
00445 NTSTRSAFEAPI RtlStringCbCatNExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cbToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags)
00446 {
00447     NTSTATUS Status;
00448     size_t cchDest = cbDest / sizeof(wchar_t);
00449     size_t cchToAppend = cbToAppend / sizeof(wchar_t);
00450     size_t cchRemaining = 0;
00451     if (cchDest > NTSTRSAFE_MAX_CCH)
00452         Status = STATUS_INVALID_PARAMETER;
00453     else
00454         Status = RtlStringCatNExWorkerW(pszDest,cchDest,cbDest,pszSrc,cchToAppend,ppszDestEnd,&cchRemaining,dwFlags);
00455     if ((NT_SUCCESS(Status) || Status == STATUS_BUFFER_OVERFLOW) && pcbRemaining)
00456         *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
00457     return Status;
00458 }
00459 
00460 
00461 NTSTRSAFEAPI RtlStringCchVPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList);
00462 NTSTRSAFEAPI RtlStringCchVPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList);
00463 
00464 
00465 NTSTRSAFEAPI RtlStringCchVPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList)
00466 {
00467     if (cchDest > NTSTRSAFE_MAX_CCH)
00468         return STATUS_INVALID_PARAMETER;
00469     return RtlStringVPrintfWorkerA(pszDest,cchDest,pszFormat,argList);
00470 }
00471 
00472 NTSTRSAFEAPI RtlStringCchVPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList)
00473 {
00474     if (cchDest > NTSTRSAFE_MAX_CCH)
00475         return STATUS_INVALID_PARAMETER;
00476     return RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList);
00477 }
00478 
00479 
00480 NTSTRSAFEAPI RtlStringCbVPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,va_list argList);
00481 NTSTRSAFEAPI RtlStringCbVPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,va_list argList);
00482 
00483 
00484 NTSTRSAFEAPI RtlStringCbVPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,va_list argList)
00485 {
00486     if (cbDest > NTSTRSAFE_MAX_CCH)
00487         return STATUS_INVALID_PARAMETER;
00488     return RtlStringVPrintfWorkerA(pszDest,cbDest,pszFormat,argList);
00489 }
00490 
00491 NTSTRSAFEAPI RtlStringCbVPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,va_list argList)
00492 {
00493     size_t cchDest = cbDest / sizeof(wchar_t);
00494     if (cchDest > NTSTRSAFE_MAX_CCH)
00495         return STATUS_INVALID_PARAMETER;
00496     return RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList);
00497 }
00498 
00499 
00500 NTSTRSAFEAPI RtlStringCchPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,...);
00501 NTSTRSAFEAPI RtlStringCchPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,...);
00502 
00503 
00504 NTSTRSAFEAPI RtlStringCchPrintfA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,...)
00505 {
00506     NTSTATUS Status;
00507     va_list argList;
00508     if (cchDest > NTSTRSAFE_MAX_CCH)
00509         return STATUS_INVALID_PARAMETER;
00510     va_start(argList,pszFormat);
00511     Status = RtlStringVPrintfWorkerA(pszDest,cchDest,pszFormat,argList);
00512     va_end(argList);
00513     return Status;
00514 }
00515 
00516 NTSTRSAFEAPI RtlStringCchPrintfW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,...)
00517 {
00518     NTSTATUS Status;
00519     va_list argList;
00520     if (cchDest > NTSTRSAFE_MAX_CCH)
00521         return STATUS_INVALID_PARAMETER;
00522     va_start(argList,pszFormat);
00523     Status = RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList);
00524     va_end(argList);
00525     return Status;
00526 }
00527 
00528 
00529 NTSTRSAFEAPI RtlStringCbPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,...);
00530 NTSTRSAFEAPI RtlStringCbPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,...);
00531 
00532 
00533 NTSTRSAFEAPI RtlStringCbPrintfA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPCSTR pszFormat,...)
00534 {
00535     NTSTATUS Status;
00536     va_list argList;
00537     if (cbDest > NTSTRSAFE_MAX_CCH)
00538         return STATUS_INVALID_PARAMETER;
00539     va_start(argList,pszFormat);
00540     Status = RtlStringVPrintfWorkerA(pszDest,cbDest,pszFormat,argList);
00541     va_end(argList);
00542     return Status;
00543 }
00544 
00545 NTSTRSAFEAPI RtlStringCbPrintfW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPCWSTR pszFormat,...)
00546 {
00547     NTSTATUS Status;
00548     va_list argList;
00549     size_t cchDest = cbDest / sizeof(wchar_t);
00550     if (cchDest > NTSTRSAFE_MAX_CCH)
00551         return STATUS_INVALID_PARAMETER;
00552     va_start(argList,pszFormat);
00553     Status = RtlStringVPrintfWorkerW(pszDest,cchDest,pszFormat,argList);
00554     va_end(argList);
00555     return Status;
00556 }
00557 
00558 
00559 NTSTRSAFEAPI RtlStringCchPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,...);
00560 NTSTRSAFEAPI RtlStringCchPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,...);
00561 
00562 
00563 NTSTRSAFEAPI RtlStringCchPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,...)
00564 {
00565     NTSTATUS Status;
00566     va_list argList;
00567     if (cchDest > NTSTRSAFE_MAX_CCH)
00568         return STATUS_INVALID_PARAMETER;
00569     va_start(argList,pszFormat);
00570     Status = RtlStringVPrintfExWorkerA(pszDest,cchDest,cchDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList);
00571     va_end(argList);
00572     return Status;
00573 }
00574 
00575 NTSTRSAFEAPI RtlStringCchPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,...)
00576 {
00577     NTSTATUS Status;
00578     size_t cbDest = cchDest * sizeof(wchar_t);
00579     va_list argList;
00580     if (cchDest > NTSTRSAFE_MAX_CCH)
00581         return STATUS_INVALID_PARAMETER;
00582     va_start(argList,pszFormat);
00583     Status = RtlStringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList);
00584     va_end(argList);
00585     return Status;
00586 }
00587 
00588 
00589 NTSTRSAFEAPI RtlStringCbPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,...);
00590 NTSTRSAFEAPI RtlStringCbPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,...);
00591 
00592 
00593 NTSTRSAFEAPI RtlStringCbPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,...)
00594 {
00595     NTSTATUS Status;
00596     size_t cchDest;
00597     size_t cchRemaining = 0;
00598     cchDest = cbDest / sizeof(char);
00599     if (cchDest > NTSTRSAFE_MAX_CCH)
00600         Status = STATUS_INVALID_PARAMETER;
00601     else
00602     {
00603         va_list argList;
00604         va_start(argList,pszFormat);
00605         Status = RtlStringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList);
00606         va_end(argList);
00607     }
00608     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
00609     {
00610         if (pcbRemaining)
00611         {
00612             *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char));
00613         }
00614     }
00615     return Status;
00616 }
00617 
00618 NTSTRSAFEAPI RtlStringCbPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,...)
00619 {
00620     NTSTATUS Status;
00621     size_t cchDest;
00622     size_t cchRemaining = 0;
00623     cchDest = cbDest / sizeof(wchar_t);
00624     if (cchDest > NTSTRSAFE_MAX_CCH)
00625         Status = STATUS_INVALID_PARAMETER;
00626     else
00627     {
00628         va_list argList;
00629         va_start(argList,pszFormat);
00630         Status = RtlStringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList);
00631         va_end(argList);
00632     }
00633     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
00634     {
00635         if (pcbRemaining)
00636         {
00637             *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
00638         }
00639     }
00640     return Status;
00641 }
00642 
00643 
00644 NTSTRSAFEAPI RtlStringCchVPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList);
00645 NTSTRSAFEAPI RtlStringCchVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList);
00646 
00647 
00648 NTSTRSAFEAPI RtlStringCchVPrintfExA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList)
00649 {
00650     NTSTATUS Status;
00651     if (cchDest > NTSTRSAFE_MAX_CCH)
00652         Status = STATUS_INVALID_PARAMETER;
00653     else
00654     {
00655         size_t cbDest;
00656         cbDest = cchDest*sizeof(char);
00657         Status = RtlStringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList);
00658     }
00659     return Status;
00660 }
00661 
00662 NTSTRSAFEAPI RtlStringCchVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList)
00663 {
00664     NTSTATUS Status;
00665     if (cchDest > NTSTRSAFE_MAX_CCH)
00666         Status = STATUS_INVALID_PARAMETER;
00667     else
00668     {
00669         size_t cbDest;
00670         cbDest = cchDest*sizeof(wchar_t);
00671         Status = RtlStringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,pcchRemaining,dwFlags,pszFormat,argList);
00672     }
00673     return Status;
00674 }
00675 
00676 
00677 NTSTRSAFEAPI RtlStringCbVPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList);
00678 NTSTRSAFEAPI RtlStringCbVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList);
00679 
00680 
00681 NTSTRSAFEAPI RtlStringCbVPrintfExA(STRSAFE_LPSTR pszDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList)
00682 {
00683     NTSTATUS Status;
00684     size_t cchDest;
00685     size_t cchRemaining = 0;
00686     cchDest = cbDest / sizeof(char);
00687     if (cchDest > NTSTRSAFE_MAX_CCH)
00688         Status = STATUS_INVALID_PARAMETER;
00689     else
00690         Status = RtlStringVPrintfExWorkerA(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList);
00691     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
00692     {
00693         if (pcbRemaining)
00694         {
00695             *pcbRemaining = (cchRemaining*sizeof(char)) + (cbDest % sizeof(char));
00696         }
00697     }
00698     return Status;
00699 }
00700 
00701 NTSTRSAFEAPI RtlStringCbVPrintfExW(STRSAFE_LPWSTR pszDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcbRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList)
00702 {
00703     NTSTATUS Status;
00704     size_t cchDest;
00705     size_t cchRemaining = 0;
00706     cchDest = cbDest / sizeof(wchar_t);
00707     if (cchDest > NTSTRSAFE_MAX_CCH)
00708         Status = STATUS_INVALID_PARAMETER;
00709     else
00710         Status = RtlStringVPrintfExWorkerW(pszDest,cchDest,cbDest,ppszDestEnd,&cchRemaining,dwFlags,pszFormat,argList);
00711     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
00712     {
00713         if (pcbRemaining)
00714         {
00715             *pcbRemaining = (cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t));
00716         }
00717     }
00718     return Status;
00719 }
00720 
00721 
00722 NTSTRSAFEAPI RtlStringCchLengthA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength);
00723 NTSTRSAFEAPI RtlStringCchLengthW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength);
00724 
00725 
00726 NTSTRSAFEAPI RtlStringCchLengthA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength)
00727 {
00728     NTSTATUS Status;
00729     if (!psz || (cchMax > NTSTRSAFE_MAX_CCH))
00730         Status = STATUS_INVALID_PARAMETER;
00731     else
00732         Status = RtlStringLengthWorkerA(psz,cchMax,pcchLength);
00733     if (!NT_SUCCESS(Status) && pcchLength)
00734     {
00735         *pcchLength = 0;
00736     }
00737     return Status;
00738 }
00739 
00740 NTSTRSAFEAPI RtlStringCchLengthW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength)
00741 {
00742     NTSTATUS Status;
00743     if (!psz || (cchMax > NTSTRSAFE_MAX_CCH))
00744         Status = STATUS_INVALID_PARAMETER;
00745     else
00746         Status = RtlStringLengthWorkerW(psz,cchMax,pcchLength);
00747     if (!NT_SUCCESS(Status) && pcchLength)
00748     {
00749         *pcchLength = 0;
00750     }
00751     return Status;
00752 }
00753 
00754 
00755 NTSTRSAFEAPI RtlStringCbLengthA(STRSAFE_LPCSTR psz,size_t cbMax,size_t *pcbLength);
00756 NTSTRSAFEAPI RtlStringCbLengthW(STRSAFE_LPCWSTR psz,size_t cbMax,size_t *pcbLength);
00757 
00758 
00759 NTSTRSAFEAPI RtlStringCbLengthA(STRSAFE_LPCSTR psz,size_t cbMax,size_t *pcbLength)
00760 {
00761     NTSTATUS Status;
00762     size_t cchMax;
00763     size_t cchLength = 0;
00764     cchMax = cbMax / sizeof(char);
00765     if (!psz || (cchMax > NTSTRSAFE_MAX_CCH))
00766         Status = STATUS_INVALID_PARAMETER;
00767     else
00768         Status = RtlStringLengthWorkerA(psz,cchMax,&cchLength);
00769     if (pcbLength)
00770     {
00771         if (NT_SUCCESS(Status))
00772         {
00773             *pcbLength = cchLength*sizeof(char);
00774         }
00775         else
00776         {
00777             *pcbLength = 0;
00778         }
00779     }
00780     return Status;
00781 }
00782 
00783 NTSTRSAFEAPI RtlStringCbLengthW(STRSAFE_LPCWSTR psz,size_t cbMax,size_t *pcbLength)
00784 {
00785     NTSTATUS Status;
00786     size_t cchMax;
00787     size_t cchLength = 0;
00788     cchMax = cbMax / sizeof(wchar_t);
00789     if (!psz || (cchMax > NTSTRSAFE_MAX_CCH))
00790         Status = STATUS_INVALID_PARAMETER;
00791     else
00792         Status = RtlStringLengthWorkerW(psz,cchMax,&cchLength);
00793     if (pcbLength)
00794     {
00795         if (NT_SUCCESS(Status))
00796         {
00797             *pcbLength = cchLength*sizeof(wchar_t);
00798         }
00799         else
00800         {
00801             *pcbLength = 0;
00802         }
00803     }
00804     return Status;
00805 }
00806 
00807 NTSTRSAFEAPI RtlStringCopyWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc)
00808 {
00809     NTSTATUS Status = STATUS_SUCCESS;
00810     if (cchDest==0)
00811         Status = STATUS_INVALID_PARAMETER;
00812     else
00813     {
00814         while(cchDest && (*pszSrc!='\0'))
00815         {
00816             *pszDest++ = *pszSrc++;
00817             cchDest--;
00818         }
00819         if (cchDest==0)
00820         {
00821             pszDest--;
00822             Status = STATUS_BUFFER_OVERFLOW;
00823         }
00824         *pszDest= '\0';
00825     }
00826     return Status;
00827 }
00828 
00829 NTSTRSAFEAPI RtlStringCopyWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc)
00830 {
00831     NTSTATUS Status = STATUS_SUCCESS;
00832     if (cchDest==0)
00833         Status = STATUS_INVALID_PARAMETER;
00834     else
00835     {
00836         while(cchDest && (*pszSrc!=L'\0'))
00837         {
00838             *pszDest++ = *pszSrc++;
00839             cchDest--;
00840         }
00841         if (cchDest==0)
00842         {
00843             pszDest--;
00844             Status = STATUS_BUFFER_OVERFLOW;
00845         }
00846         *pszDest= L'\0';
00847     }
00848     return Status;
00849 }
00850 
00851 NTSTRSAFEAPI RtlStringCopyExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
00852 {
00853     NTSTATUS Status = STATUS_SUCCESS;
00854     STRSAFE_LPSTR pszDestEnd = pszDest;
00855     size_t cchRemaining = 0;
00856     if (dwFlags & (~STRSAFE_VALID_FLAGS))
00857         Status = STATUS_INVALID_PARAMETER;
00858     else
00859     {
00860         if (dwFlags & STRSAFE_IGNORE_NULLS)
00861         {
00862             if (!pszDest)
00863             {
00864                 if ((cchDest!=0) || (cbDest!=0))
00865                     Status = STATUS_INVALID_PARAMETER;
00866             }
00867             if (!pszSrc)
00868                 pszSrc = "";
00869         }
00870         if (NT_SUCCESS(Status))
00871         {
00872             if (cchDest==0)
00873             {
00874                 pszDestEnd = pszDest;
00875                 cchRemaining = 0;
00876                 if (*pszSrc!='\0')
00877                 {
00878                     if (!pszDest)
00879                         Status = STATUS_INVALID_PARAMETER;
00880                     else
00881                         Status = STATUS_BUFFER_OVERFLOW;
00882                 }
00883             }
00884             else
00885             {
00886                 pszDestEnd = pszDest;
00887                 cchRemaining = cchDest;
00888                 while(cchRemaining && (*pszSrc!='\0'))
00889                 {
00890                     *pszDestEnd++ = *pszSrc++;
00891                     cchRemaining--;
00892                 }
00893                 if (cchRemaining > 0)
00894                 {
00895                     if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
00896                     {
00897                         memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(char)) + (cbDest % sizeof(char)));
00898                     }
00899                 }
00900                 else
00901                 {
00902                     pszDestEnd--;
00903                     cchRemaining++;
00904                     Status = STATUS_BUFFER_OVERFLOW;
00905                 }
00906                 *pszDestEnd = '\0';
00907             }
00908         }
00909     }
00910     if (!NT_SUCCESS(Status))
00911     {
00912         if (pszDest)
00913         {
00914             if (dwFlags & STRSAFE_FILL_ON_FAILURE)
00915             {
00916                 memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
00917                 if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
00918                 {
00919                     pszDestEnd = pszDest;
00920                     cchRemaining = cchDest;
00921                 }
00922                 else
00923                     if (cchDest > 0)
00924                     {
00925                         pszDestEnd = pszDest + cchDest - 1;
00926                         cchRemaining = 1;
00927                         *pszDestEnd = '\0';
00928                     }
00929             }
00930             if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
00931             {
00932                 if (cchDest > 0)
00933                 {
00934                     pszDestEnd = pszDest;
00935                     cchRemaining = cchDest;
00936                     *pszDestEnd = '\0';
00937                 }
00938             }
00939         }
00940     }
00941     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
00942     {
00943         if (ppszDestEnd)
00944             *ppszDestEnd = pszDestEnd;
00945         if (pcchRemaining)
00946             *pcchRemaining = cchRemaining;
00947     }
00948     return Status;
00949 }
00950 
00951 NTSTRSAFEAPI RtlStringCopyExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
00952 {
00953     NTSTATUS Status = STATUS_SUCCESS;
00954     STRSAFE_LPWSTR pszDestEnd = pszDest;
00955     size_t cchRemaining = 0;
00956     if (dwFlags & (~STRSAFE_VALID_FLAGS))
00957         Status = STATUS_INVALID_PARAMETER;
00958     else
00959     {
00960         if (dwFlags & STRSAFE_IGNORE_NULLS)
00961         {
00962             if (!pszDest)
00963             {
00964                 if ((cchDest!=0) || (cbDest!=0))
00965                     Status = STATUS_INVALID_PARAMETER;
00966             }
00967             if (!pszSrc)
00968                 pszSrc = L"";
00969         }
00970         if (NT_SUCCESS(Status))
00971         {
00972             if (cchDest==0)
00973             {
00974                 pszDestEnd = pszDest;
00975                 cchRemaining = 0;
00976                 if (*pszSrc!=L'\0')
00977                 {
00978                     if (!pszDest)
00979                         Status = STATUS_INVALID_PARAMETER;
00980                     else
00981                         Status = STATUS_BUFFER_OVERFLOW;
00982                 }
00983             }
00984             else
00985             {
00986                 pszDestEnd = pszDest;
00987                 cchRemaining = cchDest;
00988                 while(cchRemaining && (*pszSrc!=L'\0'))
00989                 {
00990                     *pszDestEnd++ = *pszSrc++;
00991                     cchRemaining--;
00992                 }
00993                 if (cchRemaining > 0)
00994                 {
00995                     if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
00996                     {
00997                         memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
00998                     }
00999                 }
01000                 else
01001                 {
01002                     pszDestEnd--;
01003                     cchRemaining++;
01004                     Status = STATUS_BUFFER_OVERFLOW;
01005                 }
01006                 *pszDestEnd = L'\0';
01007             }
01008         }
01009     }
01010     if (!NT_SUCCESS(Status))
01011     {
01012         if (pszDest)
01013         {
01014             if (dwFlags & STRSAFE_FILL_ON_FAILURE)
01015             {
01016                 memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
01017                 if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
01018                 {
01019                     pszDestEnd = pszDest;
01020                     cchRemaining = cchDest;
01021                 }
01022                 else
01023                     if (cchDest > 0)
01024                     {
01025                         pszDestEnd = pszDest + cchDest - 1;
01026                         cchRemaining = 1;
01027                         *pszDestEnd = L'\0';
01028                     }
01029             }
01030             if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
01031             {
01032                 if (cchDest > 0)
01033                 {
01034                     pszDestEnd = pszDest;
01035                     cchRemaining = cchDest;
01036                     *pszDestEnd = L'\0';
01037                 }
01038             }
01039         }
01040     }
01041     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
01042     {
01043         if (ppszDestEnd)
01044             *ppszDestEnd = pszDestEnd;
01045         if (pcchRemaining)
01046             *pcchRemaining = cchRemaining;
01047     }
01048     return Status;
01049 }
01050 
01051 NTSTRSAFEAPI RtlStringCopyNWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchSrc)
01052 {
01053     NTSTATUS Status = STATUS_SUCCESS;
01054     if (cchDest==0)
01055         Status = STATUS_INVALID_PARAMETER;
01056     else
01057     {
01058         while(cchDest && cchSrc && (*pszSrc!='\0'))
01059         {
01060             *pszDest++ = *pszSrc++;
01061             cchDest--;
01062             cchSrc--;
01063         }
01064         if (cchDest==0)
01065         {
01066             pszDest--;
01067             Status = STATUS_BUFFER_OVERFLOW;
01068         }
01069         *pszDest= '\0';
01070     }
01071     return Status;
01072 }
01073 
01074 NTSTRSAFEAPI RtlStringCopyNWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy)
01075 {
01076     NTSTATUS Status = STATUS_SUCCESS;
01077     if (cchDest==0)
01078         Status = STATUS_INVALID_PARAMETER;
01079     else
01080     {
01081         while(cchDest && cchToCopy && (*pszSrc!=L'\0'))
01082         {
01083             *pszDest++ = *pszSrc++;
01084             cchDest--;
01085             cchToCopy--;
01086         }
01087         if (cchDest==0)
01088         {
01089             pszDest--;
01090             Status = STATUS_BUFFER_OVERFLOW;
01091         }
01092         *pszDest= L'\0';
01093     }
01094     return Status;
01095 }
01096 
01097 NTSTRSAFEAPI RtlStringCopyNExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cchToCopy,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
01098 {
01099     NTSTATUS Status = STATUS_SUCCESS;
01100     STRSAFE_LPSTR pszDestEnd = pszDest;
01101     size_t cchRemaining = 0;
01102     if (dwFlags & (~STRSAFE_VALID_FLAGS))
01103         Status = STATUS_INVALID_PARAMETER;
01104     else
01105         if (cchToCopy > NTSTRSAFE_MAX_CCH)
01106             Status = STATUS_INVALID_PARAMETER;
01107         else
01108         {
01109             if (dwFlags & STRSAFE_IGNORE_NULLS)
01110             {
01111                 if (!pszDest)
01112                 {
01113                     if ((cchDest!=0) || (cbDest!=0))
01114                         Status = STATUS_INVALID_PARAMETER;
01115                 }
01116                 if (!pszSrc)
01117                     pszSrc = "";
01118             }
01119             if (NT_SUCCESS(Status))
01120             {
01121                 if (cchDest==0)
01122                 {
01123                     pszDestEnd = pszDest;
01124                     cchRemaining = 0;
01125                     if ((cchToCopy!=0) && (*pszSrc!='\0'))
01126                     {
01127                         if (!pszDest)
01128                             Status = STATUS_INVALID_PARAMETER;
01129                         else
01130                             Status = STATUS_BUFFER_OVERFLOW;
01131                     }
01132                 }
01133                 else
01134                 {
01135                     pszDestEnd = pszDest;
01136                     cchRemaining = cchDest;
01137                     while(cchRemaining && cchToCopy && (*pszSrc!='\0'))
01138                     {
01139                         *pszDestEnd++ = *pszSrc++;
01140                         cchRemaining--;
01141                         cchToCopy--;
01142                     }
01143                     if (cchRemaining > 0)
01144                     {
01145                         if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
01146                         {
01147                             memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(char)) + (cbDest % sizeof(char)));
01148                         }
01149                     }
01150                     else
01151                     {
01152                         pszDestEnd--;
01153                         cchRemaining++;
01154                         Status = STATUS_BUFFER_OVERFLOW;
01155                     }
01156                     *pszDestEnd = '\0';
01157                 }
01158             }
01159         }
01160     if (!NT_SUCCESS(Status))
01161     {
01162         if (pszDest)
01163         {
01164             if (dwFlags & STRSAFE_FILL_ON_FAILURE)
01165             {
01166                 memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
01167                 if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
01168                 {
01169                     pszDestEnd = pszDest;
01170                     cchRemaining = cchDest;
01171                 }
01172                 else
01173                     if (cchDest > 0)
01174                     {
01175                         pszDestEnd = pszDest + cchDest - 1;
01176                         cchRemaining = 1;
01177                         *pszDestEnd = '\0';
01178                     }
01179             }
01180             if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
01181             {
01182                 if (cchDest > 0)
01183                 {
01184                     pszDestEnd = pszDest;
01185                     cchRemaining = cchDest;
01186                     *pszDestEnd = '\0';
01187                 }
01188             }
01189         }
01190     }
01191     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
01192     {
01193         if (ppszDestEnd)
01194             *ppszDestEnd = pszDestEnd;
01195         if (pcchRemaining)
01196             *pcchRemaining = cchRemaining;
01197     }
01198     return Status;
01199 }
01200 
01201 NTSTRSAFEAPI RtlStringCopyNExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cchToCopy,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
01202 {
01203     NTSTATUS Status = STATUS_SUCCESS;
01204     STRSAFE_LPWSTR pszDestEnd = pszDest;
01205     size_t cchRemaining = 0;
01206     if (dwFlags & (~STRSAFE_VALID_FLAGS))
01207         Status = STATUS_INVALID_PARAMETER;
01208     else
01209         if (cchToCopy > NTSTRSAFE_MAX_CCH)
01210             Status = STATUS_INVALID_PARAMETER;
01211         else
01212         {
01213             if (dwFlags & STRSAFE_IGNORE_NULLS)
01214             {
01215                 if (!pszDest)
01216                 {
01217                     if ((cchDest!=0) || (cbDest!=0))
01218                         Status = STATUS_INVALID_PARAMETER;
01219                 }
01220                 if (!pszSrc)
01221                     pszSrc = L"";
01222             }
01223             if (NT_SUCCESS(Status))
01224             {
01225                 if (cchDest==0)
01226                 {
01227                     pszDestEnd = pszDest;
01228                     cchRemaining = 0;
01229                     if ((cchToCopy!=0) && (*pszSrc!=L'\0'))
01230                     {
01231                         if (!pszDest)
01232                             Status = STATUS_INVALID_PARAMETER;
01233                         else
01234                             Status = STATUS_BUFFER_OVERFLOW;
01235                     }
01236                 }
01237                 else
01238                 {
01239                     pszDestEnd = pszDest;
01240                     cchRemaining = cchDest;
01241                     while(cchRemaining && cchToCopy && (*pszSrc!=L'\0'))
01242                     {
01243                         *pszDestEnd++ = *pszSrc++;
01244                         cchRemaining--;
01245                         cchToCopy--;
01246                     }
01247                     if (cchRemaining > 0)
01248                     {
01249                         if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
01250                         {
01251                             memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
01252                         }
01253                     }
01254                     else
01255                     {
01256                         pszDestEnd--;
01257                         cchRemaining++;
01258                         Status = STATUS_BUFFER_OVERFLOW;
01259                     }
01260                     *pszDestEnd = L'\0';
01261                 }
01262             }
01263         }
01264     if (!NT_SUCCESS(Status))
01265     {
01266         if (pszDest)
01267         {
01268             if (dwFlags & STRSAFE_FILL_ON_FAILURE)
01269             {
01270                 memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
01271                 if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
01272                 {
01273                     pszDestEnd = pszDest;
01274                     cchRemaining = cchDest;
01275                 }
01276                 else
01277                     if (cchDest > 0)
01278                     {
01279                         pszDestEnd = pszDest + cchDest - 1;
01280                         cchRemaining = 1;
01281                         *pszDestEnd = L'\0';
01282                     }
01283             }
01284             if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
01285             {
01286                 if (cchDest > 0)
01287                 {
01288                     pszDestEnd = pszDest;
01289                     cchRemaining = cchDest;
01290                     *pszDestEnd = L'\0';
01291                 }
01292             }
01293         }
01294     }
01295     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
01296     {
01297         if (ppszDestEnd)
01298             *ppszDestEnd = pszDestEnd;
01299         if (pcchRemaining)
01300             *pcchRemaining = cchRemaining;
01301     }
01302     return Status;
01303 }
01304 
01305 NTSTRSAFEAPI RtlStringCatWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc)
01306 {
01307     NTSTATUS Status;
01308     size_t cchDestLength;
01309     Status = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength);
01310     if (NT_SUCCESS(Status))
01311         Status = RtlStringCopyWorkerA(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc);
01312     return Status;
01313 }
01314 
01315 NTSTRSAFEAPI RtlStringCatWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc)
01316 {
01317     NTSTATUS Status;
01318     size_t cchDestLength;
01319     Status = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength);
01320     if (NT_SUCCESS(Status))
01321         Status = RtlStringCopyWorkerW(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc);
01322     return Status;
01323 }
01324 
01325 NTSTRSAFEAPI RtlStringCatExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
01326 {
01327     NTSTATUS Status = STATUS_SUCCESS;
01328     STRSAFE_LPSTR pszDestEnd = pszDest;
01329     size_t cchRemaining = 0;
01330     if (dwFlags & (~STRSAFE_VALID_FLAGS))
01331         Status = STATUS_INVALID_PARAMETER;
01332     else
01333     {
01334         size_t cchDestLength;
01335         if (dwFlags & STRSAFE_IGNORE_NULLS)
01336         {
01337             if (!pszDest)
01338             {
01339                 if ((cchDest==0) && (cbDest==0))
01340                     cchDestLength = 0;
01341                 else
01342                     Status = STATUS_INVALID_PARAMETER;
01343             }
01344             else
01345             {
01346                 Status = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength);
01347                 if (NT_SUCCESS(Status))
01348                 {
01349                     pszDestEnd = pszDest + cchDestLength;
01350                     cchRemaining = cchDest - cchDestLength;
01351                 }
01352             }
01353             if (!pszSrc)
01354                 pszSrc = "";
01355         }
01356         else
01357         {
01358             Status = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength);
01359             if (NT_SUCCESS(Status))
01360             {
01361                 pszDestEnd = pszDest + cchDestLength;
01362                 cchRemaining = cchDest - cchDestLength;
01363             }
01364         }
01365         if (NT_SUCCESS(Status))
01366         {
01367             if (cchDest==0)
01368             {
01369                 if (*pszSrc!='\0')
01370                 {
01371                     if (!pszDest)
01372                         Status = STATUS_INVALID_PARAMETER;
01373                     else
01374                         Status = STATUS_BUFFER_OVERFLOW;
01375                 }
01376             }
01377             else
01378                 Status = RtlStringCopyExWorkerA(pszDestEnd,cchRemaining,(cchRemaining*sizeof(char)) + (cbDest % sizeof(char)),pszSrc,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)));
01379         }
01380     }
01381     if (!NT_SUCCESS(Status))
01382     {
01383         if (pszDest)
01384         {
01385             if (dwFlags & STRSAFE_FILL_ON_FAILURE)
01386             {
01387                 memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
01388                 if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
01389                 {
01390                     pszDestEnd = pszDest;
01391                     cchRemaining = cchDest;
01392                 }
01393                 else
01394                     if (cchDest > 0)
01395                     {
01396                         pszDestEnd = pszDest + cchDest - 1;
01397                         cchRemaining = 1;
01398                         *pszDestEnd = '\0';
01399                     }
01400             }
01401             if (dwFlags & STRSAFE_NULL_ON_FAILURE)
01402             {
01403                 if (cchDest > 0)
01404                 {
01405                     pszDestEnd = pszDest;
01406                     cchRemaining = cchDest;
01407                     *pszDestEnd = '\0';
01408                 }
01409             }
01410         }
01411     }
01412     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
01413     {
01414         if (ppszDestEnd)
01415             *ppszDestEnd = pszDestEnd;
01416         if (pcchRemaining)
01417             *pcchRemaining = cchRemaining;
01418     }
01419     return Status;
01420 }
01421 
01422 NTSTRSAFEAPI RtlStringCatExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
01423 {
01424     NTSTATUS Status = STATUS_SUCCESS;
01425     STRSAFE_LPWSTR pszDestEnd = pszDest;
01426     size_t cchRemaining = 0;
01427     if (dwFlags & (~STRSAFE_VALID_FLAGS))
01428         Status = STATUS_INVALID_PARAMETER;
01429     else
01430     {
01431         size_t cchDestLength;
01432         if (dwFlags & STRSAFE_IGNORE_NULLS)
01433         {
01434             if (!pszDest)
01435             {
01436                 if ((cchDest==0) && (cbDest==0))
01437                     cchDestLength = 0;
01438                 else
01439                     Status = STATUS_INVALID_PARAMETER;
01440             }
01441             else
01442             {
01443                 Status = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength);
01444                 if (NT_SUCCESS(Status))
01445                 {
01446                     pszDestEnd = pszDest + cchDestLength;
01447                     cchRemaining = cchDest - cchDestLength;
01448                 }
01449             }
01450             if (!pszSrc)
01451                 pszSrc = L"";
01452         }
01453         else
01454         {
01455             Status = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength);
01456             if (NT_SUCCESS(Status))
01457             {
01458                 pszDestEnd = pszDest + cchDestLength;
01459                 cchRemaining = cchDest - cchDestLength;
01460             }
01461         }
01462         if (NT_SUCCESS(Status))
01463         {
01464             if (cchDest==0)
01465             {
01466                 if (*pszSrc!=L'\0')
01467                 {
01468                     if (!pszDest)
01469                         Status = STATUS_INVALID_PARAMETER;
01470                     else
01471                         Status = STATUS_BUFFER_OVERFLOW;
01472                 }
01473             }
01474             else
01475                 Status = RtlStringCopyExWorkerW(pszDestEnd,cchRemaining,(cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)),pszSrc,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)));
01476         }
01477     }
01478     if (!NT_SUCCESS(Status))
01479     {
01480         if (pszDest)
01481         {
01482             if (dwFlags & STRSAFE_FILL_ON_FAILURE)
01483             {
01484                 memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
01485                 if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
01486                 {
01487                     pszDestEnd = pszDest;
01488                     cchRemaining = cchDest;
01489                 }
01490                 else
01491                     if (cchDest > 0)
01492                     {
01493                         pszDestEnd = pszDest + cchDest - 1;
01494                         cchRemaining = 1;
01495                         *pszDestEnd = L'\0';
01496                     }
01497             }
01498             if (dwFlags & STRSAFE_NULL_ON_FAILURE)
01499             {
01500                 if (cchDest > 0)
01501                 {
01502                     pszDestEnd = pszDest;
01503                     cchRemaining = cchDest;
01504                     *pszDestEnd = L'\0';
01505                 }
01506             }
01507         }
01508     }
01509     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
01510     {
01511         if (ppszDestEnd)
01512             *ppszDestEnd = pszDestEnd;
01513         if (pcchRemaining)
01514             *pcchRemaining = cchRemaining;
01515     }
01516     return Status;
01517 }
01518 
01519 NTSTRSAFEAPI RtlStringCatNWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend)
01520 {
01521     NTSTATUS Status;
01522     size_t cchDestLength;
01523     Status = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength);
01524     if (NT_SUCCESS(Status))
01525         Status = RtlStringCopyNWorkerA(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc,cchToAppend);
01526     return Status;
01527 }
01528 
01529 NTSTRSAFEAPI RtlStringCatNWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend)
01530 {
01531     NTSTATUS Status;
01532     size_t cchDestLength;
01533     Status = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength);
01534     if (NT_SUCCESS(Status))
01535         Status = RtlStringCopyNWorkerW(pszDest + cchDestLength,cchDest - cchDestLength,pszSrc,cchToAppend);
01536     return Status;
01537 }
01538 
01539 NTSTRSAFEAPI RtlStringCatNExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCSTR pszSrc,size_t cchToAppend,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
01540 {
01541     NTSTATUS Status = STATUS_SUCCESS;
01542     STRSAFE_LPSTR pszDestEnd = pszDest;
01543     size_t cchRemaining = 0;
01544     size_t cchDestLength = 0;
01545     if (dwFlags & (~STRSAFE_VALID_FLAGS))
01546         Status = STATUS_INVALID_PARAMETER;
01547     else
01548         if (cchToAppend > NTSTRSAFE_MAX_CCH)
01549             Status = STATUS_INVALID_PARAMETER;
01550         else
01551         {
01552             if (dwFlags & STRSAFE_IGNORE_NULLS)
01553             {
01554                 if (!pszDest)
01555                 {
01556                     if ((cchDest==0) && (cbDest==0))
01557                         cchDestLength = 0;
01558                     else
01559                         Status = STATUS_INVALID_PARAMETER;
01560                 }
01561                 else
01562                 {
01563                     Status = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength);
01564                     if (NT_SUCCESS(Status))
01565                     {
01566                         pszDestEnd = pszDest + cchDestLength;
01567                         cchRemaining = cchDest - cchDestLength;
01568                     }
01569                 }
01570                 if (!pszSrc)
01571                     pszSrc = "";
01572             }
01573             else
01574             {
01575                 Status = RtlStringLengthWorkerA(pszDest,cchDest,&cchDestLength);
01576                 if (NT_SUCCESS(Status))
01577                 {
01578                     pszDestEnd = pszDest + cchDestLength;
01579                     cchRemaining = cchDest - cchDestLength;
01580                 }
01581             }
01582             if (NT_SUCCESS(Status))
01583             {
01584                 if (cchDest==0)
01585                 {
01586                     if ((cchToAppend!=0) && (*pszSrc!='\0'))
01587                     {
01588                         if (!pszDest)
01589                             Status = STATUS_INVALID_PARAMETER;
01590                         else
01591                             Status = STATUS_BUFFER_OVERFLOW;
01592                     }
01593                 }
01594                 else
01595                     Status = RtlStringCopyNExWorkerA(pszDestEnd,cchRemaining,(cchRemaining*sizeof(char)) + (cbDest % sizeof(char)),pszSrc,cchToAppend,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)));
01596             }
01597         }
01598     if (!NT_SUCCESS(Status))
01599     {
01600         if (pszDest)
01601         {
01602             if (dwFlags & STRSAFE_FILL_ON_FAILURE)
01603             {
01604                 memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
01605                 if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
01606                 {
01607                     pszDestEnd = pszDest;
01608                     cchRemaining = cchDest;
01609                 }
01610                 else
01611                     if (cchDest > 0)
01612                     {
01613                         pszDestEnd = pszDest + cchDest - 1;
01614                         cchRemaining = 1;
01615                         *pszDestEnd = '\0';
01616                     }
01617             }
01618             if (dwFlags & (STRSAFE_NULL_ON_FAILURE))
01619             {
01620                 if (cchDest > 0)
01621                 {
01622                     pszDestEnd = pszDest;
01623                     cchRemaining = cchDest;
01624                     *pszDestEnd = '\0';
01625                 }
01626             }
01627         }
01628     }
01629     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
01630     {
01631         if (ppszDestEnd)
01632             *ppszDestEnd = pszDestEnd;
01633         if (pcchRemaining)
01634             *pcchRemaining = cchRemaining;
01635     }
01636     return Status;
01637 }
01638 
01639 NTSTRSAFEAPI RtlStringCatNExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPCWSTR pszSrc,size_t cchToAppend,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags)
01640 {
01641     NTSTATUS Status = STATUS_SUCCESS;
01642     STRSAFE_LPWSTR pszDestEnd = pszDest;
01643     size_t cchRemaining = 0;
01644     size_t cchDestLength = 0;
01645     if (dwFlags & (~STRSAFE_VALID_FLAGS))
01646         Status = STATUS_INVALID_PARAMETER;
01647     else
01648         if (cchToAppend > NTSTRSAFE_MAX_CCH)
01649             Status = STATUS_INVALID_PARAMETER;
01650         else
01651         {
01652             if (dwFlags & STRSAFE_IGNORE_NULLS)
01653             {
01654                 if (!pszDest)
01655                 {
01656                     if ((cchDest==0) && (cbDest==0))
01657                         cchDestLength = 0;
01658                     else
01659                         Status = STATUS_INVALID_PARAMETER;
01660                 }
01661                 else
01662                 {
01663                     Status = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength);
01664                     if (NT_SUCCESS(Status))
01665                     {
01666                         pszDestEnd = pszDest + cchDestLength;
01667                         cchRemaining = cchDest - cchDestLength;
01668                     }
01669                 }
01670                 if (!pszSrc)
01671                     pszSrc = L"";
01672             }
01673             else
01674             {
01675                 Status = RtlStringLengthWorkerW(pszDest,cchDest,&cchDestLength);
01676                 if (NT_SUCCESS(Status))
01677                 {
01678                     pszDestEnd = pszDest + cchDestLength;
01679                     cchRemaining = cchDest - cchDestLength;
01680                 }
01681             }
01682             if (NT_SUCCESS(Status))
01683             {
01684                 if (cchDest==0)
01685                 {
01686                     if ((cchToAppend!=0) && (*pszSrc!=L'\0'))
01687                     {
01688                         if (!pszDest)
01689                             Status = STATUS_INVALID_PARAMETER;
01690                         else
01691                             Status = STATUS_BUFFER_OVERFLOW;
01692                     }
01693                 }
01694                 else
01695                     Status = RtlStringCopyNExWorkerW(pszDestEnd,cchRemaining,(cchRemaining*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)),pszSrc,cchToAppend,&pszDestEnd,&cchRemaining,dwFlags & (~(STRSAFE_FILL_ON_FAILURE | STRSAFE_NULL_ON_FAILURE)));
01696             }
01697         }
01698     if (!NT_SUCCESS(Status))
01699     {
01700         if (pszDest)
01701         {
01702             if (dwFlags & STRSAFE_FILL_ON_FAILURE)
01703             {
01704                 memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
01705                 if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
01706                 {
01707                     pszDestEnd = pszDest;
01708                     cchRemaining = cchDest;
01709                 }
01710                 else
01711                     if (cchDest > 0)
01712                     {
01713                         pszDestEnd = pszDest + cchDest - 1;
01714                         cchRemaining = 1;
01715                         *pszDestEnd = L'\0';
01716                     }
01717             }
01718             if (dwFlags & (STRSAFE_NULL_ON_FAILURE))
01719             {
01720                 if (cchDest > 0)
01721                 {
01722                     pszDestEnd = pszDest;
01723                     cchRemaining = cchDest;
01724                     *pszDestEnd = L'\0';
01725                 }
01726             }
01727         }
01728     }
01729     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
01730     {
01731         if (ppszDestEnd)
01732             *ppszDestEnd = pszDestEnd;
01733         if (pcchRemaining)
01734             *pcchRemaining = cchRemaining;
01735     }
01736     return Status;
01737 }
01738 
01739 NTSTRSAFEAPI RtlStringVPrintfWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,STRSAFE_LPCSTR pszFormat,va_list argList)
01740 {
01741     NTSTATUS Status = STATUS_SUCCESS;
01742     if (cchDest==0)
01743         Status = STATUS_INVALID_PARAMETER;
01744     else
01745     {
01746         int iRet;
01747         size_t cchMax;
01748         cchMax = cchDest - 1;
01749         iRet = _vsnprintf(pszDest,cchMax,pszFormat,argList);
01750         if ((iRet < 0) || (((size_t)iRet) > cchMax))
01751         {
01752             pszDest += cchMax;
01753             *pszDest = '\0';
01754             Status = STATUS_BUFFER_OVERFLOW;
01755         }
01756         else
01757             if (((size_t)iRet)==cchMax)
01758             {
01759                 pszDest += cchMax;
01760                 *pszDest = '\0';
01761             }
01762     }
01763     return Status;
01764 }
01765 
01766 NTSTRSAFEAPI RtlStringVPrintfWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat,va_list argList)
01767 {
01768     NTSTATUS Status = STATUS_SUCCESS;
01769     if (cchDest==0)
01770         Status = STATUS_INVALID_PARAMETER;
01771     else
01772     {
01773         int iRet;
01774         size_t cchMax;
01775         cchMax = cchDest - 1;
01776         iRet = _vsnwprintf(pszDest,cchMax,pszFormat,argList);
01777         if ((iRet < 0) || (((size_t)iRet) > cchMax))
01778         {
01779             pszDest += cchMax;
01780             *pszDest = L'\0';
01781             Status = STATUS_BUFFER_OVERFLOW;
01782         }
01783         else
01784             if (((size_t)iRet)==cchMax)
01785             {
01786                 pszDest += cchMax;
01787                 *pszDest = L'\0';
01788             }
01789     }
01790     return Status;
01791 }
01792 
01793 NTSTRSAFEAPI RtlStringVPrintfExWorkerA(STRSAFE_LPSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCSTR pszFormat,va_list argList)
01794 {
01795     NTSTATUS Status = STATUS_SUCCESS;
01796     STRSAFE_LPSTR pszDestEnd = pszDest;
01797     size_t cchRemaining = 0;
01798     if (dwFlags & (~STRSAFE_VALID_FLAGS))
01799         Status = STATUS_INVALID_PARAMETER;
01800     else
01801     {
01802         if (dwFlags & STRSAFE_IGNORE_NULLS)
01803         {
01804             if (!pszDest)
01805             {
01806                 if ((cchDest!=0) || (cbDest!=0))
01807                     Status = STATUS_INVALID_PARAMETER;
01808             }
01809             if (!pszFormat)
01810                 pszFormat = "";
01811         }
01812         if (NT_SUCCESS(Status))
01813         {
01814             if (cchDest==0)
01815             {
01816                 pszDestEnd = pszDest;
01817                 cchRemaining = 0;
01818                 if (*pszFormat!='\0')
01819                 {
01820                     if (!pszDest)
01821                         Status = STATUS_INVALID_PARAMETER;
01822                     else
01823                         Status = STATUS_BUFFER_OVERFLOW;
01824                 }
01825             }
01826             else
01827             {
01828                 int iRet;
01829                 size_t cchMax;
01830                 cchMax = cchDest - 1;
01831                 iRet = _vsnprintf(pszDest,cchMax,pszFormat,argList);
01832                 if ((iRet < 0) || (((size_t)iRet) > cchMax))
01833                 {
01834                     pszDestEnd = pszDest + cchMax;
01835                     cchRemaining = 1;
01836                     *pszDestEnd = '\0';
01837                     Status = STATUS_BUFFER_OVERFLOW;
01838                 }
01839                 else
01840                     if (((size_t)iRet)==cchMax)
01841                     {
01842                         pszDestEnd = pszDest + cchMax;
01843                         cchRemaining = 1;
01844                         *pszDestEnd = '\0';
01845                     }
01846                     else
01847                         if (((size_t)iRet) < cchMax)
01848                         {
01849                             pszDestEnd = pszDest + iRet;
01850                             cchRemaining = cchDest - iRet;
01851                             if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
01852                             {
01853                                 memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(char)) + (cbDest % sizeof(char)));
01854                             }
01855                         }
01856             }
01857         }
01858     }
01859     if (!NT_SUCCESS(Status))
01860     {
01861         if (pszDest)
01862         {
01863             if (dwFlags & STRSAFE_FILL_ON_FAILURE)
01864             {
01865                 memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
01866                 if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
01867                 {
01868                     pszDestEnd = pszDest;
01869                     cchRemaining = cchDest;
01870                 }
01871                 else
01872                     if (cchDest > 0)
01873                     {
01874                         pszDestEnd = pszDest + cchDest - 1;
01875                         cchRemaining = 1;
01876                         *pszDestEnd = '\0';
01877                     }
01878             }
01879             if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
01880             {
01881                 if (cchDest > 0)
01882                 {
01883                     pszDestEnd = pszDest;
01884                     cchRemaining = cchDest;
01885                     *pszDestEnd = '\0';
01886                 }
01887             }
01888         }
01889     }
01890     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
01891     {
01892         if (ppszDestEnd)
01893             *ppszDestEnd = pszDestEnd;
01894         if (pcchRemaining)
01895             *pcchRemaining = cchRemaining;
01896     }
01897     return Status;
01898 }
01899 
01900 NTSTRSAFEAPI RtlStringVPrintfExWorkerW(STRSAFE_LPWSTR pszDest,size_t cchDest,size_t cbDest,STRSAFE_LPWSTR *ppszDestEnd,size_t *pcchRemaining,STRSAFE_DWORD dwFlags,STRSAFE_LPCWSTR pszFormat,va_list argList)
01901 {
01902     NTSTATUS Status = STATUS_SUCCESS;
01903     STRSAFE_LPWSTR pszDestEnd = pszDest;
01904     size_t cchRemaining = 0;
01905     if (dwFlags & (~STRSAFE_VALID_FLAGS))
01906         Status = STATUS_INVALID_PARAMETER;
01907     else
01908     {
01909         if (dwFlags & STRSAFE_IGNORE_NULLS)
01910         {
01911             if (!pszDest)
01912             {
01913                 if ((cchDest!=0) || (cbDest!=0))
01914                     Status = STATUS_INVALID_PARAMETER;
01915             }
01916             if (!pszFormat)
01917                 pszFormat = L"";
01918         }
01919         if (NT_SUCCESS(Status))
01920         {
01921             if (cchDest==0)
01922             {
01923                 pszDestEnd = pszDest;
01924                 cchRemaining = 0;
01925                 if (*pszFormat!=L'\0')
01926                 {
01927                     if (!pszDest)
01928                         Status = STATUS_INVALID_PARAMETER;
01929                     else
01930                         Status = STATUS_BUFFER_OVERFLOW;
01931                 }
01932             }
01933             else
01934             {
01935                 int iRet;
01936                 size_t cchMax;
01937                 cchMax = cchDest - 1;
01938                 iRet = _vsnwprintf(pszDest,cchMax,pszFormat,argList);
01939                 if ((iRet < 0) || (((size_t)iRet) > cchMax))
01940                 {
01941                     pszDestEnd = pszDest + cchMax;
01942                     cchRemaining = 1;
01943                     *pszDestEnd = L'\0';
01944                     Status = STATUS_BUFFER_OVERFLOW;
01945                 }
01946                 else
01947                     if (((size_t)iRet)==cchMax)
01948                     {
01949                         pszDestEnd = pszDest + cchMax;
01950                         cchRemaining = 1;
01951                         *pszDestEnd = L'\0';
01952                     }
01953                     else
01954                         if (((size_t)iRet) < cchMax)
01955                         {
01956                             pszDestEnd = pszDest + iRet;
01957                             cchRemaining = cchDest - iRet;
01958                             if (dwFlags & STRSAFE_FILL_BEHIND_NULL)
01959                             {
01960                                 memset(pszDestEnd + 1,STRSAFE_GET_FILL_PATTERN(dwFlags),((cchRemaining - 1)*sizeof(wchar_t)) + (cbDest % sizeof(wchar_t)));
01961                             }
01962                         }
01963             }
01964         }
01965     }
01966     if (!NT_SUCCESS(Status))
01967     {
01968         if (pszDest)
01969         {
01970             if (dwFlags & STRSAFE_FILL_ON_FAILURE)
01971             {
01972                 memset(pszDest,STRSAFE_GET_FILL_PATTERN(dwFlags),cbDest);
01973                 if (STRSAFE_GET_FILL_PATTERN(dwFlags)==0)
01974                 {
01975                     pszDestEnd = pszDest;
01976                     cchRemaining = cchDest;
01977                 }
01978                 else
01979                     if (cchDest > 0)
01980                     {
01981                         pszDestEnd = pszDest + cchDest - 1;
01982                         cchRemaining = 1;
01983                         *pszDestEnd = L'\0';
01984                     }
01985             }
01986             if (dwFlags & (STRSAFE_NULL_ON_FAILURE | STRSAFE_NO_TRUNCATION))
01987             {
01988                 if (cchDest > 0)
01989                 {
01990                     pszDestEnd = pszDest;
01991                     cchRemaining = cchDest;
01992                     *pszDestEnd = L'\0';
01993                 }
01994             }
01995         }
01996     }
01997     if (NT_SUCCESS(Status) || (Status==STATUS_BUFFER_OVERFLOW))
01998     {
01999         if (ppszDestEnd)
02000             *ppszDestEnd = pszDestEnd;
02001         if (pcchRemaining)
02002             *pcchRemaining = cchRemaining;
02003     }
02004     return Status;
02005 }
02006 
02007 NTSTRSAFEAPI RtlStringLengthWorkerA(STRSAFE_LPCSTR psz,size_t cchMax,size_t *pcchLength)
02008 {
02009     NTSTATUS Status = STATUS_SUCCESS;
02010     size_t cchMaxPrev = cchMax;
02011     while(cchMax && (*psz!='\0'))
02012     {
02013         psz++;
02014         cchMax--;
02015     }
02016     if (cchMax==0)
02017         Status = STATUS_INVALID_PARAMETER;
02018     if (pcchLength)
02019     {
02020         if (NT_SUCCESS(Status))
02021             *pcchLength = cchMaxPrev - cchMax;
02022         else
02023             *pcchLength = 0;
02024     }
02025     return Status;
02026 }
02027 
02028 NTSTRSAFEAPI RtlStringLengthWorkerW(STRSAFE_LPCWSTR psz,size_t cchMax,size_t *pcchLength)
02029 {
02030     NTSTATUS Status = STATUS_SUCCESS;
02031     size_t cchMaxPrev = cchMax;
02032     while(cchMax && (*psz!=L'\0'))
02033     {
02034         psz++;
02035         cchMax--;
02036     }
02037     if (cchMax==0)
02038         Status = STATUS_INVALID_PARAMETER;
02039     if (pcchLength)
02040     {
02041         if (NT_SUCCESS(Status))
02042             *pcchLength = cchMaxPrev - cchMax;
02043         else
02044             *pcchLength = 0;
02045     }
02046     return Status;
02047 }
02048 
02049 
02050 
02051 #define RtlStringCopyWorkerA RtlStringCopyWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
02052 #define RtlStringCopyWorkerW RtlStringCopyWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
02053 #define RtlStringCopyExWorkerA RtlStringCopyExWorkerA_instead_use_StringCchCopyA_or_StringCchCopyExA;
02054 #define RtlStringCopyExWorkerW RtlStringCopyExWorkerW_instead_use_StringCchCopyW_or_StringCchCopyExW;
02055 #define RtlStringCatWorkerA RtlStringCatWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
02056 #define RtlStringCatWorkerW RtlStringCatWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
02057 #define RtlStringCatExWorkerA RtlStringCatExWorkerA_instead_use_StringCchCatA_or_StringCchCatExA;
02058 #define RtlStringCatExWorkerW RtlStringCatExWorkerW_instead_use_StringCchCatW_or_StringCchCatExW;
02059 #define RtlStringCatNWorkerA RtlStringCatNWorkerA_instead_use_StringCchCatNA_or_StrincCbCatNA;
02060 #define RtlStringCatNWorkerW RtlStringCatNWorkerW_instead_use_StringCchCatNW_or_StringCbCatNW;
02061 #define RtlStringCatNExWorkerA RtlStringCatNExWorkerA_instead_use_StringCchCatNExA_or_StringCbCatNExA;
02062 #define RtlStringCatNExWorkerW RtlStringCatNExWorkerW_instead_use_StringCchCatNExW_or_StringCbCatNExW;
02063 #define RtlStringVPrintfWorkerA RtlStringVPrintfWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
02064 #define RtlStringVPrintfWorkerW RtlStringVPrintfWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
02065 #define RtlStringVPrintfExWorkerA RtlStringVPrintfExWorkerA_instead_use_StringCchVPrintfA_or_StringCchVPrintfExA;
02066 #define RtlStringVPrintfExWorkerW RtlStringVPrintfExWorkerW_instead_use_StringCchVPrintfW_or_StringCchVPrintfExW;
02067 #define RtlStringLengthWorkerA RtlStringLengthWorkerA_instead_use_StringCchLengthA_or_StringCbLengthA;
02068 #define RtlStringLengthWorkerW RtlStringLengthWorkerW_instead_use_StringCchLengthW_or_StringCbLengthW;
02069 
02070 #ifdef _MSC_VER
02071 #pragma warning(pop)
02072 #endif /* _MSC_VER */
02073 
02074 #endif /* _NTSTRSAFE_H_INCLUDED_ */

Generated on Sat May 26 2012 04:28:55 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.