From: Joel Holdsworth joel@airwebreathe.org.uk
Test failures were introduced in c695f8906fc270c551ec9ebe0531d2ceabba5b79, and affect Windows 10 1607 and older.
Wine-bug: https://bugs.winehq.org/show_bug.cgi?id=55632 Signed-off-by: Joel Holdsworth joel@airwebreathe.org.uk --- dlls/ntdll/tests/file.c | 196 ++++++++++++++++++++++++++-------------- 1 file changed, 127 insertions(+), 69 deletions(-)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index fd69522aff9..de15f30711a 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -2315,22 +2315,28 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine_if( class == FileLinkInformationEx ) - ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); - todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); - fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; - ok( !fileDeleted, "file should exist\n" ); - fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + ok( io.Status == STATUS_SUCCESS || (class == FileLinkInformationEx && io.Status == 0xdeadbeef), + "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( !fileDeleted, "file should exist\n" ); + ok( res == STATUS_SUCCESS || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_SUCCESS, got %lx\n", res );
- fni = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_NAME_INFORMATION) + MAX_PATH * sizeof(WCHAR) ); - res = pNtQueryInformationFile( handle, &io, fni, sizeof(FILE_NAME_INFORMATION) + MAX_PATH * sizeof(WCHAR), FileNameInformation ); - ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); - fni->FileName[ fni->FileNameLength / sizeof(WCHAR) ] = 0; - ok( !lstrcmpiW(fni->FileName, oldpath + 2), "FileName expected %s, got %s\n", - wine_dbgstr_w(oldpath + 2), wine_dbgstr_w(fni->FileName) ); - HeapFree( GetProcessHeap(), 0, fni ); + if ( res == STATUS_SUCCESS ) + { + fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + ok( !fileDeleted, "file should exist\n" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + todo_wine_if( class == FileLinkInformationEx ) + ok( !fileDeleted, "file should exist\n" ); + + fni = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_NAME_INFORMATION) + MAX_PATH * sizeof(WCHAR) ); + res = pNtQueryInformationFile( handle, &io, fni, sizeof(FILE_NAME_INFORMATION) + MAX_PATH * sizeof(WCHAR), FileNameInformation ); + ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); + fni->FileName[ fni->FileNameLength / sizeof(WCHAR) ] = 0; + ok( !lstrcmpiW(fni->FileName, oldpath + 2), "FileName expected %s, got %s\n", + wine_dbgstr_w(oldpath + 2), wine_dbgstr_w(fni->FileName) ); + HeapFree( GetProcessHeap(), 0, fni ); + }
CloseHandle( handle ); HeapFree( GetProcessHeap(), 0, fli ); @@ -2357,7 +2363,8 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION, "res expected STATUS_OBJECT_NAME_COLLISION, got %lx\n", res ); + ok( res == STATUS_OBJECT_NAME_COLLISION || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_OBJECT_NAME_COLLISION, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; @@ -2387,9 +2394,11 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine_if( class == FileLinkInformationEx ) - ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + ok( io.Status == STATUS_SUCCESS || (class == FileLinkInformationEx && io.Status == 0xdeadbeef), + "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); + ok( res == STATUS_SUCCESS || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_SUCCESS, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; @@ -2420,24 +2429,36 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine_if( class == FileLinkInformationEx ) - ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + ok( io.Status == STATUS_SUCCESS || (class == FileLinkInformationEx && io.Status == 0xdeadbeef), + "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); - fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; - ok( !fileDeleted, "file should exist\n" ); - fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; - ok( !fileDeleted, "file should exist\n" ); + ok( res == STATUS_SUCCESS || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_SUCCESS, got %lx\n", res ); + + if ( res == STATUS_SUCCESS ) + { + fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && + GetLastError() == ERROR_FILE_NOT_FOUND; + ok( !fileDeleted, "file should exist\n" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && + GetLastError() == ERROR_FILE_NOT_FOUND; + ok( !fileDeleted, "file should exist\n" ); + }
CloseHandle( handle ); - handle = FindFirstFileW( newpath, &find_data ); - ok(handle != INVALID_HANDLE_VALUE, "FindFirstFileW: failed, error %ld\n", GetLastError()); - if (handle != INVALID_HANDLE_VALUE) + + if ( res == STATUS_SUCCESS ) { - todo_wine ok(!lstrcmpW(wcsrchr(newpath, '\') + 1, find_data.cFileName), - "Link did not change casing on existing target file: got %s\n", wine_dbgstr_w(find_data.cFileName)); + handle = FindFirstFileW( newpath, &find_data ); + ok(handle != INVALID_HANDLE_VALUE, "FindFirstFileW: failed, error %ld\n", GetLastError()); + if (handle != INVALID_HANDLE_VALUE) + { + todo_wine ok(!lstrcmpW(wcsrchr(newpath, '\') + 1, find_data.cFileName), + "Link did not change casing on existing target file: got %s\n", wine_dbgstr_w(find_data.cFileName)); + } + FindClose( handle ); }
- FindClose( handle ); HeapFree( GetProcessHeap(), 0, fli ); delete_object( oldpath ); delete_object( newpath ); @@ -2465,7 +2486,8 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION, "res expected STATUS_OBJECT_NAME_COLLISION, got %lx\n", res ); + ok( res == STATUS_OBJECT_NAME_COLLISION || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_OBJECT_NAME_COLLISION, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; @@ -2500,7 +2522,8 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_ACCESS_DENIED, "res expected STATUS_ACCESS_DENIED, got %lx\n", res ); + ok( res == STATUS_ACCESS_DENIED || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_ACCESS_DENIED, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; @@ -2538,7 +2561,8 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) ok( io.Status == 0xdeadbeef || io.Status == STATUS_FILE_IS_A_DIRECTORY , "io.Status expected 0xdeadbeef or STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_FILE_IS_A_DIRECTORY, "res expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); + ok( res == STATUS_FILE_IS_A_DIRECTORY || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; @@ -2588,7 +2612,8 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) ok( io.Status == 0xdeadbeef || io.Status == STATUS_FILE_IS_A_DIRECTORY, "io.Status expected 0xdeadbeef or STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_FILE_IS_A_DIRECTORY, "res expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); + ok( res == STATUS_FILE_IS_A_DIRECTORY || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; @@ -2625,7 +2650,9 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) ok( io.Status == 0xdeadbeef || io.Status == STATUS_FILE_IS_A_DIRECTORY, "io.Status expected 0xdeadbeef or STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION || res == STATUS_FILE_IS_A_DIRECTORY /* > Win XP */, + ok( res == STATUS_OBJECT_NAME_COLLISION || + res == STATUS_FILE_IS_A_DIRECTORY /* > Win XP */ || + (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), "res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); @@ -2665,7 +2692,9 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) ok( io.Status == 0xdeadbeef || io.Status == STATUS_FILE_IS_A_DIRECTORY, "io.Status expected 0xdeadbeef or STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION || res == STATUS_FILE_IS_A_DIRECTORY /* > Win XP */, + ok( res == STATUS_OBJECT_NAME_COLLISION || + res == STATUS_FILE_IS_A_DIRECTORY /* > Win XP */ || + (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), "res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); @@ -2703,7 +2732,8 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) ok( io.Status == 0xdeadbeef || io.Status == STATUS_FILE_IS_A_DIRECTORY, "io.Status expected 0xdeadbeef or STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_FILE_IS_A_DIRECTORY, "res expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); + ok( res == STATUS_FILE_IS_A_DIRECTORY || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; @@ -2742,7 +2772,8 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) ok( io.Status == 0xdeadbeef || io.Status == STATUS_FILE_IS_A_DIRECTORY, "io.Status expected 0xdeadbeef or STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_FILE_IS_A_DIRECTORY, "res expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); + ok( res == STATUS_FILE_IS_A_DIRECTORY || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; @@ -2782,7 +2813,9 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) ok( io.Status == 0xdeadbeef || io.Status == STATUS_FILE_IS_A_DIRECTORY, "io.Status expected 0xdeadbeef or STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION || res == STATUS_FILE_IS_A_DIRECTORY /* > Win XP */, + ok( res == STATUS_OBJECT_NAME_COLLISION || + res == STATUS_FILE_IS_A_DIRECTORY /* > Win XP */ || + (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), "res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); @@ -2822,7 +2855,8 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) ok( io.Status == 0xdeadbeef || io.Status == STATUS_FILE_IS_A_DIRECTORY, "io.Status expected 0xdeadbeef or STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_FILE_IS_A_DIRECTORY, "res expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); + ok( res == STATUS_FILE_IS_A_DIRECTORY || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; @@ -2864,7 +2898,8 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) ok( io.Status == 0xdeadbeef || io.Status == STATUS_FILE_IS_A_DIRECTORY, "io.Status expected 0xdeadbeef or STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_FILE_IS_A_DIRECTORY, "res expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); + ok( res == STATUS_FILE_IS_A_DIRECTORY || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; @@ -2899,7 +2934,8 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION, "res expected STATUS_OBJECT_NAME_COLLISION, got %lx\n", res ); + ok( res == STATUS_OBJECT_NAME_COLLISION || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_OBJECT_NAME_COLLISION, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; @@ -2933,7 +2969,8 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_ACCESS_DENIED, "res expected STATUS_ACCESS_DENIED, got %lx\n", res ); + ok( res == STATUS_ACCESS_DENIED || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_ACCESS_DENIED, got %lx\n", res ); fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; ok( !fileDeleted, "file should exist\n" ); fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; @@ -2967,22 +3004,31 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine_if( class == FileLinkInformationEx ) - ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); - todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); - fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; - ok( !fileDeleted, "file should exist\n" ); - fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + ok( io.Status == STATUS_SUCCESS || (class == FileLinkInformationEx && io.Status == 0xdeadbeef), + "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( !fileDeleted, "file should exist\n" ); + ok( res == STATUS_SUCCESS || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "res expected STATUS_SUCCESS, got %lx\n", res );
- fni = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_NAME_INFORMATION) + MAX_PATH * sizeof(WCHAR) ); - res = pNtQueryInformationFile( handle, &io, fni, sizeof(FILE_NAME_INFORMATION) + MAX_PATH * sizeof(WCHAR), FileNameInformation ); - ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); - fni->FileName[ fni->FileNameLength / sizeof(WCHAR) ] = 0; - ok( !lstrcmpiW(fni->FileName, oldpath + 2), "FileName expected %s, got %s\n", - wine_dbgstr_w(oldpath + 2), wine_dbgstr_w(fni->FileName) ); - HeapFree( GetProcessHeap(), 0, fni ); + if ( res == STATUS_SUCCESS ) + { + fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && + GetLastError() == ERROR_FILE_NOT_FOUND; + ok( !fileDeleted, "file should exist\n" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && + GetLastError() == ERROR_FILE_NOT_FOUND; + todo_wine_if( class == FileLinkInformationEx ) + ok( !fileDeleted, "file should exist\n" ); + + fni = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_NAME_INFORMATION) + MAX_PATH * sizeof(WCHAR) ); + res = pNtQueryInformationFile( handle, &io, fni, sizeof(FILE_NAME_INFORMATION) + MAX_PATH * sizeof(WCHAR), + FileNameInformation ); + ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); + fni->FileName[ fni->FileNameLength / sizeof(WCHAR) ] = 0; + ok( !lstrcmpiW(fni->FileName, oldpath + 2), "FileName expected %s, got %s\n", + wine_dbgstr_w(oldpath + 2), wine_dbgstr_w(fni->FileName) ); + HeapFree( GetProcessHeap(), 0, fni ); + }
CloseHandle( handle ); CloseHandle( handle2 ); @@ -3008,15 +3054,18 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine ok( io.Status == 0xdeadbeef, "got io status %#lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION, "got status %lx\n", res ); + ok( res == STATUS_OBJECT_NAME_COLLISION || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "got status %lx\n", res );
fli->Flags = FILE_LINK_REPLACE_IF_EXISTS; io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine_if( class == FileLinkInformationEx ) - ok( io.Status == STATUS_SUCCESS, "got io status %#lx\n", io.Status ); + ok( io.Status == STATUS_SUCCESS || (class == FileLinkInformationEx && io.Status == 0xdeadbeef), + "got io status %#lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_SUCCESS, "got status %lx\n", res ); + ok( res == STATUS_SUCCESS || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "got status %lx\n", res ); ok( GetFileAttributesW( oldpath ) != INVALID_FILE_ATTRIBUTES, "file should exist\n" );
CloseHandle( handle ); @@ -3042,27 +3091,36 @@ static void test_file_link_information(FILE_INFORMATION_CLASS class) res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine ok( io.Status == 0xdeadbeef, "got io status %#lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION, "got status %lx\n", res ); + ok( res == STATUS_OBJECT_NAME_COLLISION || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "got status %lx\n", res );
fli->Flags = FILE_LINK_REPLACE_IF_EXISTS; io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, class ); todo_wine_if( class == FileLinkInformationEx ) - ok( io.Status == STATUS_SUCCESS, "got io status %#lx\n", io.Status ); + ok( io.Status == STATUS_SUCCESS || (class == FileLinkInformationEx && io.Status == 0xdeadbeef), + "got io status %#lx\n", io.Status ); todo_wine_if( class == FileLinkInformationEx ) - ok( res == STATUS_SUCCESS, "got status %lx\n", res ); - ok( GetFileAttributesW( oldpath ) != INVALID_FILE_ATTRIBUTES, "file should exist\n" ); + ok( res == STATUS_SUCCESS || (class == FileLinkInformationEx && res == STATUS_INVALID_INFO_CLASS), + "got status %lx\n", res ); + + if (res == STATUS_SUCCESS ) + ok( GetFileAttributesW( oldpath ) != INVALID_FILE_ATTRIBUTES, "file should exist\n" );
CloseHandle( handle ); - handle = FindFirstFileW( oldpath, &find_data ); - ok(handle != INVALID_HANDLE_VALUE, "FindFirstFileW: failed, error %ld\n", GetLastError()); - if (handle != INVALID_HANDLE_VALUE) + + if (res == STATUS_SUCCESS ) { - todo_wine ok(!lstrcmpW(wcsrchr(oldpath, '\') + 1, find_data.cFileName), - "Link did not change casing on same file: got %s\n", wine_dbgstr_w(find_data.cFileName)); + handle = FindFirstFileW( oldpath, &find_data ); + ok(handle != INVALID_HANDLE_VALUE, "FindFirstFileW: failed, error %ld\n", GetLastError()); + if (handle != INVALID_HANDLE_VALUE) + { + todo_wine ok(!lstrcmpW(wcsrchr(oldpath, '\') + 1, find_data.cFileName), + "Link did not change casing on same file: got %s\n", wine_dbgstr_w(find_data.cFileName)); + } + FindClose( handle ); }
- FindClose( handle ); HeapFree( GetProcessHeap(), 0, fli ); delete_object( oldpath ); }