Module: wine Branch: master Commit: eeb4ed4c7066ec877cc746bcf608059535c325f2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=eeb4ed4c7066ec877cc746bcf6...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Oct 17 21:22:16 2016 +0200
ntdll/tests: Added more registry symlink tests.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/reg.c | 2 +- dlls/ntdll/tests/reg.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c index 6dc5d61..cb522ca 100644 --- a/dlls/ntdll/reg.c +++ b/dlls/ntdll/reg.c @@ -129,7 +129,7 @@ static NTSTATUS open_key( PHANDLE retkey, ACCESS_MASK access, const OBJECT_ATTRI
TRACE( "(%p,%s,%x,%p)\n", attr->RootDirectory, debugstr_us(attr->ObjectName), access, retkey ); - if (options) + if (options & ~REG_OPTION_OPEN_LINK) FIXME("options %x not implemented\n", options);
SERVER_START_REQ( open_key ) diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c index 0160869..c15d6a8 100644 --- a/dlls/ntdll/tests/reg.c +++ b/dlls/ntdll/tests/reg.c @@ -1135,6 +1135,40 @@ static void test_symlinks(void) "wrong len %u\n", len ); pNtClose( key );
+ if (pNtOpenKeyEx) + { + /* REG_OPTION_OPEN_LINK flag doesn't matter */ + status = pNtOpenKeyEx( &key, KEY_ALL_ACCESS, &attr, REG_OPTION_OPEN_LINK ); + ok( status == STATUS_SUCCESS, "NtOpenKey failed: 0x%08x\n", status ); + + len = sizeof(buffer); + status = pNtQueryValueKey( key, &symlink_str, KeyValuePartialInformation, info, len, &len ); + ok( status == STATUS_SUCCESS, "NtQueryValueKey failed: 0x%08x\n", status ); + ok( len == FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION,Data) + target_len - sizeof(WCHAR), + "wrong len %u\n", len ); + pNtClose( key ); + + status = pNtOpenKeyEx( &key, KEY_ALL_ACCESS, &attr, 0 ); + ok( status == STATUS_SUCCESS, "NtOpenKey failed: 0x%08x\n", status ); + + len = sizeof(buffer); + status = pNtQueryValueKey( key, &symlink_str, KeyValuePartialInformation, info, len, &len ); + ok( status == STATUS_SUCCESS, "NtQueryValueKey failed: 0x%08x\n", status ); + ok( len == FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION,Data) + target_len - sizeof(WCHAR), + "wrong len %u\n", len ); + pNtClose( key ); + + attr.Attributes = 0; + status = pNtOpenKeyEx( &key, KEY_ALL_ACCESS, &attr, REG_OPTION_OPEN_LINK ); + ok( status == STATUS_SUCCESS, "NtOpenKey failed: 0x%08x\n", status ); + + len = sizeof(buffer); + status = pNtQueryValueKey( key, &symlink_str, KeyValuePartialInformation, info, len, &len ); + ok( status == STATUS_OBJECT_NAME_NOT_FOUND, "NtQueryValueKey failed: 0x%08x\n", status ); + pNtClose( key ); + } + + attr.Attributes = OBJ_OPENLINK; status = pNtCreateKey( &key, KEY_ALL_ACCESS, &attr, 0, 0, 0, 0 ); ok( status == STATUS_SUCCESS, "NtCreateKey failed: 0x%08x\n", status ); len = sizeof(buffer); @@ -1144,6 +1178,36 @@ static void test_symlinks(void) "wrong len %u\n", len ); pNtClose( key );
+ /* delete target and create by NtCreateKey on link */ + attr.ObjectName = &target_str; + status = pNtOpenKey( &key, KEY_ALL_ACCESS, &attr ); + ok( status == STATUS_SUCCESS, "NtOpenKey failed: 0x%08x\n", status ); + status = pNtDeleteKey( key ); + ok( status == STATUS_SUCCESS, "NtDeleteKey failed: 0x%08x\n", status ); + pNtClose( key ); + + attr.ObjectName = &link_str; + attr.Attributes = 0; + status = pNtOpenKey( &key, KEY_ALL_ACCESS, &attr ); + ok( status == STATUS_OBJECT_NAME_NOT_FOUND, "NtOpenKey wrong status 0x%08x\n", status ); + + status = pNtCreateKey( &key, KEY_ALL_ACCESS, &attr, 0, 0, 0, 0 ); + todo_wine ok( status == STATUS_SUCCESS, "NtCreateKey failed: 0x%08x\n", status ); + pNtClose( key ); + if (status) /* can be removed once todo_wine above is fixed */ + { + attr.ObjectName = &target_str; + attr.Attributes = OBJ_OPENLINK; + status = pNtCreateKey( &key, KEY_ALL_ACCESS, &attr, 0, 0, 0, 0 ); + ok( status == STATUS_SUCCESS, "NtCreateKey failed: 0x%08x\n", status ); + pNtClose( key ); + } + + attr.ObjectName = &target_str; + attr.Attributes = OBJ_OPENLINK; + status = pNtOpenKey( &key, KEY_ALL_ACCESS, &attr ); + ok( status == STATUS_SUCCESS, "NtOpenKey wrong status 0x%08x\n", status ); + if (0) /* crashes the Windows kernel on some Vista systems */ { /* reopen the link from itself */