Alexandre Julliard : server: Store the prefix 32/ 64 architecture in the registry files.
Alexandre Julliard
julliard at winehq.org
Wed May 5 11:08:34 CDT 2010
Module: wine
Branch: master
Commit: 58791c9acd762ac074e7a46dea2cc0bc632d84a8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=58791c9acd762ac074e7a46dea2cc0bc632d84a8
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue May 4 20:26:04 2010 +0200
server: Store the prefix 32/64 architecture in the registry files.
---
server/registry.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 50 insertions(+), 4 deletions(-)
diff --git a/server/registry.c b/server/registry.c
index f4dbf8e..e5c0da4 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -109,6 +109,7 @@ static struct key *root_key;
static const timeout_t ticks_1601_to_1970 = (timeout_t)86400 * (369 * 365 + 89) * TICKS_PER_SEC;
static const timeout_t save_period = 30 * -TICKS_PER_SEC; /* delay between periodic saves */
static struct timeout_user *save_timeout_user; /* saving timer */
+static enum prefix_type { PREFIX_UNKNOWN, PREFIX_32BIT, PREFIX_64BIT } prefix_type;
static const WCHAR root_name[] = { '\\','R','e','g','i','s','t','r','y','\\' };
static const WCHAR wow6432node[] = {'W','o','w','6','4','3','2','N','o','d','e'};
@@ -1305,6 +1306,35 @@ static struct key *load_key( struct key *base, const char *buffer,
return create_key_recursive( base, &name, modif );
}
+/* load a global option from the input file */
+static int load_global_option( const char *buffer, struct file_load_info *info )
+{
+ const char *p;
+
+ if (!strncmp( buffer, "#arch=", 6 ))
+ {
+ enum prefix_type type;
+ p = buffer + 6;
+ if (!strcmp( p, "win32" )) type = PREFIX_32BIT;
+ else if (!strcmp( p, "win64" )) type = PREFIX_64BIT;
+ else
+ {
+ file_read_error( "Unknown architecture", info );
+ set_error( STATUS_NOT_REGISTRY_FILE );
+ return 0;
+ }
+ if (prefix_type == PREFIX_UNKNOWN) prefix_type = type;
+ else if (type != prefix_type)
+ {
+ file_read_error( "Mismatched architecture", info );
+ set_error( STATUS_NOT_REGISTRY_FILE );
+ return 0;
+ }
+ }
+ /* ignore unknown options */
+ return 1;
+}
+
/* load a key option from the input file */
static int load_key_option( struct key *key, const char *buffer, struct file_load_info *info )
{
@@ -1525,6 +1555,7 @@ static void load_keys( struct key *key, const char *filename, FILE *f, int prefi
break;
case '#': /* option */
if (subkey) load_key_option( subkey, p, &info );
+ else if (!load_global_option( p, &info )) goto done;
break;
case ';': /* comment */
case 0: /* empty line */
@@ -1563,7 +1594,7 @@ static void load_registry( struct key *key, obj_handle_t handle )
}
/* load one of the initial registry files */
-static void load_init_registry_from_file( const char *filename, struct key *key )
+static int load_init_registry_from_file( const char *filename, struct key *key )
{
FILE *f;
@@ -1574,7 +1605,7 @@ static void load_init_registry_from_file( const char *filename, struct key *key
if (get_error() == STATUS_NOT_REGISTRY_FILE)
{
fprintf( stderr, "%s is not a valid registry file\n", filename );
- return;
+ return 1;
}
}
@@ -1583,6 +1614,7 @@ static void load_init_registry_from_file( const char *filename, struct key *key
save_branch_info[save_branch_count].path = filename;
save_branch_info[save_branch_count++].key = (struct key *)grab_object( key );
make_object_static( &key->obj );
+ return (f != NULL);
}
static WCHAR *format_user_registry_path( const SID *sid, struct unicode_str *path )
@@ -1639,7 +1671,10 @@ void init_registry(void)
if (!(hklm = create_key_recursive( root_key, &HKLM_name, current_time )))
fatal_error( "could not create Machine registry key\n" );
- load_init_registry_from_file( "system.reg", hklm );
+ if (!load_init_registry_from_file( "system.reg", hklm ))
+ prefix_type = sizeof(void *) > sizeof(int) ? PREFIX_64BIT : PREFIX_32BIT;
+ else if (prefix_type == PREFIX_UNKNOWN)
+ prefix_type = PREFIX_32BIT;
/* load userdef.reg into Registry\User\.Default */
@@ -1660,7 +1695,7 @@ void init_registry(void)
load_init_registry_from_file( "user.reg", hkcu );
/* set the shared flag on Software\Classes\Wow6432Node */
- if (sizeof(void *) > sizeof(int))
+ if (prefix_type == PREFIX_64BIT)
{
if ((key = create_key_recursive( hklm, &classes_name, current_time )))
{
@@ -1687,6 +1722,17 @@ static void save_all_subkeys( struct key *key, FILE *f )
fprintf( f, ";; All keys relative to " );
dump_path( key, NULL, f );
fprintf( f, "\n" );
+ switch (prefix_type)
+ {
+ case PREFIX_32BIT:
+ fprintf( f, "\n#arch=win32\n" );
+ break;
+ case PREFIX_64BIT:
+ fprintf( f, "\n#arch=win64\n" );
+ break;
+ default:
+ break;
+ }
save_subkeys( key, key, f );
}
More information about the wine-cvs
mailing list