Module: wine Branch: master Commit: 4073805aeb2900a1e2032115bd18859b9740a54e URL: http://source.winehq.org/git/wine.git/?a=commit;h=4073805aeb2900a1e2032115bd...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Apr 24 11:53:45 2008 +0200
kernel32: If necessary reload the environment after wineboot has run.
---
dlls/kernel32/process.c | 76 +++++++++++++++++++++-------------------------- 1 files changed, 34 insertions(+), 42 deletions(-)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index fe523d6..59fd1f5 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -372,7 +372,7 @@ static void set_registry_variables( HANDLE hkey, ULONG type ) * %SystemRoot% which are predefined. But Wine defines these in the * registry, so we need two passes. */ -static void set_registry_environment(void) +static BOOL set_registry_environment(void) { static const WCHAR env_keyW[] = {'M','a','c','h','i','n','e','\', 'S','y','s','t','e','m','\', @@ -385,6 +385,7 @@ static void set_registry_environment(void) OBJECT_ATTRIBUTES attr; UNICODE_STRING nameW; HANDLE hkey; + BOOL ret = FALSE;
attr.Length = sizeof(attr); attr.RootDirectory = 0; @@ -400,10 +401,11 @@ static void set_registry_environment(void) set_registry_variables( hkey, REG_SZ ); set_registry_variables( hkey, REG_EXPAND_SZ ); NtClose( hkey ); + ret = TRUE; }
/* then the ones for the current user */ - if (RtlOpenCurrentUser( KEY_ALL_ACCESS, &attr.RootDirectory ) != STATUS_SUCCESS) return; + if (RtlOpenCurrentUser( KEY_ALL_ACCESS, &attr.RootDirectory ) != STATUS_SUCCESS) return ret; RtlInitUnicodeString( &nameW, envW ); if (NtOpenKey( &hkey, KEY_ALL_ACCESS, &attr ) == STATUS_SUCCESS) { @@ -412,6 +414,7 @@ static void set_registry_environment(void) NtClose( hkey ); } NtClose( attr.RootDirectory ); + return ret; }
/*********************************************************************** @@ -731,45 +734,6 @@ static void init_windows_dirs(void)
/*********************************************************************** - * process_init - * - * Main process initialisation code - */ -static BOOL process_init(void) -{ - static const WCHAR kernel32W[] = {'k','e','r','n','e','l','3','2',0}; - PEB *peb = NtCurrentTeb()->Peb; - RTL_USER_PROCESS_PARAMETERS *params = peb->ProcessParameters; - - PTHREAD_Init(); - - setbuf(stdout,NULL); - setbuf(stderr,NULL); - - kernel32_handle = GetModuleHandleW(kernel32W); - - LOCALE_Init(); - - if (!params->Environment) - { - /* Copy the parent environment */ - if (!build_initial_environment( __wine_main_environ )) return FALSE; - - /* convert old configuration to new format */ - convert_old_config(); - - set_registry_environment(); - set_additional_environment(); - } - - init_windows_dirs(); - init_current_directory( ¶ms->CurrentDirectory ); - - return TRUE; -} - - -/*********************************************************************** * start_wineboot * * Start the wineboot process if necessary. Return the event to wait on. @@ -893,15 +857,41 @@ static void set_process_name( int argc, char *argv[] ) */ void __wine_kernel_init(void) { + static const WCHAR kernel32W[] = {'k','e','r','n','e','l','3','2',0}; static const WCHAR dotW[] = {'.',0}; static const WCHAR exeW[] = {'.','e','x','e',0};
WCHAR *p, main_exe_name[MAX_PATH+1]; PEB *peb = NtCurrentTeb()->Peb; + RTL_USER_PROCESS_PARAMETERS *params = peb->ProcessParameters; HANDLE boot_event = 0; + BOOL got_environment = TRUE;
/* Initialize everything */ - if (!process_init()) exit(1); + + PTHREAD_Init(); + + setbuf(stdout,NULL); + setbuf(stderr,NULL); + kernel32_handle = GetModuleHandleW(kernel32W); + + LOCALE_Init(); + + if (!params->Environment) + { + /* Copy the parent environment */ + if (!build_initial_environment( __wine_main_environ )) exit(1); + + /* convert old configuration to new format */ + convert_old_config(); + + got_environment = set_registry_environment(); + set_additional_environment(); + } + + init_windows_dirs(); + init_current_directory( ¶ms->CurrentDirectory ); + set_process_name( __wine_main_argc, __wine_main_argv ); set_library_wargv( __wine_main_argv );
@@ -954,6 +944,8 @@ void __wine_kernel_init(void) { if (WaitForSingleObject( boot_event, 30000 )) WARN( "boot event wait timed out\n" ); CloseHandle( boot_event ); + /* if we didn't find environment section, try again now that wineboot has run */ + if (!got_environment) set_registry_environment(); }
LdrInitializeThunk( 0, 0, 0, 0 );