Module: wine Branch: master Commit: 6beb82e2d6cc400c97fc654c2f157c217c4f87e4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=6beb82e2d6cc400c97fc654c2f...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jan 28 14:53:24 2010 +0100
kernel32: Append the user PATH value to the system one.
---
dlls/kernel32/process.c | 30 ++++++++++++++++++++---------- 1 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index 993fa6e..1ef3e46 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -358,13 +358,20 @@ static BOOL build_initial_environment(void) */ static void set_registry_variables( HANDLE hkey, ULONG type ) { + static const WCHAR pathW[] = {'P','A','T','H'}; + static const WCHAR sep[] = {';',0}; UNICODE_STRING env_name, env_value; NTSTATUS status; DWORD size; int index; char buffer[1024*sizeof(WCHAR) + sizeof(KEY_VALUE_FULL_INFORMATION)]; + WCHAR tmpbuf[1024]; + UNICODE_STRING tmp; KEY_VALUE_FULL_INFORMATION *info = (KEY_VALUE_FULL_INFORMATION *)buffer;
+ tmp.Buffer = tmpbuf; + tmp.MaximumLength = sizeof(tmpbuf); + for (index = 0; ; index++) { status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation, @@ -376,24 +383,27 @@ static void set_registry_variables( HANDLE hkey, ULONG type ) env_name.Buffer = info->Name; env_name.Length = env_name.MaximumLength = info->NameLength; env_value.Buffer = (WCHAR *)(buffer + info->DataOffset); - env_value.Length = env_value.MaximumLength = info->DataLength; + env_value.Length = info->DataLength; + env_value.MaximumLength = sizeof(buffer) - info->DataOffset; if (env_value.Length && !env_value.Buffer[env_value.Length/sizeof(WCHAR)-1]) env_value.Length -= sizeof(WCHAR); /* don't count terminating null if any */ if (!env_value.Length) continue; if (info->Type == REG_EXPAND_SZ) { - WCHAR buf_expanded[1024]; - UNICODE_STRING env_expanded; - env_expanded.Length = env_expanded.MaximumLength = sizeof(buf_expanded); - 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 ); + status = RtlExpandEnvironmentStrings_U( NULL, &env_value, &tmp, NULL ); + if (status != STATUS_SUCCESS && status != STATUS_BUFFER_OVERFLOW) continue; + RtlCopyUnicodeString( &env_value, &tmp ); } - else + /* PATH is magic */ + if (env_name.Length == sizeof(pathW) && + !memicmpW( env_name.Buffer, pathW, sizeof(pathW)/sizeof(WCHAR) ) && + !RtlQueryEnvironmentVariable_U( NULL, &env_name, &tmp )) { - RtlSetEnvironmentVariable( NULL, &env_name, &env_value ); + RtlAppendUnicodeToString( &tmp, sep ); + if (RtlAppendUnicodeStringToString( &tmp, &env_value )) continue; + RtlCopyUnicodeString( &env_value, &tmp ); } + RtlSetEnvironmentVariable( NULL, &env_name, &env_value ); } }