Module: wine Branch: master Commit: e3c32904b27c14e2a9ecde973458f25441587534 URL: https://source.winehq.org/git/wine.git/?a=commit;h=e3c32904b27c14e2a9ecde973...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Jul 6 15:38:58 2022 +0200
server: Use the standard object name for registry keys.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
server/registry.c | 76 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 32 deletions(-)
diff --git a/server/registry.c b/server/registry.c index 3c5f72a699c..87e2f1c0835 100644 --- a/server/registry.c +++ b/server/registry.c @@ -78,10 +78,8 @@ struct type_descr key_type = struct key { struct object obj; /* object header */ - WCHAR *name; /* key name */ WCHAR *class; /* key class */ - unsigned short namelen; /* length of key name */ - unsigned short classlen; /* length of class name */ + data_size_t classlen; /* length of class name */ struct key *parent; /* parent key */ int last_subkey; /* last in use subkey */ int nb_subkeys; /* count of allocated subkeys */ @@ -167,6 +165,7 @@ static void key_dump( struct object *obj, int verbose ); static unsigned int key_map_access( struct object *obj, unsigned int access ); static struct security_descriptor *key_get_sd( struct object *obj ); static WCHAR *key_get_full_name( struct object *obj, data_size_t *len ); +static void key_unlink_name( struct object *obj, struct object_name *name ); static int key_close_handle( struct object *obj, struct process *process, obj_handle_t handle ); static void key_destroy( struct object *obj );
@@ -187,7 +186,7 @@ static const struct object_ops key_ops = key_get_full_name, /* get_full_name */ no_lookup_name, /* lookup_name */ no_link_name, /* link_name */ - NULL, /* unlink_name */ + key_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ key_close_handle, /* close_handle */ @@ -217,7 +216,7 @@ static void dump_path( const struct key *key, const struct key *base, FILE *f ) dump_path( key->parent, base, f ); fprintf( f, "\\" ); } - dump_strW( key->name, key->namelen, f, "[]" ); + dump_strW( key->obj.name->name, key->obj.name->len, f, "[]" ); }
/* dump a value to a text file */ @@ -412,21 +411,25 @@ static WCHAR *key_get_full_name( struct object *obj, data_size_t *ret_len ) return NULL; }
- for (key = (struct key *)obj; key != root_key; key = key->parent) len += key->namelen + sizeof(WCHAR); + for (key = (struct key *)obj; key != root_key; key = key->parent) len += key->obj.name->len + sizeof(WCHAR); if (!(ret = malloc( len ))) return NULL;
*ret_len = len; key = (struct key *)obj; for (key = (struct key *)obj; key != root_key; key = key->parent) { - memcpy( ret + len - key->namelen, key->name, key->namelen ); - len -= key->namelen + sizeof(WCHAR); + memcpy( ret + len - key->obj.name->len, key->obj.name->name, key->obj.name->len ); + len -= key->obj.name->len + sizeof(WCHAR); memcpy( ret + len, &backslash, sizeof(WCHAR) ); } memcpy( ret, root_name, sizeof(root_name) - sizeof(WCHAR) ); return (WCHAR *)ret; }
+static void key_unlink_name( struct object *obj, struct object_name *name ) +{ +} + /* close the notification associated with a handle */ static int key_close_handle( struct object *obj, struct process *process, obj_handle_t handle ) { @@ -443,7 +446,6 @@ static void key_destroy( struct object *obj ) struct key *key = (struct key *)obj; assert( obj->ops == &key_ops );
- free( key->name ); free( key->class ); for (i = 0; i <= key->last_value; i++) { @@ -508,12 +510,16 @@ static struct unicode_str *get_path_token( const struct unicode_str *path, struc /* allocate a key object */ static struct key *alloc_key( const struct unicode_str *name, timeout_t modif ) { + struct object_name *name_ptr; struct key *key; + + if (!(name_ptr = mem_alloc( offsetof( struct object_name, name[name->len / sizeof(WCHAR)] )))) + return NULL; + if ((key = alloc_object( &key_ops ))) { - key->name = NULL; + key->obj.name = name_ptr; key->class = NULL; - key->namelen = name->len; key->classlen = 0; key->flags = 0; key->last_subkey = -1; @@ -526,12 +532,13 @@ static struct key *alloc_key( const struct unicode_str *name, timeout_t modif ) key->modif = modif; key->parent = NULL; list_init( &key->notify_list ); - if (name->len && !(key->name = memdup( name->str, name->len ))) - { - release_object( key ); - key = NULL; - } + + name_ptr->obj = &key->obj; + name_ptr->len = name->len; + name_ptr->parent = NULL; + memcpy( name_ptr->name, name->str, name->len ); } + else free( name_ptr ); return key; }
@@ -632,7 +639,8 @@ static struct key *alloc_subkey( struct key *parent, const struct unicode_str *n for (i = ++parent->last_subkey; i > index; i--) parent->subkeys[i] = parent->subkeys[i-1]; parent->subkeys[index] = key; - if (is_wow6432node( key->name, key->namelen ) && !is_wow6432node( parent->name, parent->namelen )) + if (is_wow6432node( key->obj.name->name, key->obj.name->len ) && + !is_wow6432node( parent->obj.name->name, parent->obj.name->len )) parent->wow6432node = key; } return key; @@ -679,9 +687,9 @@ static struct key *find_subkey( const struct key *key, const struct unicode_str while (min <= max) { i = (min + max) / 2; - len = min( key->subkeys[i]->namelen, name->len ); - res = memicmp_strW( key->subkeys[i]->name, name->str, len ); - if (!res) res = key->subkeys[i]->namelen - name->len; + len = min( key->subkeys[i]->obj.name->len, name->len ); + res = memicmp_strW( key->subkeys[i]->obj.name->name, name->str, len ); + if (!res) res = key->subkeys[i]->obj.name->len - name->len; if (!res) { *index = i; @@ -929,7 +937,7 @@ static void enum_key( struct key *key, int index, int info_class, struct enum_ke key = key->subkeys[index]; }
- namelen = key->namelen; + namelen = key->obj.name->len; classlen = key->classlen;
switch(info_class) @@ -950,7 +958,7 @@ static void enum_key( struct key *key, int index, int info_class, struct enum_ke case KeyCachedInformation: for (i = 0; i <= key->last_subkey; i++) { - if (key->subkeys[i]->namelen > max_subkey) max_subkey = key->subkeys[i]->namelen; + if (key->subkeys[i]->obj.name->len > max_subkey) max_subkey = key->subkeys[i]->obj.name->len; if (key->subkeys[i]->classlen > max_class) max_class = key->subkeys[i]->classlen; } for (i = 0; i <= key->last_value; i++) @@ -982,7 +990,7 @@ static void enum_key( struct key *key, int index, int info_class, struct enum_ke if (len > namelen) { reply->namelen = namelen; - memcpy( data, key->name, namelen ); + memcpy( data, key->obj.name->name, namelen ); memcpy( data + namelen, key->class, len - namelen ); } else if (info_class == KeyNameInformation) @@ -993,7 +1001,7 @@ static void enum_key( struct key *key, int index, int info_class, struct enum_ke else { reply->namelen = len; - memcpy( data, key->name, len ); + memcpy( data, key->obj.name->name, len ); } } free( fullname ); @@ -1004,9 +1012,9 @@ static void enum_key( struct key *key, int index, int info_class, struct enum_ke static int rename_key( struct key *key, const struct unicode_str *new_name ) { struct unicode_str token, name; + struct object_name *new_name_ptr; struct key *subkey; int i, index, cur_index; - WCHAR *ptr;
token.str = NULL;
@@ -1030,11 +1038,16 @@ static int rename_key( struct key *key, const struct unicode_str *new_name ) return -1; }
+ if (!(new_name_ptr = mem_alloc( offsetof( struct object_name, name[new_name->len / sizeof(WCHAR)] )))) + return -1;
- if (!(ptr = memdup( new_name->str, new_name->len ))) return -1; + new_name_ptr->obj = &key->obj; + new_name_ptr->len = new_name->len; + new_name_ptr->parent = NULL; + memcpy( new_name_ptr->name, new_name->str, new_name->len );
- name.str = key->name; - name.len = key->namelen; + name.str = key->obj.name->name; + name.len = key->obj.name->len; find_subkey( key->parent, &name, &cur_index );
if (cur_index < index && (index - cur_index) > 1) @@ -1050,9 +1063,8 @@ static int rename_key( struct key *key, const struct unicode_str *new_name ) } key->parent->subkeys[index] = key;
- free( key->name ); - key->name = ptr; - key->namelen = new_name->len; + free( key->obj.name ); + key->obj.name = new_name_ptr;
if (debug_level > 1) dump_operation( key, NULL, "Rename" ); make_dirty( key ); @@ -1722,7 +1734,7 @@ static int get_prefix_len( struct key *key, const char *name, struct file_load_i len = (p - info->tmp) * sizeof(WCHAR); for (res = 1; key != root_key; res++) { - if (len == key->namelen && !memicmp_strW( info->tmp, key->name, len )) break; + if (len == key->obj.name->len && !memicmp_strW( info->tmp, key->obj.name->name, len )) break; key = key->parent; } if (key == root_key) res = 0; /* no matching name */