From 7bf36ad35dda45d5e6b192fe2b83605134bb0129 Mon Sep 17 00:00:00 2001 From: Nathaniel Date: Sun, 24 Oct 1999 19:35:47 +0000 Subject: [PATCH] Improved registry isolation possibilities. --- misc/registry.c | 342 ++++++++++++++++++++++++------------------------ wine.ini | 20 ++- 2 files changed, 187 insertions(+), 175 deletions(-) diff --git a/misc/registry.c b/misc/registry.c index fc3fd31ddc..29a69fdf4c 100644 --- a/misc/registry.c +++ b/misc/registry.c @@ -753,114 +753,111 @@ static void SHELL_SaveRegistryBranch(HKEY hkey, int all) { char *fn, *home, *tmp; + /* Find out what to save to, get from config file */ + BOOL writeToHome = PROFILE_GetWineIniBool("registry","WritetoHomeRegistries",1); + BOOL writeToAlt = PROFILE_GetWineIniBool("registry","WritetoAltRegistries",1); + /* FIXME: does this check apply to all keys written below ? */ if (!(home = getenv( "HOME" ))) - { ERR_(reg)("Failed to get homedirectory of UID %ld.\n",(long) getuid()); - return; - } - /* HKEY_LOCAL_MACHINE contains the HKEY_CLASSES_ROOT branch */ - if (hkey == HKEY_CLASSES_ROOT) - hkey = HKEY_LOCAL_MACHINE; + /* HKEY_LOCAL_MACHINE contains the HKEY_CLASSES_ROOT branch */ + if (hkey == HKEY_CLASSES_ROOT) hkey = HKEY_LOCAL_MACHINE; - switch (hkey) + switch (hkey) { - case HKEY_CURRENT_USER: - { - int usedCfgUser = 0; + case HKEY_CURRENT_USER: + fn = xmalloc( MAX_PATHNAME_LEN ); + if (writeToAlt && PROFILE_GetWineIniString( "registry", "AltCurrentUserFile", "", + fn, MAX_PATHNAME_LEN - 1)) + _savereg(lookup_hkey(HKEY_CURRENT_USER),fn,all); + free (fn); - fn = xmalloc( MAX_PATHNAME_LEN ); - if (PROFILE_GetWineIniString ( "Registry", "UserFileName", "", - fn, MAX_PATHNAME_LEN - 1)) - { - _savereg(lookup_hkey(HKEY_CURRENT_USER),fn,all); - usedCfgUser = 1; - } - free (fn); - - if (usedCfgUser != 1) - { - fn=(char*)xmalloc( strlen(home) + strlen(WINE_PREFIX) + - strlen(SAVE_CURRENT_USER) + 2 ); - strcpy(fn,home); - strcat(fn,WINE_PREFIX); + if (home && writeToHome) + { + fn=(char*)xmalloc( strlen(home) + strlen(WINE_PREFIX) + + strlen(SAVE_CURRENT_USER) + 2 ); + strcpy(fn,home); + strcat(fn,WINE_PREFIX); - /* create the directory. don't care about errorcodes. */ - mkdir(fn,0755); /* drwxr-xr-x */ - strcat(fn,"/"SAVE_CURRENT_USER); + /* create the directory. don't care about errorcodes. */ + mkdir(fn,0755); /* drwxr-xr-x */ + strcat(fn,"/"SAVE_CURRENT_USER); - tmp = (char*)xmalloc(strlen(fn)+strlen(".tmp")+1); - strcpy(tmp,fn); - strcat(tmp,".tmp"); + tmp = (char*)xmalloc(strlen(fn)+strlen(".tmp")+1); + strcpy(tmp,fn); + strcat(tmp,".tmp"); - if (_savereg(lookup_hkey(HKEY_CURRENT_USER),tmp,all)) { - if (-1==rename(tmp,fn)) { - perror("rename tmp registry"); - unlink(tmp); + if (_savereg(lookup_hkey(HKEY_CURRENT_USER),tmp,all)) { + if (-1==rename(tmp,fn)) { + perror("rename tmp registry"); + unlink(tmp); + } } + free(tmp); + free(fn); } - free(tmp); - free(fn); - } - } - break; - case HKEY_LOCAL_MACHINE: - { - int usedCfgLM = 0; - /* Try first saving according to the defined location in .winerc */ - fn = xmalloc ( MAX_PATHNAME_LEN); - if (PROFILE_GetWineIniString ( "Registry", - "LocalMachineFileName", "", fn, MAX_PATHNAME_LEN - 1)) - { - _savereg(lookup_hkey(HKEY_LOCAL_MACHINE), fn, all); - usedCfgLM = 1; - } - free (fn); + break; + case HKEY_LOCAL_MACHINE: + /* Try first saving according to the defined location in .winerc */ + fn = xmalloc ( MAX_PATHNAME_LEN); + if (writeToAlt && PROFILE_GetWineIniString( "Registry", "AltLocalMachineFile", "", + fn, MAX_PATHNAME_LEN - 1)) + _savereg(lookup_hkey(HKEY_LOCAL_MACHINE), fn, all); + free (fn); - if ( usedCfgLM != 1) - { - fn=(char*)xmalloc( strlen(home) + strlen(WINE_PREFIX) + - strlen(SAVE_LOCAL_MACHINE) + 2); - strcpy(fn,home); - strcat(fn,WINE_PREFIX"/"SAVE_LOCAL_MACHINE); + if (home && writeToHome) + { + fn=(char*)xmalloc( strlen(home) + strlen(WINE_PREFIX) + + strlen(SAVE_LOCAL_MACHINE) + 2); + strcpy(fn,home); + strcat(fn,WINE_PREFIX"/"SAVE_LOCAL_MACHINE); - tmp = (char*)xmalloc(strlen(fn)+strlen(".tmp")+1); - strcpy(tmp,fn); - strcat(tmp,".tmp"); + tmp = (char*)xmalloc(strlen(fn)+strlen(".tmp")+1); + strcpy(tmp,fn); + strcat(tmp,".tmp"); - if (_savereg(lookup_hkey(HKEY_LOCAL_MACHINE),tmp,all)) { - if (-1==rename(tmp,fn)) { - perror("rename tmp registry"); - unlink(tmp); + if (_savereg(lookup_hkey(HKEY_LOCAL_MACHINE),tmp,all)) { + if (-1==rename(tmp,fn)) { + perror("rename tmp registry"); + unlink(tmp); + } } + free(tmp); + free(fn); } - free(tmp); - free(fn); - } - } - break; - case HKEY_USERS: - fn=(char*)xmalloc( strlen(home) + strlen(WINE_PREFIX) + - strlen(SAVE_LOCAL_USERS_DEFAULT) + 2); + break; + case HKEY_USERS: + fn = xmalloc( MAX_PATHNAME_LEN ); + if (writeToAlt && PROFILE_GetWineIniString( "Registry", "AltUserFile", "", + fn, MAX_PATHNAME_LEN - 1)) + _savereg(lookup_hkey(HKEY_LOCAL_MACHINE), fn, all); + free (fn); - strcpy(fn,home); - strcat(fn,WINE_PREFIX"/"SAVE_LOCAL_USERS_DEFAULT); + if (home && writeToHome) + { + fn=(char*)xmalloc( strlen(home) + strlen(WINE_PREFIX) + + strlen(SAVE_LOCAL_USERS_DEFAULT) + 2); + strcpy(fn,home); + strcat(fn,WINE_PREFIX"/"SAVE_LOCAL_USERS_DEFAULT); - tmp = (char*)xmalloc(strlen(fn)+strlen(".tmp")+1); - strcpy(tmp,fn);strcat(tmp,".tmp"); - if ( _savereg(lookup_hkey(HKEY_USERS),tmp,FALSE)) { - if (-1==rename(tmp,fn)) { - perror("rename tmp registry"); - unlink(tmp); + tmp = (char*)xmalloc(strlen(fn)+strlen(".tmp")+1); + strcpy(tmp,fn); + strcat(tmp,".tmp"); + if ( _savereg(lookup_hkey(HKEY_USERS),tmp,FALSE)) { + if (-1==rename(tmp,fn)) { + perror("rename tmp registry"); + unlink(tmp); + } + } + free(tmp); + free(fn); } + break; + default: + ERR_(reg)("unknown/invalid key handle !\n"); + break; } - free(tmp); - free(fn); - break; - default: - ERR_(reg)("unknown/invalid key handle !\n"); - } } @@ -1958,108 +1955,111 @@ void SHELL_LoadRegistry( void ) HKU = lookup_hkey(HKEY_USERS); HKLM = lookup_hkey(HKEY_LOCAL_MACHINE); - /* Load windows 3.1 entries */ - _w31_loadreg(); - /* Load windows 95 entries */ - _w95_loadreg("C:\\system.1st", HKLM); - _w95_loadreg("system.dat", HKLM); - _w95_loadreg("user.dat", HKU); + if (PROFILE_GetWineIniBool ("registry", "LoadWindowsRegistryFiles", 1)) + { + /* Load windows 3.1 entries */ + _w31_loadreg(); + /* Load windows 95 entries */ + _w95_loadreg("C:\\system.1st", HKLM); + _w95_loadreg("system.dat", HKLM); + _w95_loadreg("user.dat", HKU); + } - /* - * Load the global HKU hive directly from sysconfdir - */ - _wine_loadreg( HKU, SAVE_USERS_DEFAULT, 0); + if (PROFILE_GetWineIniBool ("registry","LoadGlobalRegistryFiles", 1)) + { + /* + * Load the global HKU hive directly from sysconfdir + */ + _wine_loadreg( HKU, SAVE_USERS_DEFAULT, 0); - /* - * Load the global machine defaults directly form sysconfdir - */ - _wine_loadreg( HKLM, SAVE_LOCAL_MACHINE_DEFAULT, 0); + /* + * Load the global machine defaults directly form sysconfdir + */ + _wine_loadreg( HKLM, SAVE_LOCAL_MACHINE_DEFAULT, 0); + } /* * Load the user saved registries */ - if ((home = getenv( "HOME" ))) + if (!(home = getenv( "HOME" ))) + WARN_(reg)("Failed to get homedirectory of UID %ld.\n",(long) getuid()); + else if (PROFILE_GetWineIniBool("registry", "LoadHomeRegistryFiles", 0)) { - /* - * Load user's personal versions of global HKU/.Default keys - */ - fn=(char*)xmalloc( - strlen(home)+ - strlen(WINE_PREFIX)+ - strlen(SAVE_LOCAL_USERS_DEFAULT)+2); + /* + * Load user's personal versions of global HKU/.Default keys + */ + fn=(char*)xmalloc( strlen(home)+ strlen(WINE_PREFIX) + + strlen(SAVE_LOCAL_USERS_DEFAULT)+2); + strcpy(fn, home); + strcat(fn, WINE_PREFIX"/"SAVE_LOCAL_USERS_DEFAULT); + _wine_loadreg(HKU, fn, REG_OPTION_TAINTED); + free(fn); - strcpy(fn, home); - strcat(fn, WINE_PREFIX"/"SAVE_LOCAL_USERS_DEFAULT); - _wine_loadreg(HKU, fn, REG_OPTION_TAINTED); - free(fn); + fn=(char*)xmalloc( strlen(home) + strlen(WINE_PREFIX) + strlen(SAVE_CURRENT_USER)+2); + strcpy(fn, home); + strcat(fn, WINE_PREFIX"/"SAVE_CURRENT_USER); + _wine_loadreg(HKCU, fn, REG_OPTION_TAINTED); + free(fn); - /* - * Load HKCU, attempt to get the registry location from the config - * file first, if exist, load and keep going. - */ - fn = xmalloc( MAX_PATHNAME_LEN ); - if ( PROFILE_GetWineIniString( - "Registry", - "UserFileName", - "", - fn, - MAX_PATHNAME_LEN - 1)) - { - _wine_loadreg(HKCU,fn,0); - } - free (fn); - - fn=(char*)xmalloc( - strlen(home)+ - strlen(WINE_PREFIX)+ - strlen(SAVE_CURRENT_USER)+2); - - strcpy(fn, home); - strcat(fn, WINE_PREFIX"/"SAVE_CURRENT_USER); - _wine_loadreg(HKCU, fn, REG_OPTION_TAINTED); - free(fn); - - /* - * Load HKLM, attempt to get the registry location from the config - * file first, if exist, load and keep going. - */ - fn = xmalloc ( MAX_PATHNAME_LEN); - if ( PROFILE_GetWineIniString( - "Registry", - "LocalMachineFileName", - "", - fn, - MAX_PATHNAME_LEN - 1)) - { - _wine_loadreg(HKLM, fn, 0); - } - free(fn); - - fn=(char*)xmalloc( - strlen(home)+ - strlen(WINE_PREFIX)+ - strlen(SAVE_LOCAL_MACHINE)+2); - - strcpy(fn,home); - strcat(fn,WINE_PREFIX"/"SAVE_LOCAL_MACHINE); - _wine_loadreg(HKLM, fn, REG_OPTION_TAINTED); - free(fn); + /* + * Load HKLM, attempt to get the registry location from the config + * file first, if exist, load and keep going. + */ + fn=(char*)xmalloc( strlen(home)+ strlen(WINE_PREFIX)+ strlen(SAVE_LOCAL_MACHINE)+2); + strcpy(fn,home); + strcat(fn,WINE_PREFIX"/"SAVE_LOCAL_MACHINE); + _wine_loadreg(HKLM, fn, REG_OPTION_TAINTED); + free(fn); } - else + + /* + * Load HKCU, get the registry location from the config + * file, if exist, load and keep going. + */ + if (PROFILE_GetWineIniBool ( "registry", "LoadAltRegistryFiles", 1)) { - WARN_(reg)("Failed to get homedirectory of UID %ld.\n",(long) getuid()); - } - + fn = xmalloc( MAX_PATHNAME_LEN ); + if ( PROFILE_GetWineIniString( "registry", "AltCurrentUserFile", "", + fn, MAX_PATHNAME_LEN - 1)) + { + _wine_loadreg(HKCU,fn,REG_OPTION_TAINTED); + } + free (fn); + /* + * Load HKU, get the registry location from the config + * file, if exist, load and keep going. + */ + fn = xmalloc ( MAX_PATHNAME_LEN ); + if ( PROFILE_GetWineIniString ( "registry", "AltUserFile", "", + fn, MAX_PATHNAME_LEN - 1)) + { + _wine_loadreg(HKU,fn,REG_OPTION_TAINTED); + } + free (fn); + /* + * Load HKLM, get the registry location from the config + * file, if exist, load and keep going. + */ + fn = xmalloc ( MAX_PATHNAME_LEN ); + if (PROFILE_GetWineIniString ( "registry", "AltLocalMachineFile", "", + fn, MAX_PATHNAME_LEN - 1)) + { + _wine_loadreg(HKLM,fn,REG_OPTION_TAINTED); + } + free (fn); + } + /* * Obtain the handle of the HKU\.Default key. * in order to copy HKU\.Default\* onto HKEY_CURRENT_USER */ RegCreateKey16(HKEY_USERS,".Default",&hkey); lpkey = lookup_hkey(hkey); - if(!lpkey) + if(!lpkey){ WARN_(reg)("Could not create global user default key\n"); - else + } else { _copy_registry(lpkey, HKCU ); + } RegCloseKey(hkey); @@ -2074,7 +2074,7 @@ void SHELL_LoadRegistry( void ) _flush_registry(HKU); /* Reload user's local HKU hive */ - if (home) + if (home && PROFILE_GetWineIniBool ("registry","LoadHomeRegistryFiles",1)) { fn=(char*)xmalloc( strlen(home) + strlen(WINE_PREFIX) + strlen(SAVE_LOCAL_USERS_DEFAULT) + 2); diff --git a/wine.ini b/wine.ini index 3630df793f..a995dc8a8a 100644 --- a/wine.ini +++ b/wine.ini @@ -125,13 +125,25 @@ LPT3:=/dev/lp3 [spy] Exclude=WM_SIZE;WM_TIMER; -[Registry] +[registry] ; Paths must be given in /dir/dir/file.reg format. ; Wine will not understand dos file names here... -;UserFileName=xxx ; alternate registry file name (user.reg) -;LocalMachineFileName=xxx ; (system.reg) - +AltCurrentUserFile= ; alternate registry file name: HKCU +AltUserFile= ; alternate registry file name: HKU +AltLocalMachineFile= ; alternate registry file name: HKLM + +;These are all booleans. Y/y/T/t/1 are true, N/n/F/f/0 are false. +;Defaults are read all, write to Home and Alt +;Note: it is pointless to specify alt files and neither load nor write to them. + +LoadGlobalRegistryFiles=Y ; Global registries (stored in /etc) +LoadHomeRegistryFiles=Y ; Home registries (stored in ~user/.wine/) +LoadWindowsRegistryFiles=Y ; Windows registries in windows path, above +LoadAltRegistryFiles=Y ; Load above registries. +WritetoHomeRegitsryFiles=Y ; TRY to write all changes to home registries +WritetoAltRegistryFiles=Y ; TRY to write all changes to alt registries + [Tweak.Layout] ;; WineLook=xxx (supported styles are 'Win31'(default), 'Win95', 'Win98') ;WineLook=Win95