From 33c6a6cb285800cac60ceab5868122fa8d9cda92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Pi=C5=A1l?= Date: Tue, 23 Mar 2021 15:16:40 +0100 Subject: [PATCH] kernelbase: Convert DOS to NT path for FileRenameInfo in SetFileInformationByHandle. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50756 Signed-off-by: Roman Pišl Signed-off-by: Alexandre Julliard --- dlls/kernel32/tests/file.c | 4 ---- dlls/kernelbase/file.c | 23 +++++++++++++++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index f2254d4e988..5deed96abf3 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -5322,24 +5322,20 @@ 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 result %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()); CloseHandle(file); file = CreateFileW(tempFileTo2, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); -todo_wine ok(file != INVALID_HANDLE_VALUE, "file not renamed, error %d\n", GetLastError()); fri->FileNameLength = wcslen(tempFileTo1) * sizeof(WCHAR); diff --git a/dlls/kernelbase/file.c b/dlls/kernelbase/file.c index 23a36b0a765..e0a75c2ad08 100644 --- a/dlls/kernelbase/file.c +++ b/dlls/kernelbase/file.c @@ -3556,8 +3556,27 @@ 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 ((status = RtlDosPathNameToNtPathName_U_WithStatus( ((FILE_RENAME_INFORMATION *)info)->FileName, + &nt_name, NULL, NULL ))) + break; + + size = sizeof(*rename_info) + nt_name.Length; + if ((rename_info = HeapAlloc( GetProcessHeap(), 0, size ))) + { + 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; + status = NtSetInformationFile( file, &io, rename_info, size, FileRenameInformation ); + HeapFree( GetProcessHeap(), 0, rename_info ); + } + RtlFreeUnicodeString( &nt_name ); + break; + } case FileStandardInfo: case FileCompressionInfo: case FileAttributeTagInfo: