Implement RegFlushKey

Mike Hearn mike at theoretic.com
Sat Dec 27 05:54:02 CST 2003


This implementation is a little inefficient but without using a random
access binary db as Windows does (which I am not going to advocate) it's
the best we can do.

Mike Hearn <mike at theoretic.com>
Implement RegFlushKey, NtRegFlushKey

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