This patch-set adds the definitions and struct modifications required to eventually implement `FileRenameInformationEx` and `FileLinkInformationEx`.
The initial tests are copies of the tests for `FileRenameInformation` and `FileLinkInformation`, but with the `ReplaceIfExists` field replaced with the equivalient `Flag` value: `FILE_RENAME_REPLACE_IF_EXISTS` or `FILE_LINK_REPLACE_IF_EXISTS` respectively.
From: Joel Holdsworth joel@airwebreathe.org.uk
Signed-off-by: Joel Holdsworth joel@airwebreathe.org.uk --- include/winternl.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/include/winternl.h b/include/winternl.h index d3537cc774d..9bcfd43aa5a 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -1432,12 +1432,24 @@ typedef struct _FILE_NAME_INFORMATION { } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
typedef struct _FILE_RENAME_INFORMATION { - BOOLEAN ReplaceIfExists; + union { + BOOLEAN ReplaceIfExists; + ULONG Flags; + }; HANDLE RootDirectory; ULONG FileNameLength; WCHAR FileName[1]; } FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
+#define FILE_RENAME_REPLACE_IF_EXISTS 0x00000001 +#define FILE_RENAME_POSIX_SEMANTICS 0x00000002 +#define FILE_RENAME_SUPPRESS_PIN_STATE_INHERITANCE 0x00000004 +#define FILE_RENAME_SUPPRESS_STORAGE_RESERVE_INHERITANCE 0x00000008 +#define FILE_RENAME_NO_INCREASE_AVAILABLE_SPACE 0x00000010 +#define FILE_RENAME_NO_DECREASE_AVAILABLE_SPACE 0x00000020 +#define FILE_RENAME_PRESERVE_AVAILABLE_SPACE 0x00000030 +#define FILE_RENAME_IGNORE_READONLY_ATTRIBUTE 0x00000040 + typedef struct _FILE_LINK_INFORMATION { BOOLEAN ReplaceIfExists; HANDLE RootDirectory;
From: Joel Holdsworth joel@airwebreathe.org.uk
These initial tests are copies of the tests for FileRenameInformation, but with the ReplaceIfExists field replaced with the equivalient Flag value: FILE_RENAME_REPLACE_IF_EXISTS.
Signed-off-by: Joel Holdsworth joel@airwebreathe.org.uk --- dlls/ntdll/tests/file.c | 657 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 657 insertions(+)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index e70bbc32be4..210e26ea03b 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -2168,6 +2168,662 @@ static void test_file_rename_information(void) delete_object( oldpath ); }
+static void test_file_rename_information_ex(void) +{ + static const WCHAR foo_txtW[] = {'\','f','o','o','.','t','x','t',0}; + static const WCHAR fooW[] = {'f','o','o',0}; + WCHAR tmp_path[MAX_PATH], oldpath[MAX_PATH + 16], newpath[MAX_PATH + 16], *filename, *p; + FILE_RENAME_INFORMATION *fri; + FILE_NAME_INFORMATION *fni; + BOOL success, fileDeleted; + UNICODE_STRING name_str; + HANDLE handle, handle2; + IO_STATUS_BLOCK io; + NTSTATUS res; + + GetTempPathW( MAX_PATH, tmp_path ); + + /* oldpath is a file, newpath doesn't exist */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + DeleteFileW( newpath ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = 0; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + todo_wine 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 ok( fileDeleted, "file should not exist\n" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + todo_wine 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 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 ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a file, without FILE_RENAME_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = 0; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a file, with FILE_RENAME_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = FILE_RENAME_REPLACE_IF_EXISTS; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + todo_wine 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 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 ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a file, without FILE_RENAME_REPLACE_IF_EXISTS, target file opened */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + handle2 = CreateFileW( newpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = 0; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + CloseHandle( handle2 ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a file, with FILE_RENAME_REPLACE_IF_EXISTS, target file opened */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + handle2 = CreateFileW( newpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = FILE_RENAME_REPLACE_IF_EXISTS; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_ACCESS_DENIED, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + CloseHandle( handle2 ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath doesn't exist, without FILE_RENAME_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + DeleteFileW( newpath ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = 0; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + todo_wine 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 ok( fileDeleted, "file should not exist\n" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + todo_wine 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 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 ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory (but child object opened), newpath doesn't exist, without FILE_RENAME_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + lstrcpyW( newpath, oldpath ); + lstrcatW( newpath, foo_txtW ); + handle2 = CreateFileW( newpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + DeleteFileW( newpath ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = 0; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_ACCESS_DENIED, "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; + ok( fileDeleted, "file should not exist\n" ); + + CloseHandle( handle ); + CloseHandle( handle2 ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + if (res == STATUS_SUCCESS) /* remove when Wine is fixed */ + { + lstrcpyW( oldpath, newpath ); + lstrcatW( oldpath, foo_txtW ); + delete_object( oldpath ); + } + delete_object( newpath ); + + /* oldpath is a directory, newpath is a file, without FILE_RENAME_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = 0; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a file, without FILE_RENAME_REPLACE_IF_EXISTS, target file opened */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + handle2 = CreateFileW( newpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = 0; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + CloseHandle( handle2 ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a file, with FILE_RENAME_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = FILE_RENAME_REPLACE_IF_EXISTS; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + todo_wine 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 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 ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a file, with FILE_RENAME_REPLACE_IF_EXISTS, target file opened */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + handle2 = CreateFileW( newpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = FILE_RENAME_REPLACE_IF_EXISTS; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_ACCESS_DENIED, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + CloseHandle( handle2 ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a directory, without FILE_RENAME_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( newpath ); + success = CreateDirectoryW( newpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = 0; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a directory, with FILE_RENAME_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( newpath ); + success = CreateDirectoryW( newpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = FILE_RENAME_REPLACE_IF_EXISTS; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_ACCESS_DENIED, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a directory, with FILE_RENAME_REPLACE_IF_EXISTS, target file opened */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( newpath ); + success = CreateDirectoryW( newpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle2 = CreateFileW( newpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = FILE_RENAME_REPLACE_IF_EXISTS; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_ACCESS_DENIED, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + CloseHandle( handle2 ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a directory, without FILE_RENAME_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( newpath ); + success = CreateDirectoryW( newpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = 0; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a directory, with FILE_RENAME_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( newpath ); + success = CreateDirectoryW( newpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = FILE_RENAME_REPLACE_IF_EXISTS; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_ACCESS_DENIED, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath doesn't exist, test with RootDir != NULL */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( newpath ); + for (filename = newpath, p = newpath; *p; p++) + if (*p == '\') filename = p + 1; + handle2 = CreateFileW( tmp_path, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + lstrlenW(filename) * sizeof(WCHAR) ); + fri->Flags = 0; + fri->RootDirectory = handle2; + fri->FileNameLength = lstrlenW(filename) * sizeof(WCHAR); + memcpy( fri->FileName, filename, fri->FileNameLength ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + todo_wine 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 ok( fileDeleted, "file should not exist\n" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + todo_wine 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 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 ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath == newpath */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + pRtlDosPathNameToNtPathName_U( oldpath, &name_str, NULL, NULL ); + fri = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fri->Flags = 0; + fri->RootDirectory = NULL; + fri->FileNameLength = name_str.Length; + memcpy( fri->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fri, sizeof(FILE_RENAME_INFORMATION) + fri->FileNameLength, FileRenameInformationEx ); + todo_wine ok( io.Status == STATUS_SUCCESS, "got io status %#lx\n", io.Status ); + todo_wine ok( res == STATUS_SUCCESS, "got status %lx\n", res ); + ok( GetFileAttributesW( oldpath ) != INVALID_FILE_ATTRIBUTES, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fri ); + delete_object( oldpath ); +} + static void test_file_link_information(void) { static const WCHAR foo_txtW[] = {'\','f','o','o','.','t','x','t',0}; @@ -5678,6 +6334,7 @@ START_TEST(file) test_file_full_size_information(); test_file_all_name_information(); test_file_rename_information(); + test_file_rename_information_ex(); test_file_link_information(); test_file_disposition_information(); test_file_completion_information();
From: Joel Holdsworth joel@airwebreathe.org.uk
Signed-off-by: Joel Holdsworth joel@airwebreathe.org.uk --- include/winternl.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/include/winternl.h b/include/winternl.h index 9bcfd43aa5a..07169e820e0 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -1451,12 +1451,26 @@ typedef struct _FILE_RENAME_INFORMATION { #define FILE_RENAME_IGNORE_READONLY_ATTRIBUTE 0x00000040
typedef struct _FILE_LINK_INFORMATION { - BOOLEAN ReplaceIfExists; + union { + BOOLEAN ReplaceIfExists; + ULONG Flags; + }; HANDLE RootDirectory; ULONG FileNameLength; WCHAR FileName[1]; } FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
+#define FILE_LINK_REPLACE_IF_EXISTS 0x00000001 +#define FILE_LINK_POSIX_SEMANTICS 0x00000002 +#define FILE_LINK_SUPPRESS_STORAGE_RESERVE_INHERITANCE 0x00000008 +#define FILE_LINK_NO_INCREASE_AVAILABLE_SPACE 0x00000010 +#define FILE_LINK_NO_DECREASE_AVAILABLE_SPACE 0x00000020 +#define FILE_LINK_PRESERVE_AVAILABLE_SPACE 0x00000030 +#define FILE_LINK_IGNORE_READONLY_ATTRIBUTE 0x00000040 +#define FILE_LINK_FORCE_RESIZE_TARGET_SR 0x00000080 +#define FILE_LINK_FORCE_RESIZE_SOURCE_SR 0x00000100 +#define FILE_LINK_FORCE_RESIZE_SR 0x00000180 + typedef struct _FILE_NAMES_INFORMATION { ULONG NextEntryOffset; ULONG FileIndex;
From: Joel Holdsworth joel@airwebreathe.org.uk
These initial tests are copies of the tests for FileLinkInformation, but with the ReplaceIfExists field replaced with the equivalient Flag value: FILE_LINK_REPLACE_IF_EXISTS.
Signed-off-by: Joel Holdsworth joel@airwebreathe.org.uk --- dlls/ntdll/tests/file.c | 750 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 750 insertions(+)
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index 210e26ea03b..3d693624869 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -3573,6 +3573,755 @@ static void test_file_link_information(void) delete_object( oldpath ); }
+static void test_file_link_information_ex(void) +{ + static const WCHAR foo_txtW[] = {'\','f','o','o','.','t','x','t',0}; + static const WCHAR fooW[] = {'f','o','o',0}; + WCHAR tmp_path[MAX_PATH], oldpath[MAX_PATH + 16], newpath[MAX_PATH + 16], *filename, *p; + FILE_LINK_INFORMATION *fli; + FILE_NAME_INFORMATION *fni; + WIN32_FIND_DATAW find_data; + BOOL success, fileDeleted; + UNICODE_STRING name_str; + HANDLE handle, handle2; + IO_STATUS_BLOCK io; + NTSTATUS res; + + GetTempPathW( MAX_PATH, tmp_path ); + + /* oldpath is a file, newpath doesn't exist */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + DeleteFileW( newpath ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = 0; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + todo_wine 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; + todo_wine 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 ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a file, without FILE_LINK_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = 0; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a file, with FILE_LINK_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = FILE_LINK_REPLACE_IF_EXISTS; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + todo_wine 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" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a file, with FILE_LINK_REPLACE_IF_EXISTS, different casing on link */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + wcsrchr( newpath, '\' )[1] = 'F'; + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = FILE_LINK_REPLACE_IF_EXISTS; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + todo_wine 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" ); + + CloseHandle( handle ); + 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 ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a file, without FILE_LINK_REPLACE_IF_EXISTS, target file opened */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + handle2 = CreateFileW( newpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = 0; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + CloseHandle( handle2 ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a file, with FILE_LINK_REPLACE_IF_EXISTS, target file opened */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + handle2 = CreateFileW( newpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = FILE_LINK_REPLACE_IF_EXISTS; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_ACCESS_DENIED, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + CloseHandle( handle2 ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath doesn't exist, without FILE_LINK_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + DeleteFileW( newpath ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = 0; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_FILE_IS_A_DIRECTORY , + "io.Status expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_FILE_IS_A_DIRECTORY, "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; + ok( fileDeleted, "file should not 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 ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory (but child object opened), newpath doesn't exist, without FILE_LINK_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + lstrcpyW( newpath, oldpath ); + lstrcatW( newpath, foo_txtW ); + handle2 = CreateFileW( newpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + DeleteFileW( newpath ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = 0; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_FILE_IS_A_DIRECTORY, + "io.Status expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_FILE_IS_A_DIRECTORY, "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; + ok( fileDeleted, "file should not exist\n" ); + + CloseHandle( handle ); + CloseHandle( handle2 ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a file, without FILE_LINK_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = 0; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_FILE_IS_A_DIRECTORY, + "io.Status expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION || res == STATUS_FILE_IS_A_DIRECTORY /* > Win XP */, + "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" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a file, without FILE_LINK_REPLACE_IF_EXISTS, target file opened */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + handle2 = CreateFileW( newpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = 0; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_FILE_IS_A_DIRECTORY, + "io.Status expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION || res == STATUS_FILE_IS_A_DIRECTORY /* > Win XP */, + "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" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + CloseHandle( handle2 ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a file, with FILE_LINK_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = FILE_LINK_REPLACE_IF_EXISTS; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_FILE_IS_A_DIRECTORY, + "io.Status expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_FILE_IS_A_DIRECTORY, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a file, with FILE_LINK_REPLACE_IF_EXISTS, target file opened */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + handle2 = CreateFileW( newpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = FILE_LINK_REPLACE_IF_EXISTS; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_FILE_IS_A_DIRECTORY, + "io.Status expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_FILE_IS_A_DIRECTORY, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + CloseHandle( handle2 ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a directory, without FILE_LINK_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( newpath ); + success = CreateDirectoryW( newpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = 0; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_FILE_IS_A_DIRECTORY, + "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION || res == STATUS_FILE_IS_A_DIRECTORY /* > Win XP */, + "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" ); + fileDeleted = GetFileAttributesW( newpath ) == INVALID_FILE_ATTRIBUTES && GetLastError() == ERROR_FILE_NOT_FOUND; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a directory, with FILE_LINK_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( newpath ); + success = CreateDirectoryW( newpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = FILE_LINK_REPLACE_IF_EXISTS; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_FILE_IS_A_DIRECTORY, + "io.Status expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_FILE_IS_A_DIRECTORY, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a directory, newpath is a directory, with FILE_LINK_REPLACE_IF_EXISTS, target file opened */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( oldpath ); + success = CreateDirectoryW( oldpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( newpath ); + success = CreateDirectoryW( newpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + handle2 = CreateFileW( newpath, GENERIC_WRITE | DELETE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = FILE_LINK_REPLACE_IF_EXISTS; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_FILE_IS_A_DIRECTORY, + "io.Status expected STATUS_FILE_IS_A_DIRECTORY, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_FILE_IS_A_DIRECTORY, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + CloseHandle( handle2 ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a directory, without FILE_LINK_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( newpath ); + success = CreateDirectoryW( newpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = 0; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath is a directory, with FILE_LINK_REPLACE_IF_EXISTS */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( newpath ); + success = CreateDirectoryW( newpath, NULL ); + ok( success != 0, "failed to create temp directory\n" ); + pRtlDosPathNameToNtPathName_U( newpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + name_str.Length ); + fli->Flags = FILE_LINK_REPLACE_IF_EXISTS; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "io.Status expected 0xdeadbeef, got %lx\n", io.Status ); + todo_wine ok( res == STATUS_ACCESS_DENIED, "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; + ok( !fileDeleted, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath is a file, newpath doesn't exist, test with RootDirectory != NULL */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + res = GetTempFileNameW( tmp_path, fooW, 0, newpath ); + ok( res != 0, "failed to create temp file\n" ); + DeleteFileW( newpath ); + for (filename = newpath, p = newpath; *p; p++) + if (*p == '\') filename = p + 1; + handle2 = CreateFileW( tmp_path, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0 ); + ok( handle2 != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_LINK_INFORMATION) + lstrlenW(filename) * sizeof(WCHAR) ); + fli->Flags = 0; + fli->RootDirectory = handle2; + fli->FileNameLength = lstrlenW(filename) * sizeof(WCHAR); + memcpy( fli->FileName, filename, fli->FileNameLength ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_SUCCESS, "io.Status expected STATUS_SUCCESS, got %lx\n", io.Status ); + todo_wine 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; + todo_wine 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 ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + delete_object( newpath ); + + /* oldpath == newpath */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + pRtlDosPathNameToNtPathName_U( oldpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fli->Flags = 0; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "got io status %#lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION, "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, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_SUCCESS, "got io status %#lx\n", io.Status ); + todo_wine ok( res == STATUS_SUCCESS, "got status %lx\n", res ); + ok( GetFileAttributesW( oldpath ) != INVALID_FILE_ATTRIBUTES, "file should exist\n" ); + + CloseHandle( handle ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); + + /* oldpath == newpath, different casing on link */ + res = GetTempFileNameW( tmp_path, fooW, 0, oldpath ); + ok( res != 0, "failed to create temp file\n" ); + handle = CreateFileW( oldpath, GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( handle != INVALID_HANDLE_VALUE, "CreateFileW failed\n" ); + + wcsrchr( oldpath, '\' )[1] = 'F'; + pRtlDosPathNameToNtPathName_U( oldpath, &name_str, NULL, NULL ); + fli = HeapAlloc( GetProcessHeap(), 0, sizeof(FILE_RENAME_INFORMATION) + name_str.Length ); + fli->Flags = 0; + fli->RootDirectory = NULL; + fli->FileNameLength = name_str.Length; + memcpy( fli->FileName, name_str.Buffer, name_str.Length ); + pRtlFreeUnicodeString( &name_str ); + + io.Status = 0xdeadbeef; + res = pNtSetInformationFile( handle, &io, fli, sizeof(FILE_LINK_INFORMATION) + fli->FileNameLength, FileLinkInformationEx ); + todo_wine ok( io.Status == 0xdeadbeef, "got io status %#lx\n", io.Status ); + todo_wine ok( res == STATUS_OBJECT_NAME_COLLISION, "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, FileLinkInformationEx ); + todo_wine ok( io.Status == STATUS_SUCCESS, "got io status %#lx\n", io.Status ); + todo_wine ok( res == STATUS_SUCCESS, "got status %lx\n", res ); + 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) + { + 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 ); + HeapFree( GetProcessHeap(), 0, fli ); + delete_object( oldpath ); +} + static void test_file_both_information(void) { IO_STATUS_BLOCK io; @@ -6336,6 +7085,7 @@ START_TEST(file) test_file_rename_information(); test_file_rename_information_ex(); test_file_link_information(); + test_file_link_information_ex(); test_file_disposition_information(); test_file_completion_information(); test_file_id_information();
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=137378
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
ntdll: file.c:2205: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2206: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2208: Test failed: file should not exist file.c:2210: Test failed: file should exist file.c:2216: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo9943.tmp", got L"\Users\winetest\AppData\Local\Temp\foo9942.tmp" file.c:2244: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2273: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2274: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2276: Test failed: file should not exist file.c:2307: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2341: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2375: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2376: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2378: Test failed: file should not exist file.c:2380: Test failed: file should exist file.c:2386: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo994D.tmp", got L"\Users\winetest\AppData\Local\Temp\foo994C.tmp" file.c:2423: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2463: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2499: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2532: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2533: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2535: Test failed: file should not exist file.c:2569: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2606: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2642: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2681: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2715: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2748: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2781: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2782: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2784: Test failed: file should not exist file.c:2786: Test failed: file should exist file.c:2792: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo9982.tmp", got L"\Users\winetest\AppData\Local\Temp\foo9981.tmp" file.c:2818: Test failed: got io status 0xdeadbeef file.c:2819: Test failed: got status c0000003 file.c:3611: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3612: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3616: Test failed: file should exist file.c:3650: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3679: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3680: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3710: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3711: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3722: Test failed: Link did not change casing on existing target file: got L"foo99E0.tmp" file.c:3753: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3787: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3823: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3871: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3906: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3944: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3980: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4017: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4055: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4093: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4133: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4167: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:4200: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:4233: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:4234: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:4238: Test failed: file should exist file.c:4271: Test failed: got status c0000003 file.c:4276: Test failed: got io status 0xdeadbeef file.c:4277: Test failed: got status c0000003 file.c:4302: Test failed: got status c0000003 file.c:4307: Test failed: got io status 0xdeadbeef file.c:4308: Test failed: got status c0000003 file.c:4316: Test failed: Link did not change casing on same file: got L"foo9A2D.tmp"
=== w7u_adm (32 bit report) ===
ntdll: file.c:2205: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2206: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2208: Test failed: file should not exist file.c:2210: Test failed: file should exist file.c:2216: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooA2A5.tmp", got L"\Users\winetest\AppData\Local\Temp\fooA2A4.tmp" file.c:2244: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2273: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2274: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2276: Test failed: file should not exist file.c:2307: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2341: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2375: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2376: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2378: Test failed: file should not exist file.c:2380: Test failed: file should exist file.c:2386: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooA2BF.tmp", got L"\Users\winetest\AppData\Local\Temp\fooA2BE.tmp" file.c:2423: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2463: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2499: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2532: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2533: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2535: Test failed: file should not exist file.c:2569: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2606: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2642: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2681: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2715: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2748: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2781: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2782: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2784: Test failed: file should not exist file.c:2786: Test failed: file should exist file.c:2792: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooA2F4.tmp", got L"\Users\winetest\AppData\Local\Temp\fooA2F3.tmp" file.c:2818: Test failed: got io status 0xdeadbeef file.c:2819: Test failed: got status c0000003 file.c:3611: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3612: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3616: Test failed: file should exist file.c:3650: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3679: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3680: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3710: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3711: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3722: Test failed: Link did not change casing on existing target file: got L"fooA362.tmp" file.c:3753: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3787: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3823: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3871: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3906: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3944: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3980: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4017: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4055: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4093: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4133: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4167: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:4200: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:4233: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:4234: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:4238: Test failed: file should exist file.c:4271: Test failed: got status c0000003 file.c:4276: Test failed: got io status 0xdeadbeef file.c:4277: Test failed: got status c0000003 file.c:4302: Test failed: got status c0000003 file.c:4307: Test failed: got io status 0xdeadbeef file.c:4308: Test failed: got status c0000003 file.c:4316: Test failed: Link did not change casing on same file: got L"fooA3AE.tmp"
=== w7u_el (32 bit report) ===
ntdll: file.c:2205: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2206: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2208: Test failed: file should not exist file.c:2210: Test failed: file should exist file.c:2216: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo2CEA.tmp", got L"\Users\winetest\AppData\Local\Temp\foo2CE9.tmp" file.c:2244: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2273: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2274: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2276: Test failed: file should not exist file.c:2307: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2341: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2375: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2376: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2378: Test failed: file should not exist file.c:2380: Test failed: file should exist file.c:2386: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo2D04.tmp", got L"\Users\winetest\AppData\Local\Temp\foo2D03.tmp" file.c:2423: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2463: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2499: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2532: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2533: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2535: Test failed: file should not exist file.c:2569: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2606: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2642: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2681: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2715: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2748: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2781: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2782: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2784: Test failed: file should not exist file.c:2786: Test failed: file should exist file.c:2792: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo2D39.tmp", got L"\Users\winetest\AppData\Local\Temp\foo2D38.tmp" file.c:2818: Test failed: got io status 0xdeadbeef file.c:2819: Test failed: got status c0000003 file.c:3611: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3612: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3616: Test failed: file should exist file.c:3650: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3679: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3680: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3710: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3711: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3722: Test failed: Link did not change casing on existing target file: got L"foo2D97.tmp" file.c:3753: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3787: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3823: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3871: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3906: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3944: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3980: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4017: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4055: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4093: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4133: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4167: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:4200: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:4233: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:4234: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:4238: Test failed: file should exist file.c:4271: Test failed: got status c0000003 file.c:4276: Test failed: got io status 0xdeadbeef file.c:4277: Test failed: got status c0000003 file.c:4302: Test failed: got status c0000003 file.c:4307: Test failed: got io status 0xdeadbeef file.c:4308: Test failed: got status c0000003 file.c:4316: Test failed: Link did not change casing on same file: got L"foo2DD4.tmp"
=== w8 (32 bit report) ===
ntdll: file.c:2205: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2206: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2208: Test failed: file should not exist file.c:2210: Test failed: file should exist file.c:2216: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo9FEA.tmp", got L"\Users\winetest\AppData\Local\Temp\foo9FE9.tmp" file.c:2244: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2273: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2274: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2276: Test failed: file should not exist file.c:2307: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2341: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2375: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2376: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2378: Test failed: file should not exist file.c:2380: Test failed: file should exist file.c:2386: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooA3BD.tmp", got L"\Users\winetest\AppData\Local\Temp\fooA3BC.tmp" file.c:2423: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2463: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2499: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2532: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2533: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2535: Test failed: file should not exist file.c:2569: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2606: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2642: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2681: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2715: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2748: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2781: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2782: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2784: Test failed: file should not exist file.c:2786: Test failed: file should exist file.c:2792: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooA569.tmp", got L"\Users\winetest\AppData\Local\Temp\fooA568.tmp" file.c:2818: Test failed: got io status 0xdeadbeef file.c:2819: Test failed: got status c0000003 file.c:3611: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3612: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3616: Test failed: file should exist file.c:3650: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3679: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3680: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3710: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3711: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3722: Test failed: Link did not change casing on existing target file: got L"fooA673.tmp" file.c:3753: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3787: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3823: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3871: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3906: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3944: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3980: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4017: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4055: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4093: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4133: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4167: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:4200: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:4233: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:4234: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:4238: Test failed: file should exist file.c:4271: Test failed: got status c0000003 file.c:4276: Test failed: got io status 0xdeadbeef file.c:4277: Test failed: got status c0000003 file.c:4302: Test failed: got status c0000003 file.c:4307: Test failed: got io status 0xdeadbeef file.c:4308: Test failed: got status c0000003 file.c:4316: Test failed: Link did not change casing on same file: got L"fooA98F.tmp"
=== w8adm (32 bit report) ===
ntdll: file.c:2205: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2206: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2208: Test failed: file should not exist file.c:2210: Test failed: file should exist file.c:2216: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo9F5E.tmp", got L"\Users\winetest\AppData\Local\Temp\foo9F5D.tmp" file.c:2244: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2273: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2274: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2276: Test failed: file should not exist file.c:2307: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2341: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2375: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2376: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2378: Test failed: file should not exist file.c:2380: Test failed: file should exist file.c:2386: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooA350.tmp", got L"\Users\winetest\AppData\Local\Temp\fooA34F.tmp" file.c:2423: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2463: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2499: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2532: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2533: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2535: Test failed: file should not exist file.c:2569: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2606: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2642: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2681: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2715: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2748: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2781: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2782: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2784: Test failed: file should not exist file.c:2786: Test failed: file should exist file.c:2792: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooA663.tmp", got L"\Users\winetest\AppData\Local\Temp\fooA653.tmp" file.c:2818: Test failed: got io status 0xdeadbeef file.c:2819: Test failed: got status c0000003 file.c:3611: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3612: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3616: Test failed: file should exist file.c:3650: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3679: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3680: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3710: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3711: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3722: Test failed: Link did not change casing on existing target file: got L"fooA7FA.tmp" file.c:3753: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3787: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3823: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3871: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3906: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3944: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3980: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4017: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4055: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4093: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4133: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4167: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:4200: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:4233: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:4234: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:4238: Test failed: file should exist file.c:4271: Test failed: got status c0000003 file.c:4276: Test failed: got io status 0xdeadbeef file.c:4277: Test failed: got status c0000003 file.c:4302: Test failed: got status c0000003 file.c:4307: Test failed: got io status 0xdeadbeef file.c:4308: Test failed: got status c0000003 file.c:4316: Test failed: Link did not change casing on same file: got L"fooAB25.tmp"
=== w864 (32 bit report) ===
ntdll: file.c:2205: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2206: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2208: Test failed: file should not exist file.c:2210: Test failed: file should exist file.c:2216: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo9A3D.tmp", got L"\Users\winetest\AppData\Local\Temp\foo9A3C.tmp" file.c:2244: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2273: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2274: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2276: Test failed: file should not exist file.c:2307: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2341: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2375: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2376: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2378: Test failed: file should not exist file.c:2380: Test failed: file should exist file.c:2386: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo9A47.tmp", got L"\Users\winetest\AppData\Local\Temp\foo9A46.tmp" file.c:2423: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2463: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2499: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2532: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2533: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2535: Test failed: file should not exist file.c:2569: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2606: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2642: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2681: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2715: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2748: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2781: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2782: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2784: Test failed: file should not exist file.c:2786: Test failed: file should exist file.c:2792: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo9A6D.tmp", got L"\Users\winetest\AppData\Local\Temp\foo9A6C.tmp" file.c:2818: Test failed: got io status 0xdeadbeef file.c:2819: Test failed: got status c0000003 file.c:3611: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3612: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3616: Test failed: file should exist file.c:3650: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3679: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3680: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3710: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3711: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3722: Test failed: Link did not change casing on existing target file: got L"foo9AAB.tmp" file.c:3753: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3787: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3823: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3871: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3906: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3944: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3980: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4017: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4055: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4093: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4133: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4167: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:4200: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:4233: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:4234: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:4238: Test failed: file should exist file.c:4271: Test failed: got status c0000003 file.c:4276: Test failed: got io status 0xdeadbeef file.c:4277: Test failed: got status c0000003 file.c:4302: Test failed: got status c0000003 file.c:4307: Test failed: got io status 0xdeadbeef file.c:4308: Test failed: got status c0000003 file.c:4316: Test failed: Link did not change casing on same file: got L"foo9AD9.tmp"
=== w1064v1507 (32 bit report) ===
ntdll: file.c:2205: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2206: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2208: Test failed: file should not exist file.c:2210: Test failed: file should exist file.c:2216: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooB3A1.tmp", got L"\Users\winetest\AppData\Local\Temp\fooB3A0.tmp" file.c:2244: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2273: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2274: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2276: Test failed: file should not exist file.c:2307: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2341: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2375: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2376: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2378: Test failed: file should not exist file.c:2380: Test failed: file should exist file.c:2386: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooB428.tmp", got L"\Users\winetest\AppData\Local\Temp\fooB427.tmp" file.c:2423: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2463: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2499: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2532: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2533: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2535: Test failed: file should not exist file.c:2569: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2606: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2642: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2681: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2715: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2748: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2781: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2782: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2784: Test failed: file should not exist file.c:2786: Test failed: file should exist file.c:2792: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooB557.tmp", got L"\Users\winetest\AppData\Local\Temp\fooB556.tmp" file.c:2818: Test failed: got io status 0xdeadbeef file.c:2819: Test failed: got status c0000003 file.c:3611: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3612: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3616: Test failed: file should exist file.c:3650: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3679: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3680: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3710: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3711: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3722: Test failed: Link did not change casing on existing target file: got L"fooB671.tmp" file.c:3753: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3787: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3823: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3871: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3906: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3944: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3980: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4017: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4055: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4093: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4133: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4167: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:4200: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:4233: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:4234: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:4238: Test failed: file should exist file.c:4271: Test failed: got status c0000003 file.c:4276: Test failed: got io status 0xdeadbeef file.c:4277: Test failed: got status c0000003 file.c:4302: Test failed: got status c0000003 file.c:4307: Test failed: got io status 0xdeadbeef file.c:4308: Test failed: got status c0000003 file.c:4316: Test failed: Link did not change casing on same file: got L"fooB769.tmp"
=== w1064v1809 (32 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w1064_tsign (32 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w10pro64 (32 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w11pro64 (32 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w7pro64 (64 bit report) ===
ntdll: file.c:2205: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2206: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2208: Test failed: file should not exist file.c:2210: Test failed: file should exist file.c:2216: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo12B6.tmp", got L"\Users\winetest\AppData\Local\Temp\foo12B5.tmp" file.c:2244: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2273: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2274: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2276: Test failed: file should not exist file.c:2307: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2341: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2375: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2376: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2378: Test failed: file should not exist file.c:2380: Test failed: file should exist file.c:2386: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo12C0.tmp", got L"\Users\winetest\AppData\Local\Temp\foo12BF.tmp" file.c:2423: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2463: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2499: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2532: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2533: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2535: Test failed: file should not exist file.c:2569: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2606: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2642: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2681: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2715: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2748: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2781: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2782: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2784: Test failed: file should not exist file.c:2786: Test failed: file should exist file.c:2792: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo12E6.tmp", got L"\Users\winetest\AppData\Local\Temp\foo12E5.tmp" file.c:2818: Test failed: got io status 0xdeadbeef file.c:2819: Test failed: got status c0000003 file.c:3611: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3612: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3616: Test failed: file should exist file.c:3650: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3679: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3680: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3710: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3711: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3722: Test failed: Link did not change casing on existing target file: got L"foo1334.tmp" file.c:3753: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3787: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3823: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3871: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3906: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3944: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3980: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4017: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4055: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4093: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4133: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4167: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:4200: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:4233: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:4234: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:4238: Test failed: file should exist file.c:4271: Test failed: got status c0000003 file.c:4276: Test failed: got io status 0xdeadbeef file.c:4277: Test failed: got status c0000003 file.c:4302: Test failed: got status c0000003 file.c:4307: Test failed: got io status 0xdeadbeef file.c:4308: Test failed: got status c0000003 file.c:4316: Test failed: Link did not change casing on same file: got L"foo1362.tmp"
=== w864 (64 bit report) ===
ntdll: file.c:2205: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2206: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2208: Test failed: file should not exist file.c:2210: Test failed: file should exist file.c:2216: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo9E44.tmp", got L"\Users\winetest\AppData\Local\Temp\foo9E43.tmp" file.c:2244: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2273: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2274: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2276: Test failed: file should not exist file.c:2307: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2341: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2375: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2376: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2378: Test failed: file should not exist file.c:2380: Test failed: file should exist file.c:2386: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo9E5E.tmp", got L"\Users\winetest\AppData\Local\Temp\foo9E5D.tmp" file.c:2423: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2463: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2499: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2532: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2533: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2535: Test failed: file should not exist file.c:2569: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2606: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2642: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2681: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2715: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2748: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2781: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2782: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2784: Test failed: file should not exist file.c:2786: Test failed: file should exist file.c:2792: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\foo9E74.tmp", got L"\Users\winetest\AppData\Local\Temp\foo9E73.tmp" file.c:2818: Test failed: got io status 0xdeadbeef file.c:2819: Test failed: got status c0000003 file.c:3611: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3612: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3616: Test failed: file should exist file.c:3650: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3679: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3680: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3710: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3711: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3722: Test failed: Link did not change casing on existing target file: got L"foo9EB3.tmp" file.c:3753: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3787: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3823: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3871: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3906: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3944: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3980: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4017: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4055: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4093: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4133: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4167: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:4200: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:4233: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:4234: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:4238: Test failed: file should exist file.c:4271: Test failed: got status c0000003 file.c:4276: Test failed: got io status 0xdeadbeef file.c:4277: Test failed: got status c0000003 file.c:4302: Test failed: got status c0000003 file.c:4307: Test failed: got io status 0xdeadbeef file.c:4308: Test failed: got status c0000003 file.c:4316: Test failed: Link did not change casing on same file: got L"foo9ED1.tmp"
=== w1064v1507 (64 bit report) ===
ntdll: file.c:2205: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2206: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2208: Test failed: file should not exist file.c:2210: Test failed: file should exist file.c:2216: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooAC2F.tmp", got L"\Users\winetest\AppData\Local\Temp\fooAC1E.tmp" file.c:2244: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2273: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2274: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2276: Test failed: file should not exist file.c:2307: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2341: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2375: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2376: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2378: Test failed: file should not exist file.c:2380: Test failed: file should exist file.c:2386: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooB292.tmp", got L"\Users\winetest\AppData\Local\Temp\fooB291.tmp" file.c:2423: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2463: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2499: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2532: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2533: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2535: Test failed: file should not exist file.c:2569: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2606: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2642: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2681: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2715: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:2748: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:2781: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:2782: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:2784: Test failed: file should not exist file.c:2786: Test failed: file should exist file.c:2792: Test failed: FileName expected L"\Users\winetest\AppData\Local\Temp\fooB5D4.tmp", got L"\Users\winetest\AppData\Local\Temp\fooB5D3.tmp" file.c:2818: Test failed: got io status 0xdeadbeef file.c:2819: Test failed: got status c0000003 file.c:3611: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3612: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3616: Test failed: file should exist file.c:3650: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3679: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3680: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3710: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:3711: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:3722: Test failed: Link did not change casing on existing target file: got L"fooB651.tmp" file.c:3753: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:3787: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3823: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3871: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3906: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3944: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3980: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4017: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4055: Test failed: res expected STATUS_OBJECT_NAME_COLLISION or STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4093: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4133: Test failed: res expected STATUS_FILE_IS_A_DIRECTORY, got c0000003 file.c:4167: Test failed: res expected STATUS_OBJECT_NAME_COLLISION, got c0000003 file.c:4200: Test failed: res expected STATUS_ACCESS_DENIED, got c0000003 file.c:4233: Test failed: io.Status expected STATUS_SUCCESS, got deadbeef file.c:4234: Test failed: res expected STATUS_SUCCESS, got c0000003 file.c:4238: Test failed: file should exist file.c:4271: Test failed: got status c0000003 file.c:4276: Test failed: got io status 0xdeadbeef file.c:4277: Test failed: got status c0000003 file.c:4302: Test failed: got status c0000003 file.c:4307: Test failed: got io status 0xdeadbeef file.c:4308: Test failed: got status c0000003 file.c:4316: Test failed: Link did not change casing on same file: got L"fooBD65.tmp"
=== w1064v1809 (64 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w1064_2qxl (64 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w1064_adm (64 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w1064_tsign (64 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w10pro64 (64 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w10pro64_en_AE_u8 (64 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w10pro64_ar (64 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w10pro64_ja (64 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w10pro64_zh_CN (64 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== w11pro64_amd (64 bit report) ===
ntdll: file.c:3821: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3869: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3904: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3942: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:3978: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4015: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4053: Test failed: io.Status expected 0xdeadbeef, got deadbeef file.c:4091: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef file.c:4131: Test failed: io.Status expected STATUS_FILE_IS_A_DIRECTORY, got deadbeef
=== debian11b (64 bit WoW report) ===
uiautomationcore: uiautomation.c:14704: Test failed: Wait for event_handle failed. uiautomation.c:14705: Test failed: expected uia_event_callback uiautomation.c:15296: Test failed: 2 failures in child process
Alexandre Julliard (@julliard) commented about dlls/ntdll/tests/file.c:
delete_object( oldpath );
}
+static void test_file_rename_information_ex(void) +{
- static const WCHAR foo_txtW[] = {'\','f','o','o','.','t','x','t',0};
- static const WCHAR fooW[] = {'f','o','o',0};
It doesn't seem necessary to duplicate all that code.
On Thu Sep 14 19:19:28 2023 +0000, Alexandre Julliard wrote:
It doesn't seem necessary to duplicate all that code.
I guess we could do it by moving the code out to a helper which has a boolean argument to select between `FileRenameInformation` and `FileRenameInformationEx`. Is that more what you had in mind?
On Thu Sep 14 21:21:04 2023 +0000, Joel Holdsworth wrote:
I guess we could do it by moving the code out to a helper which has a boolean argument to select between `FileRenameInformation` and `FileRenameInformationEx`. Is that more what you had in mind?
Sort of, basically just pass the info class to the function and call it twice.
On Fri Sep 15 08:57:27 2023 +0000, Alexandre Julliard wrote:
Sort of, basically just pass the info class to the function and call it twice.
Ok... to do that we will need a helper to set `ReplaceIfExists`. It is a `BOOL` for `FileRenameInformation` but a flag: `FILE_RENAME_REPLACE_IF_EXISTS` in `Flags` for `FileRenameInformationEx`. That should be ok.
The most sticky issue is that all the `FileRenameInformationEx` tests have to be marked `todo_wine` until `FileRenameInformationEx` support is submitted. Is it possible to conditionally mark a test `todo_wine`? I wasn't aware that it was.
Now, I have patches for an initial `FileRenameInformationEx` implementation ready to go. In that case, if we submit that patch first, then we won't have any differing `todo_wine`s between the two classes.
I understood it was preferable to submit tests before implementation, but if you will accept the test after the implementation there won't be a problem.
Ok... to do that we will need a helper to set ReplaceIfExists. It is a BOOL for FileRenameInformation but a flag: FILE_RENAME_REPLACE_IF_EXISTS in Flags for FileRenameInformationEx. That should be ok.
It's the same field so you might just as well always set Flags.
The most sticky issue is that all the FileRenameInformationEx tests have to be marked todo_wine until FileRenameInformationEx support is submitted. Is it possible to conditionally mark a test todo_wine? I wasn't aware that it was.
`todo_wine_if(class == FileRenameInformationEx)`