Alexandre Julliard : advapi32: Implemented RegOverridePredefKey.
Alexandre Julliard
julliard at winehq.org
Wed Mar 12 06:44:11 CDT 2008
Module: wine
Branch: master
Commit: df0f42fe784f24af6ffba03648130c11884cf854
URL: http://source.winehq.org/git/wine.git/?a=commit;h=df0f42fe784f24af6ffba03648130c11884cf854
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Mar 11 19:48:57 2008 +0100
advapi32: Implemented RegOverridePredefKey.
---
dlls/advapi32/advapi32.spec | 2 +-
dlls/advapi32/registry.c | 26 ++++++++++++++++++++++++++
include/winreg.h | 1 +
3 files changed, 28 insertions(+), 1 deletions(-)
diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec
index 17dac6d..38ae793 100644
--- a/dlls/advapi32/advapi32.spec
+++ b/dlls/advapi32/advapi32.spec
@@ -499,7 +499,7 @@
@ 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)
diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c
index 40994fc..9ce3da0 100644
--- a/dlls/advapi32/registry.c
+++ b/dlls/advapi32/registry.c
@@ -150,6 +150,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.@]
*
* See RegCreateKeyExA.
diff --git a/include/winreg.h b/include/winreg.h
index 5425259..c024369 100644
--- a/include/winreg.h
+++ b/include/winreg.h
@@ -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)
More information about the wine-cvs
mailing list