Module: wine Branch: refs/heads/master Commit: 52aaddcd3493c263d3e60533ac3473804aad3f47 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=52aaddcd3493c263d3e60533...
Author: Robert Shearman rob@codeweavers.com Date: Fri Jun 30 11:06:48 2006 +0100
advapi32: Implement RegDisablePredefinedCache.
---
dlls/advapi32/advapi32.spec | 2 +- dlls/advapi32/registry.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletions(-)
diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec index 438b671..4826df9 100644 --- a/dlls/advapi32/advapi32.spec +++ b/dlls/advapi32/advapi32.spec @@ -475,7 +475,7 @@ # @ stub ReadEncryptedFileRaw @ stdcall RegDeleteKeyW(long wstr) @ stdcall RegDeleteValueA(long str) @ stdcall RegDeleteValueW(long wstr) -# @ stub RegDisablePredefinedCache +@ stdcall RegDisablePredefinedCache() @ stdcall RegEnumKeyA(long long ptr long) @ stdcall RegEnumKeyExA(long long ptr ptr ptr ptr ptr ptr) @ stdcall RegEnumKeyExW(long long ptr ptr ptr ptr ptr ptr) diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c index 7790862..e99cce7 100644 --- a/dlls/advapi32/registry.c +++ b/dlls/advapi32/registry.c @@ -52,6 +52,7 @@ #define HKEY_SPECIAL_ROOT_LAST HKEY_D #define NB_SPECIAL_ROOT_KEYS ((UINT)HKEY_SPECIAL_ROOT_LAST - (UINT)HKEY_SPECIAL_ROOT_FIRST + 1)
static HKEY special_root_keys[NB_SPECIAL_ROOT_KEYS]; +static BOOL hkcu_cache_disabled;
static const WCHAR name_CLASSES_ROOT[] = {'M','a','c','h','i','n','e','\', @@ -108,6 +109,10 @@ static HKEY create_special_root_hkey( HA { if (RtlOpenCurrentUser( access, &hkey )) return 0; TRACE( "HKEY_CURRENT_USER -> %p\n", hkey ); + + /* don't cache the key in the table if caching is disabled */ + if (hkcu_cache_disabled) + return hkey; } else { @@ -2565,3 +2570,34 @@ cleanup:
return result; } + +/****************************************************************************** + * RegDisablePredefinedCache [ADVAPI32.@] + * + * Disables the caching of the HKEY_CLASSES_ROOT key for the process. + * + * PARAMS + * None. + * + * RETURNS + * Success: ERROR_SUCCESS + * Failure: nonzero error code from Winerror.h + * + * NOTES + * This is useful for services that use impersonation. + */ +LONG WINAPI RegDisablePredefinedCache(void) +{ + HKEY hkey_current_user; + int idx = (UINT_PTR)HKEY_CURRENT_USER - (UINT_PTR)HKEY_SPECIAL_ROOT_FIRST; + + /* prevent caching of future requests */ + hkcu_cache_disabled = TRUE; + + hkey_current_user = InterlockedExchangePointer( (void **)&special_root_keys[idx], NULL ); + + if (hkey_current_user) + NtClose( hkey_current_user ); + + return ERROR_SUCCESS; +}