mirror of
https://github.com/reactos/wine.git
synced 2025-01-26 14:05:07 +00:00
Set additional environment variables at startup from
HKLM\System\CurrentControlSet\Control\Session Manager\Environment.
This commit is contained in:
parent
0040ba959b
commit
0a19a07ecf
@ -400,6 +400,56 @@ static BOOL build_initial_environment( char **environ )
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* set_registry_environment
|
||||
*
|
||||
* Set the environment variables specified in the registry.
|
||||
*/
|
||||
static void set_registry_environment(void)
|
||||
{
|
||||
static const WCHAR env_keyW[] = {'M','a','c','h','i','n','e','\\',
|
||||
'S','y','s','t','e','m','\\',
|
||||
'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
|
||||
'C','o','n','t','r','o','l','\\',
|
||||
'S','e','s','s','i','o','n',' ','M','a','n','a','g','e','r','\\',
|
||||
'E','n','v','i','r','o','n','m','e','n','t',0};
|
||||
OBJECT_ATTRIBUTES attr;
|
||||
UNICODE_STRING nameW, env_name, env_value;
|
||||
NTSTATUS status;
|
||||
HKEY hkey;
|
||||
DWORD size;
|
||||
int index;
|
||||
char buffer[1024 + sizeof(KEY_VALUE_FULL_INFORMATION)];
|
||||
KEY_VALUE_FULL_INFORMATION *info = (KEY_VALUE_FULL_INFORMATION *)buffer;
|
||||
|
||||
attr.Length = sizeof(attr);
|
||||
attr.RootDirectory = 0;
|
||||
attr.ObjectName = &nameW;
|
||||
attr.Attributes = 0;
|
||||
attr.SecurityDescriptor = NULL;
|
||||
attr.SecurityQualityOfService = NULL;
|
||||
RtlInitUnicodeString( &nameW, env_keyW );
|
||||
if (NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr ) != STATUS_SUCCESS) return;
|
||||
|
||||
for (index = 0; ; index++)
|
||||
{
|
||||
status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation,
|
||||
buffer, sizeof(buffer), &size );
|
||||
if (status == STATUS_BUFFER_OVERFLOW) continue;
|
||||
if (status != STATUS_SUCCESS) break;
|
||||
if (info->Type != REG_SZ) continue; /* FIXME: handle REG_EXPAND_SZ */
|
||||
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;
|
||||
if (env_value.Length && !env_value.Buffer[env_value.Length/sizeof(WCHAR)-1])
|
||||
env_value.Length--; /* don't count terminating null if any */
|
||||
RtlSetEnvironmentVariable( NULL, &env_name, &env_value );
|
||||
}
|
||||
NtClose( hkey );
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* set_library_wargv
|
||||
*
|
||||
@ -750,6 +800,8 @@ static BOOL process_init( char *argv[], char **environ )
|
||||
}
|
||||
SERVER_END_REQ;
|
||||
|
||||
if (!info_size) set_registry_environment();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user