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

Alexandre Julliard julliard at winehq.org
Tue Mar 23 16:54:32 CDT 2021


Module: wine
Branch: master
Commit: 33c6a6cb285800cac60ceab5868122fa8d9cda92
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=33c6a6cb285800cac60ceab5868122fa8d9cda92

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>

---

 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:




More information about the wine-cvs mailing list