advapi32: Implemented RegOverridePredefKey.
authorAlexandre Julliard <julliard@winehq.org>
Tue, 11 Mar 2008 18:48:57 +0000 (19:48 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Tue, 11 Mar 2008 18:48:57 +0000 (19:48 +0100)
dlls/advapi32/advapi32.spec
dlls/advapi32/registry.c
include/winreg.h

index 17dac6db7957c1ffecf94a95699a42e2d3faa379..38ae79358d6c13e3365c1adfaddb95ef921de0f6 100644 (file)
 @ stdcall RegOpenKeyExW(long wstr long long ptr)
 @ stdcall RegOpenKeyW(long wstr ptr)
 @ stdcall RegOpenUserClassesRoot(ptr long long ptr)
-@ stub RegOverridePredefKey
+@ stdcall RegOverridePredefKey(long long)
 @ stdcall RegQueryInfoKeyA(long ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr)
 @ stdcall RegQueryInfoKeyW(long ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr)
 @ stdcall RegQueryMultipleValuesA(long ptr long ptr ptr)
index 40994fce79c4f7dee228240fbb51f67f5afc7bb7..9ce3da06330d9153adfbf98c296b1db1d3790d78 100644 (file)
@@ -149,6 +149,32 @@ static inline HKEY get_special_root_hkey( HKEY hkey )
 }
 
 
+/******************************************************************************
+ * RegOverridePredefKey   [ADVAPI32.@]
+ */
+LSTATUS WINAPI RegOverridePredefKey( HKEY hkey, HKEY override )
+{
+    HKEY old_key;
+    int idx;
+
+    if ((hkey < HKEY_SPECIAL_ROOT_FIRST) || (hkey > HKEY_SPECIAL_ROOT_LAST))
+        return ERROR_INVALID_PARAMETER;
+    idx = (UINT_PTR)hkey - (UINT_PTR)HKEY_SPECIAL_ROOT_FIRST;
+
+    if (override)
+    {
+        NTSTATUS status = NtDuplicateObject( GetCurrentProcess(), override,
+                                             GetCurrentProcess(), (HANDLE *)&override,
+                                             0, 0, DUPLICATE_SAME_ACCESS );
+        if (status) return RtlNtStatusToDosError( status );
+    }
+
+    old_key = InterlockedExchangePointer( (void **)&special_root_keys[idx], override );
+    if (old_key) NtClose( old_key );
+    return ERROR_SUCCESS;
+}
+
+
 /******************************************************************************
  * RegCreateKeyExW   [ADVAPI32.@]
  *
index 542525908f8bd5b6a515c948a35dcc360395a896..c0243693947d5ebe1da220a25ee14ec6bfab294d 100644 (file)
@@ -143,6 +143,7 @@ WINADVAPI LSTATUS   WINAPI RegOpenKeyExW(HKEY,LPCWSTR,DWORD,REGSAM,PHKEY);
 WINADVAPI LSTATUS   WINAPI RegOpenKeyExA(HKEY,LPCSTR,DWORD,REGSAM,PHKEY);
 #define                    RegOpenKeyEx WINELIB_NAME_AW(RegOpenKeyEx)
 WINADVAPI LSTATUS   WINAPI RegOpenUserClassesRoot(HANDLE,DWORD,REGSAM,PHKEY);
+WINADVAPI LSTATUS   WINAPI RegOverridePredefKey(HKEY,HKEY);
 WINADVAPI LSTATUS   WINAPI RegQueryInfoKeyW(HKEY,LPWSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPFILETIME);
 WINADVAPI LSTATUS   WINAPI RegQueryInfoKeyA(HKEY,LPSTR,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPFILETIME);
 #define                    RegQueryInfoKey WINELIB_NAME_AW(RegQueryInfoKey)