Changed registry handling in RegOpenKeyExA to behave like windows95

when winver==win95.
This commit is contained in:
Michael Cardenas 2002-03-21 01:24:52 +00:00 committed by Alexandre Julliard
parent 8c45390a7f
commit 7dbce65bb2
1 changed files with 14 additions and 8 deletions

View File

@ -42,11 +42,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(reg);
/* check if value type needs string conversion (Ansi<->Unicode) */ /* check if value type needs string conversion (Ansi<->Unicode) */
static inline int is_string( DWORD type ) inline static int is_string( DWORD type )
{ {
return (type == REG_SZ) || (type == REG_EXPAND_SZ) || (type == REG_MULTI_SZ); return (type == REG_SZ) || (type == REG_EXPAND_SZ) || (type == REG_MULTI_SZ);
} }
/* check if current version is NT or Win95 */
inline static int is_version_nt(void)
{
return !(GetVersion() & 0x80000000);
}
/****************************************************************************** /******************************************************************************
* RegCreateKeyExW [ADVAPI32.@] * RegCreateKeyExW [ADVAPI32.@]
@ -102,7 +107,8 @@ DWORD WINAPI RegCreateKeyExA( HKEY hkey, LPCSTR name, DWORD reserved, LPSTR clas
NTSTATUS status; NTSTATUS status;
if (reserved) return ERROR_INVALID_PARAMETER; if (reserved) return ERROR_INVALID_PARAMETER;
if (!(access & KEY_ALL_ACCESS) || (access & ~KEY_ALL_ACCESS)) return ERROR_ACCESS_DENIED; if (!is_version_nt()) access = KEY_ALL_ACCESS; /* Win95 ignores the access mask */
else if (!(access & KEY_ALL_ACCESS) || (access & ~KEY_ALL_ACCESS)) return ERROR_ACCESS_DENIED;
attr.Length = sizeof(attr); attr.Length = sizeof(attr);
attr.RootDirectory = hkey; attr.RootDirectory = hkey;
@ -195,6 +201,8 @@ DWORD WINAPI RegOpenKeyExA( HKEY hkey, LPCSTR name, DWORD reserved, REGSAM acces
STRING nameA; STRING nameA;
NTSTATUS status; NTSTATUS status;
if (!is_version_nt()) access = KEY_ALL_ACCESS; /* Win95 ignores the access mask */
attr.Length = sizeof(attr); attr.Length = sizeof(attr);
attr.RootDirectory = hkey; attr.RootDirectory = hkey;
attr.ObjectName = &NtCurrentTeb()->StaticUnicodeString; attr.ObjectName = &NtCurrentTeb()->StaticUnicodeString;
@ -445,8 +453,7 @@ DWORD WINAPI RegQueryInfoKeyW( HKEY hkey, LPWSTR class, LPDWORD class_len, LPDWO
TRACE( "(0x%x,%p,%ld,%p,%p,%p,%p,%p,%p,%p,%p)\n", hkey, class, class_len ? *class_len : 0, TRACE( "(0x%x,%p,%ld,%p,%p,%p,%p,%p,%p,%p,%p)\n", hkey, class, class_len ? *class_len : 0,
reserved, subkeys, max_subkey, values, max_value, max_data, security, modif ); reserved, subkeys, max_subkey, values, max_value, max_data, security, modif );
if (class && !class_len && !(GetVersion() & 0x80000000 /*NT*/)) if (class && !class_len && is_version_nt()) return ERROR_INVALID_PARAMETER;
return ERROR_INVALID_PARAMETER;
status = NtQueryKey( hkey, KeyFullInformation, buffer, sizeof(buffer), &total_size ); status = NtQueryKey( hkey, KeyFullInformation, buffer, sizeof(buffer), &total_size );
if (status && status != STATUS_BUFFER_OVERFLOW) goto done; if (status && status != STATUS_BUFFER_OVERFLOW) goto done;
@ -508,8 +515,7 @@ DWORD WINAPI RegQueryInfoKeyA( HKEY hkey, LPSTR class, LPDWORD class_len, LPDWOR
TRACE( "(0x%x,%p,%ld,%p,%p,%p,%p,%p,%p,%p,%p)\n", hkey, class, class_len ? *class_len : 0, TRACE( "(0x%x,%p,%ld,%p,%p,%p,%p,%p,%p,%p,%p)\n", hkey, class, class_len ? *class_len : 0,
reserved, subkeys, max_subkey, values, max_value, max_data, security, modif ); reserved, subkeys, max_subkey, values, max_value, max_data, security, modif );
if (class && !class_len && !(GetVersion() & 0x80000000 /*NT*/)) if (class && !class_len && is_version_nt()) return ERROR_INVALID_PARAMETER;
return ERROR_INVALID_PARAMETER;
status = NtQueryKey( hkey, KeyFullInformation, buffer, sizeof(buffer), &total_size ); status = NtQueryKey( hkey, KeyFullInformation, buffer, sizeof(buffer), &total_size );
if (status && status != STATUS_BUFFER_OVERFLOW) goto done; if (status && status != STATUS_BUFFER_OVERFLOW) goto done;
@ -647,7 +653,7 @@ DWORD WINAPI RegSetValueExW( HKEY hkey, LPCWSTR name, DWORD reserved,
{ {
UNICODE_STRING nameW; UNICODE_STRING nameW;
if (GetVersion() & 0x80000000) /* win95 */ if (!is_version_nt()) /* win95 */
{ {
if (type == REG_SZ) count = (strlenW( (WCHAR *)data ) + 1) * sizeof(WCHAR); if (type == REG_SZ) count = (strlenW( (WCHAR *)data ) + 1) * sizeof(WCHAR);
} }
@ -674,7 +680,7 @@ DWORD WINAPI RegSetValueExA( HKEY hkey, LPCSTR name, DWORD reserved, DWORD type,
WCHAR *dataW = NULL; WCHAR *dataW = NULL;
NTSTATUS status; NTSTATUS status;
if (GetVersion() & 0x80000000) /* win95 */ if (!is_version_nt()) /* win95 */
{ {
if (type == REG_SZ) count = strlen(data) + 1; if (type == REG_SZ) count = strlen(data) + 1;
} }