From 9c57e23d9ba43fc52f82ad39b6a98b101868d719 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 21 Jun 2018 12:05:31 +0200 Subject: [PATCH] ntdll: Implement RtlExpandEnvironmentStrings(). Signed-off-by: Alexandre Julliard --- dlls/ntdll/env.c | 40 +++++++++++++++++++++++----------------- dlls/ntdll/ntdll.spec | 1 + include/winternl.h | 1 + 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/dlls/ntdll/env.c b/dlls/ntdll/env.c index a5bdf0f050c..1428a1b4353 100644 --- a/dlls/ntdll/env.c +++ b/dlls/ntdll/env.c @@ -281,21 +281,14 @@ done: return nts; } -/****************************************************************** - * RtlExpandEnvironmentStrings_U (NTDLL.@) - * +/****************************************************************************** + * RtlExpandEnvironmentStrings (NTDLL.@) */ -NTSTATUS WINAPI RtlExpandEnvironmentStrings_U(PCWSTR renv, const UNICODE_STRING* us_src, - PUNICODE_STRING us_dst, PULONG plen) +NTSTATUS WINAPI RtlExpandEnvironmentStrings( const WCHAR *renv, WCHAR *src, SIZE_T src_len, + WCHAR *dst, SIZE_T count, SIZE_T *plen ) { - DWORD src_len, len, count, total_size = 1; /* 1 for terminating '\0' */ - LPCWSTR env, src, p, var; - LPWSTR dst; - - src = us_src->Buffer; - src_len = us_src->Length / sizeof(WCHAR); - count = us_dst->MaximumLength / sizeof(WCHAR); - dst = count ? us_dst->Buffer : NULL; + SIZE_T len, total_size = 1; /* 1 for terminating '\0' */ + LPCWSTR env, p, var; if (!renv) { @@ -353,15 +346,28 @@ NTSTATUS WINAPI RtlExpandEnvironmentStrings_U(PCWSTR renv, const UNICODE_STRING* if (!renv) RtlReleasePebLock(); - /* Null-terminate the string */ if (dst && count) *dst = '\0'; - - us_dst->Length = (dst) ? (dst - us_dst->Buffer) * sizeof(WCHAR) : 0; - if (plen) *plen = total_size * sizeof(WCHAR); + if (plen) *plen = total_size; return (count) ? STATUS_SUCCESS : STATUS_BUFFER_TOO_SMALL; } +/****************************************************************** + * RtlExpandEnvironmentStrings_U (NTDLL.@) + */ +NTSTATUS WINAPI RtlExpandEnvironmentStrings_U( const WCHAR *env, const UNICODE_STRING *src, + UNICODE_STRING *dst, ULONG *plen ) +{ + SIZE_T len; + NTSTATUS ret; + + ret = RtlExpandEnvironmentStrings( env, src->Buffer, src->Length / sizeof(WCHAR), + dst->Buffer, dst->MaximumLength / sizeof(WCHAR), &len ); + if (plen) *plen = len * sizeof(WCHAR); /* FIXME: check for overflow? */ + if (len > UNICODE_STRING_MAX_CHARS) ret = STATUS_BUFFER_TOO_SMALL; + if (!ret) dst->Length = (len - 1) * sizeof(WCHAR); + return ret; +} static inline void normalize( void *base, WCHAR **ptr ) { diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 0c667aa3d5e..d321c44d4fc 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -596,6 +596,7 @@ @ stdcall RtlEraseUnicodeString(ptr) @ stdcall RtlExitUserProcess(long) @ stdcall RtlExitUserThread(long) +@ stdcall RtlExpandEnvironmentStrings(ptr wstr long ptr long ptr) @ stdcall RtlExpandEnvironmentStrings_U(ptr ptr ptr ptr) @ stub RtlExtendHeap @ stdcall -arch=win32 -ret64 RtlExtendedIntegerMultiply(int64 long) diff --git a/include/winternl.h b/include/winternl.h index 58c475dfff1..cbf5c669c86 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -2630,6 +2630,7 @@ NTSYSAPI BOOLEAN WINAPI RtlEqualString(const STRING*,const STRING*,BOOLEAN); NTSYSAPI BOOLEAN WINAPI RtlEqualUnicodeString(const UNICODE_STRING*,const UNICODE_STRING*,BOOLEAN); NTSYSAPI void DECLSPEC_NORETURN WINAPI RtlExitUserProcess(ULONG); NTSYSAPI void DECLSPEC_NORETURN WINAPI RtlExitUserThread(ULONG); +NTSYSAPI NTSTATUS WINAPI RtlExpandEnvironmentStrings(const WCHAR*,WCHAR*,SIZE_T,WCHAR*,SIZE_T,SIZE_T*); NTSYSAPI NTSTATUS WINAPI RtlExpandEnvironmentStrings_U(PCWSTR, const UNICODE_STRING*, UNICODE_STRING*, ULONG*); NTSYSAPI NTSTATUS WINAPI RtlFindActivationContextSectionString(ULONG,const GUID*,ULONG,const UNICODE_STRING*,PVOID); NTSYSAPI NTSTATUS WINAPI RtlFindActivationContextSectionGuid(ULONG,const GUID*,ULONG,const GUID*,PVOID); -- 2.11.4.GIT