From e54347601f86778b1ace002e8b168d5fe2a53f55 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Sat, 20 Oct 2007 14:11:53 -0700 Subject: [PATCH] kernel32: append the user's path to the system path --- dlls/kernel32/process.c | 42 ++++++++++++++++++++++++++++++++++++++---- 1 files changed, 38 insertions(+), 4 deletions(-) diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index a08235a..39dbd8c 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -325,13 +325,19 @@ static BOOL build_initial_environment( c */ static void set_registry_variables( HANDLE hkey, ULONG type ) { - UNICODE_STRING env_name, env_value; - NTSTATUS status; + static const WCHAR SemicolonW[] = {';',0}; + static const WCHAR pathW[] = {'p','a','t','h',0}; + UNICODE_STRING env_name, env_value, env_value2; + NTSTATUS status, q_status; DWORD size; int index; + int is_path = FALSE, len = 0; char buffer[1024*sizeof(WCHAR) + sizeof(KEY_VALUE_FULL_INFORMATION)]; + WCHAR buffer2[1024]; KEY_VALUE_FULL_INFORMATION *info = (KEY_VALUE_FULL_INFORMATION *)buffer; + env_value2.MaximumLength = sizeof(buffer2); + env_value2.Buffer = buffer2; for (index = 0; ; index++) { status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation, @@ -342,6 +348,18 @@ static void set_registry_variables( HAND continue; env_name.Buffer = info->Name; env_name.Length = env_name.MaximumLength = info->NameLength; + is_path = !strcmpiW(info->Name, pathW); + + q_status = RtlQueryEnvironmentVariable_U( NULL, &env_name, &env_value2 ); + if (is_path && q_status == STATUS_BUFFER_TOO_SMALL) + continue; + if (is_path && q_status == STATUS_SUCCESS) + { + if (RtlAppendUnicodeToString(&env_value2, SemicolonW) == STATUS_BUFFER_TOO_SMALL) + continue; + len = env_value2.MaximumLength - env_value2.Length; + } + env_value.Buffer = (WCHAR *)(buffer + info->DataOffset); env_value.Length = env_value.MaximumLength = info->DataLength; if (env_value.Length && !env_value.Buffer[env_value.Length/sizeof(WCHAR)-1]) @@ -354,11 +372,27 @@ static void set_registry_variables( HAND env_expanded.Buffer=buf_expanded; status = RtlExpandEnvironmentStrings_U(NULL, &env_value, &env_expanded, NULL); if (status == STATUS_SUCCESS || status == STATUS_BUFFER_OVERFLOW) - RtlSetEnvironmentVariable( NULL, &env_name, &env_expanded ); + { + if (is_path && q_status == STATUS_SUCCESS) + { + env_expanded.Length = min(env_expanded.Length, len); + RtlAppendUnicodeStringToString(&env_value2, &env_expanded); + RtlSetEnvironmentVariable( NULL, &env_name, &env_value2 ); + } + else + RtlSetEnvironmentVariable( NULL, &env_name, &env_expanded ); + } } else { - RtlSetEnvironmentVariable( NULL, &env_name, &env_value ); + if (is_path && q_status == STATUS_SUCCESS) + { + env_value.Length = min(env_value.Length, len); + RtlAppendUnicodeStringToString(&env_value2, &env_value); + RtlSetEnvironmentVariable( NULL, &env_name, &env_value2 ); + } + else + RtlSetEnvironmentVariable( NULL, &env_name, &env_value ); } } } -- 1.4.1