Revert "advapi32: Fix RegEnumValueW when enumerating long values.".
This reverts commit 443ef6e7a6026f6aaa5ffcfcbc33d582da780ac5. The tests fail on all versions of Windows.
This commit is contained in:
parent
d940ac2412
commit
645a31474c
@ -1922,12 +1922,16 @@ LSTATUS WINAPI RegEnumValueW( HKEY hkey, DWORD index, LPWSTR value, LPDWORD val_
|
|||||||
|
|
||||||
status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation,
|
status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation,
|
||||||
buffer, total_size, &total_size );
|
buffer, total_size, &total_size );
|
||||||
|
if (status && status != STATUS_BUFFER_OVERFLOW) goto done;
|
||||||
|
|
||||||
|
if (value || data)
|
||||||
|
{
|
||||||
/* retry with a dynamically allocated buffer */
|
/* retry with a dynamically allocated buffer */
|
||||||
while (status == STATUS_BUFFER_OVERFLOW)
|
while (status == STATUS_BUFFER_OVERFLOW)
|
||||||
{
|
{
|
||||||
if (buf_ptr != buffer) heap_free( buf_ptr );
|
if (buf_ptr != buffer) heap_free( buf_ptr );
|
||||||
if (!(buf_ptr = heap_alloc( total_size ))) return ERROR_NOT_ENOUGH_MEMORY;
|
if (!(buf_ptr = heap_alloc( total_size )))
|
||||||
|
return ERROR_NOT_ENOUGH_MEMORY;
|
||||||
info = (KEY_VALUE_FULL_INFORMATION *)buf_ptr;
|
info = (KEY_VALUE_FULL_INFORMATION *)buf_ptr;
|
||||||
status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation,
|
status = NtEnumerateValueKey( hkey, index, KeyValueFullInformation,
|
||||||
buf_ptr, total_size, &total_size );
|
buf_ptr, total_size, &total_size );
|
||||||
@ -1963,6 +1967,8 @@ LSTATUS WINAPI RegEnumValueW( HKEY hkey, DWORD index, LPWSTR value, LPDWORD val_
|
|||||||
if (ptr > (WCHAR *)data && ptr[-1]) *ptr = 0;
|
if (ptr > (WCHAR *)data && ptr[-1]) *ptr = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else status = STATUS_SUCCESS;
|
||||||
|
|
||||||
overflow:
|
overflow:
|
||||||
if (type) *type = info->Type;
|
if (type) *type = info->Type;
|
||||||
|
@ -522,8 +522,6 @@ static void test_enum_value(void)
|
|||||||
static const WCHAR foobarW[] = {'f','o','o','b','a','r',0};
|
static const WCHAR foobarW[] = {'f','o','o','b','a','r',0};
|
||||||
static const WCHAR testW[] = {'T','e','s','t',0};
|
static const WCHAR testW[] = {'T','e','s','t',0};
|
||||||
static const WCHAR xxxW[] = {'x','x','x','x','x','x','x','x',0};
|
static const WCHAR xxxW[] = {'x','x','x','x','x','x','x','x',0};
|
||||||
WCHAR longW[128];
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* create the working key for new 'Test' value */
|
/* create the working key for new 'Test' value */
|
||||||
res = RegCreateKeyA( hkey_main, "TestKey", &test_key );
|
res = RegCreateKeyA( hkey_main, "TestKey", &test_key );
|
||||||
@ -712,17 +710,6 @@ static void test_enum_value(void)
|
|||||||
ok( !memcmp( valueW, testW, sizeof(testW) ), "value is not 'Test'\n" );
|
ok( !memcmp( valueW, testW, sizeof(testW) ), "value is not 'Test'\n" );
|
||||||
ok( !memcmp( dataW, foobarW, sizeof(foobarW) ), "data is not 'foobar'\n" );
|
ok( !memcmp( dataW, foobarW, sizeof(foobarW) ), "data is not 'foobar'\n" );
|
||||||
|
|
||||||
/* tests the overflow case for the fixed "char buffer[]" in RegEnumValueW */
|
|
||||||
for (i = 0; i < sizeof(longW)/sizeof(WCHAR); i++) longW[i] = 'x';
|
|
||||||
longW[i - 1] = 0;
|
|
||||||
res = RegSetValueExW( test_key, testW, 0, REG_SZ, (const BYTE *)longW, sizeof(longW) );
|
|
||||||
ok( res == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", res );
|
|
||||||
data_count = 20;
|
|
||||||
type = 1234;
|
|
||||||
res = RegEnumValueW( test_key, 0, NULL, NULL, NULL, &type, NULL, &data_count);
|
|
||||||
ok( res == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %d\n", res );
|
|
||||||
ok( data_count == sizeof(longW), "data_count set to %d\n", data_count );
|
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
RegDeleteKeyA(test_key, "");
|
RegDeleteKeyA(test_key, "");
|
||||||
RegCloseKey(test_key);
|
RegCloseKey(test_key);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user