Module: wine Branch: master Commit: df0f42fe784f24af6ffba03648130c11884cf854 URL: http://source.winehq.org/git/wine.git/?a=commit;h=df0f42fe784f24af6ffba03648...
Author: Alexandre Julliard julliard@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)