Implement RegFlushKey

Mike Hearn mike at theoretic.com
Tue Dec 23 11:00:20 CST 2003


The sheer amount of spew from these fixmes during IE 6 setup was
annoying me.

This is not the most efficient implementation possible as we write out
the whole registry save branch each time, but it's not possible with our
current format (or not easy) to only write a specific key.

ChangeLog:
Implement RegFlushKey and NtFlushKey

Index: dlls/advapi32/registry.c
===================================================================
RCS file: /home/wine/wine/dlls/advapi32/registry.c,v
retrieving revision 1.58
diff -u -r1.58 registry.c
--- dlls/advapi32/registry.c	13 Dec 2003 01:34:40 -0000	1.58
+++ dlls/advapi32/registry.c	23 Dec 2003 16:50:45 -0000
@@ -1831,8 +1831,10 @@
  */
 DWORD WINAPI RegFlushKey( HKEY hkey )
 {
-    FIXME( "(%p): stub\n", hkey );
-    return ERROR_SUCCESS;
+    hkey = get_special_root_hkey( hkey );
+    if (!hkey) return ERROR_INVALID_HANDLE;
+
+    return RtlNtStatusToDosError( NtFlushKey( hkey ) );
 }
 
 
Index: dlls/kernel/vxd.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/vxd.c,v
retrieving revision 1.5
diff -u -r1.5 vxd.c
--- dlls/kernel/vxd.c	8 Dec 2003 21:58:55 -0000	1.5
+++ dlls/kernel/vxd.c	23 Dec 2003 16:50:53 -0000
@@ -306,6 +306,14 @@
     return RtlNtStatusToDosError( NtClose( hkey ) );
 }
 
+/******************************************************************************
+ *           VMM_RegFlushKey
+ */
+static DWORD VMM_RegFlushKey( HKEY hkey )
+{
+    return RtlNtStatusToDosError( NtFlushKey( hkey ) );
+}
+
 
 /******************************************************************************
  *           VMM_RegDeleteKeyA
@@ -805,8 +813,7 @@
     case 0x001C:  /* RegFlushKey */
     {
         HKEY hkey = (HKEY)stack32_pop( context );
-        FIXME( "RegFlushKey(%p): stub\n", hkey );
-        return ERROR_SUCCESS;
+        return VMM_RegFlushKey( hkey );
     }
 
     case 0x001D:  /* RegQueryInfoKey */
Index: dlls/ntdll/reg.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/reg.c,v
retrieving revision 1.46
diff -u -r1.46 reg.c
--- dlls/ntdll/reg.c	4 Dec 2003 20:52:12 -0000	1.46
+++ dlls/ntdll/reg.c	23 Dec 2003 16:51:00 -0000
@@ -542,11 +542,20 @@
  *  NtFlushKey	[NTDLL.@]
  *  ZwFlushKey  [NTDLL.@]
  */
-NTSTATUS WINAPI NtFlushKey(HKEY KeyHandle)
+NTSTATUS WINAPI NtFlushKey(HKEY key)
 {
-	FIXME("(%p) stub!\n",
-	KeyHandle);
-	return 1;
+    NTSTATUS ret;
+
+    TRACE("key=%p\n", key);
+
+    SERVER_START_REQ( flush_key )
+    {
+	req->hkey = key;
+	ret = wine_server_call( req );
+    }
+    SERVER_END_REQ;
+    
+    return ret;
 }
 
 /******************************************************************************
Index: server/protocol.def
===================================================================
RCS file: /home/wine/wine/server/protocol.def,v
retrieving revision 1.91
diff -u -r1.91 protocol.def
--- server/protocol.def	11 Dec 2003 05:34:53 -0000	1.91
+++ server/protocol.def	23 Dec 2003 16:51:33 -0000
@@ -1294,6 +1294,11 @@
     obj_handle_t hkey;         /* handle to the key */
 @END
 
+/* Flush a registry key */
+ at REQ(flush_key)
+    obj_handle_t hkey;         /* handle to the key */
+ at END
+
 
 /* Enumerate registry subkeys */
 @REQ(enum_key)
Index: server/registry.c
===================================================================
RCS file: /home/wine/wine/server/registry.c,v
retrieving revision 1.54
diff -u -r1.54 registry.c
--- server/registry.c	1 Oct 2003 03:32:16 -0000	1.54
+++ server/registry.c	23 Dec 2003 16:51:37 -0000
@@ -1707,6 +1707,31 @@
     release_object( root_key );
 }
 
+/* ensure a key has been written out to disk */
+DECL_HANDLER(flush_key)
+{
+    struct key *key;
+    
+    key = get_hkey_obj( req->hkey, 0 );
+    if (key) {
+	int i;
+
+	/* locate the save branch this key belongs to, then write it out - this is the best we can do for now */
+	struct key *k = key;
+	while (k->parent) {
+	    for (i = 0; i < save_branch_count; i++) {
+		if (k == save_branch_info[i].key) {
+		    save_branch( k, save_branch_info[i].path );
+		    release_object( key );
+		    return;
+		}
+	    }
+	    k = k->parent;
+	}
+	
+	release_object( key );
+    }
+}
 
 /* create a registry key */
 DECL_HANDLER(create_key)





More information about the wine-patches mailing list