Alexandre Julliard : server: Add a helper function for the common functionality between open_key and create_key .
Alexandre Julliard
julliard at winehq.org
Fri Mar 5 09:42:54 CST 2010
Module: wine
Branch: master
Commit: 606cc0614840459be900628e48be3638cc40a781
URL: http://source.winehq.org/git/wine.git/?a=commit;h=606cc0614840459be900628e48be3638cc40a781
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Mar 4 20:46:42 2010 +0100
server: Add a helper function for the common functionality between open_key and create_key.
---
server/registry.c | 66 +++++++++++++++++++++++++----------------------------
1 files changed, 31 insertions(+), 35 deletions(-)
diff --git a/server/registry.c b/server/registry.c
index ad57bd2..c342603 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -643,33 +643,45 @@ static struct key *follow_symlink( struct key *key, int iteration )
return key;
}
-/* open a subkey */
-static struct key *open_key( struct key *key, const struct unicode_str *name, unsigned int access,
- unsigned int attributes )
+/* open a key until we find an element that doesn't exist */
+/* helper for open_key and create_key */
+static struct key *open_key_prefix( struct key *key, const struct unicode_str *name,
+ unsigned int access, struct unicode_str *token, int *index )
{
- int index;
- struct unicode_str token;
-
- token.str = NULL;
- if (!get_path_token( name, &token )) return NULL;
- if (access & KEY_WOW64_32KEY) key = find_wow64_subkey( key, &token );
- while (token.len)
+ token->str = NULL;
+ if (!get_path_token( name, token )) return NULL;
+ if (access & KEY_WOW64_32KEY) key = find_wow64_subkey( key, token );
+ while (token->len)
{
- if (!(key = find_subkey( key, &token, &index )))
- {
- set_error( STATUS_OBJECT_NAME_NOT_FOUND );
- return NULL;
- }
- get_path_token( name, &token );
- if (!token.len) break;
- if (!(access & KEY_WOW64_64KEY)) key = find_wow64_subkey( key, &token );
+ struct key *subkey;
+ if (!(subkey = find_subkey( key, token, index ))) break;
+ key = subkey;
+ get_path_token( name, token );
+ if (!token->len) break;
+ if (!(access & KEY_WOW64_64KEY)) key = find_wow64_subkey( key, token );
if (!(key = follow_symlink( key, 0 )))
{
set_error( STATUS_OBJECT_NAME_NOT_FOUND );
return NULL;
}
}
+ return key;
+}
+/* open a subkey */
+static struct key *open_key( struct key *key, const struct unicode_str *name, unsigned int access,
+ unsigned int attributes )
+{
+ int index;
+ struct unicode_str token;
+
+ if (!(key = open_key_prefix( key, name, access, &token, &index ))) return NULL;
+
+ if (token.len)
+ {
+ set_error( STATUS_OBJECT_NAME_NOT_FOUND );
+ return NULL;
+ }
if (!(access & KEY_WOW64_64KEY)) key = find_wow64_subkey( key, &token );
if (!(attributes & OBJ_OPENLINK) && !(key = follow_symlink( key, 0 )))
{
@@ -695,24 +707,8 @@ static struct key *create_key( struct key *key, const struct unicode_str *name,
return NULL;
}
- token.str = NULL;
- if (!get_path_token( name, &token )) return NULL;
*created = 0;
- if (access & KEY_WOW64_32KEY) key = find_wow64_subkey( key, &token );
- while (token.len)
- {
- struct key *subkey;
- if (!(subkey = find_subkey( key, &token, &index ))) break;
- key = subkey;
- get_path_token( name, &token );
- if (!token.len) break;
- if (!(access & KEY_WOW64_64KEY)) key = find_wow64_subkey( key, &token );
- if (!(key = follow_symlink( key, 0 )))
- {
- set_error( STATUS_OBJECT_NAME_NOT_FOUND );
- return NULL;
- }
- }
+ if (!(key = open_key_prefix( key, name, access, &token, &index ))) return NULL;
if (!token.len) /* the key already exists */
{
More information about the wine-cvs
mailing list