From: Joel Holdsworth joel@airwebreathe.org.uk
Test failures were introduced in 67479f8c2fc03c2043b8414bc063e671e36fdbda, and affect Windows 10 1607 and older.
Wine-bug: https://bugs.winehq.org/show_bug.cgi?id=55631 Signed-off-by: Joel Holdsworth joel@airwebreathe.org.uk --- dlls/ntdll/tests/file.c | 233 ++++++++++++++++++++++++++-------------- 1 file changed, 151 insertions(+), 82 deletions(-)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index fc7a6e82059..fd69522aff9 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -1547,24 +1547,32 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine_if( class == FileRenameInformationEx ) - ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); - todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); - fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + ok( io.Status == STATUS_SUCCESS || (class == FileRenameInformationEx && io.Status == 0xdeadbeef), + "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( fileDeleted, "file should not exist\n" ); - fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; - todo_wine_if( class == FileRenameInformationEx ) - ok( !fileDeleted, "file should exist\n" ); + ok( res == STATUS_SUCCESS || (class == FileRenameInformationEx && 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; - todo_wine_if( class == FileRenameInformationEx ) - ok( !lstrcmpiW(fni->FileName, newpath + 2), "FileName expected %s, got %s\n", - wine_dbgstr_w(newpath + 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; + todo_wine_if( class == FileRenameInformationEx ) + ok( fileDeleted, "file should not exist\n" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && + GetLastError() == ERROR_FILE_NOT_FOUND; + todo_wine_if( class == FileRenameInformationEx ) + 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; + todo_wine_if( class == FileRenameInformationEx ) + ok( !lstrcmpiW(fni->FileName, newpath + 2), "FileName expected %s, got %s\n", + wine_dbgstr_w(newpath + 2), wine_dbgstr_w(fni->FileName) ); + }
CloseHandle( handle ); HeapFree( GetProcessHeap(), 0, fri ); @@ -1591,7 +1599,8 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION, "res expected STATUS_OBJECT_NAME_COLLISION, got %lx\n", res ); + ok( res == STATUS_OBJECT_NAME_COLLISION || (class == FileRenameInformationEx && 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; @@ -1621,14 +1630,22 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine_if( class == FileRenameInformationEx ) - ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); - todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); - fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + ok( io.Status == STATUS_SUCCESS || (class == FileRenameInformationEx && io.Status == 0xdeadbeef), + "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( fileDeleted, "file should not exist\n" ); - fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; - ok( !fileDeleted, "file should exist\n" ); + ok( res == STATUS_SUCCESS || (class == FileRenameInformationEx && 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; + todo_wine_if( class == FileRenameInformationEx ) + ok( fileDeleted, "file should not exist\n" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && + GetLastError() == ERROR_FILE_NOT_FOUND; + ok( !fileDeleted, "file should exist\n" ); + }
CloseHandle( handle ); HeapFree( GetProcessHeap(), 0, fri ); @@ -1658,7 +1675,8 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION, "res expected STATUS_OBJECT_NAME_COLLISION, got %lx\n", res ); + ok( res == STATUS_OBJECT_NAME_COLLISION || (class == FileRenameInformationEx && 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; @@ -1693,7 +1711,8 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_ACCESS_DENIED, "res expected STATUS_ACCESS_DENIED, got %lx\n", res ); + ok( res == STATUS_ACCESS_DENIED || (class == FileRenameInformationEx && 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; @@ -1728,24 +1747,33 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine_if( class == FileRenameInformationEx ) - ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); - todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); - fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; - todo_wine_if( class == FileRenameInformationEx ) - ok( fileDeleted, "file should not exist\n" ); - fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + ok( io.Status == STATUS_SUCCESS || (class == FileRenameInformationEx && io.Status == 0xdeadbeef), + "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( !fileDeleted, "file should exist\n" ); + ok( res == STATUS_SUCCESS || (class == FileRenameInformationEx && 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; - todo_wine_if( class == FileRenameInformationEx ) - ok( !lstrcmpiW(fni->FileName, newpath + 2), "FileName expected %s, got %s\n", - wine_dbgstr_w(newpath + 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; + todo_wine_if( class == FileRenameInformationEx ) + ok( fileDeleted, "file should not exist\n" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && + GetLastError() == ERROR_FILE_NOT_FOUND; + todo_wine_if( class == FileRenameInformationEx ) + 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; + todo_wine_if( class == FileRenameInformationEx ) + ok( !lstrcmpiW(fni->FileName, newpath + 2), "FileName expected %s, got %s\n", + wine_dbgstr_w(newpath + 2), wine_dbgstr_w(fni->FileName) ); + HeapFree( GetProcessHeap(), 0, fni ); + }
CloseHandle( handle ); HeapFree( GetProcessHeap(), 0, fri ); @@ -1779,8 +1807,11 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class)
io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); - todo_wine ok( io.Status == 0xdeadbeef || io.Status == STATUS_ACCESS_DENIED, "io.Status got %lx\n", io.Status ); - todo_wine ok( res == STATUS_ACCESS_DENIED, "res expected STATUS_ACCESS_DENIED, got %lx\n", res ); + todo_wine ok( io.Status == 0xdeadbeef || io.Status == STATUS_ACCESS_DENIED || + (class == FileRenameInformationEx && io.Status == STATUS_INVALID_INFO_CLASS), + "io.Status got %lx\n", io.Status ); + todo_wine ok( res == STATUS_ACCESS_DENIED || (class == FileRenameInformationEx && 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; todo_wine_if( class != FileRenameInformationEx ) ok( !fileDeleted, "file should exist\n" ); @@ -1822,9 +1853,13 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine_if( class == FileRenameInformationEx ) - ok( io.Status == 0xdeadbeef || io.Status == STATUS_OBJECT_NAME_COLLISION, "io.Status got %lx\n", io.Status ); + ok( io.Status == 0xdeadbeef || io.Status == STATUS_OBJECT_NAME_COLLISION || + (class == FileRenameInformationEx && io.Status == STATUS_INVALID_INFO_CLASS), + "io.Status got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION, "res expected STATUS_OBJECT_NAME_COLLISION, got %lx\n", res ); + ok( res == STATUS_OBJECT_NAME_COLLISION || + (class == FileRenameInformationEx && 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; @@ -1860,9 +1895,12 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine_if( class == FileRenameInformationEx ) - ok( io.Status == 0xdeadbeef || io.Status == STATUS_OBJECT_NAME_COLLISION, "io.Status got %lx\n", io.Status ); + ok( io.Status == 0xdeadbeef || io.Status == STATUS_OBJECT_NAME_COLLISION || + (class == FileRenameInformationEx && io.Status == 0xdeadbeef), + "io.Status got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION, "res expected STATUS_OBJECT_NAME_COLLISION, got %lx\n", res ); + ok( res == STATUS_OBJECT_NAME_COLLISION || (class == FileRenameInformationEx && 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; @@ -1896,14 +1934,22 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine_if( class == FileRenameInformationEx ) - ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + ok( io.Status == STATUS_SUCCESS || (class == FileRenameInformationEx && io.Status == 0xdeadbeef), + "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); - fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; - todo_wine_if( class == FileRenameInformationEx ) - ok( fileDeleted, "file should not exist\n" ); - fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; - ok( !fileDeleted, "file should exist\n" ); + ok( res == STATUS_SUCCESS || (class == FileRenameInformationEx && 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; + todo_wine_if( class == FileRenameInformationEx ) + ok( fileDeleted, "file should not exist\n" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && + GetLastError() == ERROR_FILE_NOT_FOUND; + ok( !fileDeleted, "file should exist\n" ); + }
CloseHandle( handle ); HeapFree( GetProcessHeap(), 0, fri ); @@ -1935,9 +1981,12 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine_if( class == FileRenameInformationEx ) - ok( io.Status == 0xdeadbeef || io.Status == STATUS_ACCESS_DENIED, "io.Status got %lx\n", io.Status ); + ok( io.Status == 0xdeadbeef || io.Status == STATUS_ACCESS_DENIED || + (class == FileRenameInformationEx && io.Status == STATUS_INVALID_INFO_CLASS), + "io.Status got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_ACCESS_DENIED, "res expected STATUS_ACCESS_DENIED, got %lx\n", res ); + ok( res == STATUS_ACCESS_DENIED || (class == FileRenameInformationEx && 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; @@ -1974,9 +2023,12 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine_if( class == FileRenameInformationEx ) - ok( io.Status == 0xdeadbeef || io.Status == STATUS_OBJECT_NAME_COLLISION, "io.Status got %lx\n", io.Status ); + ok( io.Status == 0xdeadbeef || io.Status == STATUS_OBJECT_NAME_COLLISION || + (class == FileRenameInformationEx && io.Status == STATUS_INVALID_INFO_CLASS), + "io.Status got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION, "res expected STATUS_OBJECT_NAME_COLLISION, got %lx\n", res ); + ok( res == STATUS_OBJECT_NAME_COLLISION || (class == FileRenameInformationEx && 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; @@ -2012,9 +2064,12 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine_if( class == FileRenameInformationEx ) - ok( io.Status == 0xdeadbeef || io.Status == STATUS_ACCESS_DENIED, "io.Status got %lx\n", io.Status ); + ok( io.Status == 0xdeadbeef || io.Status == STATUS_ACCESS_DENIED || + (class == FileRenameInformationEx && io.Status == STATUS_INVALID_INFO_CLASS), + "io.Status got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_ACCESS_DENIED, "res expected STATUS_ACCESS_DENIED, got %lx\n", res ); + ok( res == STATUS_ACCESS_DENIED || (class == FileRenameInformationEx && 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; @@ -2055,7 +2110,8 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) todo_wine_if( class == FileRenameInformationEx ) ok( io.Status == 0xdeadbeef || io.Status == STATUS_ACCESS_DENIED, "io.Status got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_ACCESS_DENIED, "res expected STATUS_ACCESS_DENIED, got %lx\n", res ); + ok( res == STATUS_ACCESS_DENIED || (class == FileRenameInformationEx && 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; @@ -2090,7 +2146,8 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_OBJECT_NAME_COLLISION, "res expected STATUS_OBJECT_NAME_COLLISION, got %lx\n", res ); + ok( res == STATUS_OBJECT_NAME_COLLISION || (class == FileRenameInformationEx && 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; @@ -2124,7 +2181,8 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_ACCESS_DENIED, "res expected STATUS_ACCESS_DENIED, got %lx\n", res ); + ok( res == STATUS_ACCESS_DENIED || (class == FileRenameInformationEx && 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; @@ -2158,24 +2216,33 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine_if( class == FileRenameInformationEx ) - ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + ok( io.Status == STATUS_SUCCESS || (class == FileRenameInformationEx && io.Status == 0xdeadbeef), + "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_SUCCESS, "res expected STATUS_SUCCESS, got %lx\n", res ); - fileDeleted = GetFileAttributesW( oldpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; - todo_wine_if( class == FileRenameInformationEx ) - ok( fileDeleted, "file should not exist\n" ); - fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; - todo_wine_if( class == FileRenameInformationEx ) - ok( !fileDeleted, "file should exist\n" ); + ok( res == STATUS_SUCCESS || (class == FileRenameInformationEx && 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; - todo_wine_if( class == FileRenameInformationEx ) - ok( !lstrcmpiW(fni->FileName, newpath + 2), "FileName expected %s, got %s\n", - wine_dbgstr_w(newpath + 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; + todo_wine_if( class == FileRenameInformationEx ) + ok( fileDeleted, "file should not exist\n" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && + GetLastError() == ERROR_FILE_NOT_FOUND; + todo_wine_if( class == FileRenameInformationEx ) + 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; + todo_wine_if( class == FileRenameInformationEx ) + ok( !lstrcmpiW(fni->FileName, newpath + 2), "FileName expected %s, got %s\n", + wine_dbgstr_w(newpath + 2), wine_dbgstr_w(fni->FileName) ); + HeapFree( GetProcessHeap(), 0, fni ); + }
CloseHandle( handle ); CloseHandle( handle2 ); @@ -2200,9 +2267,11 @@ static void test_file_rename_information(FILE_INFORMATION_CLASS class) io.Status = 0xdeadbeef; res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, class ); todo_wine_if( class == FileRenameInformationEx ) - ok( io.Status == STATUS_SUCCESS, "got io status %#lx\n", io.Status ); + ok( io.Status == STATUS_SUCCESS || (class == FileRenameInformationEx && io.Status == 0xdeadbeef), + "got io status %#lx\n", io.Status ); todo_wine_if( class == FileRenameInformationEx ) - ok( res == STATUS_SUCCESS, "got status %lx\n", res ); + ok( res == STATUS_SUCCESS || (class == FileRenameInformationEx && res == STATUS_INVALID_INFO_CLASS), + "got status %lx\n", res ); ok( GetFileAttributesW( oldpath ) != INVALID_FILE_ATTRIBUTES, "file should exist\n" );
CloseHandle( handle );