diff --git a/dlls/kernel/Makefile.in b/dlls/kernel/Makefile.in index 92180d84db3..d847edb45a8 100644 --- a/dlls/kernel/Makefile.in +++ b/dlls/kernel/Makefile.in @@ -16,6 +16,7 @@ C_SRCS = \ format_msg.c \ kernel_main.c \ locale.c \ + registry16.c \ stress.c \ string.c \ sync.c \ diff --git a/dlls/kernel/registry16.c b/dlls/kernel/registry16.c new file mode 100644 index 00000000000..7a4a558c8f9 --- /dev/null +++ b/dlls/kernel/registry16.c @@ -0,0 +1,209 @@ +/* + * 16-bit registry functions + * + * Copyright 1996 Marcus Meissner + * Copyright 1998 Matthew Becker + * Copyright 1999 Sylvain St-Germain + * Copyright 2002 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "winbase.h" +#include "winreg.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(reg); + +DWORD (WINAPI *pRegCloseKey)(HKEY); +DWORD (WINAPI *pRegCreateKeyA)(HKEY,LPCSTR,LPHKEY); +DWORD (WINAPI *pRegDeleteKeyA)(HKEY,LPCSTR); +DWORD (WINAPI *pRegDeleteValueA)(HKEY,LPCSTR); +DWORD (WINAPI *pRegEnumKeyA)(HKEY,DWORD,LPSTR,DWORD); +DWORD (WINAPI *pRegEnumValueA)(HKEY,DWORD,LPSTR,LPDWORD,LPDWORD,LPDWORD,LPBYTE,LPDWORD); +DWORD (WINAPI *pRegFlushKey)(HKEY); +DWORD (WINAPI *pRegOpenKeyA)(HKEY,LPCSTR,LPHKEY); +DWORD (WINAPI *pRegQueryValueA)(HKEY,LPCSTR,LPSTR,LPLONG); +DWORD (WINAPI *pRegQueryValueExA)(HKEY,LPCSTR,LPDWORD,LPDWORD,LPBYTE,LPDWORD); +DWORD (WINAPI *pRegSetValueA)(HKEY,LPCSTR,DWORD,LPCSTR,DWORD); +DWORD (WINAPI *pRegSetValueExA)(HKEY,LPCSTR,DWORD,DWORD,CONST BYTE*,DWORD); + +static HMODULE advapi32; + + +/* 0 and 1 are valid rootkeys in win16 shell.dll and are used by + * some programs. Do not remove those cases. -MM + */ +static inline void fix_win16_hkey( HKEY *hkey ) +{ + if (*hkey == 0 || *hkey == (HKEY)1) *hkey = HKEY_CLASSES_ROOT; +} + +static void init_func_ptrs(void) +{ + advapi32 = LoadLibraryA("advapi32.dll"); + if (!advapi32) + { + ERR( "Unable to load advapi32.dll\n" ); + ExitProcess(1); + } +#define GET_PTR(name) p##name = (void *)GetProcAddress(advapi32,#name); + GET_PTR( RegCloseKey ); + GET_PTR( RegCreateKeyA ); + GET_PTR( RegDeleteKeyA ); + GET_PTR( RegDeleteValueA ); + GET_PTR( RegEnumKeyA ); + GET_PTR( RegEnumValueA ); + GET_PTR( RegFlushKey ); + GET_PTR( RegOpenKeyA ); + GET_PTR( RegQueryValueA ); + GET_PTR( RegQueryValueExA ); + GET_PTR( RegSetValueA ); + GET_PTR( RegSetValueExA ); +#undef GET_PTR +} + +/****************************************************************************** + * RegEnumKey [KERNEL.216] + */ +DWORD WINAPI RegEnumKey16( HKEY hkey, DWORD index, LPSTR name, DWORD name_len ) +{ + if (!advapi32) init_func_ptrs(); + fix_win16_hkey( &hkey ); + return pRegEnumKeyA( hkey, index, name, name_len ); +} + +/****************************************************************************** + * RegOpenKey [KERNEL.217] + */ +DWORD WINAPI RegOpenKey16( HKEY hkey, LPCSTR name, LPHKEY retkey ) +{ + if (!advapi32) init_func_ptrs(); + fix_win16_hkey( &hkey ); + return pRegOpenKeyA( hkey, name, retkey ); +} + +/****************************************************************************** + * RegCreateKey [KERNEL.218] + */ +DWORD WINAPI RegCreateKey16( HKEY hkey, LPCSTR name, LPHKEY retkey ) +{ + if (!advapi32) init_func_ptrs(); + fix_win16_hkey( &hkey ); + return pRegCreateKeyA( hkey, name, retkey ); +} + +/****************************************************************************** + * RegDeleteKey [KERNEL.219] + */ +DWORD WINAPI RegDeleteKey16( HKEY hkey, LPCSTR name ) +{ + if (!advapi32) init_func_ptrs(); + fix_win16_hkey( &hkey ); + return pRegDeleteKeyA( hkey, name ); +} + +/****************************************************************************** + * RegCloseKey [KERNEL.220] + */ +DWORD WINAPI RegCloseKey16( HKEY hkey ) +{ + if (!advapi32) init_func_ptrs(); + fix_win16_hkey( &hkey ); + return pRegCloseKey( hkey ); +} + +/****************************************************************************** + * RegSetValue [KERNEL.221] + */ +DWORD WINAPI RegSetValue16( HKEY hkey, LPCSTR name, DWORD type, LPCSTR data, DWORD count ) +{ + if (!advapi32) init_func_ptrs(); + fix_win16_hkey( &hkey ); + return pRegSetValueA( hkey, name, type, data, count ); +} + +/****************************************************************************** + * RegDeleteValue [KERNEL.222] + */ +DWORD WINAPI RegDeleteValue16( HKEY hkey, LPSTR name ) +{ + if (!advapi32) init_func_ptrs(); + fix_win16_hkey( &hkey ); + return pRegDeleteValueA( hkey, name ); +} + +/****************************************************************************** + * RegEnumValue [KERNEL.223] + */ +DWORD WINAPI RegEnumValue16( HKEY hkey, DWORD index, LPSTR value, LPDWORD val_count, + LPDWORD reserved, LPDWORD type, LPBYTE data, LPDWORD count ) +{ + if (!advapi32) init_func_ptrs(); + fix_win16_hkey( &hkey ); + return pRegEnumValueA( hkey, index, value, val_count, reserved, type, data, count ); +} + +/****************************************************************************** + * RegQueryValue [KERNEL.224] + * + * NOTES + * Is this HACK still applicable? + * + * HACK + * The 16bit RegQueryValue doesn't handle selectorblocks anyway, so we just + * mask out the high 16 bit. This (not so much incidently) hopefully fixes + * Aldus FH4) + */ +DWORD WINAPI RegQueryValue16( HKEY hkey, LPCSTR name, LPSTR data, LPDWORD count ) +{ + if (!advapi32) init_func_ptrs(); + fix_win16_hkey( &hkey ); + if (count) *count &= 0xffff; + return pRegQueryValueA( hkey, name, data, count ); +} + +/****************************************************************************** + * RegQueryValueEx [KERNEL.225] + */ +DWORD WINAPI RegQueryValueEx16( HKEY hkey, LPCSTR name, LPDWORD reserved, LPDWORD type, + LPBYTE data, LPDWORD count ) +{ + if (!advapi32) init_func_ptrs(); + fix_win16_hkey( &hkey ); + return pRegQueryValueExA( hkey, name, reserved, type, data, count ); +} + +/****************************************************************************** + * RegSetValueEx [KERNEL.226] + */ +DWORD WINAPI RegSetValueEx16( HKEY hkey, LPCSTR name, DWORD reserved, DWORD type, + CONST BYTE *data, DWORD count ) +{ + if (!advapi32) init_func_ptrs(); + fix_win16_hkey( &hkey ); + if (!count && (type==REG_SZ)) count = strlen(data); + return pRegSetValueExA( hkey, name, reserved, type, data, count ); +} + +/****************************************************************************** + * RegFlushKey [KERNEL.227] + */ +DWORD WINAPI RegFlushKey16( HKEY hkey ) +{ + if (!advapi32) init_func_ptrs(); + fix_win16_hkey( &hkey ); + return pRegFlushKey( hkey ); +} diff --git a/misc/registry.c b/misc/registry.c index feb548b0567..04c192b0fe1 100644 --- a/misc/registry.c +++ b/misc/registry.c @@ -1625,145 +1625,5 @@ void SHELL_LoadRegistry( void ) if (PROFILE_GetWineIniBool(RegistryW, load_home_reg_filesW, 1)) _load_home_registry( hkey_users_default ); _init_registry_saving( hkey_users_default ); - RegCloseKey(hkey_users_default); -} - -/***************************************************************************/ -/* 16-BIT API FUNCTIONS */ -/***************************************************************************/ - -/* 0 and 1 are valid rootkeys in win16 shell.dll and are used by - * some programs. Do not remove those cases. -MM - */ -static inline void fix_win16_hkey( HKEY *hkey ) -{ - if (*hkey == 0 || *hkey == (HKEY)1) *hkey = HKEY_CLASSES_ROOT; -} - -/****************************************************************************** - * RegEnumKey [KERNEL.216] - * RegEnumKey [SHELL.7] - */ -DWORD WINAPI RegEnumKey16( HKEY hkey, DWORD index, LPSTR name, DWORD name_len ) -{ - fix_win16_hkey( &hkey ); - return RegEnumKeyA( hkey, index, name, name_len ); -} - -/****************************************************************************** - * RegOpenKey [KERNEL.217] - * RegOpenKey [SHELL.1] - */ -DWORD WINAPI RegOpenKey16( HKEY hkey, LPCSTR name, LPHKEY retkey ) -{ - fix_win16_hkey( &hkey ); - return RegOpenKeyA( hkey, name, retkey ); -} - -/****************************************************************************** - * RegCreateKey [KERNEL.218] - * RegCreateKey [SHELL.2] - */ -DWORD WINAPI RegCreateKey16( HKEY hkey, LPCSTR name, LPHKEY retkey ) -{ - fix_win16_hkey( &hkey ); - return RegCreateKeyA( hkey, name, retkey ); -} - -/****************************************************************************** - * RegDeleteKey [KERNEL.219] - * RegDeleteKey [SHELL.4] - */ -DWORD WINAPI RegDeleteKey16( HKEY hkey, LPCSTR name ) -{ - fix_win16_hkey( &hkey ); - return RegDeleteKeyA( hkey, name ); -} - -/****************************************************************************** - * RegCloseKey [KERNEL.220] - * RegCloseKey [SHELL.3] - */ -DWORD WINAPI RegCloseKey16( HKEY hkey ) -{ - fix_win16_hkey( &hkey ); - return RegCloseKey( hkey ); -} - -/****************************************************************************** - * RegSetValue [KERNEL.221] - * RegSetValue [SHELL.5] - */ -DWORD WINAPI RegSetValue16( HKEY hkey, LPCSTR name, DWORD type, LPCSTR data, DWORD count ) -{ - fix_win16_hkey( &hkey ); - return RegSetValueA( hkey, name, type, data, count ); -} - -/****************************************************************************** - * RegDeleteValue [KERNEL.222] - */ -DWORD WINAPI RegDeleteValue16( HKEY hkey, LPSTR name ) -{ - fix_win16_hkey( &hkey ); - return RegDeleteValueA( hkey, name ); -} - -/****************************************************************************** - * RegEnumValue [KERNEL.223] - */ -DWORD WINAPI RegEnumValue16( HKEY hkey, DWORD index, LPSTR value, LPDWORD val_count, - LPDWORD reserved, LPDWORD type, LPBYTE data, LPDWORD count ) -{ - fix_win16_hkey( &hkey ); - return RegEnumValueA( hkey, index, value, val_count, reserved, type, data, count ); -} - -/****************************************************************************** - * RegQueryValue [KERNEL.224] - * RegQueryValue [SHELL.6] - * - * NOTES - * Is this HACK still applicable? - * - * HACK - * The 16bit RegQueryValue doesn't handle selectorblocks anyway, so we just - * mask out the high 16 bit. This (not so much incidently) hopefully fixes - * Aldus FH4) - */ -DWORD WINAPI RegQueryValue16( HKEY hkey, LPCSTR name, LPSTR data, LPDWORD count ) -{ - fix_win16_hkey( &hkey ); - if (count) *count &= 0xffff; - return RegQueryValueA( hkey, name, data, count ); -} - -/****************************************************************************** - * RegQueryValueEx [KERNEL.225] - */ -DWORD WINAPI RegQueryValueEx16( HKEY hkey, LPCSTR name, LPDWORD reserved, LPDWORD type, - LPBYTE data, LPDWORD count ) -{ - fix_win16_hkey( &hkey ); - return RegQueryValueExA( hkey, name, reserved, type, data, count ); -} - -/****************************************************************************** - * RegSetValueEx [KERNEL.226] - */ -DWORD WINAPI RegSetValueEx16( HKEY hkey, LPCSTR name, DWORD reserved, DWORD type, - CONST BYTE *data, DWORD count ) -{ - fix_win16_hkey( &hkey ); - if (!count && (type==REG_SZ)) count = strlen(data); - return RegSetValueExA( hkey, name, reserved, type, data, count ); -} - -/****************************************************************************** - * RegFlushKey [KERNEL.227] - */ -DWORD WINAPI RegFlushKey16( HKEY hkey ) -{ - fix_win16_hkey( &hkey ); - return RegFlushKey( hkey ); + NtClose(hkey_users_default); }