Signed-off-by: Roman Pišl rpisl@seznam.cz --- dlls/kernel32/tests/file.c | 68 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index 6ea9dffde5c..c4c3823aa59 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -5284,6 +5284,73 @@ todo_wine CloseHandle(file); }
+static void test_SetFileRenameInfo(void) +{ + WCHAR tempFileFrom[MAX_PATH], tempFileTo1[MAX_PATH], tempFileTo2[MAX_PATH]; + WCHAR tempPath[MAX_PATH]; + FILE_RENAME_INFORMATION *fri; + HANDLE file; + DWORD size; + BOOL ret; + + if (!pSetFileInformationByHandle) + { + win_skip("SetFileInformationByHandle is not supported\n"); + return; + } + + ret = GetTempPathW(MAX_PATH, tempPath); + ok(ret, "GetTempPathW failed, got error %u.\n", GetLastError()); + + ret = GetTempFileNameW(tempPath, L"abc", 0, tempFileFrom); + ok(ret, "GetTempFileNameW failed, got error %u.\n", GetLastError()); + + ret = GetTempFileNameW(tempPath, L"abc", 0, tempFileTo1); + ok(ret, "GetTempFileNameW failed, got error %u.\n", GetLastError()); + + ret = GetTempFileNameW(tempPath, L"abc", 1, tempFileTo2); + ok(ret, "GetTempFileNameW failed, got error %u.\n", GetLastError()); + + file = CreateFileW(tempFileFrom, GENERIC_READ | FILE_WRITE_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + NULL, OPEN_EXISTING, 0, NULL); + ok(file != INVALID_HANDLE_VALUE, "failed to create temp file, error %u.\n", GetLastError()); + + size = sizeof(FILE_RENAME_INFORMATION) + MAX_PATH; + fri = HeapAlloc(GetProcessHeap(), 0, size); + + fri->ReplaceIfExists = FALSE; + fri->RootDirectory = NULL; + fri->FileNameLength = wcslen(tempFileTo1) * sizeof(WCHAR); + memcpy(fri->FileName, tempFileTo1, fri->FileNameLength + sizeof(WCHAR)); + ret = pSetFileInformationByHandle(file, FileRenameInfo, fri, size); +todo_wine + ok(!ret && GetLastError() == ERROR_ALREADY_EXISTS, "FileRenameInfo unexpected error %d\n", GetLastError()); + + fri->ReplaceIfExists = TRUE; + ret = pSetFileInformationByHandle(file, FileRenameInfo, fri, size); +todo_wine + ok(ret, "FileRenameInfo failed, error %d\n", GetLastError()); + + fri->ReplaceIfExists = FALSE; + fri->FileNameLength = wcslen(tempFileTo2) * sizeof(WCHAR); + memcpy(fri->FileName, tempFileTo2, fri->FileNameLength + sizeof(WCHAR)); + ret = pSetFileInformationByHandle(file, FileRenameInfo, fri, size); +todo_wine + ok(ret, "FileRenameInfo failed, error %d\n", GetLastError()); + + HeapFree(GetProcessHeap(), 0, fri); + CloseHandle(file); + + file = CreateFileW(tempFileTo2, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); +todo_wine + ok(file != INVALID_HANDLE_VALUE, "file not renamed, error %d\n", GetLastError()); + CloseHandle(file); + + DeleteFileW(tempFileFrom); + DeleteFileW(tempFileTo1); + DeleteFileW(tempFileTo2); +} + static void test_GetFileAttributesExW(void) { static const WCHAR path1[] = {'\','\','?','\',0}; @@ -5846,6 +5913,7 @@ START_TEST(file) test_GetFinalPathNameByHandleA(); test_GetFinalPathNameByHandleW(); test_SetFileInformationByHandle(); + test_SetFileRenameInfo(); test_GetFileAttributesExW(); test_post_completion(); test_overlapped_read();
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50756 Signed-off-by: Roman Pišl rpisl@seznam.cz --- dlls/kernel32/tests/file.c | 4 ---- dlls/kernelbase/file.c | 25 +++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index c4c3823aa59..96ad0f42a14 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -5323,26 +5323,22 @@ static void test_SetFileRenameInfo(void) fri->FileNameLength = wcslen(tempFileTo1) * sizeof(WCHAR); memcpy(fri->FileName, tempFileTo1, fri->FileNameLength + sizeof(WCHAR)); ret = pSetFileInformationByHandle(file, FileRenameInfo, fri, size); -todo_wine ok(!ret && GetLastError() == ERROR_ALREADY_EXISTS, "FileRenameInfo unexpected error %d\n", GetLastError());
fri->ReplaceIfExists = TRUE; ret = pSetFileInformationByHandle(file, FileRenameInfo, fri, size); -todo_wine ok(ret, "FileRenameInfo failed, error %d\n", GetLastError());
fri->ReplaceIfExists = FALSE; fri->FileNameLength = wcslen(tempFileTo2) * sizeof(WCHAR); memcpy(fri->FileName, tempFileTo2, fri->FileNameLength + sizeof(WCHAR)); ret = pSetFileInformationByHandle(file, FileRenameInfo, fri, size); -todo_wine ok(ret, "FileRenameInfo failed, error %d\n", GetLastError());
HeapFree(GetProcessHeap(), 0, fri); CloseHandle(file);
file = CreateFileW(tempFileTo2, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); -todo_wine ok(file != INVALID_HANDLE_VALUE, "file not renamed, error %d\n", GetLastError()); CloseHandle(file);
diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c index 23a36b0a765..d06bb26b8e5 100644 --- a/dlls/kernelbase/file.c +++ b/dlls/kernelbase/file.c @@ -3556,8 +3556,29 @@ BOOL WINAPI DECLSPEC_HOTPATCH SetFileInformationByHandle( HANDLE file, FILE_INFO status = NtSetInformationFile( file, &io, info, size, FileIoPriorityHintInformation ); break; case FileRenameInfo: - status = NtSetInformationFile( file, &io, info, size, FileRenameInformation ); - break; + { + FILE_RENAME_INFORMATION *rename_info; + UNICODE_STRING nt_name; + ULONG size; + + if (!RtlDosPathNameToNtPathName_U( ((FILE_RENAME_INFORMATION *)info)->FileName, &nt_name, NULL, NULL )) + { + SetLastError( ERROR_PATH_NOT_FOUND ); + return FALSE; + } + + size = sizeof(*rename_info) + nt_name.Length; + if (!(rename_info = HeapAlloc( GetProcessHeap(), 0, size ))) return FALSE; + + memcpy( rename_info, info, sizeof(*rename_info) ); + memcpy( rename_info->FileName, nt_name.Buffer, nt_name.Length + sizeof(WCHAR) ); + rename_info->FileNameLength = nt_name.Length; + RtlFreeUnicodeString( &nt_name ); + + status = NtSetInformationFile( file, &io, rename_info, size, FileRenameInformation ); + HeapFree( GetProcessHeap(), 0, rename_info ); + break; + } case FileStandardInfo: case FileCompressionInfo: case FileAttributeTagInfo:
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87512
Your paranoid android.
=== w2008s64 (32 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w7u_2qxl (32 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w7u_adm (32 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w7u_el (32 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w8 (32 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w8adm (32 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w864 (32 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w1064v1507 (32 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w1064v1809 (32 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w1064 (32 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w10pro64 (32 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== wvistau64 (64 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w2008s64 (64 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w864 (64 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w1064v1507 (64 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w1064v1809 (64 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w1064 (64 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w1064_2qxl (64 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w10pro64 (64 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w10pro64_ar (64 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w10pro64_he (64 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w10pro64_ja (64 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
=== w10pro64_zh_CN (64 bit report) ===
kernel32: file.c:5326: Test failed: FileRenameInfo unexpected error 5 file.c:5330: Test failed: FileRenameInfo failed, error 5 file.c:5336: Test failed: FileRenameInfo failed, error 5 file.c:5342: Test failed: file not renamed, error 2
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87511
Your paranoid android.
=== w2008s64 (32 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w7u_2qxl (32 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w7u_adm (32 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w7u_el (32 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w8 (32 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w8adm (32 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w864 (32 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w1064v1507 (32 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w1064v1809 (32 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w1064 (32 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w10pro64 (32 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== wvistau64 (64 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w2008s64 (64 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w864 (64 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w1064v1507 (64 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w1064v1809 (64 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w1064 (64 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w1064_2qxl (64 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w10pro64 (64 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w10pro64_ar (64 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w10pro64_he (64 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w10pro64_ja (64 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2
=== w10pro64_zh_CN (64 bit report) ===
kernel32: file.c:5327: Test failed: FileRenameInfo unexpected error 5 file.c:5332: Test failed: FileRenameInfo failed, error 5 file.c:5339: Test failed: FileRenameInfo failed, error 5 file.c:5346: Test failed: file not renamed, error 2