Roman Pišl : kernelbase: Convert DOS to NT path for FileRenameInfo in SetFileInformationByHandle.

Alexandre Julliard julliard at winehq.org
Tue Oct 26 09:40:25 CDT 2021


Module: wine
Branch: stable
Commit: ef574b5e0cadb37ff091d40ad3db3624c095f34e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=ef574b5e0cadb37ff091d40ad3db3624c095f34e

Author: Roman Pišl <rpisl at seznam.cz>
Date:   Tue Mar 23 15:16:40 2021 +0100

kernelbase: Convert DOS to NT path for FileRenameInfo in SetFileInformationByHandle.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50756
Signed-off-by: Roman Pišl <rpisl at seznam.cz>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 33c6a6cb285800cac60ceab5868122fa8d9cda92)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 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 f9bce744278..a728a1d79a7 100644
--- a/dlls/kernel32/tests/file.c
+++ b/dlls/kernel32/tests/file.c
@@ -5288,24 +5288,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 765bb41ab98..23126988b78 100644
--- a/dlls/kernelbase/file.c
+++ b/dlls/kernelbase/file.c
@@ -3554,8 +3554,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:




More information about the wine-cvs mailing list